从抬手够到一个杯子动作,读懂启元机器人背后的精密链条和复杂算法
机器人抬手够到一个杯子,中间要过几道关
一句话概括:从摄像头的一个像素,到关节里的一个电流值,中间有五次「翻译」。每一层翻译都会丢信息,也都能出偏差——这就是为什么「看起来很简单」的动作,在机器人身上事故率很高。
先从一个动作说起
桌上有只杯子,离机器人 30 厘米,偏右一点。你让它「把杯子拿过来」。
对人来说,这是下意识的一伸手。对机器人来说,这句话要先被拆成五个问题:
- 杯子在画面里的哪个位置?
- 这个位置对应现实世界的哪个三维坐标?
- 这个坐标相对机器人身体的哪里?
- 手臂的四个关节该转到什么角度,手才够得到?
- 每个关节要出多大力,才能既转到位、又不把杯子捏碎?
五道关,五套数学,五种失败方式。下面用启元 Q1 的真实参数当例子——88 厘米身高、22 个自由度(手臂 4×2、腿 6×2、腰 2)、约 16 公斤整机——把这五道关拆开讲一遍。

第一关:从像素到「方向」

摄像头拍到的是一张二维图像。图像上每个点都有坐标 (u, v),单位是像素。要把像素变成方向,需要一组叫内参的数字:焦距 fx, fy 和光心 cx, cy。
x_normalized = (u - cx) / fx
y_normalized = (v - cy) / fy
这两个数不是「米」,也不是「角度」,而是方向:一条从相机光心出发、穿过这个像素的射线。也就是说,单张照片只能告诉你「杯子在那个方向上」,不能告诉你「有多远」。
举个具体数字。假设图像 640×480、fx = 500、cx = 320,杯子中心落在像素 u = 400 处:
x_normalized = (400 - 320) / 500 = 0.16
这个 0.16 的意思是:在相机前方 1 米处,这条射线偏离光轴 0.16 米。如果杯子其实在 0.5 米处,那它的横向偏移就是 0.16 × 0.5 = 0.08 米,也就是 8 厘米;如果在 2 米处,偏移就是 32 厘米。同一个像素,对应无数个三维点——这就是单目的根本歧义。
这是第一个反直觉的地方。很多人以为视觉识别框出了杯子,机器人就知道杯子在哪;实际上它只知道一条射线。距离要么靠深度相机、双目视差、结构光,要么靠「假设杯子在桌面上」这种先验去算交点。
Q1 是头部单目,T1 是双目左右两路。双目能通过视差算深度:同一个点在左右图上的水平像素差 d,距离近似为 Z = fx × B / d,B 是两相机间距。这也是为什么双目机器人对「基线长度」和「标定精度」这么敏感——d 只有几个像素的误差,Z 就会差出几十厘米。
还有一层常被忽略:镜头畸变。广角镜头边缘的直线会弯,如果不做去畸变,画面边缘的像素反投影出来的方向会偏。内参和畸变系数是一起标定的,换镜头、摔过、温度变化大,都要重标。
第二关:从「方向」到「身体坐标」
现在有了一个相对相机的三维点。但机器人的手臂不知道「相机坐标系」,它只知道「我的肩膀在哪、我的手在哪」。
所以需要一个统一的参照系。工程上的做法是坐标变换树(TF 树):每个部件(底盘、腰、肩、肘、腕、相机)都有自己的坐标系,父子之间用「平移 + 旋转」连接。任意两个坐标系之间的变换,可以沿树一路乘出来。
Q1 的 URDF 文件把这件事写死了:25 个 joint 里 22 个是转动关节(revolute),head_joint 和左右 wrist_yaw_joint 是固定关节(fixed),所以自由度是 22。每个 joint 有原点偏移、轴向、限位。这棵树就是机器人的「身体说明书」,正运动学就是沿着树把变换乘一遍,算出「在当前关节角下,手在空间的哪个位置」。
这一步最典型的错误是外参标定。相机装在头上,相机和头之间的相对位置如果标偏了 1 厘米,手就会稳定地偏 1 厘米——而且是自己感觉不到的偏。人闭眼伸手也会偏,但人能靠触觉纠正;机器人如果只靠视觉,就会一直偏下去。
第三关:从「位置」到「角度」
知道了手要去的三维点,接下来要反解:每个关节该转多少度?
这叫逆运动学(IK)。正运动学是「角度 → 位置」,有唯一答案;逆运动学是「位置 → 角度」,可能无解、可能多解、可能无穷多解。
用一个简化的二连杆手臂算一遍,就能看清「多解」是怎么回事。设大臂 L1 = 0.25 m,小臂 L2 = 0.25 m,目标点在身体正前方偏右 (x, y) = (0.30, 0.10)(俯视平面)。

先算目标到肩的距离:
r² = 0.30² + 0.10² = 0.10
cos θ2 = (r² - L1² - L2²) / (2 × L1 × L2)
= (0.10 - 0.0625 - 0.0625) / (2 × 0.25 × 0.25)
= -0.025 / 0.125 = -0.2
θ2 = ± arccos(-0.2) = ± 101.5°
两个解,对应「肘部朝上」和「肘部朝下」两种构型。再代回去求 θ1:
解 A(θ2 = +101.5°):θ1 = atan2(0.10, 0.30) - atan2(0.25×sin101.5°, 0.25+0.25×cos101.5°)
= 18.4° - 50.8° = -32.3°
解 B(θ2 = -101.5°):θ1 = 18.4° + 50.8° = 69.2°
验算解 A:x = 0.25×cos(-32.3°) + 0.25×cos(-32.3°+101.5°) = 0.2112 + 0.0887 = 0.2999,y = 0.25×sin(-32.3°) + 0.25×sin(69.2°) = -0.1337 + 0.2338 = 0.1001。和目标的 (0.30, 0.10) 对上了。
两个解都能让手到同一个点,但姿态完全不同:解 A 肘部朝外,解 B 肘部朝内。选哪个,取决于「会不会撞到身体」「手腕还能不能转」「哪个更省力」。真实的 Q1 单臂是 4 个自由度,不是 2 个,解空间更大——「够得到」和「够得舒服、不撞、能拧」是三件事。
还有一个更麻烦的情况:目标太远,cos θ2 算出来大于 1,无解。这时候机器人要么走近一点,要么放弃。工程上必须显式处理「无解」,否则会出现关节突然猛甩的保护动作。
第四关:从「角度」到「电流」
角度指令下发到关节,关节里发生了什么?
Q1 用的是 QDD 准直驱关节(准直驱,quasi-direct-drive):电机经过很小的减速比直接驱动关节,齿圈电机与外壳一体化,粉末冶金工艺把单关节重量压到 260 克,2.5 毫米中空走线,厂商标称峰值扭矩密度 85 N·m/kg。按 260 克粗算,单关节的峰值扭矩量级在 20 N·m 上下——这是估算,不是官方参数,但足以说明「小体积、大扭矩」是什么量级。
准直驱的好处是力控友好:减速比小,摩擦力矩和惯量折算都小,关节对外力的感知更灵敏,撞到人时更容易「察觉并停住」。代价是同样扭矩需要更大电流,对驱动器和散热要求更高。
下发一条关节命令,SDK 里通常带五个字段:位置、速度、力矩、刚度(stiffness)、阻尼(damping)。这说明 SDK 层是位置伺服语义:你给目标角度和一组 PD 参数,闭环在机器人内部跑,开发者看不到力矩环。
τ = Kp × (θ_target - θ_now) + Kd × (0 - θ̇_now)
Kp 小,关节软,遇阻会让;Kp 大,关节硬,定位准但撞上就疼。Kd 决定「刹车」的力度,太小会抖,太大会迟钝。官方示例里 stiffness 与 damping 的缺省值分别是 20.0 和 2.0(见 joint_control.py),但这只是示例值,不是安全建议值——真正调参要按负载和场景来。
这一关最容易被低估的是限位和防夹。Q1 的产品页专门写了「防夹关节设计:精准行程限位、多维度触感、遇阻即停」。这些不是软件里的 if 判断,而是机械 + 电气的多重保护。做二开时如果绕过高层运控直接下发关节目标,这些保护是否还生效,必须逐个确认。

第五关:执行中出错,怎么救回来
前四关都是「算」,第五关是「算错了怎么办」。
现实世界不会按假设来:杯子被挪了 2 厘米、桌面有反光、孩子的手突然伸进来、电池电压下降导致关节响应变慢。开环执行一定会偏,所以要闭环。
闭环有三个层次:
- 视觉伺服:执行过程中持续拍照,比较「手当前在画面里的位置」和「目标位置」,边走边修。它对标定误差不敏感,但要求相机能看到手和目标,且延迟要低。
- 力/触觉反馈:抓取时感知接触力,抓到就停,抓滑了就加力。Q1 的力控在机内闭环,SDK 不直接暴露力矩数据,开发者只能用位置伺服 + 刚度调参间接表达。
- 安全兜底:限位、急停、跌倒检测、遇阻即停。这一层不追求「完成任务」,只追求「不出事」。
三层里,第一层决定「做得准不准」,第三层决定「能不能让人放心站在旁边」。消费级机器人和实验室样机的分水岭,往往不在第一层,而在第三层。
第五关的隐藏成本:时间
前四关算的都是「位置对不对」,还有一个维度同样致命:时间。
一次「看见—伸手」的完整链路,每一环都要排队:
| 环节 | 典型耗时 | 说明 |
|---|---|---|
| 相机曝光 | 10–30 ms | 光线越暗,曝光越长 |
| 图像传输 | 5–15 ms | 取决于分辨率和链路 |
| 感知/推理 | 20–80 ms | 板端算力决定,大模型更久 |
| 运动规划 | 1–5 ms | 反解 + 碰撞检查 |
| 控制周期 | 2 ms | 官方关节示例的控制周期 |
| 电机响应 | 10–20 ms | 与负载、刚度有关 |
加起来是 50–150 毫秒。听起来不多,但如果机器人正以 0.3 米/秒移动,100 毫秒就是 3 厘米的位移——对一个要抓 5 厘米宽物体的任务,这 3 厘米足以让「对准」变成「擦边」。
工程上有三种应对:
- 降速。 最笨也最可靠。速度减半,同样的延迟只带来一半的位移误差。
- 预测。 把延迟补偿进去:不是瞄准「杯子现在在哪」,而是瞄准「100 毫秒后杯子会在哪」。对静止物体没用,对移动物体是必需的。
- 视觉伺服。 不追求一次算准,而是边走边看,用「手在画面里的位置」和「目标位置」的差值持续修正。它对延迟不敏感,但要保证手始终在视野里。
人的反应延迟其实也有 150–200 毫秒,但人靠预测、靠触觉、靠「快碰到时减速」的本能把这部分补上了。机器人没有这些本能,只能靠工程补。
这也解释了一个常见现象:演示视频里的机器人往往比实际使用中「聪明」。 演示时物体摆好、光线稳定、人可以等它慢慢算;真实环境里,孩子的手已经在杯子旁边了。
为什么「看起来简单」的事故率高
把五关连起来看,就明白难点在哪了:
| 关卡 | 输入 | 输出 | 典型失败 |
|---|---|---|---|
| 看见 | 图像像素 | 一条射线 | 光照、反光、透明物体、遮挡 |
| 定位 | 射线 + 深度/先验 | 三维点 | 单目歧义、标定漂移 |
| 变换 | 相机坐标 | 身体坐标 | 外参偏差 1 cm,手偏 1 cm |
| 反解 | 目标位姿 | 关节角 | 多解选错撞身体、无解未处理 |
| 执行 | 关节角 | 电流/力矩 | 刚度不当、限位误判、延迟累积 |
一个动作的成功率,是这五关成功率的乘积。每关 95%,五关下来只剩 77%。而现实里每一关在长尾场景下的成功率都远低于 95%——这就是为什么演示视频里行云流水,买回家三天就吃灰。
更麻烦的是误差会累积。第一关偏 2 厘米,第二关为了补偿又偏 3 厘米,第三关反解出一个更别扭的姿态,第四关为了到位把刚度调高,第五关撞到东西……单看每一关都不算错,连起来就是事故。
给非开发者的三个判断标准
如果你不是开发者,只想判断一台机器人「到底行不行」,可以问三个问题:
第一,它的相机是单目还是双目,深度怎么来的? 单目 + 桌面假设,遇到悬空物体就废;双目要看基线长度和标定频率。
第二,它的手有多少个自由度,限位和防夹是机械的还是软件的? 4 个自由度的手腕能做的事,比 2 个多一个量级;纯软件限位在驱动器故障时会失效。
第三,它出错了会不会自己停? 这一条比前面所有参数都重要。会停的机器人,最坏结果是没完成任务;不会停的机器人,最坏结果是进医院。
术语表
| 术语 | 一句话解释 |
|---|---|
| 内参 | 相机的焦距与光心,决定像素对应哪个方向 |
| 外参 | 相机相对机器人身体的安装位置与朝向 |
| 正运动学 | 已知关节角,算手在哪 |
| 逆运动学 | 已知手要去哪,算关节角 |
| 自由度(DOF) | 能独立运动的关节数量,Q1 为 22 |
| 刚度 / 阻尼 | 位置伺服里的「硬不硬」「刹不刹得住」 |
| QDD | 准直驱关节,小减速比、力控友好 |
| 视觉伺服 | 边看边调,用图像误差驱动动作 |
| 视差 | 同一个点在左右相机成像的水平位置差,用来算距离 |
| 标定 | 把内参、外参、畸变系数测出来的过程,换镜头或碰撞后要重做 |
| 端到端延迟 | 从「看见」到「关节动」的总耗时,通常 50–150 毫秒 |
小结
回到开头那只杯子。它被「看见」是一次投影,被「定位」是一次三角测量,被「理解」是一次坐标变换,被「执行」是一次反解加伺服,被「完成」是一次又一次的纠错。
机器人不是「不够聪明」,而是这条链路上的每一环都在和物理世界的噪声搏斗。理解这一点,再看那些演示视频,你会知道该为哪一步鼓掌,也该为哪一步担心。
Q1 把 22 个自由度、88 厘米身高、约 16 公斤的重量做进了「一个背包能带走」的形态,本质上是把这五关的工程复杂度压缩到了消费级成本。至于它能不能真的走进家庭,答案不在参数表里,而在上面那张「五关成功率」的表里——每一关都得有人去填。
参考资料
- 启元 Q1 产品页(88 cm、约 16 kg、22 自由度、QDD 关节 260 g、峰值扭矩密度 85 N·m/kg、防夹关节设计):https://www.primebot.com/q1.html
- 启元 Q1 URDF V3.0(25 个 joint、22 个 revolute、24 个 STL 网格):https://dev.primebot.com/download
- 启元机器人开发者学堂(开箱、功能介绍、使用教程):https://dev.primebot.com/learn
想亲手验证这五关,Q1 的 URDF、SDK 与入门课程都在启元机器人开发者社区:https://dev.primebot.com/
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)