強化学習への道3 -Sim2Real-

Home > 電子工作 > 強化学習への道3 -Sim2Real-
すき 0
うんこ 0

前回はついに強化学習に挑戦しました。

強化学習への道2 -強化学習開始-

 

リアクションホイール姿勢制御モジュールの倒立動作を学習しシミュレーション上で実現させました。

 

今回はここで得た学習結果を実機に移行して動作させる つまりSim2Realに挑戦いたします。

学習モデル 実機移植

前回得た学習モデルは.zipファイル形式で
入力 (observation)が 
 theta:機体傾き [rad]
 omega:機体角速度 [rad/s]
 wheel_speed:ホイール角速度 [rad/s]
出力 (action)が
 正規化されたトルク
という構成です。

ここでは学習モデルをESP32に移植してリアクションホイール姿勢制御モジュール (SHISEIGYO-1)を製作してSim2Realを目指します。

ESP32にzipデータをそのまま実装はできないので、取り扱える形式に変換します。

学習モデル変換

今回得た強化学習モデルは以下のようなニューラルネットワーク構成となっています。

このネットワークの各層の重み(weight)とバイアスを配列に変換してESP32に移植します

 

まず学習モデル.zipを.npzファイルに変換しました。
 npz:NumPyが提供している複数の配列をまとめて保存できる圧縮形式

変換用Pythonコード (ChatGPTに作ってもらった)

 

得られた.npzファイルからネットワーク各層の重み・バイアスを抽出してESP32 Arduinoコードで取り扱える配列.hに変換します。

うちのよく教育されたChatGPTに.npzファイルを投げれば 重み配列を含む.hファイルが得られます。

 

変換された学習モデル.hは以下のとおり

 

このファイルの forward(obs, action)に obsとして測定した機体傾斜、機体角速度、ホイール回転速度を入力すると
学習された推論正規化トルク (action)が得られます。

実機テスト

変換した学習モデルを ESP32 (ATOM Matrix)に実装してみました。

試しにATOM Matrix内蔵のIMU MPU6886による傾斜と傾斜角を入力して (ホイール速度は0とした)、出力を見てみました。

それっぽい出力が得られましたので学習モデルの変換がうまくいったと判断しました。

姿勢制御モジュール製作

学習モデルのESP32への移植が確認できたので、ブラシレスモータ姿勢制御モジュールを製作してSim2Realを目指します。

サクッと実機製作(こんなん一瞬やで)

構成

 

  • ブラシレスモータ 5010 360KV

 

  • 磁気エンコーダ

 

  • ESP32搭載 モータコントローラ MKS ESP32 FOC V1.0

 
IMUは壊れたATOMから摘出したMPU6886を実装しました。
コントローラとはI2Cで通信

SimpleFOC

ブラシレスモータはSimpleFOCライブラリを使用して制御します。

電流ベースのベクトル制御によるトルク駆動でモータを動かします。

学習モデルより出力されるトルク値でモータを駆動します。

古典制御で倒立確認

製作したモジュール SHISEIGYO-1の倒立動作をまずはいつものフィードバックゲイン手動調整にて確認しました。

ブラシレスモータのロータをリアクションホイールとして問題なく倒立できました。

フィードバックの式は以下のとおり
 モータトルク = Kp * 機体角度 + Kd * 機体角速度 + Kw * モータ回転速度

Sim2Real

学習モデルのESP32移植と倒立動作可能な実機が用意できましたので、いよいよSim2Realに挑戦です。

先ほど学習モデルから抽出したニューラルネットワークの配列ファイルをモータコントローラのESP32に実装し、IMUによる機体傾斜角度・角速度とSimpleFOC駆動で得られるホイール回転速度を関数に入力して得られた推定トルクでモータを駆動します。

できた!

学習モデルで得られる推定トルクは±1で正規化されているので上の動画では3倍してモータを駆動しています。

ついにSim2Realができました。
倒立動作を強化学習して得られたモデルで実機でも倒立が実現しました。

Real2Sim

Sim2Realを体験できたので、この動作をうけて再度シミュレーションにフィードバックをかけて精度を上げたいと思います。

筐体精度向上

前回の強化学習で用いたsim用モデルと実機では若干形状が異なったり、制御ボードが追加されたりしているので再度Sim用モデルを作り直しました。

MuJoCoシミュレータ用の物理モデルを記述フォーマット (MJCF[MuJoCo XML Configuration File]) ではモデルの重量と重心位置と慣性モーメントまで指定できます。

各モデルの物性情報はFusin360で素材を指定することで得ることができます。
そこで得た物性情報を実機の質量でスケーリングして入力して精度を上げました。

モータモデル

モータ全体の質量は80gですがロータと固定部のそれぞれの重量は不明なのでザックリ半々で分けました。

モータの駆動系のモデルはMuJoCoのモータアクチュエータのトルク定数gearと回転部のjointの摩擦係数dampingで表現しています。

前回の強化学習ではそれぞれ gear = 0.0265、damping = 0.00005としました。
先ほどのSim2Realでほぼ問題なく倒立ができたのでモータの駆動系モデルは大きく外れていない印象でした。

逆に言うとBLDCはギアを有するサーボモータなどに比べてモデル化がしやすいのだと感じました。

トルク定数 gear

gearの値 0.0265 はモータのKV値 360から算出

摩擦係数 damping

この値は大きすぎるとモータが回らないなどの弊害はありましたが
0.00005という小さい値だと0でも倒立の学習に影響はありませんでした。

しかしdamping 0だと回転中にトルクを0にしても慣性で延々回りすぎるのが気持ち悪かったので程よく止まる0.00005としました。

再 強化学習

実機に近い筐体モデルで再度 強化学習します。

Sim2Realの結果をうけてGymnasium学習環境定義も変更しました。

観測空間と初期状態の修正

観測値

意味

範囲の意味

theta

本体の傾き

±0.5 rad ≒ ±30度(倒立限界、安定学習向け)

omega

本体の角速度

±4.4 rad/s(MPU6886の設定測定レンジ ±250 deg/s)

wheel_speed

ホイール角速度

±50 rad/s

報酬関数の変更

delta_theta = abs(prev_theta) – abs(theta) で前のステップの傾斜角の差をとって
倒立に近づいたら報酬付与を追加

再 Sim2Real

再強化学習の結果と実機移行の結果が以下のとおりです。

Simで外乱なども模擬してみましたが、転倒の仕方もクリソツで物理シミュレータの凄さを感じました。

ブラシレスモータのモデル化に不安がありましたが概ね動作できているのでMuJoCoのmotorアクチュエータのgear値とジョイントの摩擦係数dampingのみでもいけてるようです。

モータ物理モデルもざっくりで作りましたが問題なく倒立動作の再現ができているので、このブラシレスモータに置いては良いモデル化ができたのかと考えております。

更なる細かい調整は学習ではなく推定トルクに係数をかけるなどの微調整で十分実機動作にかなう印象です。

おわりに

ここでは強化学習結果を実機に移行してSim2Realを楽しみました。
良い結果を得ることができて大変喜んでいます。

Sim2Realを経て更にフィードバックするなどしてフローをグルグル回すことでモデルの精度向上に加えて、強化学習に対する理解も増しました。

MuJoCo + Gymnasium + Stable-Baselines3 という構成の強化学習については自身で考えて好きに色々できる知識がついたかなと思っております。

 

引き続きリアクションホイール姿勢制御モジュールの強化学習をテーマに耐性向上なども考えてもいいのですが、そろそろ飽きてきたので本命の2足歩行ロボットに行ってしまおうと思います。

 

それではまたお会いいたしましょう。

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

This site uses Akismet to reduce spam. Learn how your comment data is processed.