状態:ドラフト(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. 図:このシリーズのサンプルアーム
サンプルアームは人間の腕に近い構造です。
- 1番関節は垂直軸を回る肩ヨー、2・3番は同じ方向で平行な肩ピッチと肘ピッチです。この3つがラケットの 位置を担当します。
- 4・5・6番は3つの軸が1点で交わる球面手首(spherical wrist)です。この3つがラケットの 向きを担当します。3つの軸が交わる点を手首中心と呼びます。
- 長さは d1 = 0.30、a2 = 0.40、d4 = 0.35、d6 = 0.15 m です。d6 は手首中心からラケット面中心までです。腕を真っ直ぐ伸ばすと、肩から手首中心まで 0.75 m です。
オープンハードウェアとしては、この構造の代わりに 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個においてラケットの中心位置とラケット法線の向きがどれほどずれるかを測定しました。
| 誤差の原因 | 位置誤差 中央値/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° |
- リンク長の誤差は位置のみを変更し、向きは変更しません。長さは角度を変更しないためです。
- 関節のゼロ点の0.1°は位置としては1 mm前後ですが、 向きとしては0.1~0.2° になります。第7回では、ラケットの法線が1°傾くとボールの着地地点が中央値で6 cm逸れると測定しています。ゼロ点誤差だけでも1 cm前後が失われることになります。
- 14ビットエンコーダーであれば量子化は無視できます。12ビットも位置には十分ですが、向きの0.04°が累積誤差の一因となります。
5. 制限
- 関節とリンクを剛体とみなしました。ベルト・減速機のバックラッシュや弾性、たわむリンクは順運動学の範疇外の誤差であり、測定していません(未測定)。
- 誤差を互いに独立な一様分布として投入しました。実際の補正誤差は互いに絡み合っており、大きさが異なる場合があります。
- CraigやSiciliano以外の教科書がどのようなDH表記法を採用しているかは、本文を開くことができず確認できませんでした(未確認)。
6. まとめ
- 順運動学は関節角からラケット姿勢に至る簡単な方向であり、第4・5・9回のすべての計算における検算ツールです。
- DHはリンクごとに4つの数字、PoEはゼロ姿勢の1枚と関節軸6本で同じアームを表します。両方の方法は10⁻¹⁶のレベルで一致しました。
- 球面手首は手首中心を固定することで、逆運動学を分割して解くことを可能にします。
- ハードウェアの観点からは、エンコーダーの分解能よりも 関節ゼロ点の補正のほうがラケットの方向誤差により大きく影響します。
ティティの一言。 定規を6回あてればラケットの位置がわかるよ。だけど、定規の0点が0.1°ずれただけでもボールは1 cmほど違うところに行ってしまうから、ゼロ点合わせは絶対に最初にしてね!
参考
すべての資料は2026-10-18に閲覧しました。
- Lynch, Park, Modern Robotics, 2017, 公開プレプリント、第4章 順運動学(4.1 PoE、式4.14)、付録C(DHパラメータ)。
- D'Ambrosioほか, Achieving Human Level Competitive Robot Table Tennis, arXiv:2408.03906、II-A節(アームとガントリーの構成)。
- Craig, Introduction to Robotics: Mechanics and Control 第4版(Pearson)、Sicilianoほか, Robotics: Modelling, Planning and Control(Springer 2009):出版社ごとの章リストのみ確認、本文未確認。