# 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: ```text feedback_read[n=<样本数> mean=<均值> p95= p99= max=<最大值> ms] feedback_interval[n=<样本数> mean=<均值> p95= 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 与本轮统计改动混在一起。