本文介绍的系统是ROS1架构下的多无人车协同。和ROS2相比,会有大量的不同。

我们要实现的任务很简单,多辆无人车同时运行时变直线运动。

系统架构

采取单主控节点的分布式架构,指定其中一台小车作为“主”(Master),运行核心的roscore程序。其他所有小车(“从”)都连接到这个主节点,从而形成一个统一的ROS网络。这样,网络中的任何一个节点都可以与其他节点进行通信。

实现步骤

1. 网络配置

首先,确保所有小车都连接到同一个局域网(LAN),小车之间能够互相ping通。

1
2
ifconfig  # 查看当前IP地址
ping <other_car_ip> # 测试与其他小车的连通性

2. 设置主从机

主控机上打开 ~/.bashrc 文件,在文件末尾添加以下两行:

1
2
export ROS_MASTER_URI=http://<master_ip>:11311
export ROS_IP=X.X.X.X

<master_ip> 替换为主控机的实际IP地址,X.X.X.X 替换为当前小车的IP地址。
保存并关闭文件,然后运行:

1
source ~/.bashrc

在每一台从机上也同样修改 ~/.bashrc 文件。

1
2
export ROS_MASTER_URI=http://<master_ip>:11311
export ROS_IP=Y.Y.Y.Y

<master_ip> 替换为主控机的实际IP地址,Y.Y.Y.Y 替换为对应从机的IP地址。
保存关闭,并source。

接着在主控机上启动roscore:

1
roscore

从机上可以通过以下命令测试与主控机的连接:

1
rostopic list

如果能够看到主控机上发布的主题列表,说明连接成功。

3. 使用命名空间区分小车

为了能够独立控制每台小车,同时避免节点和话题名称冲突,我们需要为每台小车设置唯一的命名空间。
这往往在小车的launch文件中进行设置。例如:

1
2
3
4
5
6
7
8
<launch>
<group ns="car1">
<!-- 这里是车1的所有节点,例如驱动、传感器等 -->
<node pkg="your_driver_pkg" type="driver_node" name="motor_driver" />
<node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher"/>
<!-- 其他节点 -->
</group>
</launch>

如此一来,车1的所有节点和话题都会被自动加上 car1/ 前缀。其他小车同理,只需更改命名空间即可。

4. 中央控制节点

需要编写一个单独的ROS节点,作为中央控制节点,负责向各个小车发布运动指令。

之后我们就可以开始控制多车协同运动了。

  • 主控机启动roscore
  • 所有小车启动各自的launch文件,确保它们都连接到主控机
  • 启动中央控制节点,向各个小车发布运动指令