中国机器人竞赛的技术栈这几年变化很快。前几年大家还在纠结底盘选型和舵机控制,现在的主流做法已经变成“ROS2 做中间件、仿真平台先跑通、导航栈直接复现、视觉和遥操作做上层应用”。如果你要带队参加机器人竞赛,或者准备做工业机器人预研,这篇博客可以帮你在半天内把整套本地开发环境搭起来,并跑通建图、导航、避障和任务响应这四个核心动作。
这里的重点不是某一款机器人,而是一套可复用的开发链路:环境怎么准备、仿真怎么启动、导航参数怎么调、四个轮子和四足平台在接口上有什么差异、进度卡住时怎么排查。全文按“环境准备->部署启动->功能测试->接口调用->性能观察->问题排查”的顺序展开,所有命令都是通用模板,实际路径和型号需要按你的开发板或竞赛平台替换。
1. 核心能力速览
先给结论。这套技术栈并不是单一开源项目,而是竞赛机器人开发中最常用的一组组件组合,你可以在项目里按需裁剪。
| 技术模块 | 常见方案 | 硬件门槛 | 启动方式 | 主要作用 |
|---|---|---|---|---|
| 中间件 | ROS2 Humble / Foxy | 4 核 CPU、8G 内存 | 命令行启动 | 节点通信、话题订阅、任务调度 |
| 仿真平台 | Gazebo / Webots / Isaac Sim | 独显或不独显均可 | 命令行启动 | 建图、导航、视觉算法验证 |
| 导航栈 | Nav2 | 建议 4G 以上显存 | 命令或 launch 文件 | 全局规划、局部避障、路径跟踪 |
| 定位 | AMCL / 卡尔曼滤波 / RTK | CPU 即可 | 节点启动 | 机器人位置估计 |
| 视觉感知 | OpenCV + YOLO 系列 | CPU 可跑,GPU 更稳 | Python 脚本 | 目标检测、视觉引导 |
| 运动控制 | 底盘 SDK / 四足 SDK | 取决于硬件 | 原生接口 | 前进后退、转向、步态切换 |
| 遥操作 | WebRTC / 游戏手柄 / VR | 需要额外设备 | 浏览器或客户端 | 远程接管、人工介入 |
| 批量任务 | launch 文件 + Python 脚本 | 无特殊要求 | 脚本批量执行 | 多场景自动跑测试 |
从材料看,当前机器人竞赛相关的热词集中在四足机器人、人形机器人、视觉引导、资源受限机器人、仿真平台选型这几个方向。也就是说,竞赛的考察点已经从“能不能动”升级成“能不能感知、能不能规划、能不能在有限资源下稳定运行”。
2. 适用场景与使用边界
这套技术栈适合三类人:
第一类是参加机器人竞赛的队伍。比赛通常要求机器人在未知环境里自动导航、避障、识别目标并完成指定动作,ROS2 + Nav2 + 视觉方案是应对这类任务的通用组合。
第二类是做工业机器人预研的工程师。ABB、KUKA、发那科等工业机器人在产线里的动作逻辑,和竞赛机器人的状态机在思路上是相通的:先感知,再规划,最后执行。区别只是工业场景更强调安全互锁和重复定位精度。热词里出现的“ABB机器人怎么优化条件等待卡顿”“发那科机器人干涉区DI信号触发时反应”,本质上都是任务调度的边界条件问题,在 ROS2 里对应的是生命周期节点和状态机设计。
第三类是搞移动机器人算法研究的学生。仿真平台可以在没有实体机器人的情况下先验证 SLAM 和导航算法,降低开发门槛。
使用边界也要讲清楚:
- 不要在公开赛场外使用摄像头采集未授权的人脸数据。视觉感知模块只能处理合规获取的视觉素材。
- 机器人遥控和遥操作必须限定在测试场地内,远程接管时要有人工确认机制,避免失控。
- 工业机器人调试时,干涉区和急停信号必须保留硬件优先级,软件层不能覆盖。
- 仿真平台训练出来的模型在真实环境里会有 sim-to-real 差距,不能直接批量部署到产线。
3. 本地开发环境准备
在装任何机器人框架之前,先把基础环境确认一遍。这里不会写死版本号,但会给你一套通用检查流程。
3.1 操作系统与资源检查
ROS2 对 Linux 支持最好,如果你是 Windows 环境,建议用 WSL2 或者虚拟机。先确认 CPU 和内存够不够:
# 查看 CPU 核心数和内存 nproc free -h # 查看磁盘剩余空间 df -h / # 查看 GPU 信息 nvidia-smi如果你要在本地跑 Gazebo 仿真,内存建议 8G 以上;如果还要训练或推理视觉模型,建议有 NVIDIA 显卡,显存 4G 以上。没有独显也能跑,只是视觉推理会慢一些,纯 CPU 跑 YOLO 检测单帧可能要几百毫秒到秒级,具体要按模型和分辨率实测。
3.2 安装 ROS2
ROS2 的安装尽量用官方源,不要混合多个发行版的软件源,否则依赖会乱。
# Ubuntu 22.04 安装 ROS2 Humble 的通用步骤 sudo apt update && sudo apt install -y \ ros-humble-desktop \ python3-colcon-common-extensions \ ros-humble-navigation2 \ ros-humble-nav2-bringup \ ros-humble-gazebo-ros-pkgs # 配置环境变量 echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc如果你用的是 Ubuntu 20.04,对应版本是 Foxy;Ubuntu 24.04 对应 Jazzy。具体版本要按你的系统选择和官方支持矩阵确认。
3.3 Python 与开发工具
视觉和任务脚本建议用 Python 3.8 以上版本,并创建独立虚拟环境:
python3 -m venv ~/robot_dev_venv source ~/robot_dev_venv/bin/activate pip install numpy opencv-python torch torchvision \ transforms3d pyserial pymodbus注意,这里不要和系统自带的 ROS2 Python 环境混在一起。ROS2 节点用系统 Python,视觉脚本可以走虚拟环境,通过 ROS2 话题进行数据交换。硬混在一起容易出现symbol already defined或者版本冲突。
4. 机器人竞赛开发环境部署
环境准备好之后,开始部署开发环境。这里包括仿真平台、导航栈以及一个最简单的机器人模型。
4.1 创建 ROS2 工作空间
先用colcon创建自己的工作空间:
mkdir -p ~/robot_ws/src cd ~/robot_ws/ colcon build source install/setup.bash以后每次新增功能包,都在src目录下创建包:
cd ~/robot_ws/src ros2 pkg create my_robot_bringup --build-type ament_python4.2 启动 Gazebo 仿真环境
仿真平台的选择没有绝对标准,快速验证用 Gazebo,视觉和强化学习可以用 Isaac Sim 或 Webots。Gazebo 的优势是 ROS2 对接成熟,启动一条命令就能带上机器人和环境:
# 启动空世界,后续再加载机器人 ros2 launch gazebo_ros gazebo.launch.py world:=worlds/empty.world启动后可以用ros2 topic list验证节点通信是否正常:
ros2 topic list # 预期看到:/clock /gazebo/link_states /rosout 等话题如果你有实体机器人,也可以在这个阶段通过底盘 SDK 启动一个base_driver节点,把电机数据发布成 ROS2 话题。这样仿真和实车共用一套上层导航代码,后续切换成本最低。
4.3 一键启动整个机器人
假设你的机器人包带有了 launch 文件,可以这样启动:
ros2 launch my_robot_bringup robot_sim.launch.py \ use_sim_time:=true \ map_file:=maps/training_map.yaml这段命令启动后,应该能看到以下节点:
/robot_base:底盘驱动或仿真底盘/lidar:激光雷达数据发布节点,仿真里是gazebo发布/map_server:地图服务/amcl:定位节点/bt_navigator:导航行为树
如果你的平台没有雷达,也可以仅用视觉或轮式里程计做导航,但室内竞赛场景里激光雷达在稳定性和精度上依旧是最优先选项。
5. 机器人导航功能测试
导航是整个竞赛机器人开发里最容易出问题、也最值得反复验证的部分。下面按测试目标拆开讲。
5.1 SLAM 建图测试
在未知赛场环境中,一般先手动遥控机器人走一圈,生成环境地图。常用的方式是slam_toolbox。
# 启动 SLAM 建图 ros2 launch my_robot_nav slam_toolbox_launch.py use_sim_time:=true # 启动遥控节点,用手柄或键盘控制机器人移动 ros2 run teleop_twist_keyboard teleop_twist_keyboard操作建议:速度先调到 0.2m/s 以下。建图过程保持匀速,避免频繁原地旋转,否则激光匹配容易漂移。建图完成后保存地图:
ros2 run nav2_map_server map_saver_cli -f maps/training_map保存后确认目录下出现training_map.pgm和training_map.yaml两个文件。地图文件需要在后续导航启动时使用,如果文件缺失或者大小为 0,导航无法启动。
5.2 Nav2 导航启动测试
导航栈启动后,主要验证三个能力:全局路径规划、局部避障、到达目标点。
ros2 launch my_robot_nav navigation_launch.py use_sim_time:=true map:=maps/training_map.yaml在 RViz 里点击“2D Goal Pose”,给机器人一个目标点,观察机器人是否规划出路径并执行。
判断成功的标准:
- 机器人能生成从起点到终点的全局路径。
- 机器人实际运动轨迹没有穿过障碍物。
- 到达目标点后状态变为“Succeeded”。
- 终端日志里不出现
Cannot find a valid path或PathPlanning failed之类错误。
如果路径规划失败,优先检查 costmap 参数中的 footprint 半径是否大于机器人实际半径,以及地图文件路径是否有效。
5.3 避障与重规划测试
在 Gazebo 仿真环境里人为添加几个圆柱体或箱子障碍物,再次发送目标点,观察机器人是否能在遇到障碍物时重新规划局部路径。
操作步骤:
# 在仿真环境中摆放障碍物 ros2 run gazebo_ros spawn_entity.py \ -entity obstacle_box \ -file obstacles/box.sdf \ -x 1.5 -y 1.0 -z 0.1导航过程中,如果局部代价地图的膨胀半径设置得太小,机器人容易贴着障碍物走,存在碰撞风险;设置得太大,窄通道就过不去。调整inflation_radius参数时要反复试:
# costmap_common_params.yaml 中的局部代价地图参数 robot_radius: 0.20 inflation_layer: inflation_radius: 0.55从实践经验看,先设一个偏大的膨胀半径确认安全,再逐步收窄寻找通过能力。不要一开始就追求极限贴边通过。
5.4 定位精度验证
机器人导航不是每一次都从同一起点出发,AMCL 定位节点要能在运行中修正里程计漂移。
测试方法:
- 启动导航 launch,让机器人停在已知位置。
- 手动给一个初始位姿估计
2D Pose Estimate。 - 反复发送目标点,记录导航起点和目标点的误差。
- 在机器人运动一段距离后,先不动,观察
/amcl_pose是否稳定。
如果定位误差持续增大,需要检查:
- 里程计发布频率是否够高。
- 激光雷达是否固定牢固,有无抖动。
- 地图本身是否有闭环,回环位置是否对齐。
- 环境特征是否足够丰富,长走廊和空旷场地的 AMCL 效果会差很多。
热词里的“机器人定位”在竞赛中通常是失分重灾区,多花时间做定位鲁棒性测试比调高最大速度更划算。
6. 四足与人形机器人的开发要点
竞赛里四足机器人和人形机器人的出现频率越来越高,热词里也有“四足机器人”“宇树机器人”“pico4遥操宇树机器人”“人形机器人”等方向。这类平台的开发和轮式机器人有明显区别。
6.1 硬件接口与 SDK
四足和人形平台一般都会提供自己的 SDK,常见接口包括:
- 电机控制接口:控制关节角度、速度、力矩。
- 状态反馈接口:机体姿态、足端力、电压电流。
- 外部通信接口:通过 Ethernet、CAN 或 ROS2 与主控连接。
- 遥控协议:手柄、手机 App 或 VR 设备。
拿到平台后,第一步不是跑导航,而是先通 SDK。确认能读取到关节状态、姿态角,能控制机器人站立和走几步。如果这个链路不稳定,后续所有上层算法都无法开展。
6.2 运动控制与步态切换
四足机器人运动控制的关键点是步态切换。静止站立、小跑步、跨越步态、转向步态的切换要顺滑,不能出现瞬间断电一样的姿态突变。
应用层建议把所有步态封装成统一的服务接口,比如walk_to(x, y, yaw)、stand_up()、sit_down()。上层视觉和导航代码不需要关心底层关节控制细节,只需要调用接口。
# 示例:调用步态控制服务(按实际 SDK 调整) ros2 service call /gait_control my_robot_msgs/srv/GaitControl \ "{command: 'walk', target_x: 1.0, target_y: 0.0, target_yaw: 1.57}"6.3 视觉引导
竞赛场地里的目标识别通常用 YOLO 系列。典型流程:
- 相机采集图像。
- YOLO 检测目标,并输出目标类别和像素坐标。
- 通过相机内参和外参将像素坐标转换为机器人坐标系坐标。
- 导航到目标附近。
- 机械臂或执行机构完成抓取、击打或按压动作。
在资源受限机器人上,建议降低输入分辨率、减少模型通道数、用 TensorRT 或 ONNX 加速。不要追求高精度大模型,帧率稳定比单帧精度更重要。一个只跑 5FPS 的检测模型在实际导航里会因为反应延迟而频繁错过目标;一个 15FPS 的轻量模型反而好控制。
6.4 遥操作与安全接管
比赛过程中如果机器人卡在墙角或目标识别混乱,人工接管是最后的兜底手段。热词里提到的“pico4遥操宇树机器人”说明 VR 遥操作已经进入竞赛实验阶段,但低成本方案依然是游戏手柄或网页端 WebRTC。
开发时要保证一条核心原则:人工接管优先级最高,任何自动导航指令在接管后都必须立即失效。
7. 接口 API 与批量任务
机器人系统不是单机脚本,竞赛和工业场景都会用到服务接口。ROS2 本身就提供了服务调用和动作通信机制,下面给一段通用示例。
7.1 通过 Python 调用导航目标
import rclpy from rclpy.node import Node from geometry_msgs.msg import PoseStamped, Quaternion from nav2_msgs.action import NavigateToPose from rclpy.action import ActionClient import math class NavClient(Node): def __init__(self): super().__init__('nav_client') self._client = ActionClient(self, NavigateToPose, 'navigate_to_pose') def send_goal(self, x, y, yaw): goal_msg = NavigateToPose.Goal() goal_msg.pose.header.frame_id = 'map' goal_msg.pose.header.stamp = self.get_clock().now().to_msg() goal_msg.pose.pose.position.x = x goal_msg.pose.pose.position.y = y q = Quaternion() q.z = math.sin(yaw / 2.0) q.w = math.cos(yaw / 2.0) goal_msg.pose.pose.orientation = q self._client.wait_for_server() future = self._client.send_goal_async(goal_msg) future.add_done_callback(self.goal_response_callback) def main(): rclpy.init() node = NavClient() node.send_goal(2.0, 1.5, 0.0) rclpy.spin(node) node.destroy_node() rclpy.shutdown()启动前确认导航节点已运行,并且地图已加载。调用失败时可以先查看/navigate_to_pose/_action/status话题,确认 action server 状态。
7.2 批量测试任务
竞赛前需要批量验证不同起终点组合下的导航成功率。建议写一个 Python 脚本,把测试点组合做成 JSON 文件,然后循环调用上文的导航客户端,每次调用后等待固定超时时间,记录成功或失败。
{ "test_cases": [ { "start": [0.0, 0.0, 0.0], "goal": [2.0, 1.5, 1.57], "timeout": 30 }, { "start": [0.0, 0.0, 0.0], "goal": [-2.0, -1.5, 0.0], "timeout": 30 } ] }发现连续失败时,不要只调导航参数,先回放录制的 bag 包,确认失败原因是定位漂移、路径规划失败,还是执行端电机响应延迟。定位问题只能在建图和初始位姿上找,执行问题才去调底盘 PID。
8. 资源占用与性能观察
竞赛开发中一个常见误区是只在实机上调试,不做资源预算。实际环境中,机器人主控可能是 Jetson Orin、树莓派,或者一台功耗受限的小主机,计算资源非常紧张。
建议这样观察资源占用:
# 实时查看 CPU、内存占用 htop # 查看机器人各节点资源排序 ps aux --sort=-%cpu | head -20 # 查看 GPU 显存和占用 nvidia-smi -l 2 # 查看话题发布频率 ros2 topic hz /scan ros2 topic hz /odom重点观察/scan和/odom两个话题的频率。激光雷达话题频率掉到 5Hz 以下,导航的实时性会明显变差;里程计话题频率不稳定,定位和路径跟踪都会出问题。
降低资源占用的手段:
- 降低激光雷达话题发布频率,从 20Hz 降到 10Hz,不影响中低速导航。
- 视觉推理优先用 TensorRT/ONNX,而不是直接在 PyTorch 里跑。
- 地图分辨率不要盲目调高,5cm/pixel 在大多数竞赛场地足够。
- 关闭控制台日志输出等级,减少磁盘和 CPU 负担:
export RCLCPP_LOG_LEVEL=WARN在 Gazebo 仿真里,如果 CPU 占用过高,可以适当减少模型的多边形数、降低物理引擎更新频率。不过要注意,仿真速度太慢会掩盖真实机器人的时序问题,建议仿真跑出结果后至少做一次实机低功耗验证。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| ROS2 节点启动后没有话题 | 环境变量未 source | 运行ros2 topic list,查看是否为空 | 重新source install/setup.bash |
| Gazebo 仿真启动后锁死 | CPU 不足或模型太复杂 | 查看htop占用 | 简化模型、降低物理引擎频率 |
| 导航规划失败 | costmap 参数错误或地图损坏 | 查看日志是否有PathPlanning failed | 调整 footprint、膨胀半径 |
| 定位漂移 | 激光雷达扫描异常、里程计不准 | 查看/amcl_pose和/odom对比 | 检查雷达安装、标定里程计 |
| 视觉检测卡顿 | 模型过大、推理在后端太慢 | 查看 GPU 和 CPU 占用 | 用轻量模型、TensorRT 加速 |
| 机器人撞到障碍物 | 局部避障失效或传感器数据不可信 | 查看 costmap 中障碍物是否叠加 | 调小最小速度、增大膨胀半径 |
| 批量导航任务卡住 | action 超时设置过长 | 查看 action 状态话题 | 设置合理超时并增加失败重试 |
| 手柄遥控失效 | 数据线或蓝牙断连 | 查看teleop_twist_keyboard日志 | 优先使用有线连接 |
| 电机响应抖动 | 供电不足或 PID 参数不合适 | 查看电机电流反馈 | 降低加减速度、检查电池电压 |
| 仿真与实车行为不一致 | sim-to-real 差距 | 对比相同参数下的轨迹 | 分步迁移,先验证底盘再叠加导航 |
最容易忽略的问题其实是供电。四足和人形机器人在高负载运动中瞬时电流很大,如果供电不足,SDK 里的电机控制会出现随机重启或位置回跳,表现形式很像是软件 bug。排查时优先看电池电压和稳压模块输出,不要一上来就调导航参数。
10. 最佳实践与使用建议
把这几年竞赛和工业机器人开发里值得沉淀的做法整理成清单。
版本管理优先。整个工作空间从第一天就纳入 Git 管理,launch 文件、参数文件、地图文件分目录存放。地图属于竞赛环境,建议单独用 Git LFS 管理,避免仓库膨胀。
保留一套最小可运行配置。在src里独立维护一个robot_minimal包,只包含底盘驱动、激光雷达驱动和键盘遥控三个节点。以后任何改动出了问题,先回到这套配置确认硬件链路正常,再逐步叠加功能。
小参数测试先行。第一次测试导航时,速度设置为 0.1m/s,膨胀半径偏大,目标距离不超过 2 米。整套链路跑通后再逐步提高速度,最后才到比赛场地考真实性能。
批量任务必须加日志和重试。批量导航脚本每次运行都写 JSON 日志,记录时间戳、目标点、路径规划耗时、到达时间。失败时自动重试 2 次,重试仍失败则跳过,避免卡死在单个用例上。
竞速不是唯一目标。很多时候,机器人稳定跑完 3 个任务,比高速但中途卡死 5 次要更值得。不要为了节省几秒去调激进的速度参数,先把成功率稳定在 90% 以上。
合规和安全边界不能省。视觉模块采集的数据只用于测试环境;如果涉及人脸或声音数据,必须提前确认授权范围。机器人遥控演练要在隔离场地进行。工业级调试时,传感器和安全继电器信号必须保持硬件接线优先级,或者明确验证过软件互锁的响应时间符合现场安全要求后,才能调整。
11. 总结与下一步
中国机器人竞赛能接触到的技术密度很高,但这套技术栈的核心并不神秘:先建图,再定位,然后规划路径,最后执行动作。四足、人形、工业机械臂的底层逻辑都一样,只是关节数量和执行方式不同。
最先应该验证的能力是“建图 + 导航闭环”。如果在没有实机的情况下,先在 Gazebo 里手动遥控一段,保存地图,然后下发目标点让机器人自己跑通,这套闭环就意味着你已经掌握了机器人竞赛里最核心的工程能力。
最容易踩的坑集中在三个地方:ROS2 环境变量没 source 导致节点通信失败、地图文件路径配错导致导航无法启动、供电不足导致的电机随机响应异常。遇到问题时,先确认最小链路,再逐步排除上层算法,不要一上来就动参数。
下一步可以考虑扩展的方向是视觉导航融合。当前大多数竞赛队伍还是激光雷达导航为主,视觉主要做目标识别。如果你能把视觉检测结果作为动态目标点直接送到 Nav2,机器人就能在识别到目标后自动切换导航目标,这是很多队伍还没做好的能力,也是提升比赛成绩最明显的切入点。
这套开发链路建议先收藏备用。等拿到比赛机器人的 SDK 之后,直接按本文第 3 节到第 5 节走一遍,半天内可以把基础环境跑通,剩下的时间全部留给导航参数和任务逻辑打磨。