最近想从一些比较基础、但实际做机器人又绕不开的问题开始聊。

第一篇就先聊一个我觉得很典型的问题:

机器人控制里,为什么有时候我们可以直接算出答案,有时候却只能一点点迭代?

也就是常说的:

解析解和数值解

这两个词听起来有点数学,但放到机器人里,其实很好理解。

比如我们现在想让机械臂的末端移动到一个位置。

人看到这个目标,可能会觉得很自然:

“手伸过去不就行了吗?”

但机器人不是这么理解问题的。

机器人真正要解决的是:

末端想去这个位置,那每一个关节到底应该转多少?

肩膀转多少,肘关节转多少,手腕转多少。

这件事就是逆运动学,也就是 IK

看起来像是一个简单的“反推”问题,但真正做起来会发现,它没那么老实。


解析解:最好用,但不是谁都能用

先说解析解。

解析解可以简单理解成:

我已经推好了一个公式,你把目标位置丢进去,它直接告诉你每个关节应该是多少。

这当然很爽。

速度快,结果明确,也不需要一遍遍试。

很多传统工业机械臂,尤其是结构比较标准的六轴机械臂,就很适合这种方式。

因为它的结构比较规整,几何关系比较清楚,所以可以通过数学推导,把逆运动学解出来。

如果机器人结构固定、自由度不高、任务也比较标准,那解析解确实是非常好的方案。

这也是为什么很多工业机器人能跑得又快又稳。

因为它不是每次都在“猜”,而是很多东西早就被数学关系固定下来了。

但问题也在这里。

解析解好用,是因为前提条件好。

一旦机器人结构复杂起来,它就没那么舒服了。

比如双臂机器人。

比如七自由度机械臂。

比如人形机器人。

比如带腰、带躯干、带移动底盘的机器人。

这时候,同一个末端位置,可能有很多种关节姿态都能到。

手臂可以弯着到,也可以伸直到。

肩膀可以多动一点,手腕也可以多动一点。

身体可以参与,也可以不参与。

那到底选哪个?

这时候问题已经不是“能不能到”了,而是“怎么到更合理”。


数值解:不是笨办法,而是工程里真正常用的办法

很多人一听“数值解”,会觉得它是不是不如解析解高级。

其实不是。

数值解不是因为我们偷懒,而是因为很多机器人问题真的没法靠一个公式优雅解决。

数值解的思路更像是:

我先看机器人现在在哪里,再看目标在哪里,然后算一下这一步应该往哪个方向动,误差能变小。

动一点,再算一次。

再动一点,再算一次。

最后一步步逼近目标。

这个过程听起来有点像“试”,但它背后是有明确数学依据的。

比如雅可比矩阵、伪逆、阻尼最小二乘、优化求解,这些都是机器人控制里非常常见的方法。

数值解真正厉害的地方,不是它能把末端挪过去。

而是它能顺便考虑很多现实约束。

比如:

关节不能超过限位。

速度不能突然太大。

动作不能抖。

手臂不能撞到自己。

不要太靠近奇异点。

双臂要协调。

末端位置很重要,但姿态可以稍微放松一点。

某些关节最好尽量靠近一个舒服的默认姿态。

这些东西如果都想写进一个解析公式里,会非常痛苦。

但放到数值优化里,它们就可以变成不同的目标和约束。

这也是为什么越复杂的机器人,越离不开数值方法。

尤其是具身智能机器人。

它面对的不是一个干净的数学题,而是一个不断变化的真实世界


所以解析解和数值解,不是谁打败谁

我觉得这点很重要。

不要把解析解和数值解理解成“谁更高级”。

它们更像是两种工具。

结构简单、任务固定、几何关系清楚,那解析解很好。

复杂系统、约束很多、任务经常变化,那数值解更灵活。

如果只是一个标准六轴机械臂去做重复搬运,解析解可能很合适。

但如果是人形机器人去做双臂操作、避障、抓取、插入、接触,那问题就复杂多了。

它要考虑的不是单次到点。

而是整个动作过程是否连续、是否稳定、是否安全、是否方便接下来的动作。

这时候你会发现,机器人控制不是在求一个“唯一答案”。

它更像是在很多可行答案里面,选一个更好的答案。

这也是数值解的价值。


那 Pinocchio 是干什么的?

聊到这里,就可以说 Pinocchio 了。

Pinocchio 不是动画片里的那个木偶。

在机器人圈里,Pinocchio 是一个非常常用的运动学和动力学计算库。

你可以把它理解成机器人控制系统里的“底层计算引擎”。

机器人控制里,很多东西都要频繁计算。

比如:

现在这个关节角度下,末端到底在哪里?

末端速度和关节速度是什么关系?

机器人当前姿态下,重力补偿应该给多少?

如果关节这么加速,需要多少力矩?

质心在哪里?

雅可比矩阵是多少?

动力学里的质量矩阵、非线性项、重力项怎么来?

这些东西听起来很底层,但它们非常关键。

因为上层控制器再聪明,最后也要依赖这些模型计算。

如果底层算得慢,控制频率就上不去。

如果底层算得不准,控制效果就会变差。

做真实机器人时,这些问题很现实。

不是论文里画个框图就结束了。

机器人每一毫秒都在读状态、算模型、求控制量、发指令。

所以,一个稳定、高效、可维护的动力学库,价值非常大。

Pinocchio 就是在这个位置上发挥作用。


为什么很多复杂机器人会用 Pinocchio?

因为它适合高自由度、多连杆系统。

比如机械臂、人形机器人、四足机器人、双臂系统,这些都不是简单的几个杆子拼起来。

它们有很多关节、很多坐标系、很多惯量参数。

如果所有东西都自己手写,工程量很大,而且很容易出错。

Pinocchio 里面实现了很多经典刚体动力学算法。

比如 RNEA,也就是递归牛顿-欧拉算法。

这个算法可以用来计算机器人在某个状态下,各个关节需要输出多少力矩。

它的核心优势是递归。

机器人本身就是一节一节连起来的。

递归算法就利用了这种结构,把计算从基座传到末端,再从末端传回来。

这样比直接展开一大坨动力学方程要高效很多。

这也是为什么它适合实时控制。

除了 RNEA,Pinocchio 还支持正运动学、雅可比、质量矩阵、动力学导数等很多能力。

对工程开发来说,还有一个很重要的点:

它可以直接加载 URDF。

也就是说,你可以把机器人模型通过标准格式接进来,而不是所有连杆、关节、惯量都手写一遍。

这对真实项目很重要。

因为机器人系统不是一次性玩具。

模型会改,结构会迭代,参数会更新。

如果底层建模方式不干净,后面调控制、做仿真、接优化器都会很难受。


Pinocchio 不是魔法按钮

这里也要说清楚一点。

Pinocchio 不是你一调用,它就自动把机器人控制全部做好。

它更像是一个基础设施。

比如你要做数值 IK,Pinocchio 可以帮你高效算正运动学、雅可比、位姿误差相关的东西。

但最终怎么迭代、怎么加阻尼、怎么处理奇异点、怎么限制速度、怎么避障、怎么设计状态机,这些还是你的控制算法要决定。

这点很像盖楼。

Pinocchio 给你的是很好的钢筋、水泥和施工工具。

但楼怎么设计,怎么抗震,怎么走管线,还是要看你的整体方案。

所以它不是“替代控制器”。

它是让你更容易做出一个靠谱控制器。


我对这个问题的理解

如果只做简单机械臂,解析解很香。

能直接算,就不要绕远路。

但如果做的是复杂机器人,尤其是具身智能机器人,那就不能只盯着“末端能不能到”。

更重要的问题是:

它怎么到?

稳不稳?

会不会抖?

会不会撞?

会不会接近关节极限?

这个姿态对下一步动作是不是友好?

这些问题,才是真实机器人控制里最麻烦、也最有意思的地方。

所以我更愿意把解析解和数值解看成两种阶段:

解析解解决的是一个清楚、规整的问题。

数值解面对的是一个更真实、更复杂的问题。

而 Pinocchio 这类库的意义,就是让我们在面对复杂机器人时,不用从零开始造所有底层工具。

它让运动学和动力学计算变得更快、更统一,也更适合后续接优化、控制和规划。


最后

机器人控制最迷人的地方就在这里。

表面上看,是让一个末端移动到一个点。

但真正往下做,会发现背后是一整套身体如何运动的逻辑。

从解析解到数值解,再到 Pinocchio 这种底层动力学库,本质上都在回答同一个问题:

机器人怎么把“我想去哪里”,变成“我的身体应该怎么动”。

这也是我想用这个公众号慢慢聊的东西。

不一定每篇都讲得很大,但希望每篇都能把一个小问题讲清楚。

下一篇,我想聊一个做机械臂很容易遇到的问题:

为什么手臂伸得太直的时候,末端会抖?

这个问题背后,就会牵扯到一个非常经典的概念:

奇异点。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐