二つの車輪だけで立ち、指で押しても戻ってくる二輪ロボット。支えているのは形ではなくプログラムで、1秒におよそ100回、傾きを測ってモーターの電流を決め直しています。この「どれだけの力を出すか」を決める代表的な方法が PID と LQR で、動画の結論はシンプルでした。違いは一点だけ――「倍率をどう決めるか」です。
この記事は、YouTube チャンネル「ビーバーものづくり研究所」で 2026年9月18日に公開した動画「倒立振子ロボットの作り方 | PIDとLQRをゼロから理解する」の記事版です。動画で解説した PID と LQR の違いと、同じロボットを作る手順を、文章で読み返せるようにまとめました。
![]()
PIDとLQRの違いは「倍率の決め方」だけ
倒立振子は、振り子をひっくり返して真上に立てた状態です。少しでも傾けば傾いた側へ倒れていくので、手のひらにほうきを立てるように、倒れ始めた方向へ車輪を動かして下へ入り続ける必要があります。制御は「測る→比べる→決める→動かす」の繰り返し(フィードバック制御)で、測れるのは IMU の姿勢と車輪のエンコーダー、出せるのは左右モーターへの電流だけです。前後で言えば出せる力は車輪のトルク一つなのに、守りたいのは角度と位置の二つ。この「動かせる数より守りたい数が多い」形を劣駆動と呼びます。
PID は、目標との差(誤差)を三つの見方で使います。P は「いま」の誤差に比例して戻す力、I は「これまで」の誤差の積み重ね、D は誤差の変化から読む「これから」です。実機では P だけを上げるとぶるぶる震え(振動)、D を足すとすっと収まりました。一方で I は、モーターが限界を出している間もたまり続け、制限が外れた瞬間に一気に吐き出す「積分ワインドアップ」という落とし穴があります。PID の強みは、機械のモデルが要らないこと。誤差さえ測れれば、温度でも回転数でも使えます。
PDはすでに状態フィードバックだった
ここが動画の軸です。倒立の PD 制御を式で書くと u = −(Kp・角度 + Kd・角速度) となります。微分は角度の変化、つまり角速度なので、PD は角度と角速度という「状態」を見て打ち消していることになります。状態に倍率を掛けて打ち消す形は LQR の u = −Kx と同じで、違うのは倍率の決め方だけ。PD は人が手で決め、LQR は計算で解きます。
手で決めると、P を上げれば D がずれ、フィルターを入れれば反応が遅れる、という連鎖が起きます。位置や向きまで含めると調整する「つまみ」は七つに増え、何を良しとしたかは調整した人の頭の中にしか残りません。LQR では順番が逆で、先に「何を悪いと思うか」という採点表を書きます。必要なのは状態・モデル・採点表の三つ。状態には角度と角速度に加え、指令から力が出るまでの約75ミリ秒の遅れを見込んで「いまモーターが実際に出している力」も入れます。ずれへの重み Q と電流への重み R を二乗で採点すると減点はお椀の形になり、その合計が最小になる倍率 K が一組だけ計算で決まります。設計者が触るのは倍率ではなく Q と R で、「なぜそう決めたか」が重みとして残るのが利点です。
同じロボットを作る7ステップ
今回の構成は、制御マイコンが M5Stack AtomS3R、モーターが Unit Roller485 を2台(電流を直接指令でき、エンコーダー内蔵)、通信は Tail485 / RS485 115200bps、電池は9V型のリチウムイオン充電池です。全質量は電池込みで260g、車輪径は75.6mm、モーターの応答遅れは約75ミリ秒。操作は自作の BLE スマホアプリで行います。モーターは速度指令しかできないものより、電流を直接指令できてエンコーダーが付いているものが向いています。

- 車体と駆動系を作る
- センサーと電流の符号を決める
- 転倒直前まで追えるログを作る(約100Hzで記録)
- 質量・慣性・重心の高さ・モーター遅れを測る
- シミュレーションで倍率を作る
- 支えたまま低電流で試す
- 上限を上げ、速度・位置・旋回の外側制御を足す
いきなり立たせるのではなく、測る仕組みから作るのがポイントです。概要欄には、この7ステップをそのまま指示にした LLM 向けプロンプトも載っています。部品の欄を自分の機体に書き換えて Claude Code や Codex に渡し、実験のたびにログを貼って返すと、何が起きたかの説明と次に試すこと、直したコードが返ってくる、という使い方です(プロンプト全文は動画の概要欄をご覧ください)。
実機の症状は、理屈と対になっていた
実機で出た症状も、それぞれ原因と対になっていました。「倒立できても走り去る」のは、角度しか見ておらず位置を戻す制御が無いため。「その場で回り続ける」のは、旋回(ヨー)の符号が反転していて、戻すはずの力が回転を足していたためです。符号の確認が7ステップの2番目にある理由がここにあります。

モデルを持つ強みは、条件が変わったときにも表れます。例えばモーターの遅れが50ミリ秒から75ミリ秒に変わると、手で合わせた倍率のままでは揺れがだんだん大きくなりますが、モデルなら遅れの数字を書き換えて計算し直すだけで済みます。ただし LQR も万能ではありません。直立付近の線形近似の外では式が合わなくなり、電流の上限も知らないため、安全に止める仕組みは制御器の外側に必ず置きます。実際の構成でも、真ん中の LQR が前後の力を決め、外側の制御が位置と向きをゆっくり戻し、送る直前に電流制限と安全停止を通す、という役割分担になっています。
次の展開は強化学習です。まず実測モデルのシミュレーターで学習し、土台の LQR はそのままに、摩擦や床の違いを埋める小さな補正だけを学習に任せる形から実機へ進む予定とのことです。転んで覚える方法と転ぶ前に計算する方法は、対立ではなく積み重ねなのだと分かります。
実際の倒立と走行の様子は動画でどうぞ:倒立振子ロボットの作り方 | PIDとLQRをゼロから理解する(YouTube)
動画で紹介したもの(購入リンク)
購入リンクは、動画の概要欄に掲載しているものをそのまま使っています。
- モーター(Roller485) ×2:https://s.click.aliexpress.com/e/_c3H2dOw1
- マイコン (M5Stack AtomS3R):https://s.click.aliexpress.com/e/_c2IJaJlL
- 9V充電式電池(ハイパワー版):https://link.amazon/A00tjFSt1
