OpenAI gymと物理シュミレータを組み合わせたプロジェクトは色々ある。
これから便利なライブラリが色々出てくるだろうけど、
とりあえず、gym-ignitionというものを試してみる。
パッと見シンプルにまとめられていて良さげだったので...。
exampleはREADME.mdを見れば簡単にできます。
関連記事: nullpo24.hatenablog.com
自分で作成したworldとプレイヤーを学習させるにはどうするか
構造から見てみましょう。
構造
Component | Description |
---|---|
ignition | gymppとIgnition Gazeboシミュレーターをインターフェースするクラスのセット |
plugins | Ignition Gazebo プラグイン |
gym_ignition | OpenAI Gym environmentsを作成するためのPythonパッケージ |
gym_ignition_data | SDFとURDFとGazebo worlds |
gympp | OpenAIジムインターフェースの実験的なC ++ポート。C++オンリーな環境を作成したい場合に使う。 |
gym_ignition
以前、PANDRAというworldにゲルコマさんを登場させたので、 それをgym-ignitionに移植します。
nullpo24.hatenablog.com
また、Open AI Gymについてちょこっと書きました。
まずはGymへ登録します。 下記ディレクトリに登録用のファイルがあります。
gym_ignition > __init__.py
# ============================ # IGNITION GAZEBO ENVIRONMENTS # ============================ register( id='Gelcoma-Gazebo-v0', entry_point='gym_ignition.runtimes.gazebo_runtime:GazeboRuntime', max_episode_steps=5000, kwargs={'task_cls': gelcoma_gostraight.GelcomaGoStraight, 'robot_cls': sim.gazebo.gelcoma.GelcomaGazeboRobot, 'model': "Gelcoma/Gelcoma.sdf", 'world': "DefaultEmptyWorld.world", 'rtf': max_float, 'agent_rate': 1000, 'physics_rate': 1000, 'hard_reset': True, })
gymに登録した内容に合わせてファイルを追記・修正をしていきます。
とりあえず、上記に登録したタスククラスのためにimportしておく。
from gym_ignition.tasks import gelcoma_gostraight
kwargsについて
キーワード引数は公式では環境によって様々な引数が渡されるかが、
gym_ignitionでは上記のようにまとめられていた。
keyargs | description |
---|---|
task_cls | タスククラス |
robot_cls | RobotABCインターフェースが提供するクラスのタイプ |
model | SDF file |
world | SDF file |
rtf | Gazeboシミュレーション属性 |
agent_rate | Gazeboシミュレーション属性 |
physics_rate | Gazeboシミュレーション属性 |
hard_reset | Gazeboシミュレーション属性 |
task_cls
ゲルコマさんにまず何をさせよう?
とりあえず、まっすぐ走らせてみようか?
'task_cls': gelcoma_gostraight.GelcomaGoStraight
タスククラスは
gym_ignition>tasksにまとめられています。
tasks>__init__.py
(コード追記)
from . import gelcoma_gostraight
tasks>gelcoma_gostraight.py
(新規作成)
とりあえず、コピペ。
robot_cls
RobotABC?なにそれ?
ABCとはABstractClassのことらしい。
'robot_cls': sim.gazebo.gelcoma.GelcomaGazeboRobot
ロボットクラスは
gym_ignition>robotsにまとめられています。
robots>sim>gazebo>__init__.py
(コード追記)
from . import gelcoma
robots>sim>gazebo>gelcoma.py
(ファイル新規作成)
from gym_ignition.robots import gazebo_robot class GelcomaGazeboRobot(gazebo_robot.GazeboRobot): def __init__(self, model_file: str, gazebo, **kwargs): # Initialize base class super().__init__(model_file=model_file, gazebo=gazebo, controller_rate=kwargs.get("controller_rate"))
model
前回.worldの中にmodelを作成したが、どうやら分けないといけないようだ。
といってもincludeタグのground_planeとsunを外すだけだが。
というか.sdfの中にxacroが定義されている!?
'model': "Gelcoma/Gelcoma.sdf",
world
とりあえずDefaultEmptyWorld.worldでもいいかなぁ。
'world': "Pathway.world",
rtf
とりあえずそのまま
agent_rate
とりあえずそのまま
physics_rate
とりあえずそのまま
hard_reset
とりあえずそのまま
その他の追加・修正点
gym_ignition_data>CMakeLists.txt
install( DIRECTORY Gelcoma DESTINATION ${CMAKE_INSTALL_DATADIR}/gympp/gazebo/models FILES_MATCHING PATTERN "*.sdf" PATTERN "*.config")
example>python>launch_gelcoma.py(新規作成)
ポイントは
登録したidをmakeし、
env = gym.make("Gelcoma-Gazebo-v0")
再ビルドして実行
$ cd build $ cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. $ cmake --build . $ sudo cmake --build . --target install
(venv)$ python3 examples/python/launch_gelcoma.py
Task Class
タスククラスを適切に決めるのが難しい。
報酬の決め方とか...力の伝え方とか...