Roslaunch一次启动多个node-04

在 ROS 开发中,手动打开多个终端、分别输入 rosrun 是非常低效的。roslaunch 是 ROS 的核心工具,用于通过 XML 脚本一次性启动多个节点,并自动管理参数服务器。

而且,roslaunch 会自动检测 roscore 是否在运行,如果没有,它会帮你启动 Master,无需手动输入 roscore

以下是使用 roslaunch 的详细步骤和原理解析。


一、 准备工作

按照 ROS 的标准规范,我们将 launch 文件存放在包目录下的 launch 文件夹中。

假设我们的包名还是 my_robot_control

  1. 创建目录
cd ~/catkin_ws/src/my_robot_control
mkdir launch


二、 编写 Launch 文件

launch 目录下创建一个名为 start_chat.launch 的文件。

将以下 XML 代码复制进去:

<launch>
    <node pkg="my_robot_control" type="talker" name="msg_sender" output="screen"/>

    <node pkg="my_robot_control" type="listener" name="msg_receiver" output="screen"/>
</launch>

关键属性解析 (The "Big Three")

初学者最容易混淆 typename,请务必区分:

  • pkg: 功能包的名字(文件夹名)。
  • type: 二进制可执行文件的名字。这是你在 CMakeLists.txtadd_executable(talker ...) 设置的名字。
  • name: 节点运行时的名字。ROS 允许你运行同一个可执行文件多次,只要给它们起不同的 name 即可。

三、 运行 Launch 文件

回到终端(只需要一个终端):

# 别忘了刷新环境
source ~/catkin_ws/devel/setup.bash

# 语法: roslaunch <包名> <launch文件名>
roslaunch my_robot_control start_chat.launch

你将看到:

  1. 它会自动启动 roscore(如果没启动)。
  2. 同时启动 talkerlistener
  3. 终端会交替显示 "Hello ROS..." 和 "I heard..."。

四、 进阶技巧:这是 roslaunch 真正强大的地方

roslaunch 不仅仅是批量运行,它还能修改节点的行为,而无需修改 C++ 源代码

1. 话题重映射 (Remapping)

假设你写了一个节点,监听的话题叫 /chatter。但是,另一个现成的相机节点发布的话题叫 /camera/data
你不需要改 C++ 代码,只需要在 launch 文件里“接线”:

<node pkg="my_robot_control" type="listener" name="my_listener" output="screen">
    <remap from="chatter" to="camera/data"/>
</node>

2. 设置参数 (Parameters)

你可以在 launch 文件中定义变量,传给 C++ 节点。

XML 中:

<node pkg="my_robot_control" type="talker" name="talker">
    <param name="publish_frequency" type="int" value="20" />
</node>

C++ 代码中读取:

int freq;
// 获取私有命名空间下的参数,默认值为 10
ros::NodeHandle nh("~"); 
nh.param("publish_frequency", freq, 10);
ros::Rate loop_rate(freq); // 频率变成了 20

3. 嵌套 (Include)

你可以把其他包的 launch 文件包含进来,实现“套娃”启动。比如启动机器人的时候,顺便把激光雷达驱动也启动了。

<launch>
    <include file="$(find rplidar_ros)/launch/rplidar.launch" />

    <node pkg="my_robot_control" type="talker" name="my_talker" />
</launch>


五、 常见报错与排查

  1. ERROR: cannot launch node of type [xxx/yyy]: xxx
  • 原因:ROS 找不到你的包或可执行文件。
  • 解决
  1. source devel/setup.bash

  2. CMakeLists.txt 里没写 add_executable

  3. 还没运行 catkin_make 编译。

  4. RLException: [xxx.launch] is neither a launch file in package...

  • 原因:找不到 launch 文件。
  • 解决:检查文件名拼写,或者确认你是否运行过 source 命令让 ROS 知道新文件的存在。
  1. 看不到 ROS_INFO 打印
  • 原因roslaunch 默认吞掉了标准输出。
  • 解决:在 <node> 标签里加上 output="screen"

下一步建议:
你现在已经掌握了代码编写 (C++)构建系统 (CMake)系统编排 (Launch)

接下来,为了让机器人真正“动”起来或者便于调试,是否需要了解一下 ROS 的常用可视化工具(Rviz 和 Rqt),或者是 如何使用 Parameter Server (参数服务器) 在运行时动态调整参数

posted @ 2025-12-20 11:34  jack-chen666  阅读(0)  评论(0)    收藏  举报