將模型放入 ROS 2 Gazebo 並整合控制與感測器
本指南將詳細說明如何將您的 URDF 模型整合到 ROS 2 Gazebo 環境中,並加入控制插件、感測器模擬以及 RViz 可視化配置。內容基於您提供的資訊進行組織。
關於檔案名稱的注意事項: 您提供的 zip 檔案包含一個資料夾 ROS小車URDF-02
,其中有一個 .urdf
檔案和多個 .stl
檔案(機構模型),命名中有中文亂碼(例如 Φ╗èΘ½ö_IMU.stl
),這可能是編碼問題造成的。在實際操作中,建議將這些檔案重新命名為英文或純數字名稱,以避免潛在問題。本指南中的範例會使用簡化的英文名稱。
請確保您已安裝以下軟體:
- ROS 2(如 Humble / Iron)
- Gazebo(通常是 Gazebo Classic,非 Ignition)
- ros_ign_gazebo(如果您使用的是 Ignition 版本)
- gazebo_ros_pkgs
假設您有一個 ROS 2 workspace 位於 ~/ros2_ws
。請使用以下指令將壓縮包解壓到您的 ROS 2 工作區:
cd ~/ros2_ws/src
unzip /mnt/data/ROS小車URDF-02.zip -d urdf_car
這會將內容解壓到 ~/ros2_ws/src/urdf_car
資料夾中。
解壓後,請確保目錄內包含類似以下結構(請根據實際情況調整檔案名稱):
urdf_car/
├── CMakeLists.txt
├── package.xml
├── launch/
│ └── gazebo.launch.py
├── urdf/
│ └── car.urdf.xacro 或 car.urdf (根據您提供的檔案應為 .urdf)
├── meshes/
│ └── *.dae / *.stl
└── world/
└── your_world.world (optional)
如果檔案是 .xacro
格式,您需要在啟動前轉換成 URDF 格式。由於您提供的檔案是 .urdf
,通常不需要額外轉換,但請檢查內容是否完整。
這是一個典型的 gazebo.launch.py
範例,可以用來載入車模到 Gazebo。請將此內容儲存到 urdf_car/launch/gazebo.launch.py
。確保 arguments=['urdf/car.urdf']
中的檔案名稱與您的模型實際名稱一致。
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import ExecuteProcess
def generate_launch_description():
return LaunchDescription([
# 啟動 Gazebo 模擬器
ExecuteProcess(
cmd=['gazebo', '--verbose', '-s', 'libgazebo_ros_factory.so'],
output='screen'),
# 載入車輛模型
Node(
package='robot_state_publisher',
executable='robot_state_publisher',
name='robot_state_publisher',
output='screen',
parameters=[{'use_sim_time': True}],
arguments=['urdf/car.urdf'] # 根據實際檔名修改,例如 'urdf/ROS小車URDF-02.urdf'
),
# Spawn Model 到 Gazebo 中
Node(
package='gazebo_ros',
executable='spawn_entity.py',
arguments=['-entity', 'urdf_car', '-file', 'urdf/car.urdf', '-x', '0', '-y', '0', '-z', '0.2'],
output='screen'
)
])
- 回到工作區根目錄並編譯您的 package:
- 啟動模擬:
cd ~/ros2_ws
colcon build --packages-select urdf_car
source install/setup.bash
ros2 launch urdf_car gazebo.launch.py
以下是進一步增強您的模型與模擬環境的建議:
- 加入控制插件(如 diff_drive_controller)
- 加入感測器模擬(如 lidar、camera、IMU)
- 撰寫控制節點與 RViz 可視化配置
接下來的步驟
以下將說明如何加入控制器、感測器模擬、RViz 可視化設定及控制節點。
① 修改 URDF:加入 Plugin 和 Sensor 模組
請將以下範例片段加入到您的 URDF 檔案中。通常這些 <gazebo>
標籤會放在 </robot>
標籤之前,或者與對應的 <link>
標籤在相同的 <robot>
範圍內。請確保連接 (reference
) 的 link name
正確。
✅ 加入 Diff Drive Controller Plugin
<gazebo>
<plugin name="diff_drive" filename="libgazebo_ros_diff_drive.so">
<ros>
<namespace>/</namespace>
</ros>
<update_rate>50</update_rate>
<left_wheel>left_wheel_joint</left_wheel>
<right_wheel>right_wheel_joint</right_wheel>
<wheel_separation>0.5</wheel_separation>
<wheel_diameter>0.15</wheel_diameter>
<command_topic>cmd_vel</command_topic>
<odometry_topic>odom</odometry_topic>
<odometry_frame>odom</odometry_frame>
<robot_base_frame>base_link</robot_base_frame>
<publish_tf>true</publish_tf>
</plugin>
</gazebo>
注意: 請將 left_wheel_joint
和 right_wheel_joint
替換為您 URDF 中實際定義的左右輪關節名稱。
✅ 加入 IMU 感測器模擬
<link name="imu_link">
<inertial>
<mass value="0.01"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
<inertia ixx="0.001" ixy="0.0" ixz="0.0" iyy="0.001" iyz="0.0" izz="0.001"/>
</inertial>
</link>
<gazebo reference="imu_link">
<sensor name="imu_sensor" type="imu">
<always_on>true</always_on>
<update_rate>50</update_rate>
<imu>
<angular_velocity />
<linear_acceleration />
</imu>
<plugin name="imu_plugin" filename="libgazebo_ros_imu_sensor.so"/>
</sensor>
</gazebo>
注意: 您需要在 URDF 中定義一個名為 imu_link
的連結,並將其放置在模型中 IMU 實際位置。如果您的模型中已有名為 Φ╗èΘ½ö_IMU.stl
的 mesh,則可能需要創建一個對應的 link
和 joint
,並將此 <gazebo reference="imu_link">
部分與其關聯。
✅ 加入相機模擬(RGB Camera)
<gazebo reference="camera_link">
<sensor name="camera_sensor" type="camera">
<camera>
<horizontal_fov>1.39626</horizontal_fov>
<image>
<width>640</width>
<height>480</height>
<format>R8G8B8</format>
</image>
<clip>
<near>0.1</near>
<far>100</far>
</clip>
</camera>
<plugin name="camera_controller" filename="libgazebo_ros_camera.so">
<camera_name>camera</camera_name>
<image_topic_name>image_raw</image_topic_name>
<camera_info_topic_name>camera_info</camera_info_topic_name>
</plugin>
</sensor>
</gazebo>
注意: 您需要在 URDF 中定義一個名為 camera_link
的連結,並將其放置在模型中相機實際位置。
✅ 加入 LiDAR 模擬(單線雷達)
<gazebo reference="lidar_link">
<sensor name="lidar_sensor" type="ray">
<ray>
<scan>
<horizontal>
<samples>720</samples>
<resolution>1</resolution>
<min_angle>-1.57</min_angle>
<max_angle>1.57</max_angle>
</horizontal>
</scan>
<range>
<min>0.1</min>
<max>10.0</max>
<resolution>0.01</resolution>
</range>
</ray>
<plugin name="gazebo_ros_laser" filename="libgazebo_ros_ray_sensor.so"/>
</sensor>
</gazebo>
注意: 您需要在 URDF 中定義一個名為 lidar_link
的連結,並將其放置在模型中 LiDAR 實際位置。
② RViz 可視化設定
在您的 urdf_car
package 中新增一個 rviz
資料夾,並在其中創建一個 car_config.rviz
檔案。將以下內容複製到該檔案中。這是一個簡化示意,您可以根據需要添加更多顯示項。
Visualization Manager:
Class: ""
Displays:
- Name: RobotModel
Enabled: true
Robot Description: robot_description
- Name: TF
Enabled: true
- Name: Odometry
Topic: /odom
Enabled: true
- Name: LaserScan
Topic: /scan
Enabled: true
③ 控制節點(Teleop 範例)
要透過鍵盤控制車輛,您可以安裝 teleop_twist_keyboard
package。
- 安裝:
- 執行:
sudo apt install ros-humble-teleop-twist-keyboard
ros2 run teleop_twist_keyboard teleop_twist_keyboard
這會發布 /cmd_vel
主題,用於控制車子移動。
④ 啟動 Launch 檔整合
您可以建立一個新的 bringup.launch.py
檔案(例如在 urdf_car/launch/
中)來一次性啟動 Gazebo、模型和 RViz。
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch_ros.actions import Node
import os
from ament_index_python.packages import get_package_share_directory # 需要添加此行以獲取包路徑
def generate_launch_description():
pkg_share = get_package_share_directory('urdf_car') # 獲取 urdf_car 包的安裝路徑
return LaunchDescription([
# 啟動 Gazebo + 模型
IncludeLaunchDescription(
PythonLaunchDescriptionSource(os.path.join(pkg_share, 'launch', 'gazebo.launch.py'))
),
# 啟動 RViz
Node(
package='rviz2',
executable='rviz2',
name='rviz2',
arguments=['-d', os.path.join(pkg_share, 'rviz', 'car_config.rviz')],
output='screen'
),
])
注意: 您可能需要手動編輯 urdf_car/CMakeLists.txt
和 package.xml
,以確保這些新的 launch
和 rviz
檔案會被安裝到 package 的 share 目錄中。例如,在 CMakeLists.txt
中加入類似以下行:
install(
DIRECTORY launch rviz
DESTINATION share/${PROJECT_NAME}
)
install(
FILES urdf/car.urdf # 如果您的urdf在urdf/下,請確保安裝
DESTINATION share/${PROJECT_NAME}/urdf
)
install(
DIRECTORY meshes # 如果您有 meshes 資料夾,請確保安裝
DESTINATION share/${PROJECT_NAME}/meshes
)
並在 package.xml
中確認所有依賴都已聲明,例如 gazebo_ros
, robot_state_publisher
, rviz2
等。
完成這些步驟後,您現在將擁有一個更完整的 ROS 2 Gazebo 模擬環境:
- URDF 中加入了輪控器、IMU、雷達、相機模擬。
- RViz 可視化:可顯示模型、雷達、IMU 等。
- 控制節點:可用鍵盤控制車輛。
- 啟動腳本:自動載入模型與視覺化環境。
若您需要實際修改您的 URDF 檔案並產出完整的工作範例,或者需要協助產生 package.xml
、CMakeLists.txt
等,我可以進一步提供協助。