从这里开始,我们正式进入:
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̇读作:
q dot
表示:
关节速度。
例如:
q̇ = [10°/s 20°/s]意思是:
肩膀每秒转10° 肘每秒转20°以后还会有:
q̈表示:
关节加速度。
所以先记:
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手离肘比较近,扫过的弧会小一点,所以同样:
1°不同关节造成的末端位移可能完全不同,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°那么最舒服的位置可能在:
0°如果现在:
q = 95°已经非常靠近上限。
这时候即使:
继续往 + 方向运动能稍微减少末端误差,
我们也不希望这么做。
而是希望 IK 倾向于:
把这个关节往中间拉回来同时用其他关节补偿。
也就是说:
手继续跟目标 + 关节远离极限这就是更成熟的 IK。
6. 为什么人形机器人特别需要这个?
因为人形机器人自由度很多。
比如一条手臂可能:
肩3自由度 肘1自由度 腕3自由度如果只要求:
右手到某个位置实际上很多关节组合都可以做到。
因此我们可以利用“多出来的自由度”做一些好事:
避免关节限位 保持自然姿势 避免奇异位形 减少关节运动这就是:
冗余自由度的利用
7. 一个很直观的例子
你自己把手放到桌上某一点。
手的位置固定。
但你的肘可以:
抬高一点也可以:
放低一点甚至肩膀还能调整。
也就是说:
手的位置一样但:
全身姿势不同这就是为什么一个 IK 目标经常对应很多解。
所以真正的问题不是:
“有没有解?”
而是:
“这么多解里,我希望机器人选哪一种?”
8. 这就进入多任务 IK
比如我们希望机器人同时做三件事:
任务1: 右手跟人体右手 任务2: 左手也跟人体左手 任务3: 身体保持比较直立甚至还有:
任务4: 肘关节保持自然 任务5: 关节远离限位所以人形机器人实际面对的是:
右手 左手 头 躯干 骨盆 双脚 关节限位很多任务一起存在。
这就是为什么以后会进入:
Multi-task IK ↓ QP ↓ WBC9. 多任务有两种基本思想
先不用记复杂算法。
你只需要知道两种。
第一种:加权
比如:
右手任务:很重要 身体姿态:比较重要 肘部自然:没那么重要可以理解成:
右手权重 = 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 帮你做什么
哪些东西你还应该自己实现
model、data、q、frame分别是什么为什么它特别适合人形机器人
它和 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 framemodel
可以理解成:
机器人“说明书”。
里面描述:
有多少关节 关节怎么连接 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 + 右手 Orientation5. 用 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也就是说,离我们的第一个运动学小项目已经很近了。