1. はじめに
以前、M5Stackを使って二輪倒立振子を製作し、PD制御によって倒立させました。PD制御では、比例ゲイン($K_p$)と微分ゲイン($K_d$)の設定によって、倒立振子の動きが変わります。これらの値は、実際に動作させながら試行錯誤して調整することができますが、どの値がよいのかを判断するのは、なかなか難しいものです。
そこで今回は、機械学習の一手法であるベイズ最適化を使い、実機の測定結果をもとにPD制御ゲインを探索することにしました。
実験では、PCが次に試す$K_p$と$K_d$を決め、M5Stackで製作した二輪倒立振子を動作させます。そして、倒立中の姿勢角度の変動を評価し、その結果をPCに返します。この処理を繰り返すことで、倒立振子の動作を改善できるか調べました。
2. 使用した装置
今回使用したのは、以前製作した二輪倒立振子です。主な構成は次のとおりです。
| 部品 | 用途 |
|---|---|
| M5Stack Core2(M5GO-BOTTOM2 V1.3 取付) | 姿勢角度の測定、PD制御、Wi-Fi通信 |
| Roller485 Lite ×2 | 左右の車輪の駆動 |
| 車輪(直径約80 mm)×2 | 移動・倒立 |
| フレーム(LEGOブロック) | 本体の支持 |
| PC(Windows 11) | ベイズ最適化によるゲイン探索 |
| Wi-Fi | M5StackとPCの通信 |
M5Stack Core2にはIMU(慣性計測装置)が内蔵されているため、これを使って車体の傾きを求めます。左右のモータを制御することで、車体が倒れないようにしています。
写真1 製作した二輪倒立振子
なお、今回は制御プログラムにMicroPython、PC側のプログラムにPythonを使用しました。
3. PD制御とゲイン調整
二輪倒立振子の制御には、次のPD制御を使用しました。
$$
u=-K_p\theta-K_d\dot{\theta}
$$
ここで
- $u$:モータへの制御指令
- $\theta$:目標姿勢に対する車体の傾き
- $\dot{\theta}$:車体の角速度
- $K_p$:比例ゲイン
- $K_d$:微分ゲイン
です。$K_p$は車体の傾きを戻そうとする作用、$K_d$は車体の回転を抑える作用に関係します。これらのゲインが適切でないと、車体が大きく揺れたり、転倒したりします。
これまでの実験では、次の値で倒立できることを確認していました。
- $K_p$ = 40.0
- $K_d$ = 1.0
今回は、これらの値を出発点として、さらによいゲインを探索することにしました。
4. ベイズ最適化とは
ベイズ最適化は、これまでの実験結果をもとに、次に試す条件を決定する最適化手法です。例えば、$K_p$と$K_d$を変えて実験を行い、そのときの倒立状態を数値で評価します。
ベイズ最適化では、得られた結果から、まだ実験していない条件での評価値を推定します。そして、よい結果が得られそうな条件や、まだ十分に調べていない条件を考慮して、次の実験条件を選びます。
今回使用したプログラムでは、ガウス過程回帰とExpected Improvement(期待改善量)を利用しました。詳しい理論は省略しますが、実験結果を使って、次に試す条件を決める方法と考えると分かりやすいと思います。
5. 実験方法
5.1 PCとM5Stackの役割
今回のシステムでは、PCとM5Stackで役割を分担しました。
図1 実験システムの構成
- PCが$K_p$と$K_d$を決定する。
- M5StackがWi-Fi経由でゲインを取得する。
- M5StackがPD制御によって倒立振子を動作させる。
- 倒立中の角度変動を計算する。
- M5Stackが測定結果をPCに送信する。
- PCが測定結果を使って次のゲインを決定する。
この処理を繰り返します。
5.2 倒立状態の評価方法
今回は、倒立振子がどの程度安定しているかを、角度の$RMS$(二乗平均平方根)で評価しました。
$$
RMS=\sqrt{\frac{1}{N}\sum_{i=1}^{N}\theta_i^2}
$$
ここで、$\theta_i$は各測定時点における目標姿勢からの角度偏差です。
$RMS$が小さいほど、目標姿勢に対する角度偏差が小さいことを意味します。
測定条件は次のとおりです。
| 項目 | 条件 |
|---|---|
| 1回の倒立時間 | 10秒 |
| 評価開始 | 倒立開始2秒後 |
| 評価時間 | 8秒 |
| 評価点数 | 800点 |
| 評価指標 | 角度$RMS$ |
| 転倒判定 | 角度偏差が20°を超えた場合 |
倒立開始直後の動きの影響を小さくするため、最初の2秒間は評価から除外しました。また、転倒した場合にはペナルティを与え、安定して倒立できる条件を優先するようにしました。
なお、角度$RMS$は目標姿勢からの偏差を評価するものであり、車体の移動量や車輪の振動まで評価しているわけではありません。
5.3 ゲインの探索範囲
今回は、既に倒立できることを確認しているゲインの近傍を探索しました。
| パラメータ | 探索範囲 |
|---|---|
| $K_p$ | 38.0~42.0 |
| $K_d$ | 0.95~1.05 |
初回は$K_p$=40.0、$K_d$=1.0とし、合計10回の実験を行いました。
6. ベイズ最適化の実験結果
10回の実験で得られた結果を表に示します。
| 回数 | $K_p$ | $K_d$ | 角度$RMS$(°) |
|---|---|---|---|
| 1 | 40.0000 | 1.00000 | 0.486 |
| 2 | 38.0000 | 0.95000 | 1.005 |
| 3 | 42.0000 | 0.95000 | 0.193 |
| 4 | 41.9983 | 0.95418 | 0.492 |
| 5 | 41.9202 | 0.95905 | 0.319 |
| 6 | 41.2261 | 1.04776 | 0.548 |
| 7 | 41.4463 | 0.95126 | 0.362 |
| 8 | 41.8965 | 0.95030 | 0.743 |
| 9 | 41.8437 | 0.95400 | 0.998 |
| 10 | 41.9995 | 0.97304 | 0.192 |
10回とも転倒せず、10秒間の倒立に成功しました。
今回の探索では、$K_p$が42付近、$K_d$が0.95~0.97付近に実験条件が集中しました。また、10回目に最も小さい角度$RMS$が得られました。ただし、1回の測定結果だけで最適なゲインを判断することはできません。同じゲインでも、実験ごとに測定値が変動するためです。
そこで、追加の比較実験を行いました。
7. ゲインの比較実験
ベイズ最適化で得られた候補について、従来のゲインと比較しました。
比較した条件は次の3つです。
| 条件 | $K_p$ | $K_d$ |
|---|---|---|
| A:従来条件 | 40.0 | 1.000 |
| B:候補1 | 42.0 | 0.950 |
| C:候補2 | 42.0 | 0.973 |
それぞれ3回ずつ、合計9回の倒立実験を行いました。
結果を以下に示します。
| 条件 | 平均$RMS$(°) | 標準偏差(°) | 倒立成功 |
|---|---|---|---|
| A | 0.612 | 0.225 | 3/3 |
| B | 0.610 | 0.465 | 3/3 |
| C | 0.318 | 0.206 | 3/3 |
今回の実験では、条件Cの平均$RMS$が最も小さくなりました。従来条件Aと比較すると、平均$RMS$は約48%減少しています。一方、条件Bは従来条件Aとほぼ同じ平均$RMS$であり、標準偏差も大きくなりました。このように、近いゲインであっても測定結果に違いが見られました。
ただし、各条件3回の比較ですので、ゲインの違いによる改善を統計的に確認できたわけではありません。初期姿勢や測定のばらつきなどの影響も考えられます。
8. 今回の実験で分かったこと
今回、ベイズ最適化を利用して、二輪倒立振子のPD制御ゲインを探索する仕組みを作ることができました。
実験では、PCが次のゲインを決め、実際の倒立振子を動作させ、その測定結果を使って次のゲインを決定しました。また、探索によって得られた候補の一つでは、従来条件よりも平均角度RMSが小さくなる結果が得られました。
一方、実機では同じ条件でも測定結果にばらつきが生じます。したがって、最適化で得られた条件については、繰り返し測定によって再現性を確認することが重要だと分かりました。
今回は比較的狭い範囲でゲインを探索しましたが、探索範囲や評価方法を変えることで、異なる結果が得られる可能性もあります。
9. おわりに
今回は、M5Stackで製作した二輪倒立振子を使い、ベイズ最適化によるPD制御ゲインの探索を試してみました。機械学習というと、大量の学習データが必要だったり、複雑なモデルを作成したりするイメージがあります。しかし、今回のように、実機を動かして得られた結果をもとに、次の実験条件を決めるという使い方もできます。
この方法は、倒立振子だけでなく、モータの制御条件や各種装置の動作条件の調整などにも応用できると考えられます。
今回の記事が、機械学習を実際の装置に活用するための一つのきっかけになれば幸いです。
過去の記事
プログラム・データ等

