pythonによる4足歩行ロボットの制御と強化学習による歩行動作獲得の実例...
TRANSCRIPT
Pythonによる4足歩行ロボットの制御と強化学習による歩行動作獲得の実例
Beatrobo, Inc. 竹井英行PyConJP2015 2015/10/10
自己紹介
• @HideyukiTakei • H/W: 回路設計、マイコン、外装設計、中国 • SW: フロントエンドJS、Android、AWS • かわいいロボットが好き
自己紹介
アジェンダ
• 盆栽ロボット • ロボットシミュレータGazeboの紹介 • GazeboをPythonからコントロールする • 簡単な機構のロボットの作成 • Q学習による前進動作の獲得 • 盆栽ロボを実機で動作させる • まとめ
形はできたが…
モーション作るのが面倒
• モータの角度情報を手打ちして、モーションを作らなければならない
• 非常に面倒! • 勝手にロボットが動いてくれたら良いのに
強化学習によるモーションの獲得を目指す!
強化学習の壁
• 数百回の試行回数… • 試行回数多いと、ロボット自体が壊れそうな心細い設計
• 実物で学習させるには気が引ける • 計測とかもめんどくさそう
シミュレーションでやっちゃおう!
Gazebo• http://gazebosim.org/ • オープンソースな3Dのロボット シミュレータ環境
• リアルタイム、見た目きれい • ODEやBulletなどの3D物理エンジンが切り替えられる
• よくROSといっしょに使われている • バージョンの問題などもあるので、今回はROSを使わず直接Gazeboとコミュニケーションする
• Gazeboはv6.1.0を利用
Gazeboの見た目
Gazeboの構成
GzServerシミュレーション空間
vGzClient
モデル
今回作る 強化学習プログラム
Protocol BuffersのPubSubでServer-Clientが通信
Gazebo Tips• Topic Visualizationツールを使うことで、現在流れているメッセージをリアルタイムで見ることができる
• コマンドラインからメッセージのpublish/subscribeができる
• Gazebo の単位系は SI に準拠 • 長さはメートル(meter) • 重さ(mass)はキログラム(kg) • 速度(velocity)は • revolute joints は rad/s • <pose> などで6つの数字が並んでいるのは「x y z roll pitch yaw」です
PythonでGazeboと通信
• PyGazebo • https://github.com/jpieper/pygazebo • ほぼProtoBufの *_pb2.py のファイル • 今回使う機能 • Subscribe • ロボットの座標、姿勢 • Publish • ロボットのモータの角度指定
@trollius.coroutine def publish_loop(): manager = yield From(pygazebo.connect())
publisher = yield From( manager.advertise('/gazebo/default/model/joint_cmd', 'gazebo.msgs.JointCmd'))
message = pygazebo.msg.joint_cmd_pb2.JointCmd() message.name = 'robot::joint_name' message.axis = 0 message.force = 1.0
while True: yield From(publisher.publish(message)) yield From(trollius.sleep(1.0))
loop = trollius.get_event_loop() loop.run_until_complete(publish_loop())
ジョイント操作用コマンド
ロボットの関節を動かすサンプルコード
操作するロボット名と関節名を指定力を加える方向と強さを指定
コマンドをパブリッシュ
Gazeboサーバと通信する ためのマネージャの作成
モデルの表現• SDF(http://sdformat.org/)を利用 • ロボットシミュレーション向け • モデルや環境を定義するための XMLフォーマット
• モデルの形(STLかDAEを指定)、回転軸、表面の摩擦係数などの物理的な特性が定義できる
• モデルを動かす環境もSDFで定義する • https://bitbucket.org/osrf/gazebo_models/src こちらにGazeboで使えるSDFが集まっている
• WillowGarageのPR2などのSDFを参考にして モデルの定義をするのがオススメ
SDF-Converterの使い方• 3DCADのInventorのアセンブリからSDFを生成 • https://github.com/willstott101/SDF-Converter からコードをダウンロードしてVisualStudioでexeをビルドする• Inventorでアセンブリ ファイル.iamを開く • SDF-Converterアプリを同時起動する • Save to file とAlso save STLsにチェックをつけて、STL Scaleは0.01のまま • Generate SDFを押すとSDFが生成される
試しに簡単なロボットを作ってみよう• 本格的なロボットの前に板型ロボットに前進移動のモーションを獲得させる • 形は3DCADで作成 • CADデータからSDFを作成 • visualとcollisionのモデルは両方同じSTLを使用 • SDF-Converter(https://github.com/willstott101/SDF-Converter)を利用してSDFを作ろう
SDF
3DCADの Inventorで作成
SDF-Converter でInventorの アセンブリから SDFを生成
SDFをGazeboに インポートする
強化学習(Q学習)• ある状態stである行動atをとったとき、未来にわたってどのくらいの報酬が得られそうかを表す行動価値関数Q(st, at)を学習
• ε-greedy選択:定められた確率εでランダムに行動し,(1-ε)の確率で大きな方のQ値を持つ行動を選択をする
エージェントQ学習による 行動選択
環境行動at
状態st
環境の 変化
報酬rt rt+1st+1
状態sと行動aと報酬r• 状態数を減らすために制約を設ける • 各関節は-90度、0度、 90度の3パターンのみ • 行動は1つの関節しか動かせない • 同じ状態になる行動は選択不可
• 状態sは9パターン • 状態stで取ることができる行動atは4パターン • 前に進めば進むほど報酬が高い
1つの関節だけ動かす
プログラムの構成
Environment
Agent状態管理
アクション生成シミュレータ内の
ロボットのサーボ設定と 座標取得
GzServerロボットの
シミュレーションQLearning
Q学習部分
今回作ったところ
PyGazeboによる ProtoBufのやりとり
最初のころ
バタバタしかしてない
200試行目くらい
いつの間にか前に進むようになってる!
ついに盆栽に強化学習を!• 盆栽ロボ5つのサーボがある • 各足ごと1つの上下方向のサーボ4つ • 4つの足の横軸に動かすためのサーボ1つ • 獲得できた歩行を実機でデモします!!
歩行の様子
まとめ
• Q学習でロボットに前進動作の獲得をさせた • シミュレーションなら意外と簡単 • ソースコードはのちほど公開するので、 みなさん動かしてみてください!
• 盆栽は乞うご期待!
Beatroboエンジニア募集中!
docker好きな方 ハードウェア好きな方 アルバイト・社員募集中!
ロボット作りでよく使うツール• eagle http://www.cadsoftusa.com/ • プリント基板設計ソフトウェア • elecrow http://www.elecrow.com/ • 激安プリント基板製造サービス • Inventor • 3D CAD。Fusion360は無料で使える • Shapeways • ヨーロッパの3Dプリントサービス • AVR & GCC • 8bitマイコン(C言語で開発)