机器人运动控制学习7——映射关系
2026/9/1 7:23:11 网站建设 项目流程

从这里开始,我们正式进入:

FK → Jacobian → 数值IK → 伪逆 → 奇异位形 → DLS

先记一句话:

Jacobian = “关节动一点,会让末端怎么动”的映射关系。


1. 为什么有了 FK 还需要 Jacobian?

FK解决的是:

已知关节角 q ↓ 手在哪里?

比如:

q1 = 30° q2 = 60° ↓ FK ↓ Hand = (0.866, 1.5)

但现在我们想问一个新的问题:

如果肩膀再动 1°,手会往哪里动?会动多少?

这时候,仅仅知道“现在手在哪里”还不够。我们需要知道:

关节变化 ↓ 末端变化

这就是 Jacobian。


2. 继续用两关节机械臂

还是这个模型:

Base O \ \ O Elbow \ \ O Hand

两个关节:

q1 = 肩 q2 = 肘

现在假设机器人保持某个姿势不动。

我们先只让:

q1

稍微增加一点点。

比如:

q1 + 1°

会发生什么?

肩膀后面的:

上臂 肘 前臂 手

全部跟着动。所以手会产生一个小位移。


3. 再只动 q2

保持肩膀不动。

只让:

q2 + 1°

这时候:

Elbow

位置基本不变。

但:

Forearm Hand

会跟着肘转。

于是手也会产生一个小位移。

但这个位移通常和刚才:

q1 + 1°

导致的位移不一样。

这就是关键:

不同关节,对末端运动的影响不同。

Jacobian就是把这些影响全部记录下来。


4. 先把它想成一张“影响表”

比如某个姿势下:

肩膀转一点 → 手主要向左上移动 肘转一点 → 手主要向左下移动

我们可以想象一张表:

关节对手x方向影响对手y方向影响
q1某个值某个值
q2某个值某个值

把这张表写成矩阵,就是:

J

也就是 Jacobian 矩阵。


5. Jacobian 最核心的关系

你以后会经常看到:

ẋ = J(q) q̇

先别怕。

翻译成人话:

关节速度 q̇ ↓ Jacobian ↓ 末端速度 ẋ

也就是:

我知道每个关节现在转多快,就能通过 Jacobian 算出手在空间里运动多快。


6. q 和 q̇ 不一样

这里顺便补一个非常重要的符号。

q

代表:

关节当前的位置 / 角度。

比如:

q = [30° 60°]

而:

读作:

q dot

表示:

关节速度。

例如:

q̇ = [10°/s 20°/s]

意思是:

肩膀每秒转10° 肘每秒转20°

以后还会有:

表示:

关节加速度。

所以先记:

q = 位置 q̇ = 速度 q̈ = 加速度

这三个以后贯穿整个机器人控制。


7. ẋ 又是什么?

这里的:

x

不是一定只代表World坐标的x轴。

在机器人学里,很多时候:

x

会泛指:

末端任务空间状态。

比如二维手的位置:

x = [x_hand y_hand]

那么:

ẋ = [vx vy]

就是手的速度。

所以:

ẋ = J q̇

就是:

关节怎么转 → 手怎么移动。


8. 一个很直观的例子

假设某个姿势下,Jacobian近似:

J = [1.0 0.3 0.5 0.8]

你现在不用管这些数字怎么得到。

假设:

q̇ = [1 0]

也就是:

只有肩膀在动,肘不动。

那么:

ẋ = J q̇

实际上就是取:

J的第一列

所以手的运动趋势是:

[1.0 0.5]

也就是说:

第一列描述 q1 对末端的影响。


如果:

q̇ = [0 1]

只有肘动。

那么结果就是:

J第二列 = [0.3 0.8]

所以:

Jacobian 的每一列,可以理解成“某一个关节单独动时,末端会怎么动”。

这个直觉非常重要。


9. 为什么肩关节影响通常更大?

想象一条伸直的手臂:

Shoulder O────────Elbow────Hand

肩膀转1°,因为手离肩膀比较远:

半径很大

所以手会扫过比较大的弧,但肘转1°:

Elbow O────Hand

手离肘比较近,扫过的弧会小一点,所以同样:

不同关节造成的末端位移可能完全不同,Jacobian就在描述这种“杠杆效应”。


10. Jacobian 不是固定不变的

这一点特别重要。

假设手臂伸直:

O────O────O

肩膀转一点,手会主要横向移动。

但如果手臂已经折起来:

O \ O / O

同样肩膀转一点,手的运动方向和大小都会变。

所以:

J = J(q)

意思是:

Jacobian取决于机器人当前姿态 q。

机器人姿态一变:

Jacobian

也跟着变。


11. FK和Jacobian是什么关系?

FK:

q ↓ 末端位置 x

可以写成:

x = f(q)

意思:

手的位置是关节角的函数。

那么 Jacobian 可以粗略理解成:

FK对关节角的“敏感程度”。

也就是:

q改变一点 ↓ x会改变多少

数学上这和“导数”有关。


12. Jacobian 上半部分和下半部分

以后你可能看到:

J = [ Jv Jw ]

可以简单理解:

Jv = 关节对末端“位置/线速度”的影响 Jw = 关节对末端“方向/角速度”的影响

所以:

q̇ ↓ J ↓ 末端线速度 + 角速度

所以 Jacobian 是 FK 到 IK 的桥,这张图必须记住:

FK q ↓ x Jacobian q̇ ↓ ẋ 数值IK 希望x怎么变 ↓ 反过来求q怎么变

这就是为什么学习顺序一定是:

FK ↓ Jacobian ↓ IK

而不是一上来就直接学IK代码。

接近奇异点时关节速度突然爆炸
FK ↓ 我现在在哪? Jacobian ↓ 关节动一点,手怎么动? Jacobian伪逆 ↓ 我想让手这样动,关节该怎么动? 奇异位形 ↓ 为什么有时候伪逆会爆? DLS ↓ 怎么让IK更稳定? 关节限位 ↓ 不能让肘和肩随便转 多任务IK ↓ 右手跟踪 + 身体姿态 + 左手任务

Jacobian描述关节运动对末端运动的影响。

ẋ = J q̇

翻译:

关节速度经过Jacobian,变成末端速度。

Jacobian每一列,可以理解为某个关节单独运动时对末端的影响。

Jacobian跟机器人当前姿态有关,不是固定矩阵。

奇异位形

奇异位形不是:

电机坏了 传感器坏了 代码崩了

而是:

机器人几何结构导致,在某个特定姿势下,某些末端运动方向无法通过关节瞬时运动实现。

也就是说:

机械结构 + 当前姿态

共同导致。


1. Rank 是什么?

先用小白版本,假设二维末端需要:

x方向能力 y方向能力

正常:

有2个独立运动方向

可以粗略认为 rank = 2,到了奇异位形:

两个关节只能产生类似方向的末端运动

独立能力可能只剩:

1个方向

于是:

rank 从2降到1

这就叫:

Jacobian 降秩。


8. 为什么伪逆会出问题?

假设末端想移动:

Δx = 很小

但这个方向恰好是机器人在当前姿态下非常难实现的。

算法仍然想:

“我要尽量把这个 1cm 的误差消掉。”

于是它可能计算出:

需要非常大的 Δq

例如:

目标手只移动 1 cm

结果:

肩关节 +60° 肘关节 -120°

这种数值虽然只是示意,但表达了核心:

末端小变化,可能对应巨大的关节变化。

所以接近奇异点时经常出现:

关节速度暴涨 抖动 数值不稳定 控制指令尖峰

9. 用“方向放大器”理解

Jacobian 可以看成:

关节运动 ↓ 末端运动

反过来做 IK:

末端希望运动 ↓ Jacobian伪逆 ↓ 关节运动

在奇异附近,某些方向上的转换比例变得非常差。

就像:

你想让末端移动一点点 ↓ 算法需要把关节变化放大很多倍

所以伪逆像一个突然把噪声放大的放大器。


10. 这和你的动捕重定向特别相关

人体动作里很容易出现:

手臂伸直 腿伸直 膝盖接近锁死

例如人体做:

右臂水平完全伸直

机器人模仿后也靠近奇异姿态。

这时动捕数据本身可能只有一点点噪声:

目标手位置抖 2 mm

普通伪逆 IK 却可能变成:

肩膀大幅调整 肘关节快速抖动

于是你看到:

人的手明明很稳定,机器人的肘却一直抖。

这不一定是动捕问题。

也可能是:

IK接近奇异位形。


11. 人形机器人还有很多奇异姿态

不只是手臂伸直。

例如腿:

Hip ─ Knee ─ Ankle

膝盖完全打直时,也可能接近奇异。

所以实际人形机器人控制里通常不喜欢:

膝关节完全0°

而会保持一点屈膝:

slightly bent knee

除了机械、安全等原因外,运动学可控性也是一个因素。


12. 机械臂常见奇异

比如经典 6 轴机械臂可能有:

肩部奇异 肘部奇异 腕部奇异

腕部奇异很典型:

如果两个旋转轴重合,

原来两个关节能控制两个独立方向 ↓ 现在两个轴重合 ↓ 丢失一个旋转自由度

本质还是同一个问题:

独立运动方向减少。


13. 怎么判断接近奇异?

有很多方法。

以后工程里常见的有:

det(J)

但这个只适合某些方阵情况。

更常用、也更一般的是:

SVD

也就是:

Singular Value Decomposition

奇异值分解

这就是为什么你的数学路线里一定有 SVD。


14. SVD 先只理解一个作用

SVD 可以告诉我们:

Jacobian 在不同运动方向上的“能力有多强”。

它会给出一些:

σ1, σ2, σ3 ...

叫:

奇异值。

正常情况:

σ都不太小

说明各个方向都有一定运动能力。

接近奇异时:

某个 σ → 0

说明:

某一个运动方向几乎失去能力了。

所以:

最小奇异值很小

通常就是危险信号。


15. 一个非常形象的理解

把机器人末端瞬时可运动范围想成一个圆。

正常姿态:

**** ** ** * * * * ** ** ****

大致各方向都能动。

接近奇异时,圆会被压扁:

----------------

某个方向几乎没有能力。

这个东西以后叫:

Manipulability Ellipsoid
可操作度椭球

你之后做人形机器人运动学时也会遇到。


16. 所以奇异位形为什么重要?

因为它会直接影响:

IK稳定性 关节速度 轨迹平滑 控制性能 数值计算

所以你的项目不能只测:

末端误差

还应该看:

最大关节速度 最大关节加速度 jerk 奇异附近是否抖动 求解稳定性

这会让你的项目质量明显提升。


17. 怎么解决?

不能说完全“消灭”奇异位形。

因为它来自机器人几何结构。

我们能做的是:

避免 + 检测 + 稳定处理

比如:

① 规划时尽量远离奇异点 ② 限制关节速度 ③ 用更好的IK方法 ④ 加阻尼

第四个就是我们下一课要学的:

Damped Least Squares

阻尼最小二乘。


18. DLS 的直觉先提前讲

普通伪逆的态度是:

“末端误差必须尽可能消掉!”

接近奇异时,就可能为了追 1mm 误差让关节疯狂运动。

DLS会说:

“不用这么激进。末端误差可以稍微留一点,但关节不要乱跑。”

所以它同时考虑:

末端误差要小 + 关节变化不要太大

这就是为什么叫:

阻尼。

它给 IK 加了一个“刹车”。


19. 举个非常直观的对比

普通伪逆:

目标手误差:1 cm 算出来: 肩 +50° 肘 -100°

DLS可能说:

这太离谱了。 我宁愿这一次只修正: 0.7 cm 剩下: 0.3 cm 下一轮继续修。

换来的好处:

关节稳定 数值稳定 抖动减少

这就是实际工程中很重要的权衡。


20. 到现在把链条串起来

你已经学到:

FK ↓ 根据q算末端 Jacobian ↓ 关节小变化 → 末端小变化 伪逆IK ↓ 末端目标变化 → 关节变化 奇异位形 ↓ 为什么伪逆会突然不稳定 下一步: DLS ↓ 怎么让IK在奇异附近稳定

21. 今天只记住四句话

第一:

奇异位形 = 机器人在某个姿势下失去某些瞬时运动方向。

第二:

数学上表现为 Jacobian 降秩或接近降秩。

第三:

接近奇异点时,普通伪逆可能把很小的末端误差放大成很大的关节运动。

第四:

DLS 的目的,就是牺牲一点点末端精度,换取更好的数值和关节运动稳定性。


下一课就是非常关键的:

第183课:阻尼最小二乘 DLS IK 到底在干什么?

这一课我们会真正看懂:

[
\Delta q

J^T(JJ^T+\lambda^2 I)^{-1}e
]

但我不会让你死背。

我们会先搞明白:

为什么多了一个 λ? λ小时会怎样? λ大时会怎样? 为什么它能压住奇异点附近的关节爆炸?

学完这一课,你就已经进入“能独立解释一个实用数值IK算法”的阶段。

好,后面我会收紧一点,保留核心逻辑和必要公式。

第183课:阻尼最小二乘 DLS IK

普通伪逆 IK:

[
\Delta q = J^+ e
]

其中:

  • (e):末端误差

  • (J):Jacobian

  • (\Delta q):关节需要调整多少

问题是:接近奇异位形时,(J^+) 可能把很小的末端误差放大成很大的关节变化。

所以引入 DLS:

[
\boxed{
\Delta q

J^T(JJ^T+\lambda^2 I)^{-1}e
}
]

你现在不需要推导,重点理解里面新增的:

[
\lambda
]

阻尼系数


1. λ 是干什么的?

可以把它理解成 IK 的“刹车”。

普通伪逆:

末端误差 ↓ 尽可能快速消除 ↓ 可能导致关节变化很大

DLS:

末端误差 ↓ 既想消除误差 又不希望关节变化太激烈 ↓ 得到更稳定的 Δq

所以它实际上是在权衡:

[
\text{末端精度}
\quad \leftrightarrow \quad
\text{关节稳定性}
]


2. λ 大小有什么影响?

λ 很小

DLS越来越接近普通伪逆:

跟踪精度高 收敛快 但奇异点附近容易不稳定

λ 较大

关节变化更小 更稳定 但收敛变慢 末端可能存在更大误差

所以不能无限增大 λ。

工程上要调。


3. DLS 为什么能处理奇异问题?

普通伪逆在奇异附近会遇到:

某些奇异值 σ → 0

相当于出现类似:

[
\frac{1}{\sigma}
]

于是:

σ很小 ↓ 1/σ非常大 ↓ Δq爆炸

DLS加入阻尼以后,大致变成:

[
\frac{\sigma}{\sigma^2+\lambda^2}
]

当:

[
\sigma \rightarrow 0
]

结果不会无限增大。

所以 DLS 相当于把奇异方向上的“增益”压住了。

这就是它最核心的作用。


4. 实际 IK 循环

以后你自己写 DLS IK,基本流程就是:

给定目标 Pose ↓ 当前 q ↓ FK(q) ↓ 计算末端误差 e ↓ 计算 Jacobian J ↓ DLS求 Δq ↓ 限制 Δq ↓ q = q + αΔq ↓ 检查是否收敛 ↓ 继续迭代

核心代码逻辑以后会类似:

dq = J.transpose() * (J * J.transpose() + lambda * lambda * I).inverse() * error; q += alpha * dq;

实际代码我们会用 Eigen 的线性方程求解方式,不会直接手写.inverse()


5. 为什么还要限制 Δq?

即使用了 DLS,也建议:

|Δq_i| ≤ 最大单步关节变化

比如:

每轮最多变化 0.05 rad

这是第二层保护。

未来你的 IK 会逐渐变成:

DLS + 步长 α + 最大迭代次数 + 误差阈值 + 关节变化限幅 + 关节位置限位

这就已经开始接近一个真正可用的求解器。


6. 对你的动作重定向有什么意义?

动捕过程中人体可能突然:

手臂接近伸直

普通伪逆可能:

人体目标只抖几毫米 ↓ 机器人肘关节明显抖动

DLS可以显著降低这种现象。

所以以后项目可以做一个很好的对比实验:

方法末端误差最大关节速度奇异附近稳定性
Jacobian Pseudoinverse较小可能很高较差
DLS IK略高或接近更低更好

这就是很有价值的项目证据。


7. 现在你已经掌握了 IK 的主干

FK ↓ Jacobian ↓ 伪逆IK ↓ 奇异位形 ↓ DLS IK

接下来还缺两个非常实际的问题:

关节不能超过机械限位

以及:

不止右手一个任务怎么办?

所以:

第184课:关节限位和多任务 IK

下一课我们重点讲:

  • 为什么单纯 DLS 仍可能把关节拧到极限

  • 怎么让 IK 主动远离关节限位

  • “右手跟踪 + 身体姿态 + 肘部自然姿势”怎么同时处理

学完这部分,运动学理论主体基本就快结束了。

好,后面我就按这个方式讲:少公式、重直觉、先把“为什么”讲明白。

第184课:关节限位和多任务 IK

DLS IK 解决了一个问题:

接近奇异位形时,别让关节突然乱飞。

但它还没有解决另外两个很现实的问题:

第一,关节不能无限转。
第二,机器人通常不只执行一个任务。

这两个问题一解决,IK才开始像“真正能用于机器人”的算法。


1. 什么叫关节限位?

以肘关节为例。

真实机器人不可能:

0° ↓ 90° ↓ 180° ↓ 270° ↓ 360°

一直转。

机械结构会规定:

最小角度 ≤ 当前关节角 ≤ 最大角度

比如:

肘关节: 0° ~ 150°

那么 IK 如果算出:

肘关节目标 = 170°

数学上它可能觉得没问题,

但真机上:

做不到。

所以机器人算法必须知道:

每个关节的合法范围

2. 为什么普通 IK 会撞限位?

假设机器人要把手伸到某个地方。

这个目标可能有很多种姿势都能完成。

例如:

姿势A: 肩膀多转一点 肘少转一点 姿势B: 肩膀少转一点 肘多转一点

普通 IK 可能只关心:

“手到目标了吗?”

它并不一定关心:

“肘是不是已经快撞到机械极限了?”

于是可能出现:

Hand Error = 很小

但是:

Elbow = 149°

而极限:

150°

从末端误差看:

很优秀。

从机器人控制看:

很危险。


3. 所以好的 IK 不应该只看“手”

我们希望它同时考虑:

任务1: 手到目标 任务2: 关节不要撞限位

这就是一个非常重要的思想:

机器人控制通常不是只有一个目标,而是多个目标同时存在。

这就是多任务控制的开始。


4. 最简单的关节限位方法

最粗暴的方法就是:

IK算出q ↓ 超过最大值? ↓ 截到最大值

比如:

计算结果 = 170° 最大允许 = 150° 最终命令 = 150°

这叫:

Clamp / Saturation,截断或饱和。

它能保护硬件。

但有个明显缺点:

它只是“撞墙以后把你拦住”。

而不是:

“提前知道前面有墙,主动绕开。”


5. 更好的思路:主动远离关节极限

例如某个关节范围:

-100° ~ +100°

那么最舒服的位置可能在:

如果现在:

q = 95°

已经非常靠近上限。

这时候即使:

继续往 + 方向运动

能稍微减少末端误差,

我们也不希望这么做。

而是希望 IK 倾向于:

把这个关节往中间拉回来

同时用其他关节补偿。

也就是说:

手继续跟目标 + 关节远离极限

这就是更成熟的 IK。


6. 为什么人形机器人特别需要这个?

因为人形机器人自由度很多。

比如一条手臂可能:

肩3自由度 肘1自由度 腕3自由度

如果只要求:

右手到某个位置

实际上很多关节组合都可以做到。

因此我们可以利用“多出来的自由度”做一些好事:

避免关节限位 保持自然姿势 避免奇异位形 减少关节运动

这就是:

冗余自由度的利用


7. 一个很直观的例子

你自己把手放到桌上某一点。

手的位置固定。

但你的肘可以:

抬高一点

也可以:

放低一点

甚至肩膀还能调整。

也就是说:

手的位置一样

但:

全身姿势不同

这就是为什么一个 IK 目标经常对应很多解。

所以真正的问题不是:

“有没有解?”

而是:

“这么多解里,我希望机器人选哪一种?”


8. 这就进入多任务 IK

比如我们希望机器人同时做三件事:

任务1: 右手跟人体右手 任务2: 左手也跟人体左手 任务3: 身体保持比较直立

甚至还有:

任务4: 肘关节保持自然 任务5: 关节远离限位

所以人形机器人实际面对的是:

右手 左手 头 躯干 骨盆 双脚 关节限位

很多任务一起存在。

这就是为什么以后会进入:

Multi-task IK ↓ QP ↓ WBC

9. 多任务有两种基本思想

先不用记复杂算法。

你只需要知道两种。

第一种:加权

比如:

右手任务:很重要 身体姿态:比较重要 肘部自然:没那么重要

可以理解成:

右手权重 = 100 身体权重 = 50 肘姿态权重 = 5

算法会尽量让重要任务先做好。

这叫:

Weighted Tasks,加权任务。


第二种:严格优先级

还有一种情况不是“权重不同”,而是:

有些事情绝对不能为了其他任务被破坏。

比如人形机器人:

第一优先级: 不要摔倒 第二优先级: 双脚别滑 第三优先级: 右手跟踪动作

那就不能出现:

为了让右手多靠近目标1厘米,机器人把支撑脚抬起来。

这种设计就更像:

任务1必须满足 ↓ 在不破坏任务1的前提下做任务2 ↓ 在不破坏前两个任务的前提下做任务3

这就是:

Task Priority,任务优先级。


10. 这和你未来的动作重定向有什么关系?

非常直接。

人体动捕可能告诉机器人:

右手应该在这里 左手应该在那里 头应该这样转 身体应该这样倾斜

但机器人自己的身体结构和人体不一样。

比如人体可以做某个动作:

手再往前10cm

机器人可能已经:

肩膀快到极限

那么控制器不能简单地:

“人体怎么动,我就一模一样复制。”

而应该:

尽可能保持动作相似 + 满足机器人自己的关节限制 + 保持动作平滑 + 保证稳定

这才叫真正的:

Motion Retargeting

而不是简单的关节角复制。


11. “重定向误差”也开始出现了

以后你的项目不能只说:

机器人成功模仿了人体动作。

要能量化:

右手位置误差 左手位置误差 手部姿态误差 关节是否超限 关节速度是否平滑 jerk大小

例如:

人体目标手位置 ↓ 机器人实际手位置 ↓ 两者距离 ↓ 末端位置误差

这样才能判断:

你的重定向算法到底好不好。


12. 为什么这一步会自然走向 QP?

现在问题越来越像:

我要: 右手跟踪好 左手跟踪好 身体姿态别太偏 同时: 关节不能超限 速度不能太大

你会发现已经不是一个简单:

IK公式

就能优雅解决的问题了。

这时候 QP 就非常适合。

因为 QP 很擅长处理:

“我有很多目标,同时还有很多不能违反的约束。”

例如:

目标: 尽量减少手的位置误差 约束: q不能超过关节限位 q̇不能超过速度限制

这就是以后:

QP IK

甚至:

Whole Body Control

的基础。


13. 所以从 DLS 到 QP 其实很自然

可以理解成:

最简单 IK

只关心: 手到目标

DLS IK

手到目标 + 别在奇异点发疯

带关节限位 IK

手到目标 + 别发疯 + 别撞关节限位

多任务 IK

右手 + 左手 + 身体 + 关节姿态

QP

很多目标 + 很多明确约束

WBC

整个机器人一起控制 + 接触 + 平衡 + 力矩

现在路线就应该越来越清楚了。


14. 你目前运动学这块已经学到哪里?

现在你已经理解了:

Frame ↓ 坐标变换 ↓ 旋转 ↓ 齐次变换 ↓ FK ↓ Jacobian ↓ 数值IK ↓ 伪逆 ↓ 奇异位形 ↓ DLS ↓ 关节限位 ↓ 多任务IK

运动学理论主干已经基本走完。

接下来我不建议继续堆概念。

应该开始往实际工具走。


下一课:第185课——Pinocchio 到底是什么,为什么要用它?

我们会开始把前面这些东西对应到真正的软件:

URDF ↓ Pinocchio ↓ Robot Model ↓ q ↓ FK ↓ Hand Pose ↓ Jacobian ↓ DLS IK

我会重点告诉你:

  • Pinocchio 帮你做什么

  • 哪些东西你还应该自己实现

  • modeldataqframe分别是什么

  • 为什么它特别适合人形机器人

  • 它和 MuJoCo 到底是什么关系

这一步开始,我们就从“学概念”正式进入“以后要写项目”的阶段。

继续。

第185课:Pinocchio 到底是什么?

你可以先把 Pinocchio 理解成:

一个专门帮你做机器人运动学和动力学计算的库。

它不是仿真器,也不是控制器。

它更像是:

URDF机器人模型 ↓ Pinocchio ↓ 帮你计算 FK Jacobian 质量矩阵 重力项 RNEA CRBA ABA ...

1. 它和 MuJoCo 有什么区别?

这个一定要分清。

Pinocchio

主要负责:

“算”

例如:

给我机器人关节角 q ↓ 手在哪里? 给我 q ↓ Jacobian是多少? 给我 q、q̇、q̈ ↓ 需要多少力矩?

它是一个:

机器人数学计算库。

MuJoCo

主要负责:

“模拟真实机器人动起来”

例如:

我给电机100 Nm ↓ 机器人会怎么动? 脚踩地面 ↓ 地面产生什么接触力? 机器人失去平衡 ↓ 会不会摔?

所以最简单地区分:

Pinocchio = 算法模型 MuJoCo = 物理世界仿真

以后它们经常一起用。


2. 为什么不能只用 MuJoCo?

MuJoCo当然也能得到很多机器人状态。

但你以后自己写算法时,会经常需要:

Jacobian 质量矩阵 非线性项 质心 动力学相关量

Pinocchio特别擅长快速计算这些。

所以未来控制器可能长这样:

MuJoCo ↓ 读取 q、q̇ ↓ Pinocchio ↓ 计算 FK / J / M / g ↓ 你的 IK / QP / WBC ↓ 得到控制命令 ↓ MuJoCo

这就是我们最终项目非常重要的一条数据链。


3. Pinocchio怎么知道机器人长什么样?

靠:

URDF

比如机器人模型里面会描述:

pelvis torso upper_arm forearm hand thigh calf foot

以及:

哪个link和哪个link连接 关节转轴是什么 关节限位多少 link长度多少 质量多少 惯量多少

流程就是:

robot.urdf ↓ Pinocchio读取 ↓ 建立机器人模型

4. Pinocchio里你最常见的四个东西

目前先认识:

model data q frame

model

可以理解成:

机器人“说明书”。

里面描述:

有多少关节 关节怎么连接 link结构 质量 惯量 关节限制

它通常不会随着机器人运动不断改变。

比如:

G1还是这个G1

机器人举手以后,结构并没有换掉。

所以:

model = 机器人固定模型

q

这个我们已经认识了。

q = 当前机器人位形

里面包含机器人当前:

肩关节角 肘关节角 膝关节角 髋关节角 ...

对于人形浮动基机器人,还会比普通机械臂更复杂,我们后面讲。


data

你可以暂时把它理解成:

Pinocchio做计算时使用和保存中间结果的地方。

比如刚刚做完 FK:

q ↓ forwardKinematics ↓ 各种link/frame当前的位置

这些计算结果很多会存在:

data

里。

所以小白阶段可以先记:

model = 机器人是什么 q = 机器人现在什么姿势 data = 计算过程中产生的结果

frame

比如:

right_hand left_hand left_foot right_foot head

你经常不会关心某个 link 的所有信息,

而会问:

右手 Frame 当前在哪里?

所以流程经常是:

q ↓ Pinocchio做FK ↓ 更新Frame ↓ 读取 right_hand frame

然后得到:

右手 Position + 右手 Orientation

5. 用 Pinocchio 做 FK 是什么感觉?

概念上非常简单:

加载URDF ↓ 得到model ↓ 创建data ↓ 准备q ↓ 执行FK ↓ 读取right_hand的Pose

这和我们前面手算:

q1 q2 ↓ 一段一段坐标变换 ↓ Hand

完全是同一件事。

只是现在:

Pinocchio帮你处理几十个关节。


6. 为什么还要学自己推 FK?

你可能会问:

Pinocchio都能算,那我之前为什么还要学FK?

因为如果你只会:

forwardKinematics(...)

但不知道它做什么,

面试官问:

“FK底层原理是什么?”

你只能回答:

“调用Pinocchio。”

这不叫掌握算法。

我们希望你达到:

简单2R/3R → 我自己能推、能写 真实人形机器人 → 用Pinocchio高效计算

这才是正确组合。


7. Jacobian也是一样

简单机械臂:

自己理解Jacobian怎么来的

真实机器人:

Pinocchio计算Jacobian

然后你自己实现:

Jacobian ↓ DLS ↓ Δq ↓ 更新q

所以我们不是让 Pinocchio 帮你“把 IK 全写完”。

我们要让它负责:

机器人模型相关计算

而你负责:

IK算法逻辑

这样最适合你的学习目标。


8. 未来我们会这样分工

Pinocchio: FK Jacobian 动力学模型 Eigen: 矩阵和向量运算 你自己的C++代码: DLS IK 关节限位 误差计算 迭代逻辑 QP控制器 MuJoCo: 物理仿真 ROS2: 把各个模块连接起来

这张关系图很重要:

URDF ↓ Pinocchio ↓ FK / J / Dynamics ↓ Human → Retargeting → IK/QP ↓ Command ↓ MuJoCo ↓ State └──────→ 再计算

9. 为什么 Pinocchio 特别适合你后面的人形机器人?

因为人形机器人不是一个简单机械臂。

它是:

多关节 + 树结构 + 浮动基 + 多接触 + 全身动力学

如果全部自己从零写:

FK Jacobian 质量矩阵 RNEA CRBA ABA

工作量非常大,而且容易出错。

所以真正工程开发会:

理解算法原理,但使用成熟库实现机器人模型计算。

Pinocchio正适合干这个。


10. 你目前只需要记住

URDF ↓ Pinocchio读取机器人结构 ↓ model ↓ 输入当前q ↓ 计算 ├─ FK ├─ Jacobian ├─ CoM └─ Dynamics

以及:

Pinocchio负责“算机器人模型”,MuJoCo负责“模拟机器人真的动起来”。

这两个一定不要混。


下一课:第186课——URDF进入Pinocchio后,到底变成了什么?

下一课我们会把:

URDF link joint frame model data q

全部串起来。

然后再下一步就开始进入真正的:

Pinocchio FK ↓ Pinocchio Jacobian ↓ Eigen DLS IK

也就是说,离我们的第一个运动学小项目已经很近了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询