このページでは、せっかく配布されているKNOPPIXをロボット工学の助けに使わない手はないということで、活用法をまとめていきます。
なお、このページの例は、
変数の名前を適当につけていたため、ちょっと分かりにくいかも知れませんが、
もっとも、本来コンピュータは数値計算は得意ですが、数式をそのまま処理するということは容易ではありません。数式の解釈や展開、単純化は簡単ではないのです。 しかし、KNOPPIX EduTGに含まれているMaxima(xmaxima)というソフトウエアが数式処理をしてくれますので、この講義で出てきた演算を例につかってみます。
XMaximaは起動後、メニュー→数学演習→xmaximaで起動します。
下半分には簡単な使い方がでます。青い表示の数式をクリックするとその演算が実行されます。
解説文は英語ですが、微積の使い方などはすぐにわかるとおもいます。
ここではそれらは飛ばして、実際に行列演算をやってみます。
参考:Maximaのマニュアル@狸穴
まず、行列を定義します。Maximaでの行列は
さて、上の例題の通りの定義は
まず、Z軸回りの回転(0→1)の角度をφ(phi, ファイ)として、
角度(φ, θ, ψ)で表される回転を総合して得られる回転行列は、
A:
検算例:
次に、せっかくなので検算も行ってみます。
Q:
θ1およびθ2で回転させる行列
に対して、
を計算し、結果を論じよ。
A:
計算については
の結果を論じることは無理としても、計算だけやらせてみます。
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は積和公式などで単純化を試みる)。
ここまでの実行例を下に示します。
上記オイラー角での回転を数式で考えてみましょう。
となります。ただし、
と置き換えています(この先面倒なので)。
つぎにX軸回り(1→2)の角度をθとして、
を得ます(同じ置き換えパターン)。最後のZ軸回り(2→3)の角度をψ(psi, プサイ)として、
となります。
となります。
これをXMaximaにかけてみます。
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,B,Cとおき、しかも、cos(θ)をBCとおいています。
これは小細工で、maximaがこちらの意図とは関係なく、アルファベット順に変数を並べてしまうため、角度順に並ぶように敢えてこういう表記をしました。
結果は、右図のようになりました。良く見比べると、式が一致していることが確認できます。
(xmaximaがあっていたのではなく、このページがあっていた、といったほうがいいかも。
もちろん、xmaximaの使い方が正しかったとも言えます。)
Q:
Z-Y-Xの順番で回転させるロールピッチヨー角回転変換の変換行列
を求めよ。
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));
結果:
ここでは、行列R03をR01,R12,R23の積としてまず定義しています。
結果は前と同じ意味ですが、大きくなり過ぎたので列ごとに分解されて表示されたようです。
次に、ROWで行列の行を抜いてきます。ROW(R03,1)でR03の1行目がとれます。
これを二つとって内積をとると、回転行列なので1になるはずです。
ただ内積をとるとごちゃっと出てきますが、簡略化の処理、TRIGSIMPを使用すると1になります。
異なる行(ここでは1と2)を取ってきて内積をとった場合は0になります。
ROWのかわりに列をとるCOLを使っても、同列なら1、異列なら0になります。