第4章:轨迹规划入门:关节空间 vs 笛卡尔空间规划、梯形速度规划、S形速度规划
大家好,欢迎来到轨迹规划这一章。
说实话,轨迹规划这块内容,是我在做人形机器人项目时,踩坑最多的地方之一。你想想看,一个1米7的大个子,如果轨迹规划没做好,走起路来就像喝醉了酒,那画面……嗯,我经历过。
今天咱们就把这块硬骨头啃下来。我会把关节空间和笛卡尔空间的区别讲透,再把梯形和S形速度规划掰开揉碎了说清楚。
4.1 关节空间 vs 笛卡尔空间:两条完全不同的路
先问大家一个问题:你希望机器人末端走直线,还是关节转得顺?
这两个目标,其实对应了两种不同的规划思路。
4.1.1 关节空间规划
说白了,就是只关心每个关节的角度变化。从起始角度到目标角度,我不管末端走什么曲线,我只管关节自己转得舒服。
优点很明显:
- 计算量小,实时性好
- 不会遇到奇异点问题
- 关节运动平滑
缺点也致命:
- 末端轨迹不可控,可能走出一条奇怪的弧线
- 在狭窄空间里容易撞到东西
我的经验: 在做人形机器人抓取桌面物体时,如果周围没有障碍物,我习惯用关节空间规划。省事,而且计算快。但如果是穿过一个窗户或者架子,那就必须用笛卡尔空间了。
4.1.2 笛卡尔空间规划
这个就反过来了。我不管你关节怎么转,我只要末端走直线、走圆弧,或者走任何我指定的路径。
优点:
- 末端轨迹精确可控
- 适合避障和精密操作
缺点:
- 计算量大,需要实时逆解
- 可能遇到奇异点,导致关节速度突变
注意: 我曾经在一个项目中,用笛卡尔空间规划让机器人画圆。结果在某个位置,关节突然猛转了一下——因为遇到了奇异点。从那以后,我每次做笛卡尔规划都会先检查奇异点。
4.2 梯形速度规划:简单但够用
好,现在咱们聊聊速度怎么规划。梯形速度规划,是我用得最多的入门级方案。
它的形状就像个梯形:加速段、匀速段、减速段。
// 梯形速度规划核心参数
float v_max = 0.5; // 最大速度 (m/s)
float a_max = 0.2; // 最大加速度 (m/s²)
float total_dist = 1.0; // 总位移 (m)
// 计算加速段距离
float acc_dist = v_max * v_max / (2 * a_max);
// 如果总距离不够加速和减速,就变成三角形速度曲线
if (2 * acc_dist > total_dist) {
// 三角形规划:没有匀速段
float v_peak = sqrt(a_max * total_dist);
// ... 后续计算
} else {
// 梯形规划:有匀速段
float const_dist = total_dist - 2 * acc_dist;
float const_time = const_dist / v_max;
// ... 后续计算
}
你看,代码其实很简单。但要注意一个坑:如果总位移太小,梯形会退化成三角形。我刚开始做的时候没注意这个,结果机器人抖得跟筛子似的。
小技巧: 在实际项目中,我通常会在梯形规划的基础上,加一个起始和结束的平滑过渡。比如起始加速度从0开始慢慢增加,而不是直接跳到最大加速度。这样能减少机械冲击。
4.3 S形速度规划:更顺滑,但更复杂
梯形规划有个问题:加速度突变。你想想看,从加速段切换到匀速段的那一刻,加速度从a_max直接变成0。这会导致什么?
对,冲击力。人形机器人身上有那么多精密传感器,这种冲击会直接影响IMU的数据质量。
S形速度规划就是来解决这个问题的。它把加速度也做了平滑处理,变成了加加速度(Jerk)可控。
// S形速度规划七段式参数
float v_max = 0.5; // 最大速度
float a_max = 0.2; // 最大加速度
float j_max = 0.5; // 最大加加速度 (m/s³)
// 七段式:加加速、匀加速、减加速、匀速、加减速、匀减速、减减速
// 计算各段时间
float t_j = a_max / j_max; // 加加速度段时间
float t_a = v_max / a_max; // 加速段时间
// ... 实际计算要复杂得多,这里只展示核心思路
说实话,S形规划的数学推导比梯形复杂不少。但效果是真的好。我在做双足步行的时候,必须用S形规划,否则机器人走两步就开始晃。
对比总结:
| 特性 | 梯形速度规划 | S形速度规划 |
|---|---|---|
| 计算复杂度 | 低 | 中高 |
| 加速度连续性 | 不连续 | 连续 |
| 机械冲击 | 有 | 小 |
| 适用场景 | 简单搬运、快速移动 | 精密操作、人形机器人 |
4.4 核心知识体系:一张图看懂
下面这张图,是我自己梳理的轨迹规划知识体系。你看完应该能对整体有个把握。
4.5 实际项目中的选择策略
说了这么多理论,咱们聊聊实际怎么选。
- 如果只是做简单的点到点运动,比如机器人从A点走到B点,中间没有障碍物——我建议用关节空间+梯形规划。省事,够用。
- 如果需要末端走特定路径,比如焊接、涂胶、画图——必须用笛卡尔空间。速度规划看精度要求,一般S形更稳。
- 做人形机器人步行——我个人的血泪教训:一定要用笛卡尔空间+S形规划。因为人形机器人的质心高度变化很敏感,梯形规划的冲击会让ZMP(零力矩点)剧烈波动,走着走着就倒了。
避坑指南: 我曾经在一个项目中,为了省计算资源,在笛卡尔空间里用了梯形规划。结果机器人末端在拐角处抖了一下,把旁边的一个精密零件碰掉了。从那以后,凡是笛卡尔空间,我必用S形规划。
好了,这一章的内容就到这里。轨迹规划是运动控制的灵魂,关节空间和笛卡尔空间的选择,梯形和S形的取舍,都需要你在实际项目中慢慢体会。
最后说一句: 别怕代码复杂。S形规划的七段式推导确实绕,但你只要把核心公式记住,剩下的就是调参。调参这件事,说白了就是试——我一般先给一个保守的加速度和加加速度,然后慢慢往上加,直到出现抖动再退回来一点。
可可精品资料库