Showing posts with label 教育. Show all posts
Showing posts with label 教育. Show all posts

3/27/2013

Good-bye & Hello


阪大では昨日25(月)に卒業式が行われました.大須賀・石川研からも修士7名,学部5名が学位を授与されました.今年は3月に入ってから暖かい日が続いたので,早咲きの桜の中での卒業式となりました.皆さんおめでとうございます.

3月は別れの季節です.大学の教員をしていると人を送り出す一方なので,毎年この時期に晴れがましくも寂しい思いをすることになります.ほとんどの学生が研究室に在籍するのは1〜3年,中でも一番多いのが学部+修士の3年間在籍するパターンです.見よう見まねで研究を始めて,卒論でようやく形ができてきて,学会に行って,いつの間にか後輩の指導をするようになったりして,ずいぶん成長したなあと思ったらもう修論を書いて卒業,ということの繰り返しです.


私は阪大に着任して3年,今年がいわば「完成年度」になります.着任時に卒論で配属された最初の学生達がこのたび修士を取って出て行くというわけです.最初からとびきり優秀な学生達に恵まれたので,「阪大生って優秀だなあ」という印象を持つことができました.この印象が続くかどうかは彼らの後輩達次第ですが,どうやら今のM1,B4を見ている限り間違ってはいないようです.

さて,卒業式が終わった翌日から新4年生の研究室配属行事が始まっています.今週末に配属が決まり,来週4月1日には,卒論生と外部から来るM1を合わせて10人近い新メンバーが研究室に加わることになります.彼らと過ごす研究生活がどんなものになるのか,今から楽しみです.願わくば,1〜3年後の別れが寂しくなるような日々になって欲しいものです.

7/01/2012

歌うモータ

私の居室は,薄い壁一枚を隔てて学生の実験室と隣接しています(正確には,実験室の一角を壁で仕切って教員室にしているという感じです).話し声はさほど聞こえないのですが,モータなどの機械音だけはよく伝わってきます.私にとっては騒音どころかBGMみたいなものです.

一番大きいのは工作機械の音ですが,毎日聞いているとどの機械でどんな加工をしているか大体わかります.「糸鋸でアクリル切ってるな」とか,「そんな削り方じゃフライスの刃をいためるなあ」とか.音だけでも加工の上手下手は結構わかりますが,ほとんどは材料の固定のしかたと刃の送り方で決まるものです.

また,誰かが実験を始めるとロボットの音が聞こえてきます.それぞれ個性的な動作音をもっていますし,使っているモータの種類やギヤ比も違うので,誰がどのロボットを動かしているのか一耳瞭然です.たまにいつもと違う音が聞こえてくると,「あ,誰か新しいメカを作ったのかな?」などと思って,イソイソと実験室を覗きに行ってしまいます.

さて,このようにモータの音というのはなかなかに個性的なものですが,これを活用(悪用?)すると,こんな余興も可能になります.
用意するものはごくありふれたモータ制御系一式.ここで挙げたのはマイコン(Arduino Pro mini 3.3V),モータドライバTB6612FNG,タミヤのミニモータ,Li-po電池(3.7V),そして紙コップです.30分もあれば組めるようなものです.ここでマイコンにプログラムを書きこめば普通にモータを動かせるわけですが,そこにちょっと細工をすると…

  

DCモータをPWM制御すると,「ピー」という特有の甲高い音がしますよね.あの音はPWMのキャリア周波数に起因しています.普通はモータの時定数などを考慮して適当に決めてそのまま一定にしておくのですが,その周波数をオンラインでどんどん切り替えてしまえば,このように音階を奏でることができるというわけです.

いろいろ試してみたところ,モータ単体では蚊の鳴くような微弱な音しか鳴りませんが,紙コップの底に貼りつけるとかなりはっきり聞こえる音になります.
※動画ではギアボックスがついていますが,ギアボックスをつけずにモータを直接紙コップに貼り付けた方がきれいに聞こえることがわかりました.

音楽のスタンダードでは基準音階であるA4が440Hz,周波数が2倍になるごとに1オクターブ=12半音階上がりますので,周波数を2^(1/12)倍にすれば半音上がることになります.なおPWM制御ではデューティ比によってモータの速度を変えるわけですが,試してみた結果,聞こえる音はほぼ周波数だけで決まり,デューティ比にはほとんど関係がありませんでした.従って,ここではモータが動かないようにデューティ比を5%とごく小さく設定しています.

結局この現象は磁界中のコイルを振動させて音を出していることになるので,実はダイナミックスピーカの仕組みそのものです.モータとスピーカが同じ電磁誘導という原理に基づいていること,また振動源だけではだめで,適切な形状のコーンによる拡声が重要なこと,などを説明するのによい教材になるのではと思っています.


追記:こんな動画もありました.同じようなことを考える人はいるものです.

6/28/2012

スタートアッププロジェクト


大須賀・石川研では,新年度に配属された4年生に「スタートアッププロジェクト(SP)」という課題に取り組んでもらうことにしています.4月〜6月くらいの期間で研究計画の立案からプログラミングや実機実験,TeXによる論文執筆,PCを使ったプレゼンテーションまでを行い,研究の進め方を一通り経験するというプロジェクトです.いわば「ミニ卒論」です.

当初は教育目的ということで必ずしもオリジナリティは要求せず,先輩の研究の追実験などでもよいとしていたのですが,結局みんな新しいことがやりたくなるので,最近ではほぼ全員が本格的な研究をするようになりました.中には即学会で発表できるような成果を挙げる人もいます.

このような制度は,今まで私がいた研究室でもだいたい同じような形態で実施していましたし,多かれ少なかれどの研究室でも行っていることかと思います.私自身の原点は東工大の三平研(もともとは古田研)で「教育期間」と呼んでいた制度で,配属早々からかなりハードなノルマを4年生に課していました.
 今までの経験上,その教育効果は絶大であるといえます.頑張った人はものすごく力がつきますし,適当にやった人にはそれなりの力しかつきません.また,大抵はB4一人に上級生一人をサポートにつけるのですが,上級生の方も後輩の指導を通して大きく成長することが多いです.

さて,今年度の4年生はSP発表会を来週7月2日に控え,寝る間も惜しんで研究に没頭している様子です.サポートのM1・M2も手厚く面倒を見てくれていて頼もしい限りです.


 このプロジェクトを無事に終えれば,4年生はもう「新人」ではなくなり,真の意味で「仲間」になります.大変楽しみにしています.

12/16/2011

増淵泉先生特別講義

先日に引き続き,大須賀・石川研主宰の「ダイナミクスと制御研究会」と,本学機械工学専攻の「ロバスト制御特論」の共催として神戸大学准教授の増淵泉先生に特別講義をしていただきました.今回の題目は「線形行列不等式を用いた制御系設計」です.まさに制御理論の王道中の王道ともいえるテーマで,増淵先生はその王道をリードして来られたエキスパートのお一人です.

私が大学院生だった90年代後半頃は,LMI, ロバスト制御,それに基づく制御系設計やゲインスケジューリング制御等の研究がシンポジウムで大半を占めるような状況でした.専門がやや異なる私でも,学会に行っていれば門前の小僧で自然と最低限の知識(あるいは問題意識)が頭に入ってきましたが,2〜3年で発展的なテーマにキャッチアップしなければならない現在の学生さんは,なかなかこういった知識を学ぶ機会がないかもしれません.


本日出席していただいた学生さんにはぜひ,今日のお話は「一部の人だけに必要な専門的トピック」ではなくて,「制御に関わる研究をする人なら一通り知っておいて欲しいスタンダード」なのだと認識してもらえればと思います.


増淵先生,どうもありがとうございました.次回は年明けの2012年1月6日(金)に金沢大学の金子修先生をお招きしてご講義いただきます.

12/14/2011

足立修一先生特別講義



気がつけばまる3ヶ月も更新していませんでした.9月の後半から大変な状況が続き,なかなかWebに手を出す心の余裕がなかったというのが実情です.

さて,すでに10日以上経ってしまいましたが,12月2日(金)に慶応義塾大学教授の足立修一先生に本学にお越しいただき,「1時間半でカルマンフィルタを理解したつもりになる」と題した特別講義をしていただきました.この講演会は,本研究室が主宰している「ダイナミクスと制御研究会」と,本学機械工学専攻M1の講義「ロバスト制御特論」の共催の形で実施したものです.


制御理論とカルマンフィルタの歴史的背景から具体的な構成法まで,非常にわかりやすくお話ししていただきました.学生にとっても,教員にとっても得るところの大きいご講演でした.特に,平均値フィルタの例題を用いた非定常カルマンフィルタの説明はみごとで,早速私も授業などで使ってみたいと思っています.
 
また,すでに足立研究室ブログにて足立先生ご本人による美しいスナップショットつきでご紹介いただいていますのでぜひご覧下さい.

本研究室ではこれからも内外の著名な研究者をお招きしてダイナミクスと制御研究会を開催して行きますので,ご興味を持たれた方は石川までご一報下さい.
次回は12月16日(金),神戸大学の増淵泉先生にお越しいただきます.

 追伸:これまた大変浦島な報告ですが,さる11月16日には石川が足立研セミナーにお招きいただき,非線形制御の入門をお話しして大変楽しい時間を過ごさせていただきました.

8/08/2011

阪大工学部オープンキャンパス

阪大工学部では,8月10日(水)にオープンキャンパス(主に高校生・既卒者対象)が行われます.

http://www.eng.osaka-u.ac.jp/ja/entrance/opencampus.html

大須賀・石川研も,応用理工学科・機械工学科目の研究室公開ツアーの一部として,たくさんのロボット達の展示・実演を行う予定です.多数の皆さんのお越しをお待ちしています.

8/01/2011

PWM制御あれこれ







前回の記事では,Cortex-M0ボードの演算速度を調べるためにPWM出力端子の波形をいろいろとみていたわけですが,今回はその出力をモータドライバに通したときに気になる特性をいくつか確認してみました.(従って,主役はマイコンではなくてモータドライバの方です.)

まずはライブラリとしてCQ.zipで配布のpwm.cをベースにしますので,搬送波の生成に32ビットタイマTMR32B1,デューティー比の設定にマッチレジスタMR0, MR1を使うことになります.モータドライバとしては,以前紹介したTB6612FNGを使います.

【TB6612FNGのスイッチング性能】

TB6612FNGのデータシートをみますと,スイッチングの周波数は最大100kHzとあります.すなわち10μsecくらいの間隔のスイッチング性能は保証されていることになりますが,実際のところはどの程度なのでしょうか.

pwm.cでは32ビットタイマTMR32B1が下記のように設定されています.
#define MAX_PWM 999

[...]

    LPC_TMR32B1->PR  = 0; 
    LPC_TMR32B1->MR2 = MAX_PWM;
    LPC_TMR32B1->MCR = (0x3 << 6); // MR2で割込み&リセット
TMR32B1はシステムクロックの48MHz(すなわち20.83nsec/クロック)をプリスケーラで分周してカウントします.ここではプリスケーラの設定が0(すなわち1分周)ですので,TMR32B1のカウント周期もそのまま20.83nsecになります.そして,レジスタMR2との一致で割込みおよびリセットをするように設定されていますので,カウント値が MR2に設定した値MAX_PWMに達するまでの時間がPWMの搬送波周期です.1カウント20.83nsecで0〜999までカウント,すなわち 20.83μsecというわけです.さらに,設定したデューティー比によってこの20.83μsecの時間がON区間とOFF区間に2分されます.

モータドライバの最小スイッチング周期が10μsecということですから,スペック的には限界ぎりぎりでOKということになるでしょう.実際,モータドライバの入力(黄色)と出力(水色)を比較してみると次のようになります.
横軸は時間で一目盛りが5μsecで,2本の垂直カーソルで挟まれた区間が搬送波一周期分の20.8μsecです.出力はぴったり入力に追従できていますので,まったく問題なさそうです.

調子に乗ってカタログスペックを超え,PWMの搬送波周期をもっと短くしてみます.
 図の左上から順に約10μsec(時間目盛り2.5μsec/div で表示), 約4μsec (1μsec/div), 約1μsec (250nsec/div) と設定した場合です.時間目盛りを細かくしていくと,スイッチングに250nsec程度の遅れがあることが見えてきます.実用的なのはせいぜい10μsec周期くらいまででしょうか.しかしまあ,思ったよりもずっと応答が俊敏であることがわかりました.

【マイコンとモータの電源系統の話】
基本的なことですが,マイコンとモータドライバおよびモータは下図のように接続します.

Vccはマイコンやモータなどの弱電回路用の電源,Vmはモータ駆動用の電源です(GNDは共通).つまり2系統の電源が必要になります.それで,よく学生などに「VccとVmは一緒じゃダメなんですか?」ということを聞かれるので,なぜダメなのかを少し見てみましょう.

左はVccとVmを別にした場合,右は共通にした場合です.いずれも黄色はVcc,水色はモータ端子の片方(OUT1)をはかったものです.Vccを供給しているバッテリの電圧は4.1Vほどで,モータはマブチの130系という小さなものです.左図ではそのまま一定になっているのに対し,右図ではかなりのノイズが乗っているうえ,モータの動作に合わせて480mVほどの電圧降下を起こしてしまっています.

影響の度合いはバッテリーの駆動能力と負荷の大きさにもよりますが,やはりVccとVmは分けておくのが原則です.




7/29/2011

Cortex-M0ボードでリアルタイム実数演算






Cortex-M0ボード"MARY"で実数演算を使ったリアルタイム制御がどの程度できるのかを確認していきます.
まずやってみたのはこれです.

【サンプル1: 浮動小数点演算で正弦波出力】
#ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

#include "pwm.h"
#include "math.h"
#define omega (2 * 3.141592 / 10.0)
int sample_out = 0; 
uint32_t msec;
float u;

int main(void)
{
  sample_out = 0;
  GPIOSetDir(1, 8, 1);          // PIO1_8 : OUTPUT

  Init_PWM();

  // Set TIMER32B0 as Free-Running milliseconds Timer
  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);    // Timer32B0 Clock ON (48MHz)
  LPC_TMR32B0->PR  = 48000;    // Pre-scaler : 48MHz/48000 → 1msecで1カウント
  LPC_TMR32B0->TCR = 1;        // Timer Start

  while(1)
    {
      GPIOSetValue(1, 8, sample_out); 

      msec = LPC_TMR32B0->TC; 

      u = sin(omega * msec);   /* -1 〜 1 */
      PWM_Set_Duty(0, (uint16_t)((u+1)*500) ) ; /* 0 〜 1000 */
      sample_out = 1 - sample_out;
    }
    return 0; 
}
このプログラムは32ビットタイマとしてTMR32B0とTMR32B1の二つを使用します.TMR32B0は1kHzのフリーランニングタイマとして用います.カウント値(TMR32B0TC)は現在時刻[msec]を表し,これを変数msecに読み込みます.一方,TMR32B1はPWM信号の生成に用います.ここではCQ.zipのサンプルにあるpwm.cを利用していますので,デフォルトで搬送波周期が約20usec,0〜999の整数でデューティー比を設定できます.これらを用い,msec を浮動小数点演算ライブラリ math.h の sin 関数に与えることにより,100Hz(周期10msec)の正弦波をPWM出力します.

下図のように,PWMの出力(CN1の8番,青)とサンプル周期テスト出力(CN3の1番,黄色)をオシロで測ってみましょう.


結果は以下のとおり.
黄色がサンプル周期出力,青がPWM出力です.少し見づらいですが,サンプル周期は420usecくらい(計算負荷によって変動します).PWMの方はデューティー比を周期的に変化させているので疎密波のようにみえます.これを単純なRC回路(R=33kΩ,C=0.1μF)で平滑化してみてやると,
のように,確かに周期10msecの正弦波が出ていることがわかります.

以前に調べた限界のサンプル周期は2usecほどでしたので,sin一つをいれただけでずいぶん時間がかかるようになったのがわかります.また,コードサイズは 21KB ほどで,メモリが32KBしかないことを考えるとこれもかなりの大きさです.

【サンプル2: 固定小数点演算で正弦波出力】
CQ.zipで配布されているfixedpoint.hを使ってsinの部分を固定小数点演算に書き換えてみます.
#ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

#include "pwm.h"
#include "fixedpoint.h"
int sample_out = 0; 
uint32_t msec;

int main(void)
{
  fix32_t u, omega; 
  int32_t duty;

  omega = FIX_Mul(FIX_PI, FIX_DBL(0.2));  // omega = 2*PI/10 (100Hz)

  sample_out = 0;
  GPIOSetDir(1, 8, 1);          // PIO1_8 : OUTPUT

  Init_PWM();

  // Set TIMER32B0 as Free-Running milliseconds Timer
  LPC_SYSCON->SYSAHBCLKCTRL |= (1<<9);    // Timer32B0 Clock ON (48MHz)
  LPC_TMR32B0->PR  = 48000;    // Pre-scaler : 48MHz/48000 → 1msecで1カウント
  LPC_TMR32B0->TCR = 1;        // Timer Start

  while(1)
    {
      GPIOSetValue(1, 8, sample_out); 

      msec = LPC_TMR32B0->TC; 

      u = FIX_Sin( FIX_Mul(omega, FIX_INT(msec)) );     /* -1 〜 1 */
      duty = INT_FIX( FIX_Mul(u, FIX_INT(500)) ) + 500; /* 0 〜 1000 */
      PWM_Set_Duty(0, duty) ; 
      sample_out = 1 - sample_out;
    }
    return 0; 
}
すると結果は
のように,サンプル周期は220usecと約半分になりました.また,コードサイズは約10KBと,こちらも約半分です.劇的とまではいえませんが,うまく使えば効果的でしょう.

7/22/2011

Cortex-M0ボード:ハードの基礎・マニュアルの読み方





学生へのチュートリアルと備忘録を兼ねてメモしておきます.

Cortex-M0ボードに搭載・接続されている様々なハードウェアを使用するためのやり方は,先に紹介したトラ技2011年4月増刊や本誌連載(2〜8月号)にわかりやすく解説されています.しかし,ちょっと自分で何かやろうとするとすぐにこれでは情報が足りないことに気づくでしょう.著者自身も書いているように,ちゃんと理解するにはデータシートやマニュアル,そしてソースファイルを読むことが何よりも近道です.

【例】
  • ポートPIO_1_8 (汎用IOポート1の8番端子)からON/OFF信号を出力したいとします.増刊号のp.50, あるいは配布ファイルCQ.zipの LPC1114/hardware/LPC1114_MARY_DesignData.pdf を参照すると,PIO1_8はMARYボードのCN3の1番ピンに割り当てられていることがわかります.また表Aの右の方を見ると,OB, LB, XB, GB, UB などの拡張ボードではすでに別の用途に使用されているので,PIO1_8を使うときはこれらのボードを外さなければならないこともわかります. この端子からON信号を出力するには以下のようにします.
    #Ifdef __USE_CMSIS
    #include "LPC11xx.h"
    #endif
    
    #include "gpio.h"
    
    int main(void)
    {
        GPIOSetDir(1, 8, 1);   // PIO1_8 : OUTPUT
        GPIOSetValue(1, 8, 1);   // ON
        while(1) {}
        return 0; 
    }
    

    最初の3行は,まずはオマジナイだと思って下さい.汎用入出力のための関数のヘッダファイルが gpio.h で,この中で GPIOSetDir や GPIOSetValue が宣言されています.GPIOSetDir で信号の入出力方向を「出力」に設定し,GPIOSetValueで ON や OFF の値をセットするわけです.

  • 次に,同じことをポートPIO_1_0についてやろうとしてみます.PIO_1_0はMARYボードのCN4の6番ピンです.GPIOSet...
    の部分を
        GPIOSetDir(1, 0, 1);   // PIO1_0 : OUTPUT
        GPIOSetValue(1, 0, 1);   // ON
    
    と変えれば十分のように思いますが,これだけではうまくいきません.

    その理由は,p.50表Bの「端子番号7」と「22」のところを比べてみるとわかります.ここでいう端子番号とはMARYボードのピン番号とは別で,ボード上にみえる8mm角ほどのマイコンチップ本体,LPC1114の端子番号の事です.このLPC1114のような小型のマイコンチップでは,サイズを節約するために一つのピンに複数を機能を割り当てていることが多いのです.端子7はPIO1_8/CT16B1_CAP0の2種類兼用,端子22はPIO1_0/TMS/CT32B1_CAP0/AD1の4種類兼用というように.端子を使うときには,このうちどの役割をさせるのかを指定しないといけないわけです.表Bの2列目をみると端子機能のデフォルト設定が書いてありますね.端子7はデフォルト(リセット直後)でPIO1_8になっているのでたまたま設定の必要がなかったのですが,端子22はReservedとなっているので明示的に設定しないといけないわけです.

    端子22をPIO1_0として機能させるためには,上記2行の前に
        LPC_IOCON->R_PIO1_0   = 0xd1; // PIO1_0 -> PIO1_0
    の一行を追加する必要があります.

【マニュアルの読み方】
こういった情報はどこを調べればよいのでしょうか.そのためにはまず,このMARYボードシステムの基本的な成り立ちを理解する必要があります.

名称開発元マニュアル
1. CPUコアCortex-M0ARMCortex-M0テクニカルリファレンスマニュアル (ARM DDI0432CJ)
2. マイコンチップ(MCU)LPC1114NXPセミコンダクタLPC111x/LPC11C1xユーザーマニュアル (NXP UM10398)
3. マイコンボードMARYCQ出版・圓山宗智氏トラ技増刊号,CQ.zip に附属のドキュメント他
包含関係はCortex-M0 ⊂ LPC1114 ⊂ MARY です(※).いわゆるCPUはCortex-M0ですが,これは表には見えていません.見えているのはLPC1114で,これはCortex-M0をコアとしてタイマやA/Dコンバータといった周辺機能を1チップにまとめたものです.MARYボードはCQ出版・圓山氏が今回の企画で開発したもので,LPC1114を中心に電源,USBインタフェース,コネクタ・スイッチ・LEDなどがついて完成したシステムになっています.

なにか調べようとしたとき,それが3つのうちどれに関係しているのか,を考えれば参照すべきマニュアルがわかるでしょう.基本的な演算能力や命令セットについて知りたければCortex-M0のマニュアル(1)を見ます.タイマ,I/Oポート,A/D変換,UART(シリアル入出力) などの周辺機能関連についてはすべて LPC1114の マニュアル(2)を見ることになりますので,おそらく最も参照頻度が高いと思われます.LPC1114のある端子がどのコネクタに出ているかとか,電源関係,拡張ボードの使い方などに関することはすべて MARY のマターになります.さらにはライブラリ,ヘッダファイル,サンプルプログラムなどのソフトウェアもCQ出版・圓山氏の作によるものなので,トラ技の記事やCQ.zipに附属ドキュメント(3)に頼ることになります.

さて,上の例の場合は汎用入出力GPIOの設定の問題ですので,LPC111xユーザーズマニュアルを開きます.第6章のTable 80を見ますと,PIO1_0端子の機能を設定するレジスタ IOCON_R_PIO1_0 の設定方法の説明が出ています.端子機能を PIO1_0 にセットするには第2〜0ビットを 001 にします.その他の第7〜3ビットはデフォルトのままで 11010 としますので,あわせて 11010001B = 0xd1 をセットすればよいというわけです.

※当然ですが,Cortex-M0を使ったマイコンチップはLPC1114以外にもありますし,LPC1114を使ったボードも MARY以外にもたくさんあります.また,Cortex-M0の命令セットはThumbといって,他のいくつかのCPUにも共通して使われています.


【追記:C言語からのアクセス】
LPC1114のユーザーマニュアルを見て周辺機能レジスタの詳細を理解したとして,実際にそれにどうやってアクセスするかを確認するには LPC1114/workspace/CMSISv1p30_LPC11xx/inc/LPC11xx.h を参照するとわかりやすいです.例えば上述したIOCON_R_PIO1_0にアクセスしたいと思ったら,LPC11xx.hの中を検索すると
/*------------- Pin Connect Block (IOCON) --------------------------------*/
/** @addtogroup LPC11xx_IOCON LPC11xx I/O Configuration Block 
  @{
*/
typedef struct
{

 ...(中略)...

  __IO uint32_t R_PIO1_0;               /*!< Offset: 0x078 I/O configuration for pin TMS/PIO1_0/AD1/CT32B1_CAP0 (R/W) */

 ...(中略)...

} LPC_IOCON_TypeDef;
/*@}*/ /* end of group LPC11xx_IOCON */
という構造体の定義部分が見つかります.さらにLPC_IOCON_TypeDefで検索すれば,その下の方に
#define LPC_IOCON             ((LPC_IOCON_TypeDef  *) LPC_IOCON_BASE )
とあって,構造体の実体がLPC_IOCONという名前で宣言されていることがわかります.それで,LPC_IOCON->R_PIO1_0と記述すれば構造体のメンバR_PIO1_0を読み書きできるというわけです.

※冒頭に書いたオマジナイは,このLPC11xx.hをインクルードするためのものです.

7/19/2011

ARM Cortex-M0ボード"MARY"のリアルタイム性能





CQ出版・マルツパーツから販売されているARM Cortex-M0基盤 "MARY" (トランジスタ技術2011年4月増刊に付属)は,超小型ながら必要十分な基本機能と高い拡張性をもった,とてもクリスプなマイコンです.ご多分にもれず私も3月の発売時に大人買いしました(単体で買っても1980円,増刊号では3000円で2枚付属するという破格の安さも魅力の一つです).
  • マイクロコントローラ:NXP LPC1114
  • CPUコア:ARM Cortex-M0
  • 動作クロック:48MHz
  • 内蔵フラッシュメモリ:32kBytes
まずは全開で回したとき(デジタル出力をON/OFFするだけのループ)の確認です.ループ周期は約1.7μsecでした. さすがに速いです.パルスにかなりヒゲが出ているのはGPIOの応答限界なのでしょうか.

ソース:
#Ifdef __USE_CMSIS
#include "LPC11xx.h"
#endif

int main(void)
{
  int sample_out; 

    GPIOSetDir(1, 8, 1);   // PIO1_8 : OUTPUT
    sample_out = 0;

    while(1)
    {
      GPIOSetValue(1, 8, sample_out); 
      sample_out = 1 - sample_out;
    }
    return 0; 
}



1000カウントの空for ループを入れて回したとき.ループ周期は約400μsecとなりました.



図は省略しますが,10000カウントにすると約4msec (=4000μsec) でした.デクリメントと条件分岐が一回あたり4μsecくらいかかるということですね.十分すぎるほど速いように見えますが,Cortex-M0は乗除算が(整数であっても)複数サイクルを要することと,浮動小数点演算はさらにさらに高コストなことを考えると,制御則などを下手にコーディングすると一気に時間がはねあがることも予想されます.これからもう少し演算性能をテストしておこうと思います.Cortex-M3,M4との比較も早くやってみたいところです.

追記:簡単な演算テストをしてみた結果は以下の通りでした.クロスコンパイラはgccです.
  •  int どうしの乗算 3.6μsec
  •  int どうしの除算 7μsec
  •  float どうしの乗算 60μsec
  •  float の sin関数 240μsec
コンパイラの最適化処理にも依存するので一概にはいえませんが,だいたいの目安にはなりそうです.やはりfloatで sqrt, sin, cos, exp などの数学関数を使うと急激に時間が増えます.二,三段の複合計算をしたら簡単に1msecを超えました.非線形制御を実装するときにはさまざまな工夫が必要です.

追記の追記:
Arduinoのリアルタイム性能についても少し追記しておきましたが,Arduinoでは全開で回したときの周期が460μsecでした.sinやcosを入れると数十msecまで増えることもあります.

7/11/2011

モータドライバ TB6612FNGの使い方

最近よく使っている小型のモータドライバTB6612FNGと使用上の注意点について記しておきます.
TA7291P

TB6612FNG
TB6612FNGはMOSFETを使用した低損失なデュアルモータドライバで,連続1.2A,ピーク3.2Aの電流が流せます(電圧は15Vまで).小型ロボットの製作にはぴったりです.
単体のデータシートはこちらです. サイズは表面実装のSSOPですが,SparkfunからBreakoutボード(写真左)が出ていて,スイッチサイエンス等で購入できます(単価は900円程度).

小型ロボットでは他にも,超安価(200円程度)で使いやすいバイポーラ型のTA7291P (写真右)などを使う人も多いと思いますが,この手のものは損失が大きく(=発熱が大きく)スイッチングが遅いのが難点です.TA7291Pが放熱板つきで連続1.0Aなのに対してTB6612FNGはこのサイズで連続1.2Aですから, 効率の違いがよくわかります.

さて,かように優れもののTB6612FNGですが,使い方を誤ると全然効果を発揮しません.モータAの入力端子には AIN1, AIN2, PWMAの3本があり,AIN1, AIN2 の組で方向を指定,PWMAにPWM制御パルスを加えるようにすると以下のようになります(以下はArduinoで制御).


黄色がPWM制御パルス (PWMA),水色がモータドライバ出力(A01)です(この場合A02は0Vで一定です).PWMの搬送波周期は4msです.水色がきちんと黄色を追従していることがわかります.

ところが,使い方を誤って(あるいはピン数をケチって)PWMAをHIGHに固定し,AIN1, AIN2の一方をLOWに,もう一方にPWM制御パルスを使ってしまうケースがみられます.この場合は以下のようになってしまいます.

 黄色がPWM制御パルス(AIN1),水色がモータドライバ出力(A01)です.期待した通りにスイッチングが行われていません.実は上の図はまだモータをつないでいないときの状況で,モータをつなぐとさらに酷くなります.
 

モータドライバの使い方になれていない人はご注意下さい.

※後ほどもう少し加筆

7/05/2011

ArduinoとPC(Processing)のシリアル通信:承前






先の記事でArduinoのリアルタイム性能の確認,およびシリアル通信におけるバイト通信のすすめについて述べました.最後に,実際にバイト通信をするための簡単なサンプルプログラムを挙げておきます.Arduinoで現在時刻,アナログ端子A0およびアナログ端子A1の値をそれぞれ取得し,シリアルでPCに送信するというものです.

基本動作:
  • 現在時刻(マイクロ秒)をmicros()で取得すると unsigned long intすなわち4バイトの値が返ってきますが,そのうち下位の1バイトを無視して上位の3バイトだけ送信しています.2^32[usec]≒4295[sec]ですので,71分くらいで飽和します(注:計算間違ってたので直しました).
  • アナログ信号をanalogRead()で取得するとintすなわち2バイトの値が返ってきますが,精度は10bit,つまり 0〜1023の整数値が返ってきます.
  • unsigned と signed の挙動の違いを確認するため,data[1]の方は512を引いて -512〜511 の整数値を送信しています.
  • 送信したいデータは時刻が3バイト,アナログ信号がそれぞれ2バイトで計7バイトになります.これを配列buffer[0]〜buffer[6]に格納します.
  • サンプル周期4[msec]で回しています.端子D12から確認用のパルスを出しています.

終端バイトとエスケープの設定:
  • 一回分の送信データの末尾に終端バイトDLMを付加することにします.ここでは0x80です.
  • もし buffer[0]〜buffer[6] にDLMと同じバイトが含まれていたら,別のバイトESCに置き換えます.ここでは0xFFです.
  • 置き換えを行ったら,buffer[7] の第0〜第6ビットの対応するところを1にして記録します.ここで,buffer[7]の第7ビットは使わないので,buffer[7]自身が DLM=0x80と一致することはあり得ません.
  • buffer[0]〜buffer[6]に,エスケープ情報buffer[7]と終端バイトbuffer[8]を加えて,計9バイトを送信します.

Arduino側プログラム:
const int analog_0 = 0;
const int analog_1 = 1;
const int sample_out = 12;
const long int dT = 4000;
const byte DLM = 0x80;
const byte ESC = 0xFF;

boolean sample_flag;
long int time_us;        /* current time [usec] */

void setup()
{
  pinMode(sample_out, OUTPUT);
  Serial.begin(57600);
  sample_flag = true;
}

void loop()
{
  int data[2];
  byte buffer[9];
  
  time_us = micros();
  
  /* data 0, 1 */
  data[0] = analogRead(0);
  data[1] = analogRead(1);

  digitalWrite(sample_out, sample_flag?HIGH:LOW);
  sample_flag = !sample_flag;
  
  buffer[0] = byte((time_us>> 8) & 0xFF);
  buffer[1] = byte((time_us>>16) & 0xFF);
  buffer[2] = byte((time_us>>24) & 0xFF);  
  buffer[3] = byte( data[0]      & 0xFF);
  buffer[4] = byte((data[0]>> 8) & 0xFF);
  buffer[5] = byte( data[1]      & 0xFF);
  buffer[6] = byte((data[1]>> 8) & 0xFF);
  
  buffer[7] = 0;
  for (int i=0; i<=6; i++) {
    if (buffer[i] == DLM) {  /* if the delimiter appears*/
      buffer[7] += 1<<i;
      buffer[i] = ESC;     /* escape */
    }
  }

  buffer[8] = DLM;         /* send delimiter */

  Serial.write(buffer,9);
  delayMicroseconds( max(time_us+dT-micros(), 0) );
}

Processing側では次のようにコーディングします.
  • Serial.bufferUntil(DLM)を使用し,終端バイトDLMを受け取ったら割り込みをかけるように設定します.コールバック関数はserialEvent()です.
  • Serial.readBytesUntil(DLM)を使用し,終端バイトDLMまでのデータを読み込みます.(余分なデータが残っていると負の数が返されます. )
  • あとは基本的にArduino側のプログラムと逆の操作です.エスケープbitが立っていた場合は当該バイトをDLMに差し替えます.
  • 【重要】以前にも書きましたが,Arduinoのint型が2バイトなのに対しProcessingのint型は4バイトです.元の2バイト整数が2の補数で正負表現されていたとしても,これを4バイト整数に代入すると正しく正負が表現されません.たとえば -1=0xFFFF が 0x0000FFFF = +65535 になってしまうわけです.そこで,0x8000以上の数値は負の数と解釈するように修正が必要です.

Processing側プログラム:
import processing.serial.*;

byte DLM = byte(0x80);
int[] data = new int[3];

void setup() 
{
  Serial myPort;

  size(320, 200);
  frameRate(30);
  
  println(Serial.list());
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 57600);
  myPort.clear();
  myPort.bufferUntil(DLM);
}

void draw() { 
  background(0);
  fill(255);
  
  for (int i=0; i<data.length; i++) {
    textAlign(RIGHT);  text( nfc(data[i],0), 150, 50*i+50 );
    textAlign(LEFT);   text( ": data(" + nf(i,1) + ")", 170, 50*i+50 );
  }
}

void serialEvent(Serial port)
{
  byte[] buffer = new byte[9];

  if (port.readBytesUntil(byte(0x80),buffer) <0) { 
    port.clear(); 
  } else {

    for (int i=0; i<=6; i++) {              /* check the escape flag */
      if ( ((buffer[7]>>i) & 0x01) == 1) {
        buffer[i] = DLM;                    /* restore! */
      }
    }
    
    data[0] = (((buffer[2]<<24)&0xFF000000) | ((buffer[1]<<16)&0xFF0000) | ((buffer[0]<<8)&0xFF00));
    data[1] = ( ((buffer[4]<<8)&0xFF00) | (buffer[3] & 0xFF) );
    data[2] = ( ((buffer[6]<<8)&0xFF00) | (buffer[5] & 0xFF) );
    if (data[2] >= 0x8000)  data[2] -= 0x10000;   /* from unsigned to signed */
  }
}



以上,学生が通信でハマったときに「ここ見といて」で済ませられるようにTipsをまとめておきました.もっと洗練された書き方もできると思いますが,とりあえず挙動を理解するためのサンプルということでこれ以上は詰めていません.なにかお気づきの方がおられましたらメールでご指摘いただければ幸いです.

※メモ:Serial.print(val,BYTE)を使うとSerial.printでも生のバイトデータを送信できますが,送られるのは1バイトだけです.valがintやlongなどの多バイト型であっても,実際に送られるのは最下位の1バイトです.

6/17/2011

オープンラボ

6月11日(土)に応用理工学科1年生および専攻説明会参加者対象のオープンラボが行われました.当研究室では,4月に配属されたばかりのB4が現在までの約2ヶ月間で作った出来たてのメカを実演してくれました.直前の数日間に一気に仕事が進んだようで,私から見ると「え,これもう動いてたの?」という喜ばしいサプライズもありました.
おかげさまでオープンラボは大盛況でした.見学にお越しいただいた皆さん,運営に尽力された先生方,デモに協力してくれた学生諸君,どうもありがとうございました.




6/16/2011

MaTX on Mac OS X

MaTXは九州工業大学の古賀雅伸先生が開発されているフリーの科学技術計算・制御系設計ソフトウェアです.言語仕様が比較的C言語に近く,Cプログラマにとってはごく自然な拡張として行列,複素数,伝達関数などを扱うことができます.またインタプリタ(matx)とコンパイラ(matc)が用意されているのも特徴で,とっつきやすいインタラクティブな操作と,高速な実行コードの生成の両方がシームレスに行えます.何といってもフリーですので研究のみならず学習・教育目的にはぴったりです.


さて,MaTXはUNIX系OSやWindowsなど多くのプラットフォームで使用可能ですが,去年の秋頃から今どきのMacintosh (Intel CPU + Mac OS X) でも使えるようになっています.インストール時の注意点についてまとめておきます.
  • gcc (Xcode) のインストール
    コンパイラ(matc)を使うためにはgccが必要です(インタプリタしか使わないなら不要).
    追記(1):どうやら,現状ではインタプリタしか使わない場合であってもgccが必要なようです.matxを起動する時にCプリプロセッサ(cpp)が呼ばれていることが原因のようです.下記に従ってXcodeをインストールする必要があります.

    追記(2): インタプリタのみ使用する時は,matx を起動する際に,
    matx -nocpp
    のように,「-nocpp」オプションをつければXcodeがなくても大丈夫です.

    Macに付属のインストールDVDにXcode Toolsが入っていれば,これをインストールすればOKです.ところが最近のMac(late 2010頃から?)には付属しなくなってしまいました.最新のXcode 4.xはAppleのDeveloperサイトにて配布されていますが,入手するためには年会費10,800円のMac Developer Programに加入するか,Apple Storeから600円で購入する必要があります.
    一つ前のXcode 3.2であれば,こちらの一番下にある"Apple Developer"に無料で登録することによって入手可能です.
  • gnuplotのインストール
    MaTXはグラフィクス機能をgnuplotに任せていますので,プロットなどを実行するにはgnuplotのインストールが必要です.Macの場合はMacPortsなどのパッケージ管理ソフトを利用して
    sudo port install gnuplot
    とするのが簡単です.また,Snow leopard用の64bitバイナリもこちらで配布されています(自己責任でどうぞ).
  • MaTXのインストール
    MaTXのサイトから,最新版の入手→Macintosh→Mac OS X (tar+gzip)とたどって,MaTX-x.y.z.tgz とMaTX-help.tgzをダウンロードします.それぞれ展開して適当な所に置けばOKです.私は /Applications の下に置いています.MaTXの起動プログラムは/Applications/MaTX/bin/matx です.Dockに登録する場合は,いったん "matx.app"にリネームしてからDockに放り込み,その後で"matx"に再度リネームします.前に述べた方法を使って,オリジナルアイコンを作るのもオツなものでしょう.下はPowerpoint上でCopper Blackフォントの"M"の字を使って作ったアイコンです.
  • 環境変数の設定
    起動プログラムへのパスと日本語の文字コードを設定するため,ホームディレクトリにある".bash_profile" に以下の行を加えます.
    export PATH=$PATH:/Applications/MaTX/bin
    export MATXDIR=/Applications/MaTX
    export LANG=ja
    export LESSCHARSET=utf-8
    export PAGER=less
起動するにはターミナルからmatxとタイプするか,先に登録したDockのアイコンをダブルクリックします.まずは demo とタイプして雰囲気をつかむとよいでしょう.デモの際に日本語の表示がおかしければ環境変数の設定に失敗しています.また,グラフの描画ができない場合はgnuplotのインストールに失敗しています.

matcはプラットフォーム依存のバイナリを生成しますし,matx自身もプラットフォーム依存のバイナリです.しかしMaTXの発展形であるJamoxはすべてjavaで書かれていて,プラットフォームに依存しません.JamoxでもMaTXのプログラムコード(.mmファイル)を扱うことができますが,実は内部でmatjというモジュールを呼び出し,コードを一旦javaに変換してから実行しています.このmatjはJamoxから切り出して単体でも使うことができますので,mmファイルをjavaに変換し,Processingに貼付けて使うことで,Processingのお手軽なGUI能力とMaTXの強力な計算能力をリンクさせることが可能です.これらの連携については後日あらためて紹介したいと思います.

6/07/2011

Jamox on Mac OS X

Jamox (九州工業大学の古賀雅伸先生によるJava/NFC/MaTXをベースとしたフリーの制御系解析設計ソフトウェア)について.Mac OS Xへの導入にあたっては次の点に注意するとよい.
  • Jamoxをインストール.公式サイトからJamox Installer をダウンロードして起動し,/Applications にインストール.
  • Jamoxフォルダにswtライブラリを追加.
    32bit VMの場合は org.swt.cocoa.macosx_{version}.jarを,64bit VM の場合はorg.swt.cocoa.macosx.x86_64_{version}.jarを入手して,/Applications/Jamox/lib 以下に配置.
  • swtをCLASSPATHに含める. 起動スクリプト /Applications/Jamox/jamox をエディタで開いて,上述のjarファイルにCLASSPATHを明示的に通す
  • javaの起動オプションを追加する.
    /Applications/Jamox/jamoxの最下行にある起動コマンドに
    java ...... -XstartOnFirstThread
    というオプションを追加する.
  • /Applications/Jamox/jamox を実行.enjoy!

    Snow Leopard,Java for Mac OS X  1.6.0_24, {32 bit VM / 64 bit VM} にて確認済み.
    すばらしいです.



    4/15/2011

    ArduinoとProcessingのデータ型

    • Arduino IDE では char はsigned, byte はunsigned, int は2バイト
    • Processing では char はunsigned, byte はsigned, int は4バイト
    である.これに気をつけないと,ArduinoとProcessing間でデータ通信などをしたときにはまる.なんでこんなややこしいことになっているのやら.

    ※追記:こういう比較のページもあるにはありますが,細かいことまでは書いていないですね.

    2/04/2011

    読書案内

    私と一緒に研究する学生さんにぜひ読んでおいてほしい本,お奨めできる本をあげておきます.


    【研究全般】

    必ず一度は目を通して下さい.

    【辞典類】

    • 岩波数学辞典(第4版),岩波書店.¥17,850.
      「比類なき 全数学のエンサイクロペディア」という帯のコピーが泣かせます. この辞典には一般的な数学概念が網羅的に解説されています. 索引が和文・欧文ともに非常に充実しており,論文を読んでいてわからない言葉はたいてい見つけることができるでしょう. 2007年に大幅にリニューアルされた第4版が刊行され,全文書のPDFを収めたCDROMが付属するようになりました.
      第4版から説明文がかなりわかりやすくなりましたが,それでも歯が立たないこともあるかもしれません.そういうときには,
      • 新しく出会った語がどういう分野の言葉であり,どんな本を読んで勉強すればいいのかを知る
      • 関連するキーワードにはどんなものがあるかを知る
      • 内容を大体わかっている事柄について,正確な定義を確認する(特に論文執筆時)
      といった目的で使うとよいと思います.(辞典というのは本来そういうものですが)

      また,適当に興味のある用語から調べて,説明の中に出てくるわからない語を次々に孫引きしてしていく「チェーン数学辞典」も楽しいものです.一時間や二時間はゆうに楽しめます.
    • 本書をすすめると,大抵の学生さんがまず「高い」と感じるようです. しかし,これほど上質の,普遍的な価値のある本がたった二万円弱で買える(※)なんて非常に幸せなことだと思いませんか.情報あたりの単価を考えたら安すぎて申し訳なくなるくらいです. 本気で研究をする気のある人なら何をおいても買う価値はあると保証します。
      (※)以前は「一万円ちょっと」と書いていたのですが,第4版になって「二万円弱」となりました.それでもまだ安いですね.

      追記情報:
      • 本書の英語訳が EDM(Encyclopedic Dictionary of Mathematics) という名でMIT Pressから出版されています。 
      • Mathworld: E. Weisstein主宰のオンライン数学辞典(英語).

    •  小松勇作:数学 英和・和英辞典,共立出版.¥3,780.
      コンパクトなわりに収録語の豊富な数学英語辞典です.巻末付録にある数式・文字の読み方も便利です. 和英の配列がローマ字なのが少々引きづらいかも.

      研究室に入って英語の専門文献を読むときには,通常の英和辞典だけでは絶対に不十分です. 数学的な意味で用いられている言葉を,数学の知識もなしにいくら頑張って英文解釈しようとしても無駄ですし,一般的な英和辞典だけを使ってセミナー等の準備をしたとしても,準備をしたうちには入りません. 必ず本辞典か,それに類した専門的な英和辞典で調べてください.特に,難しい単語よりむしろ日常英語でも使うような易しい単語が要注意です。 日常的な意味かと思ったら数学的な意味だったり,またその逆であったりするからです.
      最初はとにかく専門的な辞典を手元において,丹念に調べていくしか道はありません. 数学で使う語彙はさほど多くはなく,しばらく続ければすぐに辞書不要になりますので,頑張ってください.

    • Longman Dictionary of Contemporary English, Longman (ロングマン英々辞典)
      英和・和英辞典を持っていない人はいないと思いますが,英々辞典も必ず一つは入手して下さい。 英語←→日本語の対応関係を知ることと,英語の意味を英語のまま理解することとは本質的に次元の異なる作業だからです。 特に英語で文章を書くようになったら英々辞典は必携です。 和英辞典で引いた単語を並べただけでは英文を書いたうちには入りません(ネット翻訳などもってのほかです).
      Longmanの辞書では語義説明に使われる単語が約2,000語のDefining vocabularyに限られており,説明文も外国人学習者にとって平易なものになるように配慮されています。 この特徴は,自分が単語を調べるときに理解しやすいというだけでなく,他人に平易な英語で説明することを心掛けるためのトレーニングとしても役立つでしょう。

       ※このほか、Oxford Advanced Learner's Dictionary(OALD)もLongmanと並んで定評のある良い辞書です。Longmanがスラスラ理解できるようになったら,OALDと併用 して二通りの説明を読むようにするとよいでしょう.言葉をより深く、より立体的に捉えられるようになると思います。

    【数学基礎】

    • 斎藤正彦:線形代数入門,東大出版.
      線形代数の教科書を持っていない人はいないでしょうが,これからなにか新しく買う一冊勧めるとすれば本書です.説明が詳しく例題が豊富です.本書も多くの学部で一般教養の教科書として使われているようです。線形代数ができないとお話になりませんので復習は確実に.

    • 高木貞治:解析概論,岩波書店. 
    • 杉浦光夫:解析入門I,II,東大出版. 線形代数の場合と違い,解析学に関しては一般教養で学ぶいわゆる「微分積分」の内容では概して不十分で,少し上のレベルを自習する必要があると意識して下さい.工学系では積分や微分方程式の算法に時間が割かれる(あるいは,そういったところだけ覚えている)ことが多いように見受けられますが,研究で必要になるのはその背後にある連続,極限,絶対収束,一様収束などの基礎概念,そしてそれらを統べる「論理」の方です.上記2書はこのあたりをしっかり学ぶためのバイブル的存在です(本来はどちらも一般教養の教科書ですが…).『解析概論』は講義のようなライブ感と文語文の格調があり,旧制高校の学生になったような気分が味わえます.『解析入門』は解説が徹底的に詳しくじっくり自習するのに向いています.
    • 高橋礼司:複素解析,東大出版
    • 杉山昌平:ラプラス変換入門,実教出版
    • アールフォルス:複素解析,現代数学社

    【制御工学の基礎(線形制御)】

    • 杉江,藤田:フィードバック制御入門,コロナ社.
    • 片山徹:フィードバック制御の基礎(新版),朝倉書店.
    • 須田信英:線形システム理論,朝倉書店.
    • 前田,杉江: アドバンスト制御のためのシステム制御理論,朝倉書店.
    • 児玉,須田:システム制御のためのマトリクス理論,コロナ社.
      制御理論に必要なマトリクス理論を網羅したすばらしい本なのですが,残念ながら絶版です.所属する研究室や図書館に置いてある人は幸運です.

    【非線形制御】

    • Isidori: Nonlinear Control Systems, 3rd eds., Springer-Verlag.
    • Isidori: Nonlinear Control Systems II, Springer-Verlag.
      難しさ:★★★★ 非線形制御の理論をやる人は必修.多様体論の基礎知識が前提
    • Khalil: Nonlinear Systems, 2nd eds., Prentice-Hall.
      難しさ:★ 専門を問わずどなたにでも
      説明が詳細でわかりやすく,独習に向いています.非線形の素人さんにとりあえず一冊おすすめするならこれです。

    • Vidyasagar: Nonlinear Systems Analysis 2nd Ed., Prentice-Hall,1993.
      難しさ:★★
      数学的にきちんと書かれた非線形システム論の教科書です。予備知識はたいして要りませんが、理論への情熱と忍耐力は必要です。特徴としては、
      • 微分方程式の解の取り扱い、それからLyapunovの安定性の議論に多くのページ数を費やしている
      • 信号とノルムの取扱が厳密。それだけに準備が長い
      • マトリクスメジャーと時変系の安定論についてきちんと書かれている
      • 最後の方に厳密な線形化とFrobeniusの定理も触れられていますが、ここをきちんと勉強したいならIsidoriの本を読んだほうがいいです。


    【力学・ロボティクスの基礎】

    • 有本卓:新版 ロボットの力学と制御,システム制御情報ライブラリー,朝倉書店,2004.
    • 吉川恒夫:ロボット制御基礎論,コンピュータ制御機械システムシリーズ,コロナ社, 1988.
    • 広瀬茂男:ロボット工学ー機械システムのベクトル解析ー,裳華房. 
    • Spong & Vidyasagar:Robot Dynamics and Control, John Willey & Sons.

      ロボットをやるならば, 上のうち少なくとも一冊は必修.内容は、だいたい90年頃までに確立されたロボット制御の基礎理論です (ベクトル解析,機構の表現形式,順・逆運動学,順・逆動力学/フィードバック線形化,軌道追従制御,適応制御など。) ロボット業界は裾野が広くて意思の疎通に苦労することもありますが、 少なくともこのあたりまではおおむねどの研究者にも通じる共通言語だと思います。

    • Goldstein (+Poole+Safko): Classical Mechanics, 3rd ed., Prentice-Hall.
      邦訳: ゴールドスタイン:古典力学, 物理学叢書 吉岡書店.
      第1版が出たのは1950年代と非常に古く,現在は後継者らが加筆して第3版まで出ています。 同じく吉岡書店から演習問題の解説書も出版されています。 解析力学をカンペキに理解したい人は避けて通れない定番中の定番ですが,読むにはそれなりに腰を据える必要があります.力学の教科書はそれこそ星の数ほどありますので,もっとやわらかい本で理解を助けながら読むとよいかもしれません.

    • V.I.Arnold: Mathematical Methods of Classical Mechanics, 2nd ed., Springer-Verlag.
      邦訳: アーノルド:古典力学の数学的方法,岩波書店.
      私が個人的に好きな本です。主に幾何学的な観点から古典力学を総括した傑作です。 ニュートン力学,ラグランジュ力学,ハミルトン力学の三部構成で,これを読むと古典力学のすべてがスッキリと頭の中に収まります。 少々アドバンストですが,これは古典力学と数学(多様体論,ファイバー束,Lie群論など)の知識をある程度前提にしているという意味であって,既にこういった知識を持っている人にとってはむしろ易しい本と言えます。 また、Springerから出ている英語版ももともとがロシア語からの英訳なので、 わりあい平易な英語で書かれていて読みやすいです。



    【論文を書くために】

    • 奥村晴彦:LaTeX2ε美文書作成入門(技術評論社)
      研究室で論文を書く以上は,なにがしかのTeXのガイドブックを手元においておくことをおすすめします. とりあえずの一冊目として本書をお勧めしますが、 この他にも
      • 伊藤和人:LaTeXトータルガイド(秀和システムトレーディング)や
      • 中野:日本語LaTeX2εブック,ASCII. ¥2,039
      など他にも良い本はいろいろあります。 
    • インターネット上では奥村晴彦先生の日本語TeX情報のページが定番です。
    • 一つ強調しておきたいのは,TeXはたんなる数式ワープロではない、MS-WORDその他の(WYSIWIGな)ワープロソフトの代替品ではないということです. 「WORDの数式エディタでも習熟すればきれいな数式は書けるのだから、見た目は同じじゃないか」という人がいますが、それは間違いです。 TeXとワープロではそもそも思想が違うのです。 TeXはMarkup Languageという、文書(あるいは版組)を構造的に記述する一種の言語処理系であって, これで論文を書くためには「その論文の構造」を論理的に理解している必要があります. 逆に、TeXの言語使用やスタイルを正しく守って書いていると、自然にきちんとした文書が書けるようになるのです。 TeXは決して初心者にとっつき易いものではありませんが,使うことによってユーザーを成長させてくれるソフトウェアなのです.
      TeXに限らず,多くの優れたソフトウェアにはこのようにユーザを成長させる効能があるものです。 emacs然り, perl然り, unix然り。 その多くが百人の凡人ではなく一人の天才によって設計されたもの,という点で共通しているのは興味深いことだと思います。

    • 小林,小林:LaTeXで数学を─LaTeX2ε+AMS-TeX入門,朝倉書店.
    • 嶋田:LaTeX2εまるごと数式,株式会社ディー・アート.
      数学をバリバリ使った論文を書き始めると,ふつうのLaTeXのスタイルだけでは物足りなくなってきます. そこでAMS-TeXというパッケージの使い方をおぼえると数学の表現能力が飛躍的にアップします.(かつてAMSは追加のインストールが必要でしたが,現在ではデフォルトのLaTeXに含まれていますので,特段AMSを意識しなくてもよくなりました).