AIエージェント Codex で 強化学習4
車輪倒立振子

Home > 電子工作 > AIエージェント Codex で 強化学習4 車輪倒立振子

本記事にはアフィリエイト広告が含まれます。

すき 0
うんこ 0

最近はCodexを当たり前のように使って生活しており、
わざわざ “AIエージェント  Codex を使ってます” なんてことを言うのも今回が最後になるのではないでしょうか?

ここでは以前挑戦したゲームコントローラで操作する倒立振子の強化学習に再挑戦します。

コントローラのジョイスティック(XY)のステートも観測して学習させるのですが、自身で報酬設計した倒立振子はそれほどギュンギュン動かすことはできませんでした。
報酬設計むず過ぎるんだって!

ROBSTRIDE 05 倒立振子を強化学習で楽しむ3

 

いまの私にはCodex先生がついておりますので、報酬設計を丸投げして コントローラも観測に含めた学習に再挑戦したいと思います。

 

AudiostockでBGM・効果音を販売中!

機体製作

今回はホイール駆動にシリアルサーボ XL330-M077-T を採用した車輪倒立振子で強化学習に挑戦します。

 
この構成はすでに実績があるのでサクッと作っちまいましょう。

DYNAMIXEL シリアルサーボ XL330 で倒立振子2

 

はい 完成

XL330-M077-T はカレントモードで駆動しています。

 

MuJoCoモデル

強化学習用にMuJoCoモデルを作成します。

各パーツの寸法と重量を測りつつ構築

 

イイ感じのモデルが完成しました。

↑この動画で実機とSim.の制御はピッチ角と角速度とホイール回転速度でそれぞれ単位を合わせて同じゲインでフィードバックさせています。
おおむね一致していますね。

実機はカレントモード制御なので MuJoCoモデルのモータはトルク制御の<motor>アクチュエータを採用しました。
ここでは暫定的にMaxトルクを0.22 N·m (XL330仕様のストールトルクから)、摩擦 dampingを0.001としました。

 

モータ同定

MuJoCoモデルのモータの定数 (gear, damping ) を適当に決めていたので、ここではモータ同定してしっかりモデリングしていきます。

Codex先生と相談して同定用テストを構築。
実機で振幅120mAで周波数を0.2~5Hzにシフトしてログを取得

 

取得したログからCodex先生にMuJoCoの<motor>アクチュエータ定数をいじってフィッティングしてもらいました。

定数を以下に変更することで実機の速度応答に近づけることができました。
 gear (トルク):0.22 → 0.05239
 damping (摩擦):0.001 → 0.0000731

フィッティングが難しい場合はフィルタとかも挿入して合わせこもうと思っていたのですが、MuJoCo定数調整だけでイケたので幸運でした。

 

モータ同定後のモデルで実機と比較

前節の比較より動作が近い(はず)。

 

強化学習

大変よいモデルができたので、ゲームコントローラジョイスティックによる倒立操作を目指して強化学習します。
学習は Gymnasiumベースの強化学習環境を Stable-Baselines3(PPO )でCPU並列処理で実施します。

Codex先生と相談して学習の観測・行動と方針を決定してあとは丸投げ

観測ベクトル 7次元
 機体 pitch角
 機体 pitch角速度
 左ホイール回転速度
 右ホイール回転速度
 機体Yaw軸角速度 gyroZ
 ジョイスティックY軸
 ジョイスティックX軸

行動ベクトル 2次元
 左モータ トルク (正規化電流)
 右モータ トルク (正規化電流)

ポリシーの構造はこんな感じ↓

学習方針は以下の順で実施
 通常倒立→前後移動→旋回

 

学習は報酬設計から評価・調整も全部Codex先生に丸なげでしたので結果のみご報告

倒立学習

前後進学習

旋回学習

やったこと(Codex先生の解説)

旋回学習までにやったこと

倒立を先に固めた
 最初から前後移動や旋回まで全部やらせるのではなく、まず倒立そのものを安定させた。
 初期姿勢のばらつきは小さめにして、倒れないこと、角度をゼロ付近に戻すことを優先した。
 この段階では旋回や移動命令は主目的にせず、姿勢維持を作った。

報酬で重視したものは以下。
 pitch angle を小さくする
 pitch rate を小さくする
 無駄な wheel velocity を抑える
 無駄な gyroZ を抑える
 action を大きくしすぎない
 倒れたら大きく減点

 押されたときに踏ん張るようにした
 倒立ができた後、外力を入れても倒れにくいようにした。
 MuJoCo上で一定間隔ごとに短い押し外乱を入れ、姿勢を戻す学習を追加した。

 この段階の狙いは、きれいに静止することだけではなく、少し乱されても戻れること。
 実機では床の摩擦、ケーブル、手で押したときのズレがあるので、押し外乱への耐性は重要だった。

前後移動命令を追加した
 次に vel_cmd を使って、ゲームパッドの前後スティックに追従する学習を入れた。
 ここで直接「車輪速度だけ」を追わせると倒立が崩れやすいので、vel_cmd から小さい pitch target を作り、少し傾けて進む形にした。
 要するに、前に進みたいときは少し前に倒し、後ろに進みたいときは少し後ろに倒す。
 この時点で、前後スティックへの反応はかなり自然になった。

旋回命令を追加した
 最後に omega_cmd を追加して、左右差を使った旋回を学習させた。
 ここでは、倒立と前後移動を壊さないように、Phase4のモデルから継続学習した。
 gyroZ が omega_cmd に近づくように報酬を入れ、同時に wheel turn や turn action が暴れすぎないようにも抑えた。

 

Sim2Real

旋回まで学習したポリシーを実機に移植

 

みごとゼロショットでSim2Realが実現されました!と言いたかったのですが、
学習したポリシーに実機のYaw軸角速度gyroZをそのまま入れると発振してしまい係数をかけて1/10以下にしてやっと安定して動作しました。

なんでこんなに誤差が出るのか。。調査中だけど原因不明 単位も間違ってないし。。
こういうときに丸投げしたことが仇になるよな。まぁ丸投げしないと結果すら出ないのだが。

もしかしたらgyroZは観測しなくてもいいのかもしれない。

 

調整は必要でしたが、とりあえず憧れの操作コントローラのステートを含めた車輪倒立振子の学習が達成できました。

ニューラルネットワークでギュンギュン動いとる

完全にAIのおかげです。

 

おわりに

ここではゲームコントローラで操作する倒立振子の強化学習に再挑戦しました。
若干調整は必要でしたが憧れのコントローラのステートを含むニューラルネットワークでのギュンギュン操作が実現されました。

報酬設計などをもろもろAIエージェント Codex に丸投げして苦痛なく強化学習を字資することができました。

AIエージェントを使ってとか、Codexを使ってとかでどーのこーのいうのは今回が最後になるかと思います。
もう当たり前に活用して生活していくのですから。
まさかおじさんになってテクノロジーによってパワーアップできると思ってなかったわ。

長生きせんといかんですね。

 

コメントはこちらから

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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください