机器人控制里,有些东西真的不是“套个公式”就完事了

最近想从一些比较基础、但实际做机器人又绕不开的问题开始聊。
第一篇就先聊一个我觉得很典型的问题:
机器人控制里,为什么有时候我们可以直接算出答案,有时候却只能一点点迭代?
也就是常说的:
解析解和数值解。
这两个词听起来有点数学,但放到机器人里,其实很好理解。
比如我们现在想让机械臂的末端移动到一个位置。
人看到这个目标,可能会觉得很自然:
“手伸过去不就行了吗?”
但机器人不是这么理解问题的。
机器人真正要解决的是:
末端想去这个位置,那每一个关节到底应该转多少?
肩膀转多少,肘关节转多少,手腕转多少。
这件事就是逆运动学,也就是 IK。
看起来像是一个简单的“反推”问题,但真正做起来会发现,它没那么老实。
解析解:最好用,但不是谁都能用
先说解析解。
解析解可以简单理解成:
我已经推好了一个公式,你把目标位置丢进去,它直接告诉你每个关节应该是多少。
这当然很爽。
速度快,结果明确,也不需要一遍遍试。
很多传统工业机械臂,尤其是结构比较标准的六轴机械臂,就很适合这种方式。
因为它的结构比较规整,几何关系比较清楚,所以可以通过数学推导,把逆运动学解出来。
如果机器人结构固定、自由度不高、任务也比较标准,那解析解确实是非常好的方案。
这也是为什么很多工业机器人能跑得又快又稳。
因为它不是每次都在“猜”,而是很多东西早就被数学关系固定下来了。

但问题也在这里。
解析解好用,是因为前提条件好。
一旦机器人结构复杂起来,它就没那么舒服了。
比如双臂机器人。
比如七自由度机械臂。
比如人形机器人。
比如带腰、带躯干、带移动底盘的机器人。
这时候,同一个末端位置,可能有很多种关节姿态都能到。
手臂可以弯着到,也可以伸直到。
肩膀可以多动一点,手腕也可以多动一点。
身体可以参与,也可以不参与。
那到底选哪个?
这时候问题已经不是“能不能到”了,而是“怎么到更合理”。
数值解:不是笨办法,而是工程里真正常用的办法
很多人一听“数值解”,会觉得它是不是不如解析解高级。
其实不是。
数值解不是因为我们偷懒,而是因为很多机器人问题真的没法靠一个公式优雅解决。
数值解的思路更像是:
我先看机器人现在在哪里,再看目标在哪里,然后算一下这一步应该往哪个方向动,误差能变小。
动一点,再算一次。
再动一点,再算一次。
最后一步步逼近目标。
这个过程听起来有点像“试”,但它背后是有明确数学依据的。
比如雅可比矩阵、伪逆、阻尼最小二乘、优化求解,这些都是机器人控制里非常常见的方法。

数值解真正厉害的地方,不是它能把末端挪过去。
而是它能顺便考虑很多现实约束。
比如:
关节不能超过限位。
速度不能突然太大。
动作不能抖。
手臂不能撞到自己。
不要太靠近奇异点。
双臂要协调。
末端位置很重要,但姿态可以稍微放松一点。
某些关节最好尽量靠近一个舒服的默认姿态。
这些东西如果都想写进一个解析公式里,会非常痛苦。
但放到数值优化里,它们就可以变成不同的目标和约束。
这也是为什么越复杂的机器人,越离不开数值方法。
尤其是具身智能机器人。
它面对的不是一个干净的数学题,而是一个不断变化的真实世界。
所以解析解和数值解,不是谁打败谁
我觉得这点很重要。
不要把解析解和数值解理解成“谁更高级”。
它们更像是两种工具。
结构简单、任务固定、几何关系清楚,那解析解很好。
复杂系统、约束很多、任务经常变化,那数值解更灵活。
如果只是一个标准六轴机械臂去做重复搬运,解析解可能很合适。
但如果是人形机器人去做双臂操作、避障、抓取、插入、接触,那问题就复杂多了。
它要考虑的不是单次到点。
而是整个动作过程是否连续、是否稳定、是否安全、是否方便接下来的动作。

这时候你会发现,机器人控制不是在求一个“唯一答案”。
它更像是在很多可行答案里面,选一个更好的答案。
这也是数值解的价值。
那 Pinocchio 是干什么的?
聊到这里,就可以说 Pinocchio 了。
Pinocchio 不是动画片里的那个木偶。
在机器人圈里,Pinocchio 是一个非常常用的运动学和动力学计算库。
你可以把它理解成机器人控制系统里的“底层计算引擎”。
机器人控制里,很多东西都要频繁计算。
比如:
现在这个关节角度下,末端到底在哪里?
末端速度和关节速度是什么关系?
机器人当前姿态下,重力补偿应该给多少?
如果关节这么加速,需要多少力矩?
质心在哪里?
雅可比矩阵是多少?
动力学里的质量矩阵、非线性项、重力项怎么来?
这些东西听起来很底层,但它们非常关键。
因为上层控制器再聪明,最后也要依赖这些模型计算。
如果底层算得慢,控制频率就上不去。
如果底层算得不准,控制效果就会变差。
做真实机器人时,这些问题很现实。
不是论文里画个框图就结束了。
机器人每一毫秒都在读状态、算模型、求控制量、发指令。
所以,一个稳定、高效、可维护的动力学库,价值非常大。
Pinocchio 就是在这个位置上发挥作用。
为什么很多复杂机器人会用 Pinocchio?
因为它适合高自由度、多连杆系统。
比如机械臂、人形机器人、四足机器人、双臂系统,这些都不是简单的几个杆子拼起来。
它们有很多关节、很多坐标系、很多惯量参数。
如果所有东西都自己手写,工程量很大,而且很容易出错。
Pinocchio 里面实现了很多经典刚体动力学算法。
比如 RNEA,也就是递归牛顿-欧拉算法。
这个算法可以用来计算机器人在某个状态下,各个关节需要输出多少力矩。
它的核心优势是递归。
机器人本身就是一节一节连起来的。
递归算法就利用了这种结构,把计算从基座传到末端,再从末端传回来。
这样比直接展开一大坨动力学方程要高效很多。
这也是为什么它适合实时控制。
除了 RNEA,Pinocchio 还支持正运动学、雅可比、质量矩阵、动力学导数等很多能力。
对工程开发来说,还有一个很重要的点:
它可以直接加载 URDF。
也就是说,你可以把机器人模型通过标准格式接进来,而不是所有连杆、关节、惯量都手写一遍。
这对真实项目很重要。
因为机器人系统不是一次性玩具。
模型会改,结构会迭代,参数会更新。
如果底层建模方式不干净,后面调控制、做仿真、接优化器都会很难受。
Pinocchio 不是魔法按钮
这里也要说清楚一点。
Pinocchio 不是你一调用,它就自动把机器人控制全部做好。
它更像是一个基础设施。
比如你要做数值 IK,Pinocchio 可以帮你高效算正运动学、雅可比、位姿误差相关的东西。
但最终怎么迭代、怎么加阻尼、怎么处理奇异点、怎么限制速度、怎么避障、怎么设计状态机,这些还是你的控制算法要决定。
这点很像盖楼。
Pinocchio 给你的是很好的钢筋、水泥和施工工具。
但楼怎么设计,怎么抗震,怎么走管线,还是要看你的整体方案。
所以它不是“替代控制器”。
它是让你更容易做出一个靠谱控制器。

我对这个问题的理解
如果只做简单机械臂,解析解很香。
能直接算,就不要绕远路。
但如果做的是复杂机器人,尤其是具身智能机器人,那就不能只盯着“末端能不能到”。
更重要的问题是:
它怎么到?
稳不稳?
会不会抖?
会不会撞?
会不会接近关节极限?
这个姿态对下一步动作是不是友好?
这些问题,才是真实机器人控制里最麻烦、也最有意思的地方。
所以我更愿意把解析解和数值解看成两种阶段:
解析解解决的是一个清楚、规整的问题。
数值解面对的是一个更真实、更复杂的问题。
而 Pinocchio 这类库的意义,就是让我们在面对复杂机器人时,不用从零开始造所有底层工具。
它让运动学和动力学计算变得更快、更统一,也更适合后续接优化、控制和规划。
最后
机器人控制最迷人的地方就在这里。
表面上看,是让一个末端移动到一个点。
但真正往下做,会发现背后是一整套身体如何运动的逻辑。
从解析解到数值解,再到 Pinocchio 这种底层动力学库,本质上都在回答同一个问题:
机器人怎么把“我想去哪里”,变成“我的身体应该怎么动”。
这也是我想用这个公众号慢慢聊的东西。
不一定每篇都讲得很大,但希望每篇都能把一个小问题讲清楚。
下一篇,我想聊一个做机械臂很容易遇到的问题:
为什么手臂伸得太直的时候,末端会抖?
这个问题背后,就会牵扯到一个非常经典的概念:
奇异点。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)