第15章 多机器人系统与通信
15 第 15 章 多机器人系统与通信¶
当单个机器人的能力无法满足任务需求时,多机器人协作成为必然选择。多个机器人如何高效通信、如何协调行动、如何分配任务——这些问题构成了多机器人系统(Multi-Robot Systems, MRS)的核心挑战。本章从通信基础出发,到协同算法,再到 ROS2 多机器人工程实践,系统构建多机器人系统的知识框架。
学习目标:
- 理解多机器人系统的分类、架构与通信模型;
- 掌握 ROS2 多机器人通信配置(命名空间、DDS 域、Topic 重映射);
- 了解多机器人协同的核心算法(编队控制、任务分配、共识);
- 了解无线通信技术在多机器人系统中的应用(WiFi、MQTT、Mesh、LoRa);
- 能设计并实现基于 ROS2 的多机器人协作系统。
15.1 多机器人系统概述¶
15.1.1 为什么需要多机器人¶
表 15-1 单机器人在以下场景中能力受限:
| 场景 | 单机器人的局限 | 多机器人的优势 |
|---|---|---|
| 大面积搜索救援 | 耗时长、覆盖慢 | 并行搜索,大幅缩短时间 |
| 仓储物流 | 单点吞吐瓶颈 | 多 AGV 并行搬运,提高吞吐 |
| 环境监测 | 空间采样稀疏 | 分布式传感,密集覆盖 |
| 协作搬运 | 载重受限 | 多机协作搬运大型物体 |
| 对抗/竞赛 | 单兵作战 | 战术配合、角色分工 |
多机器人系统的核心优势:并行性(同时执行任务)、冗余性(单体故障不影响全局)、可扩展性(增减机器人适应任务规模)。
15.1.2 系统分类¶
图 15-1 上图直观呈现了系统分类的组成要素与数据通路,有助于理解系统整体的工作机理。
15.2 多机器人系统架构¶
15.2.1 集中式架构¶
一个中央控制器收集所有机器人的状态,统一规划决策,再将指令下发。
图 15-2 上图以框图形式描绘了集中式架构的系统架构,清晰呈现了各模块之间的连接关系与信号流向。
表 15-2 集中式架构
| 特点 | 说明 |
|---|---|
| 优势 | 全局最优决策、容易实现 |
| 劣势 | 单点故障、通信瓶颈、可扩展性差 |
| 适用 | 小规模(<10 台)、通信可靠环境 |
上表对集中式架构中各方案的特性进行了横向对比,便于读者根据实际需求选择最合适的技术路线。
15.2.2 分布式架构¶
每个机器人独立决策,仅通过局部通信与邻居交换信息。
图 15-3 该框图展示了分布式架构的核心结构,读者可以从中把握各功能单元的层次划分与协作方式。
表 15-3 分布式架构
| 特点 | 说明 |
|---|---|
| 优势 | 鲁棒性强、可扩展、无单点故障 |
| 劣势 | 难以获得全局最优、算法复杂 |
| 适用 | 大规模集群、通信受限环境 |
通过上表的对比可以看出,不同方案在特点、说明等方面各有优劣,实际选型时应结合具体应用场景综合权衡。
15.2.3 混合式架构¶
分层结构:上层少量协调器负责全局任务分配,下层小组内分布式协作。
图 15-4 上图直观呈现了混合式架构的组成要素与数据通路,有助于理解系统整体的工作机理。
结合了集中式的全局视野和分布式的鲁棒性,是实际工程中最常用的架构。
15.3 多机器人通信技术¶
15.3.1 通信需求分析¶
表 15-4 通信需求分析
| 需求 | 说明 |
|---|---|
| 低延迟 | 实时协调需要 <100ms 端到端延迟 |
| 可靠性 | 控制指令不可丢失 |
| 带宽 | 点云/图像共享需要高带宽 |
| 覆盖范围 | 室外场景需要远距离通信 |
| 可扩展 | 支持动态增减机器人 |
上表对通信需求分析的核心信息进行了结构化整理,读者可根据需要快速查阅相关内容。
15.3.2 ROS2 DDS 通信¶
ROS2 基于 DDS(Data Distribution Service)标准,天然支持多机器人分布式通信:
- 去中心化发现:无需中央服务器,节点自动发现彼此;
- QoS 可配置:不同数据流使用不同可靠性等级;
- Topic 隔离:通过命名空间和 Domain ID 隔离不同机器人。
15.3.3 WiFi 与 MQTT¶
WiFi 是多机器人室内通信的首选,提供高带宽和低延迟:
- 802.11ac/ax 支持 Gbps 级带宽
- 覆盖范围 50-100m(室内)
- 支持 ROS2 DDS 直接通信
MQTT 适合跨网络/跨域的多机器人管理:
- 轻量级发布-订阅协议
- 支持 QoS 0/1/2
- 通过云端 Broker 实现 NAT 穿透
- 适合状态上报、远程监控、命令下发
图 15-5 上图以框图形式描绘了 WiFi 与 MQTT 的系统架构,清晰呈现了各模块之间的连接关系与信号流向。
15.3.4 Mesh 网络与 LoRa¶
表 15-5 Mesh 网络与 LoRa
| 技术 | 带宽 | 范围 | 适用场景 |
|---|---|---|---|
| WiFi Mesh | 高 | 室内扩展 | 仓储 AGV、室内服务机器人 |
| Zigbee | 低 | 100m | 传感器网络 |
| LoRa | 极低 | 1-15km | 农业、环境监测 |
| 5G/4G | 高 | 蜂窝覆盖 | 户外无人机编队 |
15.4 ROS2 多机器人编程¶
15.4.1 命名空间隔离¶
ROS2 通过命名空间(Namespace)区分不同机器人的 Topic 和 Node:
# 机器人 1:所有话题自动加 /robot1 前缀
ros2 run my_robot_pkg controller --ros-args -r __ns:=/robot1
# 机器人 2
ros2 run my_robot_pkg controller --ros-args -r __ns:=/robot2
# 结果:
# /robot1/cmd_vel, /robot1/odom, /robot1/scan
# /robot2/cmd_vel, /robot2/odom, /robot2/scan
15.4.2 Domain ID 隔离¶
DDS Domain ID 实现网络级隔离,不同 Domain 的节点完全不可见:
# 组 A(仿真环境)
export ROS_DOMAIN_ID=10
ros2 launch simulation.launch.py
# 组 B(真实机器人)
export ROS_DOMAIN_ID=20
ros2 launch real_robot.launch.py
跨域通信需要专门的桥接工具(如 domain_bridge)。
15.4.3 多机器人 Launch 文件¶
# launch/multi_robot.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node, PushRosNamespace, GroupAction
def generate_launch_description():
robots = ['robot1', 'robot2', 'robot3']
nodes = []
for robot_name in robots:
group = GroupAction([
PushRosNamespace(robot_name),
Node(
package='my_robot_pkg',
executable='controller',
name='controller',
parameters=[{
'robot_id': robot_name,
'initial_x': robots.index(robot_name) * 2.0,
}],
remappings=[
('cmd_vel', 'cmd_vel'),
('odom', 'odom'),
],
),
Node(
package='my_robot_pkg',
executable='sensor_node',
name='sensor',
),
])
nodes.append(group)
return LaunchDescription(nodes)
15.4.4 多机器人 TF 管理¶
每个机器人需要独立的 TF 树,通过命名空间自动隔离:
图 15-6 该框图展示了多机器人 TF 管理的核心结构,读者可以从中把握各功能单元的层次划分与协作方式。
15.5 多机器人协同算法¶
15.5.1 编队控制(Formation Control)¶
编队控制使多个机器人保持预设的几何构型移动。
领航-跟随法(Leader-Follower):
一个领航机器人规划路径,跟随者保持相对位置。
# follower_controller.py
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Twist, PoseStamped
import math
class FollowerController(Node):
def __init__(self):
super().__init__('follower_controller')
# 期望相对位置(在 leader 坐标系下)
self.desired_dx = -1.0 # leader 后方 1m
self.desired_dy = 0.5 # leader 左侧 0.5m
self.leader_pose = None
self.my_pose = None
self.create_subscription(
PoseStamped, '/leader/pose', self.leader_cb, 10)
self.create_subscription(
PoseStamped, 'pose', self.my_pose_cb, 10)
self.cmd_pub = self.create_publisher(Twist, 'cmd_vel', 10)
self.create_timer(0.1, self.control_loop)
def leader_cb(self, msg):
self.leader_pose = msg.pose
def my_pose_cb(self, msg):
self.my_pose = msg.pose
def control_loop(self):
if self.leader_pose is None or self.my_pose is None:
return
# 计算目标位置
target_x = self.leader_pose.position.x + self.desired_dx
target_y = self.leader_pose.position.y + self.desired_dy
# 计算误差
dx = target_x - self.my_pose.position.x
dy = target_y - self.my_pose.position.y
distance = math.sqrt(dx*dx + dy*dy)
angle = math.atan2(dy, dx)
# 简单比例控制
cmd = Twist()
cmd.linear.x = min(0.5, 0.8 * distance)
cmd.angular.z = 2.0 * angle
self.cmd_pub.publish(cmd)
虚拟结构法(Virtual Structure):
将编队视为一个刚体,每个机器人是该刚体上的一个点。刚体的运动定义编队的整体运动,每个机器人追踪其在刚体上的目标点。
基于势场的方法:
为机器人间定义虚拟弹簧力,平衡排斥(防碰撞)和吸引(保持队形):
$$ F_i = \sum_{j \neq i} \left[ f_{attract}(d_{ij} - d_{ij}^*) + f_{repel}(d_{ij}) \right] $$
15.5.2 任务分配(Task Allocation)¶
表 15-6 多机器人任务分配(MRTA)问题:将 $M$ 个任务分配给 $N$ 个机器人,优化总代价。
| 方法 | 类型 | 特点 |
|---|---|---|
| 匈牙利算法 | 集中式 | 最优分配,$O(n^3)$ |
| 拍卖法(Market-Based) | 分布式 | 机器人竞价,去中心化 |
| 贪心分配 | 集中/分布 | 简单快速,次优 |
| 遗传算法 | 集中式 | 大规模问题,近似最优 |
拍卖法原理:
图 15-7 上图直观呈现了任务分配(Task Allocation)的组成要素与数据通路,有助于理解系统整体的工作机理。
15.5.3 共识算法(Consensus)¶
共识算法使分布式机器人在无中央控制器的情况下,对某个值(如目标位置、编队中心)达成一致。
平均共识:
每个机器人 $i$ 维护一个状态值 $x_i$,通过与邻居的迭代更新趋向全局平均:
$$ x_i(k+1) = x_i(k) + \epsilon \sum_{j \in N_i} (x_j(k) - x_i(k)) $$
其中 $N_i$ 是 $i$ 的邻居集合,$\epsilon$ 是收敛步长。当通信图连通时,所有 $x_i$ 最终收敛到初始值的平均。
应用场景:
- 分布式估计(多传感器融合)
- 编队中心计算
- 分布式决策
15.6 多机器人 SLAM 与导航¶
15.6.1 多机器人 SLAM¶
表 15-7 多机器人同时建图可大幅加速环境探索,但面临额外挑战:
| 挑战 | 说明 |
|---|---|
| 地图合并 | 不同机器人的局部地图需要对齐和融合 |
| 相对定位 | 机器人之间的初始相对位姿可能未知 |
| 通信带宽 | 原始传感器数据传输量大 |
| 数据关联 | 不同机器人观测到的同一区域需要正确匹配 |
策略:
- 集中式:所有机器人将数据发送到中央服务器合并——简单但带宽需求高
- 分布式:机器人间直接交换压缩地图信息——带宽节省但算法复杂
- 相遇融合:当两个机器人在同一区域相遇时,利用共同观测对齐地图
15.6.2 多机器人导航¶
Nav2 原生支持多机器人导航,通过命名空间隔离:
# 机器人 1
ros2 launch nav2_bringup bringup_launch.py \
namespace:=robot1 use_namespace:=True \
map:=/maps/shared_map.yaml
# 机器人 2
ros2 launch nav2_bringup bringup_launch.py \
namespace:=robot2 use_namespace:=True \
map:=/maps/shared_map.yaml
多机器人导航的额外考虑:
- 冲突检测与避免:防止机器人之间碰撞(交通管理)
- 路径协调:在狭窄通道中协商通行优先级
- 共享代价地图:将其他机器人的位置标记为动态障碍
15.7 群体机器人(Swarm Robotics)¶
15.7.1 群体智能原理¶
群体机器人从自然界的蜂群、蚁群、鱼群中汲取灵感。核心思想:简单个体 + 局部规则 = 复杂群体行为。
关键特征:
- 简单个体:每个机器人能力有限,只有局部感知和通信;
- 局部交互:仅与邻近个体交互,无全局信息;
- 涌现行为:群体层面呈现出个体层面不具备的智能行为;
- 自组织:无外部控制器,行为从局部规则自然涌现。
15.7.2 经典群体行为¶
Reynolds 三规则(Boids 模型):
- 分离(Separation):避免与临近个体碰撞
- 对齐(Alignment):速度方向趋向邻居平均方向
- 聚合(Cohesion):位置趋向邻居平均位置
图 15-8 上图以框图形式描绘了经典群体行为的系统架构,清晰呈现了各模块之间的连接关系与信号流向。
$$ \mathbf{v}i = w_s \cdot \mathbf{f}{sep} + w_a \cdot \mathbf{f}{align} + w_c \cdot \mathbf{f}{cohesion} $$
蚁群优化(Ant Colony Optimization):
通过信息素(Pheromone)实现隐式通信。机器人在环境中留下标记,后来者根据标记强度选择路径——用于多机器人路径规划和搜索覆盖。
15.8 工程实例:多机器人协作巡检系统¶
15.8.1 系统架构¶
图 15-9 该框图展示了系统架构的核心结构,读者可以从中把握各功能单元的层次划分与协作方式。
15.8.2 代码示例:任务分配节点¶
# task_allocator.py
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
import json
class TaskAllocator(Node):
"""基于简单拍卖的多机器人任务分配"""
def __init__(self):
super().__init__('task_allocator')
self.robots = {} # robot_id → pose
self.tasks = [] # 待分配任务列表
self.bids = {} # task_id → {robot_id: cost}
# 订阅机器人状态
self.create_subscription(
String, '/robot_status', self.status_cb, 10)
# 发布任务分配
self.task_pub = self.create_publisher(
String, '/task_assignment', 10)
# 定时触发分配
self.create_timer(5.0, self.allocate)
def status_cb(self, msg):
data = json.loads(msg.data)
self.robots[data['id']] = data['pose']
if 'bid' in data:
self.bids.setdefault(data['task_id'], {})[
data['id']] = data['bid']
def allocate(self):
for task in self.tasks:
if task['id'] in self.bids:
bids = self.bids[task['id']]
winner = min(bids, key=bids.get)
assignment = json.dumps({
'task_id': task['id'],
'robot_id': winner,
'goal': task['goal'],
})
self.task_pub.publish(String(data=assignment))
self.get_logger().info(
f"Task {task['id']} → {winner}")
15.9 本章小结与拓展资源¶
15.9.1 关键知识点回顾¶
- 系统架构:集中式、分布式、混合式三种架构的权衡;
- 通信技术:ROS2 DDS 原生多机器人支持、MQTT 跨网管理、Mesh/LoRa 远程通信;
- ROS2 多机器人:命名空间隔离、Domain ID、多机器人 Launch 和 TF 管理;
- 协同算法:编队控制(领航-跟随、虚拟结构、势场)、任务分配(拍卖法)、共识算法;
- 多机器人 SLAM/导航:地图合并、相遇融合、冲突避免;
- 群体机器人:Reynolds 三规则、蚁群优化、涌现行为。
15.9.2 推荐学习资源¶
表 15-8 推荐学习资源
| 资源 | 说明 |
|---|---|
| 《Multi-Robot Systems》(Yan, Jouandeau, Cherif) | 多机器人系统综述 |
| 《Swarm Intelligence》(Bonabeau) | 群体智能经典 |
| ROS2 Multi-Robot | ROS2 多机器人教程 |
| Nav2 Multi-Robot | Nav2 多机器人配置 |
| 《Probabilistic Robotics》Ch. 9 | 多机器人 SLAM |
以上内容归纳了推荐学习资源的关键要素,为后续深入学习和工程实践提供了参考依据。
15.9.3 课后练习¶
- 架构分析:比较集中式和分布式架构的优缺点。如果要管理 100 台仓储机器人,你会选择哪种架构?说明理由。
- ROS2 实践:用命名空间在同一台机器上启动 3 个 Turtlesim 节点,分别控制它们画出不同图案。
- 编队控制:实现一个领航-跟随编队控制器,让 3 个 Turtlesim 保持三角形队形移动。
- 任务分配:编写一个简单的拍卖法任务分配器,将 5 个巡检点分配给 3 个机器人,使总行驶距离最小。
- 综合挑战:在 Gazebo 中实现两个机器人的协作 SLAM——各自探索不同区域,最终合并为一张完整地图。
15.10 本章测验¶
Quiz results are saved to your browser's local storage and will persist between sessions.
1) 关于集中式多机器人架构,下列哪些描述是正确的?
2) ROS2 中实现多机器人 Topic 隔离的推荐方法是:
3) 在领航-跟随(Leader-Follower)编队控制中:
4) 拍卖法(Market-Based)任务分配的正确描述是:
5) 群体机器人的 Reynolds Boids 模型的三条基本规则是:
Quiz Progress
0 / 0 questions answered (0%)
0 correct
本章参考资料:ESP-IDF/ESP8266 SDK 文档、MQTT 协议规范 (OASIS)、STUN/TURN/ICE RFC 文档与物联网安全最佳实践。