この資料は、**古いGazebo(Gazebo Classic)から新しいGazeboへの移行(お引越し)**について説明しています。
単なるバージョンアップではなく、中身の仕組みが大きく変わっているため、少し大がかりな作業になります。
初心者の方にもわかりやすいように、主な違いと具体的な作業ステップをまとめました。
I. 主な違い
1. 中身の仕組み(アーキテクチャ)が変わりました
- 古いGazebo: すべての機能が1つの大きな塊になっていました。
- 新しいGazebo: 必要な機能(モジュール)をブロックのように組み合わせて使う設計になりました。これにより、自分好みにカスタマイズしやすくなりました。
2. 動きがスムーズになりました
- 物理演算(モノの動きを計算する機能)が新しくなり、たくさんのロボットを動かしてもサクサク動くようになりました。
3. 見た目がキレイになりました
- 描画エンジン(画面に映し出す機能)が新しくなり、よりリアルな表現ができるようになりました。
4. 起動するコマンドが変わりました
- 古いGazeboでは
gazeboというコマンドでしたが、新しい方はgz simというコマンドになります (以前はign gazeboと呼ばれていました)。
II. 移行するための具体的なステップ
移行するには、主に「モデルファイルの書き換え」「ワールドファイルの書き換え」「プログラムの書き換え」「ROS 2との連携設定」の壁を乗り越える必要があります。
Step 1: モデルファイル(SDF)の更新
ロボットや建物の形を定義する「SDFファイル」の書き方を新しくする必要があります。
-
位置の基準をはっきりさせる(最重要):
以前は「なんとなくここが基準」とされていましたが、新しいGazeboでは「どこを基準にしているか」を必ず書く必要があります(relative_to属性)。【例:SDFの書き方の違い】
<!-- 古いGazebo(SDF 1.6)の場合 --> <pose>1 0 0 0 0 0</pose> <!-- 新しいGazebo(SDF 1.8以降)の場合 --> <!-- 'base_link' というパーツを基準にして配置すると明示する --> <pose relative_to='base_link'>1 0 0 0 0 0</pose> -
色の指定方法を変える:
見た目のキレイさを活かすために、光の反射などを細かく設定する形に変わりました。【例:色の指定】
<material> <ambient>0.8 0.1 0.1 1.0</ambient> <!-- 全体的な色(赤っぽくする) --> <diffuse>0.8 0.1 0.1 1.0</diffuse> <!-- 光が当たった時の色 --> <specular>0.5 0.5 0.5 1.0</specular> <!-- 光の反射の強さ --> </material> -
環境変数の変更:
「自作したロボットのファイルがどこにあるか」をパソコンに教えるための設定名が変わりました。- 旧:
GAZEBO_MODEL_PATH - 新:
GZ_SIM_RESOURCE_PATH
- 旧:
Step 2: ワールドファイル(世界の設定)の更新
ワールドファイル(.world)では、「どの機能を使うか」を明示的に宣言するようになりました。
-
必要な機能を読み込む:
物理演算や画面表示などの基本機能も、明示的に呼び出す必要があります。【例:ワールドファイルに追加する設定】
<world name="default"> <!-- 物理計算の機能を読み込む --> <plugin filename="gz-sim-physics-system" name="gz::sim::systems::Physics"/> <!-- 画面にモノを描画する情報を配信する機能を読み込む --> <plugin filename="gz-sim-scene-broadcaster-system" name="gz::sim::systems::SceneBroadcaster"/> <!-- 再生や停止などのユーザー操作を受け付ける機能を読み込む --> <plugin filename="gz-sim-user-commands-system" name="gz::sim::systems::UserCommands"/> ... </world>
Step 3: 自分で作ったプラグイン(C++プログラム)の書き換え
これが一番大変な作業です。古いGazebo用に作ったプログラムはそのままでは動きません。
中のデータとのやり取りの方法が根本的に変わったため、プログラムを書き直す必要があります。
-
考え方の違い:
以前は「ロボットの腕パーツを取得して、そこに力を加える」という直接的な操作でした。
新しいGazeboでは、「システム全体が持っている現在の状態(データ)を読み取り、変更の指示を出す」という間接的な操作(コマンドベースの操作)になります。少しゲーム作りのような形(ECSアーキテクチャ)に近くなりました。
Step 4: ROS 2との連携方法の変更
ROS 2と一緒に使うときの設定方法も変わりました。GazeboとROSを直接つなぐのではなく、「ブリッジ(橋渡しプログラム)」を間に挟んで通信するようになります。
-
使うパッケージが変わる: 古い
gazebo_ros_pkgsではなく、新しいros_gzというパッケージを使用します。 -
ブリッジの設定(必須): どのデータをROSとGazeboでやり取りするかを一つずつ設定する必要があります。
【例:ROS 2のPython Launchファイルでの設定例】
from launch_ros.actions import Node # GazeboとROSの間で /chatter というデータのやり取りを中継(ブリッジ)する設定 bridge = Node( package='ros_gz_bridge', executable='parameter_bridge', # 【重要】 トピック名 @ ROSのデータの型 @ Gazeboのデータの型 という形式で書く arguments=['/chatter@std_msgs/msg/String@gz.msgs.StringMsg'], output='screen' )