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
シミュレーション空間
v
GzClient
モデル
今回作る
強化学習プログラム
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+1
st+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言語で開発)

Pythonによる4足歩行ロボットの制御と強化学習による歩行動作獲得の実例 #pyconjp