基于ROS 2的多机器人协同控制实战:从原理到仿真实现

发布时间:2026/8/23 8:25:14
基于ROS 2的多机器人协同控制实战:从原理到仿真实现 最近一个名为“Booster T2 机器人方阵同步行进”的视频在网络上引起了广泛关注。视频中数十台外形统一的机器人以极高的精度和一致性完成了复杂的队列变换和同步行进场面极具未来感和视觉冲击力。这不仅仅是酷炫的表演其背后涉及的多机器人协同控制、路径规划、实时通信等技术正是当前机器人领域从单机智能迈向群体智能的关键挑战。对于开发者、机器人爱好者或相关专业的学生而言如何从零开始构建一个类似的、能够协同工作的机器人集群系统是一个极具吸引力的课题。本文将深入拆解“机器人方阵同步行进”背后的核心技术并提供一个基于ROS 2Robot Operating System 2的完整实战教程。我们将从概念原理讲起一步步完成环境搭建、通信架构设计、核心算法实现最终让多个仿真机器人实现基础的同步行进。无论你是想了解技术内幕还是希望亲手复现一个简化版的“机器人方阵”这篇文章都将为你提供一条清晰的路径。1. 背景与核心概念从单机到集群的跨越在深入代码之前我们需要理解让一群机器人“齐步走”需要解决哪些根本问题。这远非让每个机器人独立执行相同程序那么简单。1.1 什么是多机器人系统Multi-Robot System, MRS多机器人系统是指由多个自主或半自主的机器人通过协作来完成共同或相关任务的系统。其核心优势在于通过分工、冗余和并行实现单个机器人无法完成或效率低下的任务例如大规模搜索、协同搬运、编队表演等。“Booster T2 机器人方阵”就是一个典型的多机器人协同表演系统。1.2 同步行进的核心技术挑战一致的状态感知每个机器人必须对“世界”如自身位置、队友位置、目标队形有一致的理解。如果A机器人认为自己在原点而B机器人认为自己在10点那么它们对“向前一步”的指令执行结果将完全不同。实时通信与协调机器人之间需要交换状态信息如位置、速度和协调指令。通信延迟、丢包会导致机器人动作不同步甚至发生碰撞。分布式决策与控制系统需要决定每个机器人该如何移动才能达成整体队形。这涉及到集中式控制一个“大脑”指挥所有“肢体”和分布式控制每个机器人基于局部信息自主决策的权衡。精准的定位与运动控制每个机器人需要知道“我在哪”定位并能精确地移动到“我该去哪”运动控制。这是同步的物理基础。1.3 相关技术栈简介ROS 2机器人领域的“操作系统”提供了节点通信、工具、库等基础设施是构建复杂机器人系统的首选框架。其内置的DDSData Distribution Service通信中间件非常适合对实时性和可靠性要求高的多机器人系统。Gazebo / Ignition强大的机器人仿真环境可以在不拥有实体机器人的情况下进行算法开发、测试和验证极大降低学习和研发成本。SLAM同步定位与地图构建为机器人提供在未知环境中的定位能力。在已知环境的表演中可能使用更简单的信标如UWB或运动捕捉系统进行全局定位。路径规划与轨迹生成计算从当前位置到目标位置的无碰撞路径并生成平滑、可执行的运动轨迹。理解了这些概念我们就可以开始着手搭建我们的仿真实验环境了。2. 环境准备与版本说明我们将使用ROS 2 Humble Hawksbill和Gazebo Fortress作为开发与仿真平台。这个组合稳定且功能完善。请确保你的操作系统是Ubuntu 22.04 LTS。2.1 基础环境安装首先安装ROS 2 Humble。打开终端依次执行以下命令# 1. 设置语言环境确保无误 sudo apt update sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_US.UTF-8 # 2. 添加ROS 2软件源 sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update sudo apt install curl -y sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null # 3. 安装ROS 2桌面版包含ROS、RViz、示例等 sudo apt update sudo apt install ros-humble-desktop # 4. 安装colcon构建工具和ROS 2开发工具 sudo apt install python3-colcon-common-extensions python3-rosdep2 sudo rosdep init rosdep update2.2 Gazebo仿真环境安装接下来安装Gazebo Fortress与ROS 2 Humble兼容的版本# 添加Gazebo软件源 sudo wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/gazebo-stable.list /dev/null sudo apt update # 安装Gazebo Fortress sudo apt install gazebo-fortress libgazebo-fortress-dev2.3 验证安装打开一个新的终端分别验证安装# 终端1启动ROS 2 source /opt/ros/humble/setup.bash printenv | grep ROS_DOMAIN_ID # 检查环境变量默认应无输出或为0 # 终端2启动Gazebo客户端 gz sim如果能看到Gazebo的空仿真世界界面说明环境安装成功。2.4 创建工作空间我们将所有代码放在一个ROS 2工作空间中管理。mkdir -p ~/robot_swarm_ws/src cd ~/robot_swarm_ws/src至此我们的开发环境就准备好了。接下来我们将设计整个多机器人系统的软件架构。3. 核心原理与通信架构设计在ROS 2中每个机器人通常被建模为一个或多个**节点Node**的集合。为了实现同步我们需要为集群设计一个高效的通信架构。3.1 通信模式选择对于机器人方阵我们采用“集中决策-分布执行”的混合架构这是平衡控制精度和系统可靠性的常见选择。集中决策器Master Controller一个独立的节点负责计算整个方阵的目标队形、行进路径并将每个机器人的目标位置或速度指令分发给对应的机器人节点。它拥有全局视角。分布式执行器Robot Agent每个机器人对应一个代理节点。它接收来自集中决策器的指令结合自身的传感器数据在仿真中为Gazebo提供的定位信息通过本地控制器计算出电机指令驱动机器人运动。同时它将自身的实时状态位置、速度反馈给集中决策器。3.2 ROS 2通信机制应用话题Topic - 用于持续数据流/master/formation_cmd集中决策器发布队形指令消息类型可自定义。/robot_[id]/target_pose集中决策器向特定机器人发布目标位姿。/robot_[id]/odometry每个机器人发布自身的里程计信息定位。服务Service - 用于请求/响应/master/switch_formation外部命令切换队形如从方阵变箭头。参数Parameter - 用于配置每个机器人节点可以有自己的参数如机器人ID、最大速度、控制器增益等。3.3 核心算法流程初始化集中决策器加载预定义的队形如4x4方阵并为每个机器人分配一个唯一ID和在该队形中的相对位置。状态收集集中决策器订阅所有机器人的/robot_[id]/odometry话题获取它们的实时位置。队形计算根据方阵的整体目标位置例如“向前移动5米”结合当前所有机器人的实际位置计算每个机器人新的目标位置。这里可以使用简单的PID控制思想目标位置 队形基准点 个体相对偏移。指令分发将计算出的每个目标位姿发布到对应的/robot_[id]/target_pose话题。个体跟踪每个机器人节点订阅自己的目标位姿并使用本地控制器如简单的比例控制器计算速度指令发送给Gazebo中的机器人模型。循环执行上述步骤在一个循环中持续运行例如10Hz实现动态的同步行进。有了清晰的设计我们就可以开始创建项目并编写代码了。4. 完整实战构建四机器人同步方阵我们将创建一个包含1个集中决策器和4个机器人代理的仿真系统。4.1 创建ROS 2功能包在工作空间的src目录下创建我们的功能包cd ~/robot_swarm_ws/src ros2 pkg create --build-type ament_python robot_swarm \ --dependencies rclpy geometry_msgs nav_msgs tf2_ros sensor_msgs gazebo_ros cd ~/robot_swarm_ws colcon build --symlink-install source install/setup.bash4.2 编写自定义消息类型我们需要定义队形指令和机器人状态的消息。创建文件~/robot_swarm_ws/src/robot_swarm/msg/FormationCommand.msg# FormationCommand.msg # 集中决策器发布的队形指令 uint32 robot_id # 目标机器人ID float64 target_x # 目标位置X (米) float64 target_y # 目标位置Y (米) float64 target_yaw # 目标朝向 (弧度)创建文件~/robot_swarm_ws/src/robot_swarm/msg/RobotState.msg# RobotState.msg # 机器人发布的状态信息 uint32 robot_id # 机器人ID float64 pos_x # 当前位置X float64 pos_y # 当前位置Y float64 vel_x # 当前速度X float64 vel_y # 当前速度Y std_msgs/Header header # 时间戳修改package.xml确保包含消息生成依赖!-- 在 package.xml 的 export 标签前添加 -- buildtool_dependrosidl_default_generators/buildtool_depend exec_dependrosidl_default_runtime/exec_depend member_of_grouprosidl_interface_packages/member_of_group修改CMakeLists.txt(如果是Python包主要修改package.xml但为了消息生成需确认)。对于Python包更简单的方式是使用ament_python自动处理.msg文件。确保setup.py中包含# 在 setup.py 的 data_files 部分添加 data_files[ ... (os.path.join(share, package_name, msg), glob(msg/*.msg)), ],然后重新编译cd ~/robot_swarm_ws colcon build --symlink-install source install/setup.bash4.3 编写集中决策器节点创建文件~/robot_swarm_ws/src/robot_swarm/robot_swarm/master_controller.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from geometry_msgs.msg import PoseStamped from robot_swarm.msg import FormationCommand, RobotState import numpy as np class MasterController(Node): def __init__(self): super().__init__(master_controller) self.declare_parameter(formation_type, square) # 队形类型 self.declare_parameter(robot_count, 4) # 机器人数量 self.declare_parameter(update_rate, 10.0) # 控制频率 Hz self.formation_type self.get_parameter(formation_type).value self.robot_count self.get_parameter(robot_count).value update_rate self.get_parameter(update_rate).value # 存储机器人状态 {id: (x, y, vx, vy)} self.robot_states {} # 定义队形相对中心点的偏移 (行, 列) self.formation_offsets self._define_formation() # 创建发布器为每个机器人发布目标位姿 self.cmd_publishers {} for i in range(self.robot_count): pub self.create_publisher(FormationCommand, f/robot_{i}/target_pose, 10) self.cmd_publishers[i] pub # 创建订阅器监听所有机器人状态 for i in range(self.robot_count): self.create_subscription( RobotState, f/robot_{i}/state, lambda msg, idxi: self.robot_state_callback(msg, idx), 10) # 定时器周期性计算并发布指令 self.timer self.create_timer(1.0/update_rate, self.control_loop) self.get_logger().info(fMaster controller started with {self.robot_count} robots in {self.formation_type} formation.) def _define_formation(self): 定义队形偏移。这里定义一个2x2的方阵。 if self.formation_type square: # 假设间距1米 offsets { 0: (-0.5, 0.5), # 左上 1: (0.5, 0.5), # 右上 2: (-0.5, -0.5), # 左下 3: (0.5, -0.5) # 右下 } return offsets else: # 可扩展其他队形 return {i: (0.0, 0.0) for i in range(self.robot_count)} def robot_state_callback(self, msg, robot_id): 更新机器人状态 self.robot_states[robot_id] (msg.pos_x, msg.pos_y, msg.vel_x, msg.vel_y) def control_loop(self): 核心控制循环计算目标队形并发布指令 if len(self.robot_states) self.robot_count: self.get_logger().warn(Waiting for all robot states...) return # 1. 计算方阵整体基准点这里简单取所有机器人位置的平均值 avg_x np.mean([state[0] for state in self.robot_states.values()]) avg_y np.mean([state[1] for state in self.robot_states.values()]) # 2. 为每个机器人计算目标位置 # 假设我们想让方阵整体向X轴正方向移动 formation_center_x avg_x 0.1 # 每周期移动0.1米 formation_center_y avg_y for robot_id in range(self.robot_count): if robot_id not in self.robot_states: continue offset_x, offset_y self.formation_offsets[robot_id] target_x formation_center_x offset_x target_y formation_center_y offset_y # 3. 发布指令 cmd_msg FormationCommand() cmd_msg.robot_id robot_id cmd_msg.target_x target_x cmd_msg.target_y target_y cmd_msg.target_yaw 0.0 # 朝向保持不变 self.cmd_publishers[robot_id].publish(cmd_msg) def main(argsNone): rclpy.init(argsargs) node MasterController() try: rclpy.spin(node) except KeyboardInterrupt: node.get_logger().info(Master controller shutting down.) finally: node.destroy_node() rclpy.shutdown() if __name__ __main__: main()4.4 编写机器人代理节点创建文件~/robot_swarm_ws/src/robot_swarm/robot_swarm/robot_agent.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from geometry_msgs.msg import Twist from robot_swarm.msg import FormationCommand, RobotState import math class RobotAgent(Node): def __init__(self): super().__init__(robot_agent) # 通过参数获取机器人ID启动时传入 self.declare_parameter(robot_id, 0) self.robot_id self.get_parameter(robot_id).value self.get_logger().info(fRobot Agent {self.robot_id} started.) # 订阅集中决策器发来的目标位姿 self.target_pose_sub self.create_subscription( FormationCommand, f/robot_{self.robot_id}/target_pose, self.target_pose_callback, 10) # 发布机器人状态在仿真中我们从Gazebo获取真实状态这里先模拟 self.state_pub self.create_publisher(RobotState, f/robot_{self.robot_id}/state, 10) # 发布速度指令控制机器人仿真中发给Gazebo self.cmd_vel_pub self.create_publisher(Twist, f/robot_{self.robot_id}/cmd_vel, 10) # 当前状态和目标状态 self.current_x 0.0 self.current_y 0.0 self.target_x 0.0 self.target_y 0.0 # 控制参数 self.kp_linear 0.5 # 位置比例增益 self.kp_angular 1.0 # 朝向比例增益 # 定时器模拟状态更新和控制循环 self.timer self.create_timer(0.1, self.update_loop) # 10Hz def target_pose_callback(self, msg): 接收目标位姿指令 if msg.robot_id self.robot_id: self.target_x msg.target_x self.target_y msg.target_y # self.target_yaw msg.target_yaw # 本例暂不控制朝向 def update_loop(self): 模拟状态更新并计算控制指令 # 1. 模拟状态更新在真实/仿真系统中这里应订阅Gazebo的/odom话题 # 为了简单我们假设机器人能完美执行速度指令并以此更新“当前状态” # 实际项目中这里应该从传感器如里程计获取真实状态。 self.current_x 0.01 # 模拟一个很小的随机扰动或根据cmd_vel积分 self.current_y 0.01 # 2. 发布当前状态模拟 state_msg RobotState() state_msg.robot_id self.robot_id state_msg.pos_x self.current_x state_msg.pos_y self.current_y state_msg.vel_x 0.0 state_msg.vel_y 0.0 state_msg.header.stamp self.get_clock().now().to_msg() self.state_pub.publish(state_msg) # 3. 计算控制指令简单的P控制器 dx self.target_x - self.current_x dy self.target_y - self.current_y distance math.sqrt(dx**2 dy**2) if distance 0.05: # 设置一个死区避免抖动 # 计算朝向角 target_yaw math.atan2(dy, dx) # 简单计算线速度和角速度 linear_vel min(self.kp_linear * distance, 0.5) # 限速 # 角速度控制暂略假设机器人是全向移动模型 angular_vel 0.0 else: linear_vel 0.0 angular_vel 0.0 # 4. 发布速度指令 cmd_vel_msg Twist() cmd_vel_msg.linear.x linear_vel cmd_vel_msg.angular.z angular_vel self.cmd_vel_pub.publish(cmd_vel_msg) def main(argsNone): rclpy.init(argsargs) # 注意机器人ID需要通过命令行参数传入 node RobotAgent() try: rclpy.spin(node) except KeyboardInterrupt: node.get_logger().info(fRobot Agent {node.robot_id} shutting down.) finally: node.destroy_node() rclpy.shutdown() if __name__ __main__: main()4.5 创建启动文件创建文件~/robot_swarm_ws/src/robot_swarm/launch/swarm.launch.pyfrom launch import LaunchDescription from launch_ros.actions import Node from launch.actions import DeclareLaunchArgument from launch.substitutions import LaunchConfiguration def generate_launch_description(): return LaunchDescription([ DeclareLaunchArgument(robot_count, default_value4, descriptionNumber of robots in the swarm), # 启动集中决策器 Node( packagerobot_swarm, executablemaster_controller, namemaster_controller, outputscreen, parameters[{robot_count: 4}] ), # 启动4个机器人代理节点通过参数传递不同的robot_id Node( packagerobot_swarm, executablerobot_agent, namerobot_agent_0, outputscreen, parameters[{robot_id: 0}] ), Node( packagerobot_swarm, executablerobot_agent, namerobot_agent_1, outputscreen, parameters[{robot_id: 1}] ), Node( packagerobot_swarm, executablerobot_agent, namerobot_agent_2, outputscreen, parameters[{robot_id: 2}] ), Node( packagerobot_swarm, executablerobot_agent, namerobot_agent_3, outputscreen, parameters[{robot_id: 3}] ), ])4.6 修改setup.py以安装节点在setup.py中找到entry_points部分修改如下entry_points{ console_scripts: [ master_controller robot_swarm.master_controller:main, robot_agent robot_swarm.robot_agent:main, ], },4.7 编译与运行编译功能包cd ~/robot_swarm_ws colcon build --symlink-install source install/setup.bash运行仿真系统ros2 launch robot_swarm swarm.launch.py观察结果打开新的终端使用rqt_graph查看节点和话题连接图使用ros2 topic echo /robot_0/state等命令查看机器人发布的状态信息。你会看到集中决策器不断发布目标位置而机器人代理节点根据目标位置计算并发布速度指令。4.8 在Gazebo中可视化进阶为了真正看到机器人移动我们需要将控制指令与Gazebo中的机器人模型关联。这涉及创建URDF机器人模型、在Gazebo中生成多个模型实例、并让我们的节点订阅Gazebo发布的/odom话题而不是模拟状态同时将cmd_vel发布给Gazebo的控制器。这是一个更复杂的步骤但遵循以下思路创建一个简单的差分驱动机器人URDF模型。编写一个Gazebo世界文件使用include标签和plugin生成多个该模型的实例并为每个实例设置唯一的ROS命名空间如robot0,robot1。修改robot_agent.py使其能够通过参数动态地订阅对应命名空间下的/odom话题和发布/cmd_vel话题例如/robot0/cmd_vel。启动Gazebo世界然后启动我们的ROS 2节点集群。由于篇幅限制这里不展开Gazebo模型的具体创建过程但这是将仿真从“逻辑同步”推进到“视觉同步”的关键一步。5. 常见问题与排查思路在实现多机器人系统时你可能会遇到以下典型问题问题现象可能原因排查思路与解决方案节点启动后无任何日志输出或立即退出。1. 节点入口未在setup.py中正确注册。2. 脚本没有执行权限。3. Python依赖缺失。1. 检查setup.py中entry_points配置是否正确特别是冒号和模块路径。2. 运行chmod x ~/robot_swarm_ws/src/robot_swarm/robot_swarm/*.py。3. 运行rosdep install -i --from-path src --rosdistro humble -y。ros2 run找不到包或可执行文件。1. 工作空间未编译或编译失败。2. 终端未source install/setup.bash。1. 在robot_swarm_ws目录下重新执行colcon build并注意观察有无报错。2. 确保在每个运行节点的终端都执行了source ~/robot_swarm_ws/install/setup.bash。节点能启动但彼此间收不到消息。1. 话题名称不匹配大小写、拼写错误。2. ROS_DOMAIN_ID设置不一致。3. 消息类型不匹配。1. 使用ros2 topic list查看所有活跃话题核对发布和订阅的话题名。2. 检查所有终端的环境变量ROS_DOMAIN_ID是否相同通常默认为0。3. 使用ros2 interface show msg_type检查发布和订阅的消息类型是否完全一致。机器人运动抖动、画圈或无法到达目标点。1. 控制器参数如kp_linear,kp_angular不合适。2. 控制频率与系统延时不匹配。3. 未考虑机器人运动学模型如差分驱动。1. 调整P控制器增益从小值开始慢慢增加。2. 确保控制循环频率如10Hz稳定避免在回调函数中进行耗时操作。3. 为差分驱动机器人实现更精确的运动学模型将目标位姿转换为左右轮速。方阵队形在移动中逐渐发散。1. 集中决策器计算的基准点漂移。2. 机器人个体定位误差累积且未校正。3. 通信存在随机延迟导致状态信息不同步。1. 采用更稳定的基准点计算策略如跟随一个虚拟领航机器人。2. 引入全局定位仿真中可用Gazebo的/ground_truth话题定期校正个体定位。3. 在状态消息中加入时间戳决策器使用带时间戳预测的状态进行同步计算。6. 最佳实践与工程建议将演示系统升级为健壮的工程项目需要考虑以下方面6.1 通信可靠性使用可靠的QoS策略ROS 2的DDS支持丰富的服务质量QoS配置。对于控制指令使用Reliable和KeepLast策略并设置合适的队列深度。对于高频的传感器数据可能使用BestEffort以降低延迟。from rclpy.qos import QoSProfile, ReliabilityPolicy, HistoryPolicy qos_profile QoSProfile( depth10, reliabilityReliabilityPolicy.RELIABLE, # 或 BEST_EFFORT historyHistoryPolicy.KEEP_LAST ) self.publisher self.create_publisher(FormationCommand, topic, qos_profile)引入心跳机制每个机器人定期发布“心跳”消息。集中决策器监控心跳一旦某个机器人失联可以触发安全策略如全体停止或重组队形。6.2 系统容错与安全状态估计与滤波不要直接使用原始的传感器数据。对机器人的位置、速度信息进行滤波如卡尔曼滤波以减少噪声和抖动提高控制稳定性。边界与碰撞检测在集中决策器或每个代理中实现简单的边界框碰撞检测。当预测到碰撞时优先执行避障策略覆盖原有的队形跟踪指令。紧急停止设计一个全局的紧急停止话题/e_stop或服务。任何节点检测到异常如通信超时、定位丢失、接近障碍物都可以发布停止指令所有机器人必须订阅并立即执行停止。6.3 配置与参数管理充分使用ROS参数将机器人数量、控制器增益、队形参数、通信超时时间等所有可配置项都定义为节点参数。这样可以在启动文件或运行时动态调整无需修改代码。参数服务器与启动文件使用ros2 param dump导出节点参数到YAML文件然后在启动文件中加载便于管理和版本控制。6.4 仿真与实物部署仿真先行务必在Gazebo等仿真环境中充分测试算法逻辑、极端情况和故障模式。仿真可以加速迭代避免实物损坏。硬件抽象层在机器人代理节点中将“控制指令生成”与“底层驱动”分离。定义一个统一的接口来发布控制指令在仿真中这个接口连接Gazebo在实物中这个接口连接真实的电机驱动器或底盘控制器。这提高了代码的可移植性。时钟同步在实物系统中确保所有机器人的主机时间同步例如使用NTP这对于基于时间戳的协同算法至关重要。6.5 性能与扩展性优化通信负载当机器人数量很大时所有机器人状态都发给集中决策器会成为瓶颈。考虑使用tf2来广播变换信息或采用分层、分组的通信架构。算法分布式随着规模扩大集中决策器可能成为性能瓶颈和单点故障。可以研究更分布式的协同算法如基于一致性Consensus的编队控制每个机器人只与邻居通信最终达成全局一致。从“Booster T2”令人惊叹的表演到我们亲手搭建的简易仿真系统可以看到多机器人协同的核心在于状态一致、通信可靠、控制精准。本文提供了一个从零开始的实践框架涵盖了ROS 2多节点编程、自定义消息、集中式控制逻辑等关键环节。虽然我们的仿真还未接入炫酷的3D模型但核心的控制逻辑已经打通。要深入下去下一步可以沿着这几个方向探索在Gazebo中集成真实的机器人模型并实现视觉同步将简单的P控制器升级为更鲁棒、更高效的轨迹跟踪控制器如模型预测控制MPC尝试实现更复杂的队形变换和重构逻辑最后挑战分布式协同算法消除对集中决策器的依赖。多机器人系统是 robotics 皇冠上的明珠之一充满了挑战与乐趣。希望这篇长文能成为你探索这片领域的一块坚实垫脚石。动手修改代码调整参数增加机器人数量看看你的方阵能走出多复杂的舞步吧。