2、速度规划配置:加速度、减速度、急动度(Jerk)参数配置与约束

速度规划,说白了就是告诉机器人「怎么走」。但光有位置和速度还不够,你得告诉它怎么加速、怎么减速、拐弯时抖不抖。这些参数配置好了,轨迹就顺滑;配不好,机器人在那原地哆嗦,看着都心疼。

我个人习惯把这三个参数称为「速度规划三兄弟」:加速度、减速度、急动度。今天咱们就把它们掰开揉碎了讲清楚。

2.1 加速度与减速度:最基础的约束

加速度决定了机器人从静止到全速需要多久。减速度则相反,决定了它能不能稳稳停下来。

你想想看,如果加速度设得太大,电机电流瞬间飙升,轻则过载报警,重则烧驱动器。设得太小呢?机器人慢得像蜗牛,产线节拍根本跟不上。

核心原则:加速度和减速度通常不相等。减速度一般比加速度大 20%~50%,因为紧急停止的场景比启动更常见。

我在项目中遇到过一台六轴机器人,每次启动都正常,但一停下来就剧烈抖动。查了半天,发现是减速度设得跟加速度一样,但负载变化导致制动距离不够。后来把减速度调到加速度的 1.3 倍,问题就解决了。

参数 典型范围(工业机器人) 影响
加速度 0.5 ~ 5 m/s² 启动时间、电机峰值电流
减速度 0.8 ~ 8 m/s² 停止距离、末端抖动

注意:加速度和减速度的单位取决于你的运动学模型。如果是关节空间,单位是 rad/s²;如果是笛卡尔空间,单位是 m/s²。混用会导致灾难性后果——我曾经见过有人把关节加速度当笛卡尔加速度用,结果机器人直接飞出去了。

2.2 急动度(Jerk):被忽视的关键参数

急动度,英文叫 Jerk,是加速度的变化率。单位是 m/s³ 或 rad/s³。

很多人只配加速度和减速度,觉得够了。但实际跑起来,轨迹在加减速切换点会出现「加速度突变」。这个突变会产生冲击力,导致机器人抖动、末端精度下降,甚至缩短减速机寿命。

说白了,急动度就是给加速度加一个「平滑过渡」。没有它,加速度曲线是方波;有了它,加速度曲线变成梯形或 S 形。

我的经验:急动度一般设为加速度的 5~10 倍。比如加速度是 2 m/s²,急动度就设 10~20 m/s³。太小了平滑效果不明显,太大了又失去意义。

2.3 参数配置的约束关系

这三个参数不是独立的,它们之间存在硬约束。我整理了一张图,帮你理清关系:

速度规划三参数约束关系 加速度 a 单位:m/s² 减速度 d 单位:m/s² 急动度 j 单位:m/s³ 约束 1:d ≥ a(减速度 ≥ 加速度) 推荐 d = (1.2 ~ 1.5) × a 约束 2:j ≥ 5 × max(a, d)(急动度 ≥ 最大加速度/减速度的 5 倍) 推荐 j = (5 ~ 10) × max(a, d) 急动度太小(j 过小) 平滑效果不明显 轨迹仍有冲击感 急动度太大(j 过大) 失去平滑意义 加速度近似阶跃

2.4 实际配置步骤

好了,理论讲完了,咱们直接上实操。我一般按以下步骤来配:

  1. 先定最大速度——根据工艺要求和电机额定转速确定。
  2. 再定加速度和减速度——减速度比加速度大 20%~50%。
  3. 最后配急动度——设为加速度的 5~10 倍。
  4. 跑一次空载测试——观察轨迹是否平滑,末端有无抖动。
  5. 微调——如果有抖动,优先增大急动度;如果启动太慢,适当增大加速度。

避坑指南:我曾经在调试一个码垛机器人时,急动度设得太小,结果每次加减速切换时,末端抓手都会把箱子甩出去。后来把急动度从 8 m/s³ 调到 25 m/s³,问题立刻消失。嗯,有时候参数差一点点,效果天差地别。

2.5 代码示例:梯形速度规划

下面是一个简单的梯形速度规划实现,包含了加速度、减速度和急动度的约束检查:

def trapezoidal_velocity_planning(
    max_vel: float,
    accel: float,
    decel: float,
    jerk: float,
    distance: float
) -> dict:
    """
    梯形速度规划,带参数约束检查
    
    参数:
        max_vel: 最大速度 (m/s)
        accel:   加速度 (m/s²)
        decel:   减速度 (m/s²)
        jerk:    急动度 (m/s³)
        distance: 总位移 (m)
    
    返回:
        规划结果字典
    """
    # 约束检查
    if decel < accel:
        raise ValueError(f"减速度({decel})必须 ≥ 加速度({accel})")
    
    if jerk < 5 * max(accel, decel):
        raise ValueError(f"急动度({jerk})必须 ≥ 5 × max(accel, decel) = {5 * max(accel, decel)}")
    
    # 计算加速段和减速段所需距离
    accel_distance = 0.5 * max_vel * max_vel / accel
    decel_distance = 0.5 * max_vel * max_vel / decel
    
    # 判断是否能达到最大速度
    if accel_distance + decel_distance <= distance:
        # 有匀速段
        cruise_distance = distance - accel_distance - decel_distance
        cruise_time = cruise_distance / max_vel
        accel_time = max_vel / accel
        decel_time = max_vel / decel
        total_time = accel_time + cruise_time + decel_time
        profile_type = "梯形(有匀速段)"
    else:
        # 无匀速段,三角形规划
        # 需要重新计算实际能达到的最大速度
        actual_vel = (2 * accel * decel * distance / (accel + decel)) ** 0.5
        accel_time = actual_vel / accel
        decel_time = actual_vel / decel
        total_time = accel_time + decel_time
        profile_type = "三角形(无匀速段)"
    
    return {
        "profile_type": profile_type,
        "total_time": total_time,
        "accel_time": accel_time,
        "decel_time": decel_time,
        "max_vel_actual": max_vel if accel_distance + decel_distance <= distance else actual_vel
    }

# 使用示例
result = trapezoidal_velocity_planning(
    max_vel=2.0,
    accel=1.5,
    decel=2.0,
    jerk=12.0,
    distance=5.0
)
print(result)

重要提醒:上面的代码只是演示约束检查逻辑。实际工程中,急动度约束需要体现在加速度曲线的平滑处理上,而不是简单做个 if 判断。真正的 S 形速度规划会用到三次或五次多项式插值,这个我们后面章节会详细讲。

2.6 参数配置的常见误区

  • 误区一:加速度越大越好——大加速度意味着大电流、大冲击,对机械结构是摧残。
  • 误区二:减速度等于加速度——紧急停止时往往需要更大的减速度。
  • 误区三:急动度可有可无——没有急动度约束,轨迹在加减速切换点会有加速度跳变,抖动随之而来。
  • 误区四:参数一次配好不再改——不同负载、不同轨迹段可能需要不同的参数配置。

嗯,到这里,速度规划的三个核心参数就讲完了。记住:加速度管启动、减速度管停止、急动度管平滑。三者配合好了,你的机器人跑起来就像丝绸一样顺滑。