做这类技术内容,最怕起手就是概念。这次我们直接从一条新闻摘要里的关键词切入:“中国人形机器人竞技”。一句新闻标题并不算技术资料,但它把三个值得展开的东西串在了一起:人形机器人已经能上场比赛、软件架构成为核心竞争力、端侧芯片开始被反复点名,比如“全志科技 人形机器人芯片”。
这篇博客不聊新闻,只聊工程。我会围绕一支队伍要参加人形机器人竞技,需要具备的完整技术链路来展开:从人形机器人软件架构、芯片与硬件平台选型,到仿真环境、运动控制、感知决策、实机部署、接口调用和批量测试。过程中会给出一套可以落地的通用部署框架,也会把显存占用、功耗、实时性、sim2real 差距这些最容易翻车的问题说清楚。
如果你手里已经有一台人形机器人,或者准备做一套双足/四轮足机器人参加比赛,这篇文章可以直接收藏。即便你只是做算法训练或评估仿真,里面关于环境、接口和批量任务的内容也适用。
先说明一个前提:不同比赛的规则、场地、关节配置和评分方法差异很大,本文不会绑定某一项具体赛事。下面提到的一切,都按“通用技术链路”来写,具体参数需要以你手头项目的官方资料为准。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | 人形机器人竞技相关的软硬件开发链路:运动控制、感知决策、仿真训练、实机部署 |
| 核心关注点 | 人形机器人软件架构、端侧芯片选型、sim2real 迁移、批量训练与接口调用 |
| 推荐硬件 | 实机平台 + 一台带 NVIDIA GPU 的调试机;端侧可选 Jetson、RK3588 或材料中提到的全志科技人形机器人芯片 |
| 显存占用 | 视仿真器、相机路数、分辨率、训练算法而定,需按实际环境测试,不固定 |
| 支持平台 | Ubuntu 22.04/24.04 比较常见;Windows 主要用于调试工具,不推荐做主系统 |
| 启动方式 | 命令行启动 / ROS 2 launch 启动 / 仿真环境启动 / 实机控制服务启动 |
| 是否支持 API | 通常可以通过 HTTP/WebSocket/ROS 2 Topic 方式对外暴露控制接口 |
| 是否支持批量任务 | 支持,仿真阶段可以做批量 rollout,实机阶段需要设计任务队列和日志系统 |
| 适合场景 | 高校实验室、机器人竞赛队伍、端侧算法部署团队、运动控制研究入门 |
这里有一点需要单独说明。材料里出现的“全志科技 人形机器人芯片”,我没有拿到具体型号和算力表,因此不展开参数。更稳妥的判断是:这类芯片方向更偏向端侧低功耗控制和推理场景,而不是用来跑大模型训练。具体选型时,要同时看算力、接口、实时性、功耗和 SDK 生态。
2. 适用场景与使用边界
人形机器人竞技听起来热闹,但本质上是工程问题。它适合谁,不适合谁,边界非常清楚。
适合的场景有三个:
第一,高校实验和科研验证。比如做人形机器人的步态控制、摔倒恢复、物体抓取、视觉导航,这类任务可以先用仿真验证算法,再迁移到实机。比赛只是一种集中验证方式。
第二,机器人竞赛队伍做系统集成。竞赛队伍最常见的痛点是“单点功能都通,整体跑不起来”。人形机器人软件架构的价值,就是把这些单点模块串成一条可复用、可回滚、可排查的流水线。
第三,端侧 AI 厂商和开发板用户做方案演示。如果你要做机器人端侧人形交互或感知能力,把芯片、相机、运动控制板、IMU 放在同一个架构里测试,这个思路同样适用。
不适合的场景也要说清楚。如果你只是想用大语言模型做远场语音交互,需求根本不涉及运动控制,那就没必要按人形机器人整机架构去设计。另一个不适合的场景是场地、团队、安全机制还没准备好就上实机测试,那是事故高发区。
合规和边界是必须提的。涉及人脸识别、语音采集、人员跟踪的传感器,要注意个人隐私和授权。涉及机械臂、关节电机、高功率电池的整机部署,要遵守实验室安全规范,避免伤人。比赛涉及的机械结构、电子设计、代码开源协议也要提前核对,不要直接把第三方闭源模型拿来做二次发布。
3. 环境准备与前置条件
人形机器人开发和普通深度学习任务不太一样,环境要多一层。它至少包含三部分:控制器环境、仿真环境和端侧执行环境。
3.1 操作系统与基础依赖
建议使用 Ubuntu 22.04 或 24.04。ROS 2 在 Ubuntu 上的支持最成熟。Windows 可以在调试阶段接串口用,但不建议作为整机开发主系统。
基础工具链如下:
# 通用环境检查脚本,按实际项目调整 python3 --version ros2 --version cmake --version nvidia-smi ls /dev/ttyUSB* /dev/ttyACM* 2>/dev/null || true如果能显示到 Python 版本、ROS 2 版本和 NVIDIA 驱动信息,说明基础环境没有大问题。如果nvidia-smi没有输出,要检查驱动;如果看不到串口设备,要检查 USB 权限和线缆。
3.2 仿真与训练环境
常见的三个工具,按用途区分:
- MuJoCo:适合快速验证双足步态、强化学习训练。速度快,物理特性够用,社区资料多。
- Gazebo / ROS 2 集成:适合做多传感器仿真,比如相机、激光雷达、IMU 融合,但物理实时性一般。
- Isaac 系列:适合高质量视觉仿真和 GPU 并行训练,对显存要求更高,适合有 NVIDIA GPU 的机器。
依赖安装示例:
# 示例:MuJoCo 的 Python 绑定安装 pip install mujoco # 示例:ROS 2 仿真相关依赖包,具体包名以你的发行版为准 sudo apt update sudo apt install ros-$ROS_DISTRO-desktop这里的$ROS_DISTRO需要根据你的 ROS 2 版本替换,比如humble、iron或jazzy。
3.3 端侧芯片与计算平台
端侧芯片决定了你能在机器人本体上做多少实时计算。材料中提到的全志科技人形机器人芯片属于一个方向,但具体能不能跑视觉模型、能不能接 CAN 总线、能不能满足电机控制周期的实时性要求,都要以官方 SDK 为准。
除了它,常见的选项还有:
- NVIDIA Jetson 系列:视觉和神经网络生态最好,适合端侧推理。
- RK3588 平台:在成本和算力之间比较均衡,适合做传感器前处理和轻量模型。
- STM32 或实时 MCU:负责最后一级电机控制和电流环,不一定跑 Linux。
实际项目中,最合理通常是一颗 Linux SoC 负责感知和决策,一颗或几颗 MCU 负责关节闭环控制。这个分工直接决定了人形机器人软件架构怎么设计。
4. 软件架构与模块划分
人形机器人软件架构,本质上解决四个问题:看得见、想清楚、走得稳、打得通。模块划分越清晰,比赛现场排错越容易。
4.1 典型分层
| 层级 | 职责 | 常见组件 |
|---|---|---|
| 感知层 | 获取相机、激光雷达、IMU、关节编码器数据 | ROS 2 驱动节点、OpenCV、YOLO |
| 状态估计层 | 估计机器人位姿、速度、接触状态 | 扩展卡尔曼滤波、姿态解算 |
| 决策规划层 | 发出目标、路径、动作序列 | 行为树、状态机、A*、二次规划 |
| 运动控制层 | 生成关节位置、力矩指令 | PD 控制器、MPC、强化学习策略 |
| 执行层 | 驱动电机、读取编码器 | CAN/EtherCAT 驱动、MCU 固件 |
| 通信与调试层 | 日志、可视化、远程启停 | ROS 2 Topic、WebSocket、Foxglove |
这个分层不是死的,但边界越清楚,比赛现场排错越快。一个常见做法是一层一个 ROS 2 命名空间,比如/perception、/planning、/control。
4.2 状态机与行为树
竞技场景里,机器人经常要按流程行动:待机、出场、识别目标、走过去、抓取、返回。这种流程不能全部写死在 Python 脚本里,否则任何一个环节失败都只能重启。
状态机适合流程确定、分支少的场景。行为树更适合带随机性的场景,比如不断重试、带条件回退。
一个简单的行为树示例:
<BehaviorTree> <Sequence name="StandAndWalk"> <Action name="CheckFall" /> <Condition name="BatteryOK" /> <Action name="StandUp" /> <Action name="WalkToWaypoint" target="A" /> </Sequence> </BehaviorTree>这个示例的核心思想是:每个行为节点尽量原子化,后面可以挂重试节点。
4.3 通信设计
机器人体内通信建议统一走 DDS,外部调试和可视化可以走 WebSocket 或 HTTP 接口。不需要把电机数据传到外部服务器做实时控制,延迟和丢包会毁掉整个控制链。
一个常见做法是:
- 外部调试机只订阅日志和状态数据。
- 关键控制指令只在机载计算机和 MCU 之间传输。
- 比赛后端如果需要成绩数据,另行上报,不影响控制链路。
这样做的好处是,即使外部服务挂了,机器人本体还能继续走完当前动作。
5. 部署启动与仿真验证
环境准备好、架构定下来之后,最麻烦的是部署启动。人形机器人不是单进程程序,经常要启动十几个节点,还要保证顺序正确。
5.1 仿真启动流程
先在仿真环境里验证控制栈,是最安全的路径。
# 示例:启动仿真环境,具体 launch 文件需要按项目写 ros2 launch humanoid_sim sim.launch.py预期输出:看到机器人模型加载,关节读取正常,没有 model 文件缺失和 TF 树报错。
如果长时间没有出现可视化窗口,先检查仿真器和 ROS 2 是否连接成功,再看模型文件是否缺少 mesh。
5.2 实机启动流程
实机启动核心原则:先开底层控制,再开感知,最后开决策。
# 示例:分步启动脚本,具体命令以项目为准 ros2 launch humanoid_bringup motor_driver.launch.py ros2 launch humanoid_bringup imu.launch.py ros2 launch humanoid_bringup vision.launch.py ros2 launch humanoid_bringup navigation.launch.py分步启动看起来慢,但排错成本最低。不要在比赛现场一次性 launch 全部节点,出了问题很难定位。
5.3 启动后的标准检查
启动完不是直接开跑,先做三件事:
- 检查电机上电是否正常:关节能否手动掰动复位。
- 检查足端接触状态:能否正确识别离地和落地。
- 检查跌倒保护触发:人为推一下机器人,看是否触发保护动作而不至于摔坏硬件。
这三项过了,再进入正式功能测试。
6. 功能测试与效果验证
竞技场景必须量化测试,不能只靠肉眼。下面给出一套通用测试维度,具体标准要按比赛规则调整。
6.1 基础运动测试
| 测试项 | 输入条件 | 预期结果 | 判断标准 |
|---|---|---|---|
| 直线行走 | 目标距离 2 米 | 到达目标附近 | 终点误差小于一定阈值 |
| 原地转弯 | 目标角 90 度 | 转向后朝向正确 | 朝向误差在允许范围 |
| 上下坡 | 坡度 5 到 10 度 | 正常通过 | 脚跟不连续打滑 |
| 跌落恢复 | 向前倒地 | 自动恢复站立 | 30 秒内恢复 |
第一次测试时,参数不要拉满。步幅、速度、P 增益都先取保守值,确认稳定后再逐步加大。
6.2 感知与决策测试
感知测试重点是稳定性和延迟:
- 目标识别成功率:同一目标在不同光线下识别 20 次,记录成功率。
- 识别延迟:从图像输入到输出目标坐标的平均耗时。
- 路径规划成功率:给定起点和终点,能在规定时间内规划出有效路径。
这里很容易踩坑:仿真环境里光照、材质和现实差别较大,识别模型在仿真里得分高,不代表实机可靠。如果可能,在比赛场地用同一视角采集一批数据做二次验证。
6.3 综合流程测试
综合流程测试最接近比赛。把整个过程串起来:
待机 -> 视觉识别目标 -> 导航到目标区域 -> 机械臂抓取 -> 返回起点 -> 放下目标建议这样做:
- 用自动化脚本或遥控器给出“启动”指令。
- 全过程录日志:轨迹、相机、关节指令、状态机转移。
- 结束后回放日志,定位第一次失败发生在哪个环节。
- 针对失败环节做局部调试,不要全栈乱调。
6.4 显存与资源占用观察
训练和推理阶段都要关注资源占用。显存占用和以下因素强相关:
- 视觉模型的分辨率和 batch size。
- 仿真器是否开启 GPU 渲染。
- 是否同时挂载多个相机流。
- 是否在机器人端部署了大语言模型做交互。
一个可行的做法是固定一个环境变量和配置文件,每次测试前记录空闲占用,测试后再记录峰值。
# 查看进程占用 top -p $(pgrep -f 'python3|sim|driver' | tr '\n' ',' | sed 's/,$//') nvidia-smi --query-gpu=name,memory.used,utilization.gpu --format=csv如果显存不够,优先降低图像分辨率和 batch size,不要一上来就换大卡。
7. 接口 API 与批量任务
比赛和科研场景都涉及接口调用。人形机器人的接口一般分两层:一层是给外部系统调用的 HTTP/WebSocket 接口,用于比赛指令、成绩上报;另一层是 ROS 2 内部节点之间通信的接口。
7.1 外部控制接口示例
一般会有一个控制服务,接收外部指令,再转发给内部状态机。
以下是通用请求模板,实际路径和参数要按项目改:
curl -X POST http://127.0.0.1:8080/api/task \ -H "Content-Type: application/json" \ -d '{"task":"go_to_waypoint", "params":{"x":1.0,"y":2.0}}'返回结果通常包含任务 ID 和执行状态:
{ "task_id": "task_001", "status": "accepted", "message": "task has been accepted" }如果项目里没有现成接口,可以用 Python 包一层 ROS 2 调用。
import json from flask import Flask, request, jsonify app = Flask(__name__) @app.route("/api/task", methods=["POST"]) def submit_task(): data = request.get_json() # TODO: 在这里把任务转发给 ROS 2 行为树节点 return jsonify({ "task_id": "task_001", "status": "accepted", "message": "task received" }) if __name__ == "__main__": app.run(host="0.0.0.0", port=8080)这个示例只是模板,不要直接拿到比赛用,必须根据你项目里的任务格式改。
7.2 批量任务与数据采集
批量任务最常见的使用场景是强化学习训练和仿真数据采集。一次训练跑几百上千个并行环境是很常见的。
批量 rollout 的通用设计思路:
import time from collections import deque class BatchRunner: def __init__(self, env, policy, num_episodes=100): self.env = env self.policy = policy self.num_episodes = num_episodes self.result_queue = deque() def run(self): for episode in range(self.num_episodes): obs, _ = self.env.reset() done = False step = 0 while not done and step < 1000: action = self.policy(obs) obs, reward, terminated, truncated, _ = self.env.step(action) done = terminated or truncated step += 1 self.result_queue.append({ "episode": episode, "success": terminated, "steps": step, "reward": reward }) time.sleep(0.01) runner = BatchRunner(env, policy, num_episodes=200) runner.run()批量任务最容易出问题的不是跑不快,而是失败后没有日志。建议每个 episode 写一行 JSON 结果,任务挂了也能回溯。
7.3 失败重试策略
实机任务失败后,不能盲目重试。建议策略:
- 先记录失败原始数据。
- 判断故障类型:硬件异常、状态机异常、感知异常。
- 硬件异常立即停止,等待人工处理。
- 感知异常可以重试,但最多重试 2 到 3 次。
- 状态机异常要看是在哪个节点失败,先复位行为树再重试。
8. 资源占用与性能观察
8.1 CPU、内存、显存和功耗
人形机器人是典型的异构计算负载:
- 运动控制需要低延迟,资源占用不高,但要求实时性。
- 视觉感知需要较高 GPU,特别是双目标检测和深度估计。
- 仿真训练需要高 CPU 或 GPU,但不是实时需求。
如果机器人在端侧运行多个模型,一定要留足 CPU 余量给运动控制线程。一个常见方案是给运动控制进程单独绑核,避免被视觉任务抢占。
8.2 如何降低资源压力
- 相机分辨率降低一半,识别精度可能损失很小。
- 使用模型量化,比如 TensorRT 或 NPU 加速。
- 可选的传感器数据降低发布频率。
- 仿真环境关闭不必要的渲染特效。
8.3 性能数据记录
建议把性能数据统一写入一个日志目录:
logs/20260823_2100/ cpu.log gpu.log motor_feedback.log state_machine.log比赛结束后,这不是文件,而是排错证据。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动后没有图像显示 | 模型文件缺失或 mesh 路径错误 | 查看 launch 日志 | 检查 URDF/SDF 文件路径 |
| 机器人原地抖动 | 控制频率不足或增益过大 | 查看关节指令频率 | 降低 P 增益,提高控制频率 |
| 视觉识别成功率低 | 光照、视角和训练集不一致 | 采集比赛场景图片测试 | 补数据重新训练 |
| 电机关节发热严重 | 力矩指令波动大 | 查看力矩曲线 | 增大阻尼,降低加速峰值 |
| 仿真能走实机走不了 | sim2real 差距大 | 录仿真与实机数据对比 | 做参数随机化,增加域随机化 |
| API 调用超时 | 外部网络问题或接口带宽不足 | 用 curl 直接测响应时间 | 限制外部访问范围,服务放到内网 |
| 批量任务卡住 | 队列中某个失败任务持续阻塞 | 检查任务日志 | 加重试阈值和超时机制 |
| 多个进程抢占 CPU | 缺少进程调度配置 | 查看 top 各进程 CPU | 绑定 CPU 核心,设置调度优先级 |
这里最值得单独说的是 sim2real 差距。仿真里成功不代表实机成功。建议做三个操作:动力学参数随机化、摩擦系数随机化和控制延迟注入。这样模型在现实环境里会稳健很多。
另一个常见坑是:控制器默认把自己当成“世界坐标系有效”的机器人。实际跑起来后,里程计累积误差和足端打滑会导致位姿漂移。解决办法是引入视觉里程计或定期重置位置,不要依赖纯编码器积分走完整个比赛流程。
10. 最佳实践与使用建议
综合多次比赛和实验室部署经验,下面这些建议最值得记下来。
一是先小后大。第一次联调不要跑全流程,先让机器人在空地上走 1 米,再逐步增加任务。每一次调整参数,只改一个变量,不要同时改步态增益和视觉阈值。
二是保持最小可运行配置。把一条完整的、最短的启动链路单独保存,命名类似boot_min.sh。比赛出现故障时,先回到最小配置,确认基础没问题,再恢复复杂功能。
三是文件分目录管理。
humanoid_ws/ config/ models/ src/ data/raw/ data/processed/ logs/ tools/模型文件、比赛视频、日志、训练脚本分开存,避免一个目录里塞满几百个文件。
四是批量任务必须有日志和失败重试。无论是仿真训练还是实机采集数据,都执行“任务 ID + 输入参数 + 输出结果 + 错误信息”四件套。
五是接口服务要限制访问范围。比赛现场有很多终端和无线网络,外部控制接口如果开放到公网,一旦被误触发会非常危险。建议绑定到局域网 IP,不确认为需要外部访问的用户就设为127.0.0.1。
六是涉及人脸、人物、语音数据时注意授权。感知模型如果采集了现场人员数据,不要随意上传到公网服务。
最后一点,留一个“一键静默”按钮。比赛或演示过程里,任何蓝牙、Wi-Fi、HTTP 指令都可能造成干扰。给系统加一个物理急停或远程 kill 指令,紧急情况下优先切断上层决策,保留底层电机安全保护。这比在脚本里调试 prompt 重要得多。
11. 总结与下一步
这次我们从“中国人形机器人竞技”这个关键词出发,把一支队伍大概率会踩的技术链路拆了一遍。最值得先做的一项工作是:把运动控制、感知、状态机和日志先搭成最小闭环,即使功能还很弱,后边每一项升级都围绕着它做。
第一次验证时,优先看三件事:
- 仿真里机器人能不能稳定起步、停下、转身。
- 两个关键节点之间的通信延迟和日志是否完整。
- 端侧芯片或开发板能不能满足实时控制需求。
最容易踩的坑是:仿真平台太顺,实机太松散。所以不要只在仿真里调好参数就上实机,建议提前设计域随机化和故障恢复。
下一步的扩展方向很明确:把感知模型接入运动控制,形成从目标识别到路径规划的完整闭环;再接入批量训练接口,让模型在仿真里先跑出稳定的策略;最后在真实场地用同一套代码框架完成迁移。等这三个阶段都跑通,比赛现场比拼的就是整机稳定性和队伍排错速度,而不是单纯的模型好不好看。