Gazebo 使用方式与典型场景
四、使用方式与典型场景
示例一:差速小车模型的关键片段
下面是一个 SDF 模型里「差速驱动插件」的配置片段,把轮子与控制器连起来:
<plugin filename="gz-sim-diff-drive-system"
name="gz::sim::systems::DiffDrive">
<left_joint>left_wheel_joint</left_joint>
<right_joint>right_wheel_joint</right_joint>
<wheel_separation>0.34</wheel_separation>
<wheel_radius>0.06</wheel_radius>
<max_linear_acceleration>1.0</max_linear_acceleration>
<max_angular_acceleration>2.0</max_angular_acceleration>
<odom_publish_frequency>50</odom_publish_frequency>
<topic>cmd_vel</topic>
<odom_topic>odom</odom_topic>
</plugin>
轮距和轮半径必须与几何模型完全一致,写错了最直接的表现就是「走直线跑偏、转 90 度转成 80 度」。
示例二:启动世界、生成机器人并桥接话题
from launch import LaunchDescription
from launch.actions import ExecuteProcess, IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory
import os
def generate_launch_description():
pkg = get_package_share_directory("my_robot")
world = os.path.join(pkg, "worlds", "warehouse.sdf")
bridge_cfg = os.path.join(pkg, "config", "bridge.yaml")
gz_sim = ExecuteProcess(
cmd=["gz", "sim", "-r", world],
output="screen",
)
spawn = Node(
package="ros_gz_sim",
executable="create",
arguments=["-name", "agv", "-file",
os.path.join(pkg, "models", "agv", "model.sdf"),
"-x", "0", "-y", "0", "-z", "0.2"],
output="screen",
)
bridge = Node(
package="ros_gz_bridge",
executable="parameter_bridge",
parameters=[{"config_file": bridge_cfg}],
output="screen",
)
return LaunchDescription([gz_sim, spawn, bridge])
运行方式:ros2 launch my_robot sim.launch.py。注意 create 节点必须在仿真器起来之后再执行,否则会报找不到世界。
示例三:桥接配置 YAML
- ros_topic_name: "/cmd_vel"
gz_topic_name: "/model/agv/cmd_vel"
ros_type_name: "geometry_msgs/msg/Twist"
gz_type_name: "gz.msgs.Twist"
direction: ROS_TO_GZ
- ros_topic_name: "/scan"
gz_topic_name: "/model/agv/scan"
ros_type_name: "sensor_msgs/msg/LaserScan"
gz_type_name: "gz.msgs.LaserScan"
direction: GZ_TO_ROS
- ros_topic_name: "/clock"
gz_topic_name: "/clock"
ros_type_name: "rosgraph_msgs/msg/Clock"
gz_type_name: "gz.msgs.Clock"
direction: GZ_TO_ROS
方向写反是桥接最常见的问题:结果就是 ROS2 侧发了指令但车不动,或者传感器话题存在却一直没数据。类型名写错时桥接节点会在启动时直接报错,这类错误反而好查。
适合与不适合
- 适合:ROS2 系统的闭环验证、导航与 SLAM 调参、传感器布局验证、多机器人协同的大场景预演、CI 里跑回归测试。
- 不适合:需要照片级渲染或大量合成数据训练感知模型(用 Isaac Sim 一类)、接触丰富的精细操作(用 MuJoCo 一类)、对物理精度要求极高的受力分析(用专业多体动力学软件)。
