welcom ! Handel home

2025年1月16日 星期四

如何在 Gazebo 中添加新的世界和模型

 

如何在 Gazebo 中添加新的世界和模型


1. 添加新的世界

Gazebo 提供了一些 預設世界,但你也可以 自訂 .world 檔案,來建立自己的模擬環境。

1.1 使用預設世界

Gazebo 預設提供了一些 內建世界,例如:

  • empty_world.launch(空白世界)
  • willowgarage_world.launch(Willow Garage 環境)
  • mud_world.launch(泥地環境)

可以使用 roslaunch 啟動:

bash:
roslaunch gazebo_ros empty_world.launch

1.2 創建自訂世界

  1. 建立 .world 檔案

    • .world 檔案使用 SDF(Simulation Description Format) 格式來描述環境。
    • 內容示例:
      xml:
      <?xml version="1.0" ?> <sdf version="1.6"> <world name="my_world"> <include> <uri>model://ground_plane</uri> </include> <include> <uri>model://sun</uri> </include> </world> </sdf>
    • 這個 .world 檔案包含:
      • 地面 (ground_plane)
      • 太陽光源 (sun)
  2. .world 檔案存放至合適位置

    bash:
    mkdir -p ~/gazebo_worlds nano ~/gazebo_worlds/my_world.world
    • 可以將 .world 文件存放於 ROS 工作區(如 ~/catkin_ws/src/my_package/worlds/)。
  3. 建立 .launch 啟動檔

    xml:
    <launch> <arg name="world_file" default="$(find my_package)/worlds/my_world.world"/> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(arg world_file)"/> </include> </launch>
    • 這個 .launch 檔案 會載入 my_world.world 並啟動 Gazebo。
  4. 使用 roslaunch 啟動新世界

    bash:
    roslaunch my_package my_world.launch

2. 添加新的模型

Gazebo 允許載入內建模型,也可以 自訂模型(SDF 或 URDF 格式)。

2.1 使用內建模型

Gazebo 提供 官方和社群的內建模型,可以在 .world 檔案中直接引用:

xml:
<include> <uri>model://box</uri> <pose>0 0 0 0 0 0</pose> </include>

這樣會在 座標 (0,0,0) 處添加一個方形模型。


2.2 自訂模型

如果要 自己創建模型,需使用 SDF 或 URDF 格式。

  1. 建立 SDF 格式模型

    xml:
    <?xml version="1.0" ?> <sdf version="1.6"> <model name="my_box"> <static>false</static> <link name="base_link"> <collision name="collision"> <geometry> <box> <size>1 1 1</size> </box> </geometry> </collision> <visual name="visual"> <geometry> <box> <size>1 1 1</size> </box> </geometry> </visual> </link> </model> </sdf>
    • 這個模型是一個 1x1x1 的方塊,可以移動。
  2. 將 SDF 檔案放入 Gazebo 模型資料夾

    bash:
    mkdir -p ~/.gazebo/models/my_box nano ~/.gazebo/models/my_box/model.sdf

    模型結構

    javascript:
    ~/.gazebo/models/my_box/ ├── model.config ├── model.sdf
  3. 將模型載入世界

    • .world 檔案中:
      xml:
      <include> <uri>model://my_box</uri> <pose>0 0 0.5 0 0 0</pose> </include>

3. 使用 spawn_model 動態載入模型

Gazebo 支援透過 spawn_model 指令 在運行時 動態添加模型

bash:
rosrun gazebo_ros spawn_model -file ~/.gazebo/models/my_box/model.sdf -sdf -model my_box
  • 參數解釋
    • -file → 指定 SDF/URDF 檔案
    • -sdf → 指定模型格式(-urdf 代表 URDF 格式)
    • -model → 指定模型名稱

如果模型是 XACRO 格式,需先轉換為 URDF

bash:
rosrun xacro xacro my_robot.xacro > my_robot.urdf

4. 與 ROS 互動

當模型載入後,可以 透過 ROS topic 與 Gazebo 互動

4.1 監聽模型狀態

bash:
rostopic echo /gazebo/model_states

輸出範例

yaml:
name: ['ground_plane', 'my_box'] pose: - position: {x: 0, y: 0, z: 0} - position: {x: 1, y: 2, z: 0}

4.2 發送指令控制機器人

bash:
rostopic pub /cmd_vel geometry_msgs/Twist "linear: {x: 0.5, y: 0, z: 0}"

這樣會讓機器人向前移動。


5. 總結

步驟內容
添加世界    建立 .world 檔案,使用 roslaunch 啟動
使用預設世界  roslaunch gazebo_ros empty_world.launch
自訂世界   創建 .world,加入地形與光線
添加內建模型   在 .world 檔案中使用 <include> 加載模型
自訂模型   創建 SDF 或 URDF 模型,放入 ~/.gazebo/models/
動態載入模型    rosrun gazebo_ros spawn_model -file model.sdf -sdf -model my_box
與 ROS 互動   使用 rostopic 監聽 /gazebo/model_states,發送指令控制機器人

Gazebo 不僅支援預設世界和模型,也允許用戶自訂環境、載入新模型,並透過 ROS 進行控制,這使得它成為機器人開發與模擬的強大工具。 🚀

沒有留言: