TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

順運動学:DHパラメータと指数積(PoE)、2リンク平面アームと3軸手首

状態:ドラフト(2026-10-18)、実測。 数値はノートPC(Apple M1 Max、macOS 26.5)のPython 3.9.6・numpy 2.0.2で直接計算しました。 時間は7回繰り返した際の中央値(初回は除外)です。生データとコード:作業ディレクトリ measure/robot-arm-basics/の arm.py, m03_fk.py, out/m03_fk.json。サンプルアームは仮想的な設計であり、実ロボットで測定した値はありません(ハードウェア未測定)。参考資料は2026-10-18に閲覧しました。 作成ルール:実測データを基本とし、測定できなかったものは「未測定」、確認できなかったものは「未確認」と表示します。

目次

1. 直感:簡単な方向から

アームの関節角がすべて分かれば、ラケットがどこにあるかは一意に決まります。肩から肘まで定規をあて、肘から手首までもう一度定規をあてる作業を繰り返せばよいのです。これが順運動学(forward kinematics)です。答えが常に1つであり、計算が短いです。

反対の方向、すなわち「ラケットをあそこにその角度で置くには、関節を何度にすればよいか」は、答えが複数あったり存在しなかったりするため、はるかに難しくなります。それが第4回の逆運動学です。順運動学をまず正確に構築しておいてこそ、逆運動学的の答えを検算することができます。

2. 図:このシリーズのサンプルアーム

예제 팔: 6축 팔꿈치형 + 구형 손목(옆에서 본 모습) 1 요(수직축) 2 어깨 피치 3 팔꿈치 피치 4·5·6 손목 d1 = 0.30 a2 = 0.40 d4 = 0.35 d6 = 0.15 라켓 i a α d θ 1 0 +90° 0.30 θ1 2 0.40 0 0 θ2 3 0 +90° 0 θ3 4 0 −90° 0.35 θ4 5 0 +90° 0 θ5 6 0 0 0.15 θ6 길이 단위 m. 표준 DH. 손목 세 축이 한 점(손목 중심)에서 만난다.
図:6軸肘型アームと球面手首。リンク長とDHテーブル

サンプルアームは人間の腕に近い構造です。

オープンハードウェアとしては、この構造の代わりに 2軸直交ガントリーの上に2~3軸手首を載せる設計も有力な候補です。Google DeepMindのシステムも6軸産業用アームを2軸線形ガントリーの上に載せています(arXiv:2408.03906 II-A節)。ガントリーは順運動学と逆運動学がほとんど足し算だけで済むため、第4回でその利点を別個に計算します。

3. 計算

3.1 2リンク平面アーム

リンク長 L1、L2、関節角 q1、q2 の平面アームの先端点は次のとおりです。

x = L1·cos q1 + L2·cos(q1 + q2)
y = L1·sin q1 + L2·sin(q1 + q2)

この式は、第4回の逆運動学、第5回のヤコビアン、第9回の動力学のすべての出発点となります。サンプルアームの2・3番関節が作り出す平面問題がまさにこれです。

3.2 DHパラメータ

関節が6つあれば、座標系を6回つなぎ合わせる必要があります。DH(Denavit–Hartenberg)表記法は、リンクごとにわずか4つの数字で次の座標系を定義します。

記号 意味
θ_i z軸を回る角度(回転関節であればこれが関節変数)
d_i z軸方向の移動
a_i 新しいx軸方向の移動(リンク長)
α_i 新しいx軸を回る角度(次の関節軸のねじれ)

この記事では「z軸でθ回転しd動き、x軸でa動きα回転する」という順序(一般に標準DHと呼ばれる)を使用します。教科書によっては順序と添字が異なる修正DHもあります。Modern Roboticsの付録Cは α_{i−1}、a_{i−1}、d_i、φ_i の順序で定義しています。同じアームであっても表記法が異なると表の数値が変わるため、 表を他人から受け取った場合は表記法から確認する必要があります。

def dh_T(a, alpha, d, th):            # 표준 DH: Rz(θ)·Tz(d)·Tx(a)·Rx(α)
    ct, st, ca, sa = cos(th), sin(th), cos(alpha), sin(alpha)
    return np.array([[ct, -st*ca,  st*sa, a*ct],
                     [st,  ct*ca, -ct*sa, a*st],
                     [0,   sa,     ca,    d   ],
                     [0,   0,      0,     1.0 ]])

def fk_dh(q):
    T = np.eye(4)
    for (a, alpha, d), qi in zip(DH, q):
        T = T @ dh_T(a, alpha, d, qi)
    return T                            # 라켓 좌표계 {E} 를 로봇 바닥 {B} 에서 본 4×4

3.3 指数積(PoE)

DHはリンクごとに座標系を定める必要があり、その定めるルールが厄介です。指数積(product of exponentials, PoE)公式は座標系を2つしか使いません。ベース座標系と、すべての関節が0のときのラケット姿勢 M です。そして関節一つひとつを「ある軸を中心として回る螺旋運動(screw motion)」とみなします。

T(q) = e^[S1]q1 · e^[S2]q2 · … · e^[S6]q6 · M

S_i = (ω_i, v_i),  ω_i = 관절 축 방향 단위 벡터,  v_i = −ω_i × p_i  (p_i 는 축 위의 아무 점)

すべての S_i と M は ゼロ姿勢の1枚を見るだけで 書き下ろすことができます。Modern Robotics第4章の空間形式のPoE式(4.14)がこれであり、同書はリンク座標系が不要である点を利点として挙げています。指数行列にはロドリゲスの公式による閉じた形が存在します。

def exp6(S, th):
    w, v = S[:3], S[3:]
    W = skew(w)
    R = np.eye(3) + sin(th)*W + (1 - cos(th))*W@W
    G = np.eye(3)*th + (1 - cos(th))*W + (th - sin(th))*W@W
    T = np.eye(4); T[:3, :3] = R; T[:3, 3] = G @ v
    return T

このシリーズのコードは、S_i と M を手で書き下ろすのではなく、DHテーブルからゼロ姿勢の座標系を計算した上で各関節のz軸と原点から抽出しました。これにより、両方の方法が同じアームを表しているかを即座に検算できます。

3.4 球面手首と手首中心

手首の3つの軸が1点で交わると良いことが起こります。4・5・6番の関節がどれだけ回っても、 手首中心の位置は変わりません。 手首中心は1・2・3番の関節だけで決まり、ラケット姿勢から手首中心を逆算するのも簡単です。

손목 중심 = 라켓 중심 − d6 · (라켓 법선 방향, 곧 R 의 셋째 열)

第4回はこの性質を利用して、6軸の逆運動学を「位置3つ」と「向き3つ」に分割して閉じた式で解きます。

4. 実測

4.1 DHとPoEは同じ答えを出すのか

関節角を −π から π の間でランダムに10,000回抽出し、2つの関数の4×4の結果を要素ごとに比較しました。

項目 値
最大要素差 5.6×10⁻¹⁶
ゼロ姿勢 M(位置) (0.40, 0, −0.20)m、ラケット法線は下向き(−z)

差は float64 の丸め誤差レベルです。ゼロ姿勢でラケットが床より下(−0.20 m)にあるのは、肘の角0が前腕を垂直に下ろした姿勢だからです。実際のロボットでは、この「0の意味」 エンコーダーのゼロ点と合わせることがキャリブレーションの最初のステップとなります(4.3節)。

4.2 計算時間

計算 1回(µs)
2リンク平面の閉じた式(純粋なPython) 0.41
6軸DH(numpyによる4×4の乗算6回) 15.2
6軸PoE(numpy、指数行列6個) 71.7
6軸ヤコビアン(第5回、DH座標系において) 102.6

PoEはDHよりも約4.7倍遅くなりました。関節ごとにサイン・コサインのほかに3×3行列の乗算と足し算を何度も行うためです。1 kHzの制御周期は1,000 µsであるため、Pythonでも両者ともに十分に高速です。マイクロコントローラーに移植する際は、DHのようにあらかじめ展開した式が有利になると考えられます(未測定)。

4.3 小さな誤差はラケット先端でどれくらいになるか

順運動学が正確であっても、アームの実際の寸法やエンコーダーが狂っていれば意味がありません。4つの誤差を投入し、ランダムな姿勢5,000個においてラケットの中心位置とラケット法線の向きがどれほどずれるかを測定しました。

작은 오차가 라켓 끝에서 몇 mm 가 되나 링크 길이 ±1 mm 0.98 / 1.94 관절 영점 ±0.1° 0.62 / 1.43 엔코더 12비트 0.27 / 0.65 엔코더 14비트 0.07 / 0.16 0 0.5 1 1.5 2 라켓 중심 위치 오차(mm). 막대는 중앙값, 가는 선 끝은 95백분위.
図:リンク長、関節ゼロ点、エンコーダー分解能の誤差がラケット位置誤差に波及する大きさ
誤差の原因 位置誤差 中央値/95% 法線方向誤差 中央値/95%
リンク長 ±1 mm(一様分布、関節ごとに個別) 0.98 / 1.94 mm 0°
関節ゼロ点 ±0.1° 0.62 / 1.43 mm 0.09 / 0.19°
エンコーダー 12ビット(4,096分割/回転)量子化 0.27 / 0.65 mm 0.04 / 0.08°
エンコーダー 14ビット(16,384分割/回転)量子化 0.07 / 0.16 mm 0.01 / 0.02°

5. 制限

6. まとめ

ティティの一言。 定規を6回あてればラケットの位置がわかるよ。だけど、定規の0点が0.1°ずれただけでもボールは1 cmほど違うところに行ってしまうから、ゼロ点合わせは絶対に最初にしてね!

参考

すべての資料は2026-10-18に閲覧しました。

ログインするといいねできます

コメント

まだコメントはありません。

ログインするとコメントできます