ステータス:草案(2026-10-18)、実測。 数値はノートPC(Apple M1 Max、macOS 26.5)のPython 3.9.6・numpy 2.0.2で計算した 数値シミュレーション の値です。 関節・アーム・モーターの物理定数は仮定値であり、実際のモーターとコントローラーで測定した値は一つもありません(ハードウェア未実測)。元データとコード:作業ディレクトリ
measure/robot-arm-basics/のm09_control.py,out/m09_control.json。参考資料は2026-10-18に閲覧しました。 作成ルール:実測データが基本であり、測定できなかったものは「未実測」、確認できなかったものは「未確認」と表示します。
目次
1. 直感:追従の2つの方法
前の車に追従するドライバーを考えます。あるドライバーは前の車との距離だけを見ます。遠ざかれば踏み、近づけば離します。常にワンテンポ遅れます。もう一人のドライバーは前の 車のブレーキランプや道路標識を見て、 前の車がどう動くか をあらかじめ知っています。そのため、距離が開く前に踏みます。前者がフィードバック(feedback)、後者が フィードフォワード(feedforward)です。
卓球ロボットの軌跡は第8部ですでにすべて計算されています。毎瞬間の目標位置・速度・加速度が分かっています。したがって、フィードフォワードを使わない理由はありません。 フィードバックはモデルの誤差の分だけ修正すればよいのです。この記事では、その違いがどれほど大きいか、そして制御周期とモーター内部の電流ループがなぜ重要であるかをシミュレーションで測定します。
2. 図:制御の階層
- 軌跡生成器(第8部)が q_r, q̇_r, q̈_r を出力します。
- 位置・速度ループが誤差に応じてトルクを決定し、逆動力学で計算したトルクを加算します。このシリーズのシミュレーションは1 kHzです。
- 電流ループはトルク指令をモーター電流に変換します。ブラシレスモーターのトルクは回転子磁石と直交する方向の電流 i_q に比例するため、3相電流を回転子基準 座標(d・q軸)に変換して i_q のみを制御します。これがFOC(field oriented control、ベクトル制御)です。
オープンソースのモーターコントローラーを見ると、階層ごとに周期が異なります。moteusは位置ループと電流ループの両方をスイッチング周波数(デフォルト30 kHz)で実行するとドキュメントに記載されています。 ODrive 0.6.12のドキュメントでは制御ループの繰り返し回数カウンターについて説明されており、8 kHzの制御ループ周波数を仮定しています。その上のロボットコントローラーは通常、はるかに低速です。Koçら 2018の 卓球ロボットは500 Hzのリアルタイム制御、Google 2023の学習ポリシーは100 Hz、Google DeepMind 2024の低水準スキルは50 Hzで指令を出しました。
3. 計算
3.1 PIDとフィードフォワード
PD: τ = K_p e + K_d ė e = q_r − q
PID: τ = K_p e + K_d ė + K_i ∫e dt
PD + 앞먹임: τ = J q̈_r + b q̇_r + τ_c sign(q̇_r) + K_p e + K_d ė
└ 역동역학(관성·점성·쿨롱 마찰) ┘ └ 되먹임 ┘
ゲインは慣性 J に合わせて目標帯域幅 ω_n で決定しました: K_p = J ω_n²、K_d = 2 J ω_n(臨界減衰)。すべての比較で同じ ω_n = 2π·20 Hz を使用します。
3.2 計算トルク制御
アームに複数の関節がある場合、ある関節の加速度が他の関節に力を与えます(慣性結合)。遠心力・コリオリ力・重力も姿勢ごとに異なります。アーム全体の運動方程式は以下の ようになります。
M(q) q̈ + C(q, q̇) q̇ + g(q) = τ
計算トルク(computed torque)制御はこの式をそのまま用いて結合を相殺します。『Modern Robotics』の式(11.35)がこの形であり、同書では実務において K_i がしばしば 0 に設定されると 記載されています。
τ = M̃(q) (q̈_r + K_p e + K_d ė) + C̃(q, q̇) q̇ + g̃(q) (~ 는 모델 값)
モデルが正確であれば、各関節の誤差は ë + K_d ė + K_p e = 0 という互いに独立した2階微分方程式に従います。
3.3 電流ループ
q軸電流は相抵抗 R とインダクタンス L の1次回路です。PIゲインを K_p = L ω_c、K_i = R ω_c と置くと、回路の極が相殺され、帯域幅 ω_c の1次応答になります。 デジタルコントローラーは測定した電流で計算した電圧を 次の周期に 出力するため、ループ周期に比べて ω_c が大きすぎると、この1周期の遅延によって振動します。
3.4 シミュレーション設定
- 単一関節: 慣性 J = 0.015 kg·m²、粘性 b = 0.02 N·m·s、クーロン摩擦 0.1 N·m、トルク制限 6 N·m。シミュレーションの積分は 20 µs 間隔、コントローラーは周期ごとに位置・速度を 読み取り、計算したトルクを 次の周期に 出力します(1周期の遅延)。
- 基準軌跡: 第8部の打撃軌跡。0.6 rad を 0.12 s で通過し、10 rad/s(加速度 0)に達し、0.1 s 間停止した後、0.1 s 静止。
- 2リンク垂直アーム: リンク 0.40·0.35 m、質量 1.2·0.7 kg、重力あり。2つの関節が同時に 0.15 s でそれぞれ 6·8 rad/s で打撃姿勢を通過し、0.1 s で停止します。この 軌跡の逆動力学の最大トルクは第1関節 39.9 N·m、第2関節 17.4 N·m でした。
4. 実測(シミュレーション)
4.1 コントローラーと制御周期
| 周期 | コントローラー | 最大誤差 | RMS誤差 | 打撃瞬間位置誤差 | 打撃瞬間速度誤差 |
|---|---|---|---|---|---|
| 1 kHz | PD | 8.5 mrad | 5.1 mrad | 4.3 mrad | −0.20 rad/s |
| 1 kHz | PID | 10.3 | 5.1 | −1.0 | −0.22 |
| 1 kHz | PD + フィードフォワード | 0.42 | 0.28 | −0.29 | −0.007 |
| 2 kHz | PD + フィードフォワード | 0.21 | 0.14 | −0.15 | −0.003 |
| 500 Hz | PD + フィードフォワード | 0.86 | 0.46 | −0.58 | −0.014 |
| 200 Hz | PD | 39.9 | 17.5 | −2.6 | 2.25 |
| 200 Hz | PD + フィードフォワード | 34.8 | 14.4 | 1.1 | 3.37 |
- フィードフォワード単体で誤差が20倍以上に減少しました。 PDは誤差が生じないとトルクを出さないため、加速区間を通して遅れをとります。フィードフォワードは必要なトルクを事前に発生させます。
- 積分項(PID)はむしろ逆効果でした。 0.2秒の高速運動において、積分は蓄積されてから遅れて解消されるため、オーバーシュートを引き起こします。積分は重力のように緩やかに変化する バイアスを消去するためのツールであり、高速な軌跡追従のためのツールではありません。
- 周期はほぼ線形に誤差を変化させますが、ある境界を超えると破綻します。 フィードフォワードがある場合、2 kHz → 1 kHz → 500 Hz で最大誤差が 0.21 → 0.42 → 0.86 mrad と2倍ずつ 増加しました。1周期の遅延がそのまま誤差になるためです。200 Hz(5 ms)では 0.12秒の振りの間に制御機会が24回しかなく、フィードフォワードも階段状に出力され、5 msの遅延が 20 Hzのゲインと噛み合って大きく振動しました。打撃瞬間の速度誤差 3.4 rad/s はアーム長 0.5 m でラケット約 1.7 m/s であり、第7部の「0.1 m/s で 10 cm」をそのまま拡大すると、着地点が 1 m 以上外れる大きさです。
ゲインを上げるとどうなるでしょうか。ω_n を 2π·40 Hz に2倍高めたPDは、1 kHzでの最大誤差が 8.5 → 2.2 mrad に減少しましたが、200 Hz では 134 mrad となりほぼ発散しました。 低速ループでゲインを上げることは危険であり、高速ループであってもフィードフォワードには及びません。
モデルが不正確なフィードフォワードも測定しました。慣性を20%小さくまたは大きく見積もったフィードフォワード(1 kHz)の最大誤差は 1.8·1.9 mrad でした。正確なモデル(0.42)よりは4倍劣りますが、 PD(8.5)よりは依然として4倍優れています。
4.2 電流ループの遅延が位置ループに与える影響
上記の実験では、指令されたトルクが即座に出力されると仮定していました。実際には、電流ループがトルクを生成するのに時間がかかります。トルクが帯域幅 f_i の1次遅延として出力されると 仮定し、1 kHz PD + フィードフォワードの誤差を再測定しました。
| 電流(トルク)帯域幅 | 最大誤差 | RMS誤差 | 打撃瞬間速度誤差 |
|---|---|---|---|
| 遅延なし | 0.42 mrad | 0.28 mrad | −0.007 rad/s |
| 1,000 Hz | 0.46 | 0.31 | −0.007 |
| 300 Hz | 0.58 | 0.35 | −0.009 |
| 100 Hz | 0.90 | 0.48 | −0.014 |
| 50 Hz | 1.42 | 0.68 | −0.021 |
電流ループの帯域幅が位置ループの周期(1 kHz)と同程度であればほとんど差はなく、100 Hzを下回ると誤差が2〜3倍になります。「内側のループは外側のループよりも 十分に高速でなければならない」という階層制御の原則を示すのがこの数値です。
4.3 電流ループ自体:30 kHzでどれくらい高速化できるか
相抵抗 0.2 Ω、インダクタンス 100 µH の q軸電流を 30 kHz のPIで 10 A ステップ応答させました(電圧制限 48 V、1周期遅延)。
| 目標帯域幅 | 10→90%立ち上がり時間 | 理想的な1次応答 | オーバーシュート |
|---|---|---|---|
| 500 Hz | 578 µs | 700 µs | 0% |
| 1 kHz | 212 µs | 350 µs | 0% |
| 2 kHz | 63 µs | 175 µs | 16.5% |
| 4 kHz | 30 µs | 88 µs | 84% |
| 8 kHz | 17 µs | 44 µs | 200% |
目標帯域幅がループ周波数の1/15(2 kHz)を超えるとオーバーシュートが生じ、1/4(8 kHz)では事実上発振しました。1周期の遅延(33 µs)が位相を削るためです。そのため、30 kHzの電流ループで得られる実用的な帯域幅は1〜2 kHzであり、その上の位置ループは数百Hz〜1 kHz、さらにその上のロボットポリシーは数十〜数百Hzとなります。 階層ごとに約10倍ずつ遅くなる構造になっています。
4.4 2リンクアーム:結合と重力
| コントローラー(1 kHz、トルク制限 60 N·m) | 最大誤差 | RMS | 打撃瞬間位置/速度誤差 |
|---|---|---|---|
| PD | 41.0 mrad | 20.0 | 30.7 mrad / 0.95 rad/s |
| PD + 重力補償 | 37.8 | 18.8 | 27.9 / 0.92 |
| 計算トルク(正確なモデル) | 1.7 | 0.83 | 1.0 / 0.11 |
| 計算トルク(質量 20%小) | 10.5 | 4.7 | 8.4 / 0.28 |
| 計算トルク(質量 20%大) | 7.0 | 3.1 | 7.0 / 0.03 |
- 重力のみの補償ではほとんど改善されませんでした。高速な振りにおいて支配的なのは重力ではなく、 慣性と結合項です。
- 計算トルクはPDの24分の1の誤差を出し、質量が20%ずれてもPDより4〜6倍優れていました。
トルク制限を 30 N·m に下げると(軌跡が要求する 40 N·m より小さい)、計算トルクの最大誤差が 264 mrad、PD が 218 mrad となり、どちらも破綻しました。 コントローラーは実現不可能な軌跡を 実現することはできません。 軌跡を作成する際(第8部)は、逆動力学トルクが限界内にあるかまず確認する必要があります。
5. 限界
- すべてシミュレーションです。減速機のバックラッシ、ベルトの弾性、エンコーダのノイズと量子化、通信遅延の揺らぎ、モータのトルク-速度曲線は含めていません(未計測)。
- 制御ゲインを1つのルールだけで定めました。周期ごとにゲインを個別に調整すれば、200 Hzの結果は改善される可能性があります。
- 電流ループはq軸1つのRL回路に単純化しました。逆起電力、d・q軸結合、PWMの電圧量子化は扱っていません。
6. まとめ
- 軌跡を事前に知っているロボットにとって最大の改善は フィードフォワードです。同じPD制御に逆動力学を加えると、誤差が20倍以上減少しました。
- 多関節のアームでは、計算トルクが干渉を相殺します。モデルが20%間違っていてもPD制御よりはるかに優れています。
- 制御周期は1 kHz前後あれば十分であり、200 Hzでは0.1秒のスイングに追従できませんでした。電流ループはその10倍以上速くする必要があり、30 kHzの電流ループの実用帯域幅は1〜2 kHzでした。
- オープンハードウェアの部品を選ぶ際に見るべき数値:モータコントローラの位置ループ周期とフィードフォワードトルク入力のサポート有無(moteusの位置モード制御式にはフィードフォワードトルク項があります)、および上位コントローラとモータコントローラ間の通信周期です。
TTの一言。 ラケットがどこに行くのか分かっているのに、誤差が生じるまで待つ必要はありませんよね?必要な力を先に出し、フィードバックはズレた分だけ修正すればいいのです!
参考
すべての資料は2026-10-18に閲覧しました。
- Lynch, Park, Modern Robotics, 2017, 公開プレプリント、第11章(11.4 トルク入力制御、式 11.35)。
- mjbots, moteus docs/reference/theory.md(位置・電流ループ構造、デフォルト30 kHz)。
- ODrive Robotics, ODrive API Reference 0.6.12(
n_evt_control_loopの説明における8 kHzの仮定)。 - Koç, Maeda, Peters, RAS 105 (2018), 著者公開版、6.2節(500 Hz制御)。
- D'Ambrosio 他, arXiv:2309.03315(ポリシー100 Hz、ABB EGM 248 Hz)、 arXiv:2408.03906(低レベル技術50 Hz)。