目的
私的にクォータニオンをPython上で使ってみたかったので、情報をまとめてみました。
(解説見ても、結局どう使えばいいのかわからなかったので、自分用に使い方をまとめています。詳しい情報を知っている方は教えていただけると幸いです。)
インストールについては、
pip install pyquaternion
で個人的にできたが、その他に_numpy_とか入れる必要があるらしいので、それは他のところで調べてください。
クォータニオン概要
クォータニオンは三次元の物体の姿勢を表現するのに適した考え方らしい。
個人的なイメージとしては、二次元での複素数(実部とか虚部とかのあれ)を三次元に拡張したもの。
すごいのは、姿勢を変えるのに掛け算するだけで済むというのでぜひ使って見たいのだが...
そもそも姿勢って、どうやって表現するの?
という疑問から始まってる。
クォータニオンの使い方
注意:変数はこの章の間は引き継がれます
三つの虚部が回転軸を、一つの実部がその回転角を表しているらしい。
pythonで定義するには
from pyquaternion import Quaternion
q1 = Quaternion()
とすることで、方向も回転角度もない状態のクォータニオンが得られる...
以下に一般的なクォータニオンの定義の仕方について、自分で使うだろうなといものを以下に記す。
# Quaternion(axis=[x, y, z], (degrees|angle)=(度数法|弧度法))
q1 = Quaternion(axis=[1, 1, 0],degrees=90)
q1 = Quaternion(axis=[1, 1, 0],angle=3.14159265/2) # πの値はちゃんととってこようよ
この値を別のクォータニオンにかけることで、回転させることができる。
そして、大混乱中の僕でも、ベクトルを回転させたいのであれば以下のようにできる。
>>> v = [1,0,0]
>>> v_rot = q1.rotate(v)
>>> print(v_rot)
[0.5000000000000001, 0.4999999999999998, -0.7071067811865475]
多分だいたいあってる。
これで、ベクトルの回転を軸と回転量から計算することが簡単にできるようになった。
具体的な使い方
例えば、x軸に90度、y軸に120度回転させたいなと思ったら
>>> q1 = Quaternion(axis=[1, 0, 0],degrees=90)
>>> q2 = Quaternion(axis=[0, 1, 0],degrees=120)
>>> q3 = q2*q1 #q1の回転を先に行いたいのであればこの順番
>>> v_rot = q1.rotate(v)
>>> print(v_rot)
[-0.4999999999999999, 0.0, -0.8660254037844388]
こんな感じで、表せます!
クォータニオンの壁
ベクトルとクォータニオンには共通して、向きを定義することができます。が大きな違いとして、クォータニオンはその姿勢をも定義する事ができる。
なので、是非ともその姿勢とやらをクォータニオンでグリグリ動かしてやろうと思ったのですが...これがよくわからなかった
姿勢をクォータニオンで表すってなに?
ここまでのイメージだと、回転軸の方向をその物体の向き、そして、どれだけ回転してるかを__degrees__として表すのかと思い、以下を定義
posture = Quaternion(axis=[1, 0, 0],degrees=0)
これで、x軸方向に回転していない状態のクォータニオンを定義てきたぞ!って思い色々出力してみると...
>>> posture.axis
array([0., 0., 0.])
>>> posture.degrees
0.0
!!?
あれ、方向ベクトルは何処へ?ってなりましたが、中身見ているとどうやら、
クォータニオンにおいて回転しない場合、そもそも方向成分が消え失せる
ということがわかりました。なるほど、確かに回転しないのであれば、軸の情報はいらないよな...
でも、だったらどうすれば、姿勢を表せるの?(ベクトル二つ使えばできそうだが、それは絶対にやりたくなかった)
結論
結論は簡単な話で、方向ベクトルみたいなわかりやすい姿勢クォータニオンなどというものがあるわけではなく、その変化の分だけを追っていけば良いというものでした(自分の中で、まとめて見た感じです。)
つまり、これが今の状態を表すクォータニオンだ!というものがあるわけではなく、最初の状態はよくわからんけど、__最初の状態と比べるとこれだけ変化したよ!__というものが常にわかるということと判断しました。
この辺りの認識は当然なのでしょうか?少なくとも、無学な状態でWeb上を検索して漁っていく課程ではなかなかわかりませんでした。
もし、困っている人がいたら、認識の手助けになってくれると幸いです。
お疲れ様でした