Files
acRealman_xr/docs/superpowers/specs/2026-07-28-rm75-feedback-thread-timing-design.md
T

2.3 KiB
Raw Blame History

RM75 关节反馈线程计时统计设计

目标

在不改变关节反馈轮询、QP、关节指令和安全停止行为的前提下,测清当前 RealMan 反馈线程的两个关键时间:

  • rm_get_joint_degree() 单次调用耗时;
  • 相邻两次成功写入关节反馈缓存的实际更新间隔。

本轮只增加统计。高跟随、TCP 速度、反馈调度和 QP 控制方式均保持现状,待 真机日志确认根因后再修改。

方案

RealManAdapter_read_joint_state_once() 中使用单调高精度时钟记录:

  • feedback_read:从调用 rm_get_joint_degree() 前到调用返回后的耗时;
  • feedback_interval:本次成功反馈时间戳与上次成功反馈时间戳之差。

两个数值随 JointStateSnapshot 写入现有线程安全缓存。首次成功反馈没有可靠 的前序时间戳,因此不提供 feedback_interval

SingleArmVelocityTeleop 只在看到新的反馈时间戳时,将这两个数值各记录一次, 避免 125 Hz 控制循环重复读取同一缓存而造成重复统计。统计加入现有约 5 秒 timing 窗口,并输出各自的样本数、mean、P95、P99 和 max

feedback_read[n=<样本数> mean=<均值> p95=<P95> p99=<P99> max=<最大值> ms]
feedback_interval[n=<样本数> mean=<均值> p95=<P95> p99=<P99> max=<最大值> ms]

读取失败不产生成功样本,继续沿用现有一次告警、反馈超时和安全停止逻辑。 Mock 模式不伪造厂商 API 调用耗时。

验证

  • 扩展现有关节控制单元测试,使用确定性快照验证新反馈只统计一次、重复缓存 不重复计数、首次反馈没有更新间隔。
  • 运行 xr_rm_teleop 相关 pytest。
  • 按项目规则在工作空间根目录运行 colcon build --symlink-install
  • 真机测试仍由用户使用 arm_debug.launch.py arm:=right use_mock:=false 执行; 本轮不自动连接机械臂。

后续决策

用户提供真机 timing 日志后再判断:

  • feedback_interval 主要由 feedback_read + 8 ms 构成,再评估绝对周期 调度;
  • feedback_read 本身经常超过 8 ms,优先定位厂商查询或同一连接的读写 竞争;
  • 反馈问题确认前,不把高跟随或预测式 QP 与本轮统计改动混在一起。