東北学院大学工学部でIT教育の試みの一つとして配布した
KNOPPIX EduTG
は、CD一枚から立ち上がる、OS(Linux)と様々なアプリケーションプログラムをセットにしてドイツで開発されたKNOPPIXをつくばで日本語化したものに、さらにIT教育委員会の要望を組み込んで開発されたものです。
そのため、一般的なKNOPPIXには含まれていないものの工学部で使いそうなツールも搭載してあります。
このページでは、せっかく配布されているKNOPPIXをロボット工学の助けに使わない手はないということで、活用法をまとめていきます。
なお、このページの例は、
主要アプリケーションの一つであるOpenOfficeに含まれる表計算ソフト、Calcは簡単なロボット制御シミュレーションができます。
表計算ソフトでシミュレーションをやるときの、基本的な手順です(筆者独断)。
実際に、この車輪移動ロボットのページのアニメーションなどは、OpenOfficeのCalcでまずは動作確認および軌道計算や車輪の回転などを確認して、それを3次元CGソフトのデータに結合してつくっています。そのなかから、円弧走行、
のデータを見てみます。
円弧走行シミュレーションシート (2004/01/13, 42,948 bytes)
変数の名前を適当につけていたため、ちょっと分かりにくいかも知れませんが、
この講義では特に前半、やたらとcos/sinのつまった行列の演算を扱いました。 これらはある程度は手計算でできますが、コンピュータがやってくれるならまかせるにこしたことはありません(もちろん、手を動かすことは重要)。
もっとも、本来コンピュータは数値計算は得意ですが、数式をそのまま処理するということは容易ではありません。数式の解釈や展開、単純化は簡単ではないのです。 しかし、KNOPPIX EduTGに含まれているMaxima(xmaxima)というソフトウエアが数式処理をしてくれますので、この講義で出てきた演算を例につかってみます。
XMaximaは起動後、メニュー→数学演習→xmaximaで起動します。 下半分には簡単な使い方がでます。青い表示の数式をクリックするとその演算が実行されます。 解説文は英語ですが、微積の使い方などはすぐにわかるとおもいます。 ここではそれらは飛ばして、実際に行列演算をやってみます。 参考:Maximaのマニュアル@狸穴
プチテストで出題した問題、
まず、行列を定義します。Maximaでの行列は
A:matrix([a,b],[c,d]); 行列Aを定義 B:matrix([e,f],[g,h]); 行列Bを定義 A+B; A+Bを演算 A.B; 行列積 AB A*B; 注意 これは各要素ごとに乗じる:使えないという感じで演算します。 注意点は行列積でうっかり*をつかうと違う結果になることです。「.」をつかいます。
さて、上の例題の通りの定義は
A:matrix([cos(th1),-sin(th1)],[sin(th1),cos(th1)]); B:matrix([cos(th2),-sin(th2)],[sin(th2),cos(th2)]); A.B;です。 実際にXmaximaの上の枠で入力してEnterすると妥当な結果が得られます(最後の「;」に注意。忘れるとちゃんと動かない)。
TRIGREDUCE(%);と入力します。「%」は直前の結果を使うという意味です。 手を抜かないでやるならば、「TRIGREDUCE(A.B);」とします(TRIGREDUCEは積和公式などで単純化を試みる)。 ここまでの実行例を下に示します。
次は、オイラー角の回転行列です。座標変換のページから抜粋。
まず、Z軸回りの回転(0→1)の角度をφ(phi, ファイ)として、
となります。ただし、
と置き換えています(この先面倒なので)。
つぎにX軸回り(1→2)の角度をθとして、
を得ます(同じ置き換えパターン)。最後のZ軸回り(2→3)の角度をψ(psi, プサイ)として、
となります。
角度(φ, θ, ψ)で表される回転を総合して得られる回転行列は、
となります。
R01:matrix([AC,-AS,0],[AS,AC,0],[0,0,1]); R12:matrix([1,0,0],[0,BC,-BS],[0,BS,BC]); R23:matrix([CC, -CS,0],[CS,CC,0],[0,0,1]); R01.R12.R23;
次はほとんど同じですが、レポートに出したロールピッチヨーの方です。
A:
検算例:
3行:
1行:
2行・3行:
R01:matrix([AC,-AS,0],[AS,AC,0],[0,0,1]); R12:matrix([BC,0,BS],[0,1,0],[-BS,0,BC]); R23:matrix([1,0,0],[0,CC,-CS],[0,CS,CC]); R01.R12.R23;をしてみます。
次に、せっかくなので検算も行ってみます。
検算するには、最終的に1になるか0になるかをチェックしたいので、ACなどの表記ではだめです。
面倒ですが、ちゃんとcos/sinで打ち込みます。
R01:matrix([cos(th1),-sin(th1),0],[sin(th1),cos(th1),0],[0,0,1]); R12:matrix([cos(th2),0,sin(th2)],[0,1,0],[-sin(th2),0,cos(th2)]); R23:matrix([1,0,0],[0,cos(th3),-sin(th3)],[0,sin(th3),cos(th3)]); R03:R01.R12.R23; ROW(R03,1).ROW(R03,1); TRIGSIMP(%); TRIGSIMP(ROW(R03,1).ROW(R03,2));結果: