# RM75 关节命令提前制动设计 ## 背景 右臂真机保持 90 Hz 和 `follow: false`。有界迭代 QP 提高跟随速度后,手柄上下 移动约 10 mm 时出现整臂剧烈晃动,并且到达目标后仍持续振荡。 现场日志表明控制计算未超时,但存在少量 QP 未收敛警告。离线检查确认: - 手柄上下移动按现有映射对应机器人 X 方向; - 当前初始姿态的关节雅可比条件数约为 116,该方向的逆解对关节运动较敏感; - 机器人 X 方向 10 mm 的收敛逆解可能包含最大约 17° 的关节变化; - 现有关节命令限幅器只限制速度和加速度,没有根据剩余距离提前制动。 固定 10° 关节目标的离线复现中,现有限幅器运行 3 秒后仍处于约 10.56°、 -20°/s,证明稳定目标本身也会被反复越过。这与真机“到位后继续晃动”的现象 一致。 ## 目标 - 关节目标稳定后,90 Hz 关节命令提前减速并停止在目标上; - 不再因命令限幅器反复越过目标而持续振荡; - 保留当前较快的有界迭代 QP; - 保留现有关节最大速度和最大加速度限制; - 保持 `rm_movej_canfd(..., follow=false)`; - 不改变 UDP 反馈、超时保持、CANFD 错误恢复和安全停止行为。 ## 不在本次范围 - 不修改 QP 迭代次数、收敛阈值或失败回退; - 不修改初始姿态、XR 坐标映射或姿态控制; - 不增加奇异点阻尼、预测器、新线程、新依赖或新 ROS 参数; - 不修改三份机械臂 YAML、RealMan 适配器、launch 或 UI; - 不连接真机,不由 Codex 发送运动命令。 若修复制动后机械臂运动已经平稳,但上下运动仍伴随不可接受的整臂大幅构型变化, 再单独设计奇异点处理;本次不把两个问题混在同一改动中。 ## 方案 只修改 `SingleArmVelocityTeleop._limit_joint_command_step()`。 现有逻辑在目标仍位于运动方向前方时持续加速,只有到达或越过目标后才开始反向 减速。新逻辑对每个关节使用同一组现有状态: - 上一次已发送的关节目标; - 上一次关节命令速度; - 当前 QP 关节目标; - 现有关节最大速度、最大加速度和控制周期。 每周期按以下规则生成命令: 1. 计算关节剩余距离和单周期最大速度变化 `velocity_step = max_acceleration * dt`。 2. 根据 90 Hz 离散积分规则,计算“本周期再加速一次、随后以最大允许减速度制动” 所需的总距离。 3. 若关节正在朝目标运动,并且剩余距离已经不大于该制动距离,则本周期开始减速; 否则继续朝目标加速,但不超过现有最大速度。 4. 使用 `velocity_step` 限制本周期速度变化,保持现有加速度上限。 5. 使用新速度积分得到本周期关节目标。 6. 当关节已经停下且剩余距离不超过一个最大加速度位移 `max_acceleration * dt²` 时,在不违反单周期加速度限制的前提下精确落到目标, 避免离散步长形成极小往复振荡。 该逻辑只负责命令轨迹制动,不改变 QP 输出。对于持续移动的目标,若目标突然越过 当前命令位置,控制器仍优先遵守加速度限制,以最大允许减速度反向;不会为禁止 瞬时越界而跳变速度。 ## 安全行为 - 每周期命令速度绝对值不超过 `joint_max_speed`; - 相邻周期间速度变化不超过 `joint_max_acc * dt`; - 输出继续校验 NaN 和 Inf; - QP 异常仍保持上一组安全目标并在终端限频打印警告; - UDP 短暂超时仍以 90 Hz 重发最后一次已限速目标,不运行 QP; - UDP 持续超时、CANFD 错误、Grip 重新使能和安全停止逻辑保持不变。 ## 测试 先增加失败测试,再修改实现: 1. 对固定 10° 关节目标连续运行限幅器,验证命令不越过目标并最终停止; 2. 在整个序列中验证速度不超过现有上限; 3. 验证相邻命令速度变化不超过现有加速度上限; 4. 保留现有“从静止开始限制首周期加速度”测试; 5. 运行 `xr_rm_teleop` 全部测试; 6. 按项目规则运行 `colcon build --symlink-install`; 7. 使用 `arm_debug.launch.py arm:=right use_mock:=true`验证 90 Hz、低跟随和启动路径。 真机只由用户分阶段验证:先小位移、低风险姿态,确认不再到位后持续振荡,再逐步 增加位移。若仍有明显整臂构型变化但不再振荡,应停止扩大位移并转入奇异点处理, 不得通过提高速度、加速度或启用高跟随规避。 ## 文件范围 - 修改 `xr_rm_teleop/xr_rm_teleop/single_arm_velocity_teleop.py`; - 修改 `xr_rm_teleop/test/test_joint_control.py`; - 新增本中文设计文档; - 后续新增一份中文实施计划。