2. 运动学与动力学约束:速度、加速度、加加速度(Jerk)限制,驱动力矩约束

各位同学,咱们今天聊点实在的。上一章我们讲了轨迹规划的目标——时间最优。但光有目标不行,你得知道机器人到底能跑多快、多猛。说白了,就是给机器人套上“紧箍咒”。这些“紧箍咒”,就是运动学和动力学约束。

我个人习惯,在设计轨迹之前,先把约束条件列清楚。就像开车,你知道了目的地,还得知道路况、限速、发动机扭矩,才能规划出一条又快又安全的路线。机器人也一样。

2.1 运动学约束:速度、加速度、加加速度

运动学约束,说白了就是机器人“能不能动”以及“动得多快”的物理限制。它不涉及力,只关心位置、速度、加速度这些几何量。

2.1.1 速度限制

每个关节电机都有额定转速。你让电机转太快,轻则丢步,重则烧坏。我在项目中遇到过,一个六轴机器人,第六关节(手腕)转速上限是 180°/s。有一次调试,我为了赶节拍,把速度设到了 200°/s,结果运行了半小时,电机直接过热报警。

所以,速度限制是硬约束。通常表示为:

|q̇_i(t)| ≤ v_max_i

其中 q̇_i 是第 i 个关节的速度,v_max_i 是它的上限。注意,不同关节的限速可能不同,手腕关节通常比基座关节慢。

2.1.2 加速度限制

加速度限制,其实是限制“力的变化率”。加速度太大,意味着惯性力大,机器人结构会承受冲击。更重要的是,加速度突变会导致轨迹不平滑,影响加工精度。

我记得有一次做焊接轨迹,加速度限制设得太松,结果焊枪在拐角处剧烈抖动,焊缝质量一塌糊涂。后来我把加速度上限砍了一半,问题就解决了。

加速度约束:

|q̈_i(t)| ≤ a_max_i

2.1.3 加加速度(Jerk)限制

加加速度,就是加速度的变化率。这个参数很多人忽略,但我觉得它特别重要。你想想看,如果加速度突然从 0 跳到最大值,虽然加速度本身没超限,但那个“跳变”会让机器人产生冲击振动。

加加速度限制,说白了就是让加速度“平滑地”变化。它直接影响轨迹的柔顺性。我做过一个精密装配项目,要求末端执行器在接触工件时速度为零,但加速度不能突变。这时候,加加速度限制就派上用场了。

加加速度约束:

|q̇̈_i(t)| ≤ j_max_i

嗯,这里要注意:加加速度的单位是 rad/s³ 或 m/s³。它不像速度和加速度那么直观,但实际效果非常明显。

核心观点: 速度限制保证“不烧电机”,加速度限制保证“不散架”,加加速度限制保证“不抖动”。三者缺一不可。

2.2 动力学约束:驱动力矩限制

运动学约束只关心“能不能动”,动力学约束则关心“能不能推动”。驱动力矩限制,就是电机能输出的最大扭矩。

为什么需要动力学约束?因为同样的加速度,负载重的时候需要的力矩更大。你想想看,空载时加速度可以设到 5 m/s²,但抓着一个 10kg 的工件,可能 2 m/s² 就到电机极限了。

驱动力矩约束通常表示为:

|τ_i(t)| ≤ τ_max_i

其中 τ_i 是第 i 个关节的实际驱动力矩,τ_max_i 是电机额定力矩。

但这里有个坑:实际驱动力矩不仅取决于加速度,还取决于重力、科里奥利力、摩擦力等。所以,动力学约束必须结合机器人动力学模型来计算。

我曾经犯过一个错误:只考虑了加速度限制,没算力矩。结果轨迹规划出来,仿真跑得挺好,一上实际机器人,电机直接过载报警。后来我老老实实把动力学模型加进去,才算解决了问题。

2.3 约束之间的耦合关系

这些约束不是孤立的。它们之间相互影响,甚至相互矛盾。我画了一张图,帮你理清关系:

约束耦合关系图 运动学约束 速度限制 加速度限制 加加速度限制 几何层面限制 动力学约束 驱动力矩限制 力/力矩平衡 能量限制 力层面限制 相互影响 核心逻辑:运动学约束决定“能不能动”,动力学约束决定“能不能推动” 实际规划时,必须同时满足两者,取交集作为可行域

从图中可以看出,运动学约束和动力学约束是相互耦合的。比如,加速度限制会影响力矩需求,而力矩限制反过来又限制了加速度的取值。所以,在时间最优轨迹规划中,我们通常需要同时考虑这两类约束,找到它们的交集。

2.4 实际应用中的处理策略

在实际项目中,我一般按以下步骤处理约束:

  1. 先列清单:把每个关节的速度、加速度、加加速度、力矩上限都列出来。不同关节可能不同,别偷懒。
  2. 再建模型:建立机器人的动力学模型,至少要知道质量、惯量、重心位置。没有模型,力矩约束就是空谈。
  3. 然后归一化:把不同量纲的约束归一化到同一个尺度,方便比较。比如,把速度、加速度、力矩都转化为“百分比”形式。
  4. 最后取交集:在轨迹规划的每个时刻,检查所有约束是否满足。不满足就调整轨迹参数(比如降低速度、延长时间)。

小技巧: 我习惯在仿真阶段就把约束设得比实际值严格 10%-20%。这样即使模型有误差,实际运行时也不会出问题。这叫“留余量”,老工程师都懂。

2.5 一个简单的约束检查示例

下面是一个伪代码示例,展示如何在轨迹规划中检查约束:

function check_constraints(q, qd, qdd, tau, params):
    # q: 位置, qd: 速度, qdd: 加速度, tau: 力矩
    # params: 包含各关节的限值
    
    for i in range(num_joints):
        # 检查速度
        if abs(qd[i]) > params.v_max[i]:
            return False, "速度超限"
        
        # 检查加速度
        if abs(qdd[i]) > params.a_max[i]:
            return False, "加速度超限"
        
        # 检查加加速度(需要历史数据)
        if abs(jerk[i]) > params.j_max[i]:
            return False, "加加速度超限"
        
        # 检查力矩
        if abs(tau[i]) > params.tau_max[i]:
            return False, "力矩超限"
    
    return True, "约束满足"

这个函数虽然简单,但它是时间最优轨迹规划的核心检查器。每次迭代都要调用它,确保轨迹不越界。

警告: 千万不要只检查运动学约束而忽略动力学约束。我见过太多人只设速度加速度,结果电机烧了还不知道为什么。力矩约束是最后一道防线,必须重视。

2.6 总结

好了,这一章的内容就这些。总结一下:

  • 运动学约束:速度、加速度、加加速度,限制的是“几何运动能力”。
  • 动力学约束:驱动力矩,限制的是“力输出能力”。
  • 两者耦合:必须同时满足,取交集作为可行域。
  • 实际处理:列清单、建模型、归一化、取交集,留余量。

下一章,我们会把这些约束应用到具体的时间最优轨迹规划算法中。到时候你会发现,约束条件越清晰,算法设计越简单。嗯,今天就到这里。


专注资料整理