TT Lab
ブログ

한국어 English 日本語 中文

はじめる
ブログ

ブログ

制御:PID、フィードフォワード、計算トルク、FOC電流ループと位置ループの階層、制御周期

ステータス:草案(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. 図:制御の階層

제어의 층: 느린 바깥 루프, 빠른 안쪽 루프 궤적 생성 q_r, q̇_r, q̈_r 위치·속도 PD + 피드포워드 1 kHz 전류 PI(FOC) i_q 목표 → 전압 30 kHz τ 인버터·모터 토크 ≈ k_t · i_q 관절·링크 J q̈ = τ − 마찰 엔코더 각·속도(1 kHz 로 읽음) 상 전류 안쪽 루프의 대역폭은 바깥 루프보다 충분히 높아야 한다. 바깥에서 보면 안쪽 루프는 「명령한 토크가 곧바로 나오는 장치」처럼 보여야 하기 때문이다. 30 kHz 는 오픈 제어기 moteus 의 기본 스위칭 주파수(위치·전류 루프 모두).
図:軌跡生成、1 kHzの位置・速度ループ、30 kHzの電流ループ、モーターと関節へと続く制御階層

オープンソースのモーターコントローラーを見ると、階層ごとに周期が異なります。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 シミュレーション設定

4. 実測(シミュレーション)

4.1 コントローラーと制御周期

같은 이득, 다른 제어기와 주기: 최대 추종 오차 0.1 1 10 100 8.5 10 0.2 2 kHz 8.5 10 0.4 1 kHz 8.5 10 0.9 500 Hz 40 50 35 200 Hz PD PID PD + 피드포워드 최대 오차(mrad, 로그) 시뮬레이션: 관성 0.015 kg·m², 대역폭 20 Hz 이득, 한 주기 지연. 실기 미실측.
図:コントローラーおよび制御周期ごとの最大追従誤差
周期 コントローラー 最大誤差 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

ゲインを上げるとどうなるでしょうか。ω_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

トルク制限を 30 N·m に下げると(軌跡が要求する 40 N·m より小さい)、計算トルクの最大誤差が 264 mrad、PD が 218 mrad となり、どちらも破綻しました。 コントローラーは実現不可能な軌跡を 実現することはできません。 軌跡を作成する際(第8部)は、逆動力学トルクが限界内にあるかまず確認する必要があります。

5. 限界

6. まとめ

TTの一言。 ラケットがどこに行くのか分かっているのに、誤差が生じるまで待つ必要はありませんよね?必要な力を先に出し、フィードバックはズレた分だけ修正すればいいのです!

参考

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

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

コメント

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

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