30代エンジニアの備忘録のカバー画像

30代エンジニアの備忘録

組み込み開発・信号処理・プログラミングの技術メモと短編小説

🤖 【ROS2入門⑩】Gazeboシミュレーター入門 - 仮想空間でロボットを動かす

シリーズ この記事は「ROS2入門シリーズ」の一部です。 シリーズ目次を見る

2026年5月時点のメモです。ROS 2 入門シリーズ⑩として、実機がなくても試せる Gazebo 連携の入口を整理します。想定読者は Humble を入れたばかりの方で、ここでは「ros_gz でトピックを橋渡しする」イメージと TurtleBot3 シミュの起動までを押さえます。

Gazebo と ROS 2 をつなぐ層として ros_gz(旧 ros_ign 系)がよく説明されます。パッケージ名はディストリと Gazebo 世代で変わるため、手元では `apt search ros-humble ros-gz` と Gazebo(gz-sim)公式・ros_gz ドキュメント を正にしてください。本記事のコマンド例は TurtleBot3 e-Manual 向け turtlebot3_gazebo 前提です。

結論として、シミュは物理が簡略化された検証環境です。まず仮想空間でノードとトピックの流れを掴み、⑪の Nav2 へ進む足場にします。シリーズ全体は ROS2入門シリーズ目次 を参照してください。


Gazebo(gz-sim)では何がシミュレーションできる?

Gazeboがよく担当する処理の一例:

  物理エンジン  -> 重力・摩擦・衝突の近似モデル
  センサー    -> LiDAR、カメラ、IMU など(ノイズはモデル依存)
  アクチュエータ -> モーター、グリッパー、関節
  3D環境  -> 建物、道路、障害物

ROS 2 Humble に Gazebo 関連パッケージはどう入れる?

# Gazebo / ros_gz と ROS 2 Humble の組み合わせは環境により推奨が変わることがある
sudo apt install ros-humble-ros-gz -y

# TurtleBot3シミュレーションパッケージ
sudo apt install ros-humble-turtlebot3-gazebo -y

TurtleBot3 の Gazebo シミュはどう起動する?

TurtleBot3とは

TurtleBot3 は ROS 2 の教材で広く使われるプラットフォームです。シミュ用 launch は TurtleBot3 e-Manual の Simulation 章が正本です。

TurtleBot3 Burger構成図
TurtleBot3 Burger構成図
シミュレーションの起動
# 環境変数を設定
export TURTLEBOT3_MODEL=burger

# シミュレーションを起動
# ターミナル1: Gazebo起動
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

# ターミナル2: キーボード操作ノード
ros2 run turtlebot3_teleop teleop_keyboard
操作方法
teleop の操作例(パッケージの表示に従ってください):

  w: 前進
  s: 後進
  a: 左回転
  d: 右回転
  space: 停止

URDF でロボットモデルはどう定義する?

Gazebo にロボットを出すには URDF(Unified Robot Description Format)でリンク・関節・慣性を定義します。TurtleBot3 実機向けの詳細は TurtleBot3 e-Manual の Description を参照してください。

<!-- simple_robot.urdf -->
<robot name="simple_robot">
  <!-- ベースリンク -->
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.3 0.2 0.1"/>  <!-- 幅x奥行x高さ -->
      </geometry>
      <material name="blue">
        <color rgba="0.0 0.0 1.0 1.0"/>
      </material>
    </visual>
    <collision>
      <geometry>
        <box size="0.3 0.2 0.1"/>
      </geometry>
    </collision>
    <inertial>
      <mass value="1.0"/>
      <inertia ixx="0.01" ixy="0" ixz="0"
               iyy="0.01" iyz="0" izz="0.01"/>
    </inertial>
  </link>

  <!-- フロントホイール -->
  <link name="front_wheel">
    <visual>
      <geometry>
        <cylinder radius="0.05" length="0.04"/>
      </geometry>
    </visual>
  </link>

  <!-- ペアレント-子の接続 -->
  <joint name="front_wheel_joint" type="continuous">
    <parent link="base_link"/>
    <child link="front_wheel"/>
    <origin xyz="0.15 0 -0.05"/>
    <axis xyz="0 1 0"/>
  </joint>
</robot>

ROS 2 と Gazebo はどう接続される?

ROS2アプリ→ros_gz_bridge→Gazeboシミュレーターの接続構造
ROS2アプリ→ros_gz_bridge→Gazeboシミュレーターの接続構造

シミュ上のセンサーデータはどう確認する?

# TurtleBot3のセンサーデータを確認
ros2 topic list
# /scan            <- LiDARデータ
# /odom            <- オドメトリ(移動量)
# /cmd_vel         <- 速度指令
# /imu             <- IMUデータ

# LiDARデータを確認
ros2 topic echo /scan --once

Gazebo 連携でよくある失敗は何か?

  • TURTLEBOT3_MODEL(burger 等)がターミナルごとに揃っていないと、モデル読み込みで落ちやすい
  • turtlebot3_gazebo や ros-humble-ros-gz は 未導入・非推奨の案内が環境で変わり得る。メッセージに従いバージョンを合わせる
  • ros2 launch が何を起動しているかは ros2 topic list で押さえると、記事との差分が掴みやすい

Gazebo 入門の要点は?

  • Gazebo は 物理が簡略化された検証環境として捉え、チューニングやモデル選択で振る舞いは変わる
  • URDF で リンク・関節・慣性を置き、world とロボットの接続に Gazebo の拡張が乗る、というレイヤーを意識する
  • ros_gz / Bridge は ROS とシミュ側の話題がまとめて動く構成(詳細は利用パッケージの README が正)
  • TurtleBot3 のハウツーは バージョン差が出やすいので、セットアップ済み構成を基準に差分だけ追う
  • 次回(シリーズ⑪)では Nav2 入門へ進む想定です(パラメータはプロジェクトごとに要調整)