4. 轨迹跟踪
定点控制只要求机器人到达一个目标;轨迹跟踪要求机器人在每个时刻都跟上一个随时间变化的目标。机械臂执行 MoveIt 2 轨迹、四足跟踪步态、移动机器人沿路径行驶,本质上都是轨迹跟踪问题。
4.1 轨迹内容
一条合格的轨迹通常包含:
| 量 | 含义 | 为什么重要 |
|---|---|---|
| 位置 | 每个时刻应该在哪里 | 决定几何路径 |
| 速度 | 每个时刻应该多快 | 决定运动是否平滑 |
| 加速度 | 速度如何变化 | 用于前馈力矩或加速度控制 |
| 时间戳 | 每个点何时到达 | 决定节奏和同步 |
如果只有位置点,没有时间和速度,控制器只能“追点”。追点会带来两个问题:
- 速度不连续,执行器容易抖。
- 机器人可能在某些点停顿,动作不像规划器预期的轨迹。
4.2 前馈反馈
轨迹跟踪常用结构是:
期望轨迹 -> 前馈项 ----+
+-> 执行器
当前状态 -> 反馈项 ----+
反馈项根据误差修正:
前馈项根据轨迹本身提前给力:
如果系统模型已知,前馈可以来自动力学:
其中
4.3 高增益限制
有些人会想:既然误差大就加大
因为高增益反馈有代价:
- 会放大传感器噪声。
- 会激发结构柔性和传动间隙。
- 会让接触任务变硬,容易撞击环境。
- 遇到执行器限幅时,继续加增益没有意义。
前馈的价值是:在误差变大之前,就根据轨迹需求给出合理控制量。这样反馈项不用“拼命救火”,系统更平滑。
4.4 关节轨迹
机械臂和腿式机器人常在关节空间跟踪:
def track_joint_trajectory(q_des, dq_des, ddq_des, q, dq):
tau_ff = inverse_dynamics(q_des, dq_des, ddq_des)
tau_fb = kp * (q_des - q) + kd * (dq_des - dq)
return tau_ff + tau_fb
如果没有逆动力学,也可以先用:
tau = kp * (q_des - q) + kd * (dq_des - dq)
这就是带目标速度的 PD 跟踪。它比只用目标位置更稳,因为速度误差也参与了控制。
4.5 末端轨迹
机械臂末端任务通常在笛卡尔空间描述:末端应该到达某个位置和姿态。
常见流程:
- 规划器给出末端轨迹。
- 用 IK 转成关节轨迹。
- 关节控制器跟踪关节轨迹。
也可以直接做任务空间控制:
然后通过雅可比矩阵转成关节力矩:
任务空间控制更贴近任务目标,但需要处理雅可比、奇异位形、关节限位和冗余自由度。入门阶段先掌握“末端轨迹 -> IK -> 关节轨迹 -> 关节控制器”的链路即可。
4.6 时间同步
轨迹跟踪最容易被忽略的是时间。
控制器必须知道当前应该跟踪轨迹上的哪一个点:
elapsed = current_time - trajectory_start_time
q_des, dq_des, ddq_des = sample_trajectory(elapsed)
如果控制器循环有延迟,或者轨迹起始时间和执行器时间不同步,就会出现:
- 机器人总是落后轨迹。
- 某些段突然加速。
- 轨迹执行结束后还在追旧目标。
在 ROS2 / MoveIt 2 里,轨迹消息通常带有 time_from_start。控制器需要根据这个时间戳插值,而不是把每个点当成普通列表逐个执行。
4.7 排错表
| 现象 | 可能原因 |
|---|---|
| 轨迹整体跟得慢 | 控制增益低,前馈不足,执行器限速 |
| 每个路径点停顿 | 把轨迹点当离散目标,没有按时间插值 |
| 速度突然跳变 | 轨迹不连续,时间戳错误 |
| 末端路径对,但关节抖 | IK 解不连续,关节空间轨迹不平滑 |
| 仿真跟得好,真机落后 | 通信延迟、控制频率低、负载模型不准 |
轨迹跟踪是连接规划器和执行器的桥。下一章的 MPC,可以看作在轨迹跟踪的基础上,把约束和未来预测一起放进优化问题里。