预计完成时间:10 分钟
到目前为止,在这一单元中你一直是通过命令行手动启动 Gazebo-ROS bridge。每次都在命令行里重复执行桥接命令会比较繁琐。那么,有没有办法让它自动启动呢?
好消息是:你可以通过 launch 文件自动启动 Gazebo-ROS bridge,这样还能少开一个终端!
你要做的就是把 ros_gz_bridge 作为一个 Node 添加到机器人的 spawn launch 文件中。
基本结构如下:
ign_bridge = Node(
package="ros_gz_bridge",
executable="parameter_bridge",
name="ign_bridge",
arguments=[
"/topic1" + "@ros_msg_type" + "[ign_msg_type",
"/topic2" + "@ros_msg_type" + "]ign_msg_type",
"/topic3" + "@ros_msg_type" + "@ign_msg_type",
],
remappings=[
("/topic1", "/namespace/topic1"),
("/topic2", "/namespace/topic2"),
("/topic3", "/namespace/topic3"),
],
output="screen",
)
定义好这个 Node 之后,把它添加到 launch 文件中返回的 LaunchDescription 里。
现在,为你的机器人配置所有相关话题的映射。把下面的代码复制到 spawn.launch.py 文件中,并放在机器人 spawn 节点之后:
复制并粘贴
# ROS-Gazebo Bridge #
ign_bridge = Node(
package="ros_gz_bridge",
executable="parameter_bridge",
name="ign_bridge",
arguments=[
"/clock" + "@rosgraph_msgs/msg/Clock" + "[ignition.msgs.Clock",
"/cmd_vel" + "@geometry_msgs/msg/Twist" + "@ignition.msgs.Twist",
"/tf" + "@tf2_msgs/msg/TFMessage" + "[ignition.msgs.Pose_V",
"/odom" + "@nav_msgs/msg/Odometry" + "[ignition.msgs.Odometry",
"/laser/scan" + "@sensor_msgs/msg/LaserScan" + "[ignition.msgs.LaserScan",
"/imu" + "@sensor_msgs/msg/Imu" + "[ignition.msgs.IMU",
],
remappings=[
# there are no remappings for this robot description
],
output="screen",
)

对应的新 Gazebo Sim 写法:
# ROS-Gazebo Bridge #
gz_bridge = Node(
package="ros_gz_bridge",
executable="parameter_bridge",
name="gz_bridge",
arguments=[
"/clock" + "@rosgraph_msgs/msg/Clock" + "[gz.msgs.Clock",
"/cmd_vel" + "@geometry_msgs/msg/Twist" + "@gz.msgs.Twist",
"/tf" + "@tf2_msgs/msg/TFMessage" + "[gz.msgs.Pose_V",
"/odom" + "@nav_msgs/msg/Odometry" + "[gz.msgs.Odometry",
"/laser/scan" + "@sensor_msgs/msg/LaserScan" + "[gz.msgs.LaserScan",
"/imu" + "@sensor_msgs/msg/Imu" + "[gz.msgs.IMU",
],
remappings=[
# there are no remappings for this robot description
],
output="screen",
)
下面是加入了 ros_gz_bridge 节点后的 spawn.launch.py 文件:
在运行新的 spawn.launch.py 文件之前(此时还没有生成机器人),ros2 topic list 的输出如下:

在运行新的 spawn.launch.py 文件之后(此时机器人已经生成),ros2 topic list 的输出如下:

现在你已经学会了如何使用 ros_gz_bridge 和 Gazebo 机器人插件,是时候把目前学到的内容综合应用起来了。
结合你在 ROS2 Basics 课程以及本课程中已经学到的知识,自己编写一段程序,利用 /cmd_vel、/laser/scan、/odom、/imu 等话题,观察机器人在 Gazebo Sim 中的行为和响应。注意,你可能需要为这个程序自己创建一个 launch 文件。
**程序思路:** 启动空世界并生成机器人,在机器人周围放置一些基础模型。然后编写一个简单的障碍物规避程序(需要用到 /cmd_vel 和 /laser/scan),并在机器人移动时打印它的位置和姿态信息(需要用到 /odom)。
你已经拥有所需的基础文件:empty_world.launch.py、spawn.launch.py、robot.gazebo 和 robot.xacro。
ign_bridge 节点)。**注意:** 这并不是一个正式练习,因此没有标准答案。不过,完成这次实践能帮助你更好地理解前面学到的内容。如果遇到问题,可以随时到论坛寻求支持。
