3、轨迹规划入门:关节空间与笛卡尔空间轨迹规划,梯形速度与S型速度曲线
各位同学,今天我们来聊聊轨迹规划。
说实话,刚入行那会儿,我觉得轨迹规划不就是让机器人从A点走到B点嘛,有什么难的?直到我第一次在现场调试,机器人“哐”的一声撞上了夹具边缘……嗯,从那以后,我再也不敢小看这个环节了。
轨迹规划,说白了就是回答三个问题:走哪条路?走多快?怎么停?今天我们就从这两个空间和两种速度曲线入手,把基础打牢。
3.1 关节空间 vs 笛卡尔空间:两条完全不同的路
先问大家一个问题:你让机器人末端画一条直线,它真的会走直线吗?
答案是不一定。这取决于你在哪个空间做规划。
3.1.1 关节空间轨迹规划
关节空间规划,就是直接控制每个关节的角度变化。比如从关节角q1变到q2,我只需要让每个电机平滑地转过去就行。
优点很明显:
- 计算量小,实时性好
- 不会遇到奇异点问题
- 关节运动自然、平滑
缺点呢?
- 末端轨迹不可控——你以为走直线,实际走的是一条弧线
- 容易撞到周围障碍物
3.1.2 笛卡尔空间轨迹规划
笛卡尔空间规划,就是直接控制末端在三维空间中的位置和姿态。比如让焊枪沿着焊缝走一条直线,或者让涂胶头画一个圆弧。
优点:
- 末端路径精确可控
- 适合焊接、切割、涂胶等工艺
缺点:
- 计算量大,需要实时逆解
- 可能遇到奇异点——关节突然“抽风”
- 关节速度可能超限
3.2 梯形速度曲线:简单粗暴,但够用
梯形速度曲线,也叫T型曲线。它的速度变化分三段:加速→匀速→减速。形状像个梯形,所以得名。
为什么用梯形?因为电机不能瞬间从0跳到最大速度,需要时间加速。同样,也不能瞬间刹停,需要减速缓冲。
来看一个典型的梯形速度曲线参数:
| 参数 | 符号 | 说明 |
|---|---|---|
| 最大速度 | v_max | 电机允许的最高转速 |
| 加速度 | a | 加速阶段的加速度 |
| 减速度 | d | 减速阶段的减速度 |
| 总位移 | s | 从起点到终点的距离 |
梯形曲线的核心公式很简单:
// 加速段位移
s_acc = 0.5 * v_max² / a
// 减速段位移
s_dec = 0.5 * v_max² / d
// 匀速段位移
s_const = s - s_acc - s_dec
// 总时间
t_total = v_max/a + s_const/v_max + v_max/d
梯形曲线最大的问题是什么?加速度突变。在加速结束的瞬间,加速度从a突然变成0,会产生冲击力。对于重载机器人,这种冲击可能导致抖动甚至损坏工件。
3.3 S型速度曲线:丝般顺滑
S型曲线就是为了解决梯形曲线的“硬伤”而生的。它增加了加加速度(Jerk)的概念,让加速度也平滑变化。
S型曲线分七段:
- 加加速段(Jerk为正,加速度增加)
- 匀加速段(加速度恒定)
- 减加速段(Jerk为负,加速度减小到0)
- 匀速段(速度恒定)
- 加减速段(Jerk为负,加速度反向增加)
- 匀减速段(减速度恒定)
- 减减速段(Jerk为正,减速度减小到0)
你想想看,七段规划听起来复杂,但实际效果确实好。我在做精密装配项目时,必须用S型曲线——梯形曲线那一下冲击,会把精密零件震歪。
S型曲线的参数更多:
| 参数 | 符号 | 说明 |
|---|---|---|
| 最大速度 | v_max | 同梯形曲线 |
| 最大加速度 | a_max | 加速度的峰值 |
| 最大加加速度 | j_max | Jerk的峰值,控制平滑度 |
| 总位移 | s | 同梯形曲线 |
代码实现比梯形复杂不少,这里给一个核心片段:
// S型曲线位置计算(简化版)
double s_curve_position(double t, double s, double v_max, double a_max, double j_max) {
// 计算各阶段时间
double t_a = a_max / j_max; // 加加速时间
double t_v = v_max / a_max; // 匀加速时间(理想情况)
// ... 实际需要根据位移调整
// 分段计算位置
if (t < t_a) {
// 加加速段:s = 1/6 * j * t³
return 1.0/6.0 * j_max * t * t * t;
} else if (t < t_a + t_v) {
// 匀加速段
// ...
}
// ... 其他段类似
}
3.4 两种空间 × 两种曲线 = 四种组合
实际项目中,我们经常需要组合使用:
- 关节空间 + 梯形曲线:最常用,适合大多数搬运、码垛
- 关节空间 + S型曲线:重载机器人,减少冲击
- 笛卡尔空间 + 梯形曲线:简单直线路径,如涂胶
- 笛卡尔空间 + S型曲线:精密焊接、装配,路径和速度都要求高
下面这张图展示了本章的知识体系,帮你理清思路:
3.5 选型建议:到底用哪个?
很多新手会纠结这个问题。我的建议很简单:
- 先看路径要求:末端路径必须精确吗?是→笛卡尔空间;否→关节空间
- 再看负载和精度:负载重或精度高?是→S型曲线;否→梯形曲线
- 最后看控制器算力:算力够吗?不够就降级用梯形
好了,轨迹规划的基础就讲到这里。下一节我们会深入代码实现,手把手教你写一个完整的梯形曲线规划器。到时候见!