连接到 ROS 2


预计完成时间:10 分钟

3.12   从 Launch 文件启动 Gazebo-ROS Bridge

到目前为止,在这一单元中你一直是通过命令行手动启动 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 节点之后:

  复制并粘贴

In [ ]:
# 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 写法:

In [ ]:
# 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

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

"ROS2 Topics Before IGN Bridge"

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

"ROS2 Topics After IGN Bridge"

- 练习 3.9.1 -

现在你已经学会了如何使用 ros_gz_bridge 和 Gazebo 机器人插件,是时候把目前学到的内容综合应用起来了。

结合你在 ROS2 Basics 课程以及本课程中已经学到的知识,自己编写一段程序,利用 /cmd_vel/laser/scan/odom/imu 等话题,观察机器人在 Gazebo Sim 中的行为和响应。注意,你可能需要为这个程序自己创建一个 launch 文件。

**程序思路:** 启动空世界并生成机器人,在机器人周围放置一些基础模型。然后编写一个简单的障碍物规避程序(需要用到 /cmd_vel/laser/scan),并在机器人移动时打印它的位置和姿态信息(需要用到 /odom)。

你已经拥有所需的基础文件:empty_world.launch.pyspawn.launch.pyrobot.gazeborobot.xacro

  • 使用 Web Shell 1 在 Gazebo Sim 中加载空世界。
  • 使用 Web Shell 2 生成机器人(同时启动 ign_bridge 节点)。
  • 使用 Web Shell 3 运行你自己编写的程序。

**注意:** 这并不是一个正式练习,因此没有标准答案。不过,完成这次实践能帮助你更好地理解前面学到的内容。如果遇到问题,可以随时到论坛寻求支持。

- 练习 3.9.1 结束 -