Перейти к содержимому

倒立振子ロボットの作り方 | 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