寄る年波からのクォータニオン学習
千里の道も一歩から。というわけで、仕事の一環でもありますが、クォータニオンの学習中です。クォータニオンとは何か?と言う事を、復習として自分に言い聞かせるように説明してみます。
- 三次元空間上における物体の姿勢を示す、座標変換行列に変わるものとして使用する。変換行列に対して、姿勢に関する制限(=ジンバルロック)が無く、クォータニオン同士で補間が容易である。
- 1の大きさを持つ単位クォータニオンでは、ある姿勢からある姿勢に変わる回転のみを扱う(=3×3の姿勢行列)。並進も大きさの変化で表現することができる(が、単位クォータニオン+並進で扱ったほうが色々都合が良さそう)
- 概念としては、c=x+yi(iは虚数単位)のような複素数の延長上にあり、虚数空間内でそれぞれ直行するi,j,kという虚数単位を導入し、q=w+xi+yj+zk=q(w,V)(Vはx,y,zのベクトル)のように表現する。q(w,x,y,z)と、4つのパラメータで表されるので四元数(クォータニオン)と呼ばれる。
- クォータニオン同士の掛け算は、A(a,U),B(b,V)とした場合、AB=(ab-U・V,aV+bU-U×V)となる。
- x,y,z軸を中心としたθ[rad]分の回転を表したい場合、クォータニオンはq(cos(θ/2),sin(θ/2)Ve)(Veは回転方向を示す単位ベクトル)
- あるベクトルVa(0,V)(クォータニオンとしてベクトルを表現すると、実部が0になる)をクォータニオンの軸に沿って回転させ、Vbにしたい時は、Vb=q・Va・q^-1のように掛ける。
こんな感じでCGプログラミングに使っていくと良いらしいです。後は、行列←→クォータニオンの相互変換や、クォータニオンの補間操作がワンポイント的に必要になりますね。力学シミュレーションプログラム上で、物体回転操作、回転速度/加速度表現には必須かもしれません。しかし、実部1次元+虚部3次元で、都合4次元の数といわれると、一瞬??、と来ます(^^;;
GPS地図DLスクリプト再燃
さて、しばらく眠っていたqpeGPS地図DLスクリプトですが、ルート探索機能の実装にもちょっと必須になってくるので、今までサボっていたスケール可変機能を追加したいと思います(^^;;
ちなみに、qpeGPSでは、同じ地図フォルダ内にスケールの違う地図を入れておくと、上下キーによってスケールを可変してくれるのだそうですが、実際に試した事はありません・・・・・本当にやってくれるのでしょうか?
尚、ルート探索機能は、市販ソフトのようにスマートなものでは無く
- 専用地図DLスクリプト+点群道路地図変換スクリプトによって専用データに変換(これはPC等であらかじめ作成)
- ルート作成スクリプトに、目標位置、現在位置を座標により入力(ランドマーク登録ファイル等を作って、あらかじめ目標点をいろいろ作るのも手ですね)すると、ルートをトラックログとして出力
- qpeGPS側で、出力されたトラックログをread。目標点までの経路が表示される。
という感じになる予定です。現在のqpeGPSには、ウェイポイントの登録機能が無いのが残念ですね。ただ、ルート作成スクリプト側に自分の進行速度を入力すれば、目標地点までの走行距離と、大体の到着予想時刻を出力するくらいの事は出来そうです。
ここまで来たら、GPSソフトを0から作りそうになりますが、そこまでの労力はまず割けません。Perlではなく、JAVA(J2ME/Jeode?)によるGUI上で動くルート作成プログラム辺りが落とし所でしょうか・・・と、妄想ばっかりが膨らみます。まずPerlで、最後までやり遂げることが先決ですね_| ̄|○ とりあえずは、PerlMagickなる汎用画像ファイル操作モジュールからいじってみることにします。