🐱

知能ロボコンのGazeboワールド作成メモ(GazeboSim Harmonic向け)

に公開

まえがき

2024/6に知能ロボコンのGazeboワールド作成メモという記事を書いた。上記記事での環境では、Gazeboが新規一転いろいろ変わる混乱期だったとおぼろげながら記憶している。

知能ロボコン2025に参加するにあたり、上記記事にある環境をGazeboSim(Harmonic)で動かそうとしたがうまく行かず。

残念ながら知能ロボコン開催日までに完全に対応することはできなかったが、ロボコンが一段落したので腰を据えて対応させたので、その際のことを書き留める。

なお、GitHubリポジトリはここ

修正前ディレクトリ構成

$ cd ros2_ws/src/irc_table
$ tree
.
├── CMakeLists.txt
├── launch
│   └── irc.launch.py
├── models
│   └── irc_table
│       ├── meshes
│       │   ├── irc_table.dae
│       │   └── irc_table.stl
│       ├── model.config
│       └── model.sdf
├── package.xml
└── worlds
    └── irc.sdf

修正

おもむろにlauchしたが、パッケージ名やlaunchファイル名が変わっていたり、いろいろ変わっている模様。トライ&エラーで手当り次第直してみたもののいくつかやって諦めた。

困ったときは本家ドキュメントとturtlebot3のパッケージ。

GazeboSimの最新バージョンはすでにひとつ先に進んでいる。が、ROS 2(Jazzy)に入るのは一つ前のHarmonicなのでそのドキュメントを見る。

まずは、worldファイル単独で起動できるかどうか。起動しない。sunやground_planeモデルが見つからないようだ。

worldファイル修正

worldファイルから見直す。これをワールド名以外そのまま使う。

テーブルのmodelを取り込むには?これを参考に追記。環境変数を設定することでモデルの場所を追加できるようだ。

worldファイルはここです。

$ export GZ_SIM_RESOURCE_PATH="$HOME/ros2_ws/src/irc_table/models"
$ gz sim worlds/irc_table.sdf 

ひとまずテーブルが出せるところまで確認できた。

ただ、Gazebo classicでやっていたボールのランダム生成はできなかった。SDFormatの<population>タグがGazeboSimになってサポートされない、とChatGPTさんは言ってるが審議は不明。ただ、Pythonスクリプトを使うとできる、と回答をくれたのでそれを信じた。

launchファイル修正

launchファイルはturtlebot3_gazeboパッケージのturtlebot3_world.launch.pyを参考に修正した。

このlaunchファイルの中で以下2点も行っている。

  • サンプルのロボットとしてturtlebot3をspawnするlaunchファイル(spawn_turtlebot3.launch.py)を呼ぶ
  • ボールをspawnするlaunchファイル(spawn_random_balls.launch.py)を呼ぶ

修正版turtlebot3_world.launch.py

ロボコンステージの上にturtlebot3をspawnさせる必要があるため、spawn位置のz方向を指定する必要がある。ステージは0.255mの高さがあるがピッタリの高さではステージに埋まってしまう可能性がある(classic時代だと埋まった)ので、少し高めの0.290mにspawnするようにしている

spawn_random_balls.launch.py

知能ロボコンのルールを参考に、必要な要件を洗い出す

  1. ボールは8つのエリア内に配置される
  2. ボールはエリアあたり1つまたは2つ
  3. ボールは赤・青・黄の3色で各5個づつある
  4. ボールは直径65mmから70mm、重さは25から35g

上記ルールのうち、ボールの直径は66mm、重さは30gと決め打ちした。ボールの配置はルール通りを実現した。

ワールドにボールを生成するのはros_gz_simパッケージのcreateノードを使った。
launchファイルには以下のように記載した。

Node(
  package='ros_gz_sim',
  executable='create',
  arguments=[
    '-name', f'ball_{i}_{color}',
    '-file', model_file,
    '-x', str(round(x, 3)),
    '-y', str(round(y, 3)),
    '-z', str(z) 
  ],
  output='screen'
)

launchファイル全体はこれ

ボールのモデル追加

色の定義を変えただけのモデルファイルを作った。

完成したワールド

以下実行するとgazeboが表示されます。

$ export TURTLEBOT3_MODEL=burger
$ ros2 launch irc_table irc_table.launch.py

完成後のディレクトリ構成

$ tree
.
├── CMakeLists.txt
├── README.md
├── launch
│   ├── irc_table.launch.py
│   ├── spawn_random_balls.launch.py
│   └── spawn_turtlebot3.launch.py
├── models
│   ├── ball_blue
│   │   └── model.sdf
│   ├── ball_red
│   │   └── model.sdf
│   ├── ball_yellow
│   │   └── model.sdf
│   └── irc_table
│       ├── meshes
│       │   ├── irc_table.dae
│       │   └── irc_table.stl
│       ├── model.config
│       └── model.sdf
├── package.xml
└── worlds
    └── irc_table.sdf

9 directories, 14 files

最後に

1年前にGazebo classic向けに作った環境をGazeboSim環境でも使えるようになってよかった。
どなたかの役にたてると嬉しいです。

Discussion