3次元空間に存在する物体の姿勢を表現する際によく使われるのがロール角(Roll)、ピッチ角(Pitch)、ヨー角(Yaw)です。ロボット工学、ドローン制御、モーションキャプチャ、3Dゲーム開発などでは、複数の座標点から物体の向きを計算する場面が頻繁にあります。本記事では、3点の座標からロール・ピッチ・ヨー角を求める考え方と具体的な計算手順について解説します。
3点の座標だけで姿勢は求められるのか
結論から言うと、3点が同一直線上に存在しない場合は、ロール角・ピッチ角・ヨー角を求めることが可能です。
なぜなら3点が与えられると、その物体固有の平面を定義できるためです。
例えば点A、点B、点Cの座標が既知であれば、AB方向ベクトルとAC方向ベクトルを計算でき、その外積から物体の法線ベクトルを求められます。
この情報を利用することで物体の姿勢を表す回転行列を構築できます。
まずは物体の座標軸を作る
物体座標系を定義するために、3点を以下のように利用します。
| 点 | 役割の例 |
|---|---|
| A | 原点 |
| B | X軸方向 |
| C | XY平面を決定 |
まずX軸方向ベクトルを求めます。
X = (B - A) / |B - A|
続いて補助ベクトルを求めます。
V = C - A
そして法線ベクトルZを外積で求めます。
Z = X × V
最後にY軸を求めます。
Y = Z × X
これらを正規化すると物体座標系が完成します。
回転行列を作成する方法
求めたX軸、Y軸、Z軸ベクトルを並べることで回転行列Rを構成できます。
R = [X Y Z]
具体的には次の形になります。
R = [[r11,r12,r13],[r21,r22,r23],[r31,r32,r33]]
この回転行列は物体の向きを完全に表しています。
実際のロボット制御やCGプログラムでは、この回転行列からオイラー角へ変換する処理が一般的です。
ロール角・ピッチ角・ヨー角の計算式
一般的なZYX順序(Yaw→Pitch→Roll)のオイラー角の場合、回転行列から以下のように求められます。
| 角度 | 計算式 |
|---|---|
| Yaw(ヨー) | atan2(r21,r11) |
| Pitch(ピッチ) | atan2(-r31,sqrt(r32²+r33²)) |
| Roll(ロール) | atan2(r32,r33) |
これらの結果は通常ラジアンで得られるため、必要に応じて度数法へ変換します。
角度(度) = 角度(ラジアン) × 180 / π
実際の計算例
例えば次の3点が与えられたとします。
A=(0,0,0)
B=(1,0,0)
C=(0,1,0)
この場合、物体座標系は世界座標系と一致します。
そのため回転行列は単位行列となり、ロール角、ピッチ角、ヨー角はすべて0度になります。
もしCのZ座標が大きくなると平面が傾き、その傾きに応じてピッチ角やロール角が変化します。
計算時の注意点
3点が一直線上に並んでいる場合は平面を定義できないため姿勢は一意に決まりません。
またオイラー角にはジンバルロックと呼ばれる特異点問題があります。
ピッチ角が±90度付近になると計算が不安定になるため、高精度な姿勢制御ではクォータニオンを利用することも多くあります。
ただし一般的な姿勢表示やロボットの角度計算では、オイラー角でも十分利用できます。
まとめ
3次元空間上の3点の座標からロール角・ピッチ角・ヨー角を求めることは可能です。まず3点から物体座標系を構築し、X軸・Y軸・Z軸ベクトルを求めます。その後、回転行列を作成し、オイラー角変換式を利用することで各角度を計算できます。
ロボット工学や3D計測では非常に重要な技術であり、基本となるベクトル演算と回転行列の理解ができれば、さまざまな姿勢推定問題に応用できるようになります。

コメント