54 lines
2.3 KiB
Markdown
54 lines
2.3 KiB
Markdown
# 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=<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 与本轮统计改动混在一起。
|