Mini Pupper2 ros2 4足歩行 Policy 強化学習 2

Mini Pupper2 ros2 4足歩行 Policy 強化学習 2

Mini Pupper2 ros2 4足歩行 Policy 強化学習 第2弾
Policy を、MlpPolicy から、Locomotion Transformer に替えてみた。

SB3 + PPO + Locomotion Transformer で、
Ros2 Jazzy Gazebo(Hramonic) で mini_pupper_ros の Mini Pupper2 を使うのは、全てそのまま。

トランスフォーマー型 Policy(Locomotion Transformer など)
LeRobotのACTと同じように、4足歩行でもTransformer(自己アテンション機構)を採用する動きが主流になっています。
との事。
Transformer を使っているので、試してみた。

一番最初に、おんちゃんが今回学んだことを先に書いておきます。
1) Reward の評価方式。
i. Pupper の移動した位置+向きによる評価方式。
ii. /cmd_vel の 3速度一致による評価方式。
大雑把に言って、上記2方式がある。
i. Pupper の移動した位置+向きによる評価方式 は、train 初期 では、使えない。
train 初期では、数 steps 数 action で、Pupper は、とんでもない位置、向きになってしまう。
狂った位置、向きから、オリジナルの /cmd_vel を Pupper に送っても到底、目標とする本来の位置、向きに行ける訳がない。
なので 必然的に、 ii. 3速度評価方式 になると思う。
ii. 3速度評価方式 も、全ては、評価、減点の与え方のプログラムの追求になる!!
歩行の向きが合わないのは、reward_vyaw で、調整する。
歩行の前後の不一致、速度が合わないのは、reward_vx で、調整する。

2) 余分なReward 項目は、使わない。
上記で言えば、位置+向き の 2項目か、 3速度評価 による、 3項目。

3) 複数項目の場合の、reward のトータル方法。
後述の 一括マイナス方式 Isaac Gym / rsl_rl 標準 と 重み付き線形和 を参照してください。

4) SB3 OPP の強化学習の基本は、どうやるの?
Pupperの 前後、左右への小さい動きの反復動作(探索動作) をする中で、より reward が多い方の動作を強化して行く事みたい。
reward は、+ でも - でも良い。OPPのパラメータが適切であれば、より大きい方が、使われる。
ただし、reward としては、+ の方が良い気がする。
1 step 0.0 から 1.0 などがよいみたい。
一番重要なのは、探索行動は、train が進むにつれて、小さくなって行く。
なので、その間に、より reward が大き方への動きが増えていく事が大事。
この、増えていくことが無いまま、train が、80万、100万となると、Pupperが動かなくなる。
後述の、v. OPP のパラメータの見直し。を参照してください。

5) 最初から強化学習するよりも、先に、模倣学習をして、その後で、強化学習がよいみたい。

おんちゃんが、こちらを選んだのは、
入力 observation の joint-state と、model の output の act(joint-controll) のフィールドが、対応している事。
input と output の位置が同じなのが、むだな学習が、生じなくていいと思う!!
MlpPolicy は、汎用的な model なので、必ずしも、4足ロボット向けと言うわけではなくて、
input と output の対応が取れていなくて、 train の過程で、関連付けるので、時間がかかりそう!!

Mini pupper RL のサンプルがある!!

PPO の設定値があるみたい。参考になるかも。
SpotDMouse/P2-Terrain_Challenge/training/params

1. train
1.1 最初は、位置+向きによる評価方式
fps:27 位でる。
注) Gazebo の環境物を非表示にして、4 倍速(ただし、実際は、見た目がすこし早くなる程度) の場合。
この後の、第4弾 MlpLstmPolicy が、
fps:20 - 23
なので、こちらが軽い。
Transformer だと、信頼感が、ある。

Rewards について。
Google ai に聞くと、大抵、0.0 から +1.0 にするみたいに回答してくる。
これだと、あまりうまくいかないのではないか?
- も入れて、メリハリが必要みたい。
スレッショルドを決めて、それより良ければ、最大 +1.0 、悪ければ 最小 -1.0 の方が良いと思う。
注) 最小は、 -0.05 から -0.10 が良いみたい。
ただし、ステージ1 では、0.0 から +1.0 が良いと思う!

率直な話。
本当に、この強化学習だけで、/cmd_vel に従う Policy が出来るのだろうか?
ちょっと、疑問に思えてきた。
やはり、最初は、模倣学習で、びっちり train して、最後に、強化学習の方が、良い気がする。

90万ステップを過ぎてから、pupper の動きがなくなって来た気がする。
learning_rate=2e-4
では、大きすぎるのかも?
learning_rate=1e-5
にすべきかも。

transformer 独自の learning_rate の指定が、必要なのかも?
ああ、やっぱり、これが必要だったみたい。
「Warmup(ウォームアップ)+Cosine Decay(コサイン減衰)」のスケジュール
が、必要との事。組み込んで、また、最初から train じゃ!!

今は、時々 train 済 model で、enjoy_pupper.py を使って、/cmd_vel で動くのか、テストしながら、様子をみているが、
一向 /cmd_vel に応じる気配がない。
しかし、ここで経験した事が、将来の大型犬型ロボットに活かせると思う。
けっして、無駄ではない、貴重な体験じゃ!!

Gazebo Mini Pupper2 の IMU の Publish Rate が、低いか?
以前 50 -> 30 に下げた気がする。これは、もとの 50 に戻す。
mini_pupper_ros/mini_pupper_description/urdf/mini_pupper_2/mini_pupper_description.urdf.xacro



cmd_vel に従う、train じゃ無いみたいじゃ。
mini pupper2 の推奨前進速度: 0.5[m/s] なので、train の /cmd_vel x=0.5 を入れてあるので、
train が順調に進むと、20[ms] * 300[steps] = 6[秒] で、3[M] 前進しないといかんが、
そんな挙動は出てこない。
また、/cmd_vel yaw=1.0[rad/s] を入れてあるので、6[秒] で、1[回転] しないといけないが、
そんな挙動も出てこない。
多分、reward の与え方が、今の方法では、全然だめなんだろう!!
これは、難しい!!

Policy Input の Observation だが、IMU の roll pitch yaw Velocity の 3個も加えた方がよいみたい。
今回、3個追加して、下記になった。


Gazebo で、train していると、1つ前の エピソードの Pupper の動きの慣性がのこって、
新しいエピソードに引き継がれる事がある。なにもしないで、そのまま、すってん転んでしまう。
この場合も、roll pitch yaw Velocity 加えたことで、train data として、利用できる。

1.2 転倒ペナルティーは、-120 固定で、train する。
転倒ペナルティーは、一貫して、同じ値にするのが、原則みたい。
1) beginner フェーズ
300 steps 完走を目指す。
i) 転倒ペナルティー: -120
ころんだら、ガツンと減点して、転ばないように教える。
ii) 5 steps 毎の、報酬: 有効
ころばないで、走行することの意欲を与える。
iii) Pos、Yaw 以外の報酬すべて: 無効
iv) 各、エピソードの最初 0.5[秒] は、Pos、Yaw への報酬=0.0
あるいは、スロースタートにする。
# 最初の、1.0[秒] は、報酬をスロースタートする
if self.episode_steps <= 50:
  reward = reward * (float(self.episode_steps) / 50.0)

stage0 で、行う。
おんちゃんは、180,000 [steps] まわした。

2) エキスパートフェーズ
完走がで始めたら、このフェーズにする。
i) 転倒ペナルティー: -120 のまま
ii) 5 steps 毎の、報酬: 無効
iii) Pos、Yaw 以外の報酬すべて: 無効
iv) 各、エピソードの最初 0.5[秒] は、Pos、Yaw への報酬=0.0
あるいは、スロースタートにする。
# 最初の、1.0[秒] は、報酬をスロースタートする
if self.episode_steps <= 50:
  reward = reward * (float(self.episode_steps) / 50.0)

これで、開始位置に居座ることを禁止する。
もし、train が進むにつれて、Pupper の動きか小さくなる様であれば、1.0[秒] を増やす。
最大、1.5秒(75 steps) みたい。
stage0 で継続する。
注) 最初から、エキスパートフェーズでも、OKか!

後は、下記表示が、全エピソードで出るまで、ひたすら、Trainじゃ!!
🎉 300ステップ完走! 完走判定:0.1 ....

60万 steps で、1.2[秒] スロースタート にした。
残念なのが、/cmd_vel のテーブルに、6秒で、3[M] 前進するテストデータを入れているのに、その片鱗すら、でてこない。

1.3 3速度一致による評価方式に変更。
報酬を、今の、移動位置と角度の評価から、/cmd_vel の3速度に、どれだけ一致しているかに応じて報酬を与える方法に変更する。
これなら、train steps が増えて、Pupper が動かなくなる現象が出ないのではないか!!
こちらのほうが、/cmd_vel の値に、報酬が直結するので、学習しやすいと思う。

注1) こちらも、エピソードの滑り出し時に、高い報酬が出るようなので、1.0[秒] スロースタートを、入れたほうが良いとの事。
注2) 移動距離と角度の報酬による達成度の評価は、300steps 完走が出始めた時、
どれくらい、/cmd_vel に忠実かを判断するためにそのままにしておく。

同じ様に、下記表示が、全エピソードで出るまで、ひたすら、Trainじゃ!!
🎉 300ステップ完走! 完走判定:0.1 ....

うーん。これもまだ、問題か!!
少し、報酬のアルゴリズムを、かえてみる。
cmd_vel の 各 vx、vy、vz の値が大きい場合に、
act vx、vy、vz が一致すると、各 Reward を大きくする。
逆にcmd_vel の 各 vx、vy、vz の値が小さい場合に、
act vx、vy、vz が一致しても、各 Reward は、前者の場合に比べて小さくする。
これで、どうだろうか?
後は、
各速度の極性が逆の場合、reward= -0.5 にする。
これは、速すぎた時、もとに戻す場合、逆向きが必要かと思ったが、速度を 0.0 にすれば、補正できそうなので、組み込んでみる。

恐るべし Pupper2
どうやら、前後に体をブルブルさせて、どうも、Rewards を稼いでいるみたいじゃ!!
ありとあらゆる手を使って、Rewards 稼に奔走するみたいじゃ!!

1.5 /cmd_vel の3速度報酬 のみに戻して、Train に使っている、Python code 自体の、単体テストが必要!!
train データを、前進、後退、右回転、左回転 の同じ値だけで、 trainする。
その時の、total reward、 reward_vx、reward_vy、reward_vyaw の各 mean、max、min を表示して、各報酬、減点が適切かどうかを決めていく。
結局は、各動きに対する、報酬、減点の仕方が適切になるように、Python code 自体の、単体テストを、先に行う。
この後に、本番の Train へ進むことが必要!!
適切でない、報酬、減点の与え方では、いくら train しても、完了とならない!!

1.5.1 cmd_vel=(0.5 , 0.0, 0.0) での 3[M] 前進 train テスト。
ここに来て、やっと、前の方に進む train が学習できるようになった。
3[M] きっちり、前方に進むようになれば、最高じゃが!!
やっと、おんちゃんの RL Train 手法が、実際とマッチするようになったか!!
思えば、今回が一番苦労した。この作業に、8 月からずっと取り掛かってきた。
率直な気持ち、Locomotion Transformer も、train できるんだと、改めて感じた!!
もうすこしの頑張りか!!

1.6 SB3 PPO RL の Train に関して、おんちゃんが今までの作業で感じたこと。
i. 良い行動には、より多くの報酬。
ii. 良くない行動には、少ない報酬。
iii. reward が、+ でも、- でも少しでも、reward をよくしようと学習は、するみたい。
だが、OPP のパラメータ設定が正しければ、reward は、1.0 から 0.0 の範囲でいい。
また、逆向きの行動には、かならずしも reward=0.0 にする必要もない。正しい行動よりも、reward が、少なければ、reward が多い方の行動が増えるはず。だが!!

iv. total reward は、
a. 一括マイナス方式 Isaac Gym / rsl_rl 標準
3速度のエラーを、まとめて、計算するみたい。
ここで、いろんな調整ができるみたい。


上記コードで、最初から、 train すると、reward が、やたらと小さくなる。
どうやら、cmd_vel=(0.5, 0.0, 0.0) 単位のテストは、ここでは、もうできないみたい。 env のコードのバグが取れたら、cmd_vel を色々変えて、実際の train をするしかないみたい。
Pupper は、train 中、前後ろ、左右に繰り返し動くが、これが、探索行動で、その動きの中で、より Reward が大きい方の動きを強化していく。
SB3 PPO のパラメタの設定が適切であれば、
train が進むにつれて、上記探索行動は、小さくなって行き、逆に、よりReward が大きい方への動きが増えていかなければいけない。
もし、Reward が大きい方の動きが増えて行かなければ、PPO のパラメータのチェックが必要じゃ。

b. 重み付き線形和
total_reward = wvx * reward_vx + wvy * reward_vy + wvx * reward_vz
4足歩行では、前進が重要なので、
wvx: 1.0
wvy: 0.5
wvz: 0.5
みたい。

v. OPP のパラメータの見直し。

a) 現象: Train が進むに従って、Pupper が動く動作(探索動作) が、小さくなって行く割には、一向にReward が多い動作が、伸びていかない。
clip_range(ディフォルト:0.2) :
ポリシーが一度に変形できるリミット。
4足は、0.2 のままがいいみたい

n_epochs(ディフォルト:10) :
1回の最適化でデータを回す回数。
4足は、 4 から 8 みたい、5 にする。

batch_size(ディフォルト:64) :
128 から 256にする。

b) マイナスReward ばかりの時
ent_core:
0.08: 報酬がマイナスばかりでプラスに触れない時
0.05: 何回かに一度は、Max Reward が出るばあい。
0.01 から 0.001 : train 終盤

vi. 結論を言えば、まだ、完成を見ない。
最終的には、Isaac Gym を使って、何千台を同時に train させる方法にならざるを得ないか!
でも、今までの Gazebo Mini Pupper2 の強化学習の勉強で、基本的な sb3 ppo rl の使い方が、習得できた気がする。
将来は、シミュレーション環境が変わっても、もっと簡単に env 作成ができそうじゃ!!

2.
当初、google ai に最初おしえてもらった、Locomotion Transformer の class が、時間学習が無いものだった。
第4弾に記述したが、模倣学習の件で、google ai に聞いているうちに、時間学習のある、Locomotion Transformer の class コードを返答してきた。
古いコードと違うので、その点を問い詰めたら、白状した。わるいやつじゃ!!

おまけに、この件への最初の回答が、この質問に関して、回答できませんでした....
と、返してきた。
すっとぼけるな!!
と送ったら、やっと、白状した。
最近、都合が悪いと、"この質問に関して、回答できませんでした...." と逃げの手段を覚えたのか?

やはり、最初から強化学習させるよりは、最初は、模倣学習させて、あとで、強化学習させてほうが、早いきがする。

github に上げました。
@tosa-no-onchan/sb3-ppo-my/mini_pupper_rl_lt

現状、おんちゃんが考えられうる修正を加えて、最終盤を、アップしました。
とりあえず、今回の試みは、このへんで、止めにします。 by nishi 2026.9.15
また、いい考えが、浮かんだらトライしてみます。

3. ファインチューニング
SB3 PPO Locomotion Transforomer で、Mini Pupper2 用に、強化学習したら、
同じ model を使って、他の大型犬「Unitree Go2」向けに、フィインチューニングすれば、使えるみたいじゃ。
その際、joint と Action の並びの違いを吸収する、ラッパー入れればよいみたい。
ただ、大型犬となると、シミュレーションが、Gazebo でなくて、Isaac Sim とかになるから、....

このブログ記事について

このページは、おんちゃんが2026年8月 4日 13:07に書いたブログ記事です。

ひとつ前のブログ記事は「Mini Pupper2 ros2 4足歩行 Policy 強化学習」です。

次のブログ記事は「あきれたWi-Fi 通信業者!!」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

月別 アーカイブ

ウェブページ

サイトナビ