ふるお〜と!- FullAuto

AI・ロボットが普及しBI(ベーシックインカム)が早急に実現されることを願う元ニートのブログ

ふるお〜と!-FullAuto

【OpenAI】gym-ignitionを試してみた【Ignition Gazebo】

OpenAI gymと物理シュミレータを組み合わせたプロジェクトは色々ある。

これから便利なライブラリが色々出てくるだろうけど、
とりあえず、gym-ignitionというものを試してみる。
パッと見シンプルにまとめられていて良さげだったので...。

github.com

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

nullpo24.hatenablog.com

以前、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

タスククラスを適切に決めるのが難しい。
報酬の決め方とか...力の伝え方とか...

f:id:nullpo24:20200307191604g:plain