倒立振子ロボットの作り方 | PIDとLQRをゼロから理解する
ビーバーものづくり研究所 【ビーバーズ・ハイブ🦫】
0:00 / 0:00
倒立振子ロボットの作り方 | PIDとLQRをゼロから理解する
5 039 просмотров · 6 дней назад
ビーバーものづくり研究所 【ビーバーズ・ハイブ🦫】
3,53 тыс. подписчиков
5 039 просмотров · 6 дней назад
PID制御とLQR制御は、何を見て、どうモーターの力を決めているのか。
二輪倒立ロボットを題材に、制御を初めて知る人でも「二つの違いが一点に絞れる」ところまで解説します。
今回使った部品はこちらから購入できます。
・モーター(Roller485) * 2
https://s.click.aliexpress.com/e/_c3H...
・マイコン (M5Stack AtomS3R)
https://s.click.aliexpress.com/e/_c2I...
・9V充電式電池(ハイパワー版)
https://link.amazon/A00tjFSt1
Claude Code や Codex などの LLM に渡すプロンプトを、この下に載せています。
実験のログを貼って返しながら使えば、動画と同じ手順で倒立ロボットの制御までたどり着けます。
この動画の軸は、PIDとLQRを対立させないことです。
倒立のPD制御を式で書くと u = −(Kp・角度 + Kd・角速度)。
角度と角速度に倍率を掛けて打ち消しているので、これはすでに状態フィードバックであり、
LQRの u = −Kx と式の形は同じです。違うのは、その倍率をどう決めるか。
・制御の「測る→比べる→決める→動かす」という流れ
・倒立振子とは何か(振り子をひっくり返すと、なぜ不安定になるのか)
・劣駆動:出せる力は車輪のトルク一つ、守りたいのは角度と位置の二つ
・PIDのP・I・Dを「いま/これまで/これから」で整理する
・実機で P だけを上げると震え、D を足すと収まる実験
・Pが強すぎると振動し、Iがたまりすぎると一気に吐き出す理由
・PDはすでに状態フィードバックである、という見方
・手で倍率を決めると、P→D→フィルター→P再調整と連鎖する理由
・LQRに要る三つ(状態・モデル・採点表)
・二乗で採点する=減点が「お椀」の形になる理由
・QとRの重みから、状態ゲインKが一組だけ決まる考え方
・モデルを作る手間を払うと、何が手に入るのか(遅れが変わったときの直し方)
・LQRの限界:線形近似の外と、制約を知らないこと
・LLM と実験の輪を回して、同じ制御を作る進め方
後半では、同じロボットを作る流れを7ステップで紹介します。
1. 車体と駆動系を作る
2. センサーと電流の符号を決める
3. 転倒直前まで追えるログを作る
4. 質量・慣性・重心の高さ・モーター遅れを測る
5. シミュレーションで倍率を作る
6. 支えたまま低電流で試す
7. 上限を上げ、速度・位置・旋回の外側制御を足す
実機で出た症状も、それぞれ理屈と対にして扱います。
「倒立できても走り去る」は位置を戻す制御が無いこと、「その場で回り続ける」はヨー符号の反転が原因でした。
最後に、次の展開である強化学習に触れます。
まず実測モデルのシミュレーターで学習し、LQRを土台に小さな補正だけを足す形から実機へ進む予定です。
今後の動画では、報酬の作り方、学習の様子、Sim-to-Real、LQR単体との比較も紹介します。
■ LLM に渡すプロンプト(この動画の手順)
Claude Code や Codex に、部品の欄を自分の機体に書き換えてそのまま渡してください。
実験のたびにログを貼って返すと、何が起きたかの説明と、次に試すこと・直したコードが返ってきます。
-----
あなたは、二輪倒立振子ロボットの制御を一緒に作るエンジニアです。
私が実機で実験し、結果のログを貼ります。次の順番を守り、一度に一つの段階だけ進めてください。
【機体】
マイコン:(例: M5Stack AtomS3R)
モーター:(例: Unit Roller485 × 2、電流を直接指令するモード)
通信:(例: RS485)
質量・車輪径:(わかる範囲で)
【進め方】
1. 符号の確認:IMU の角度・角速度と、各モーターにプラスの電流を流したときの回転方向を表示するだけのコード。前へ傾けたときの符号を私に確かめさせてください。
2. ログ:時刻・角度・角速度・車輪速度・指令電流・停止理由を約100Hzで記録し、CSVで取り出せるようにする。
3. 計測:質量、重心の高さ、慣性(落下試験)、モーターの応答遅れを測る手順とコード。
4. モデルとLQR:測った値で直立付近の線形モデルを作り、状態を[角度, 角速度, モーターの力の遅れ]としてLQRゲインを計算するスクリプト。慣性や遅れを±30%変えても安定か確かめる。
5. 支持試験:手で支えたまま、電流上限を低くして、傾けた方向へ車輪が追いかけるか確かめる。
6. 倒立:電流上限を少しずつ上げ、手を離す時間を延ばす。
7. 外側の制御:倒立できたら、速度・位置・旋回の制御を一つずつ足す。
【毎回のやり取り】
私が貼ったログから、何が起きたかを短く説明する
次に試すことを一つだけ提案し、変更したコードを出す
符号が逆・振動する・走り去るなどの症状には、原因の候補と確かめ方を示す
【安全】
電流の上限、止める角度、指令が途切れたら止まる仕組みを、制御器の外に必ず入れる
電流上限を上げる提案は、必ず私の確認を取ってから
-----
主な構成(今回の例。ほかのマイコンやモーターでも同じ手順で作れます):
制御マイコン: M5Stack AtomS3R
モーター: Unit Roller485 × 2(電流を直接指令でき、エンコーダー内蔵)
通信: Tail485 / RS485 115200 bps
電池: 9V型のリチウムイオン充電池(小さく収まる)
操作: 自作の BLE スマホアプリ(これも LLM に書かせています)
全質量: 260 g(電池込み)
車輪径: 75.6 mm
モーター応答遅れ: 約75 ms
モーターは「電流を直接指令できて、エンコーダーが付いている」ものが向いています。
速度指令しかできないモーターだと、倒立の制御は作りにくくなります。(よくわからなければRoller485がおすすめです)
音声: VOICEVOX(ずんだもん / 春日部つむぎ)
#PID制御 #LQR #倒立振子 #制御工学 #電子工作 #M5Stack #ずんだもん
Xもやっています!
動画や作ってみたの裏側もポストしているので、ぜひこちらもフォローお願いします!
https://x.com/beavers_hive