1
0
forked from zbw/yiliao2026

docs: record DDS link recovery and live traffic proof

This commit is contained in:
2026-07-23 19:27:17 +08:00
parent 87f562d0ab
commit 929d8e2e5c

View File

@@ -1227,7 +1227,111 @@ rmdir --ignore-fail-on-non-empty /home/hikos/Yiliao2026/config/dds
- WSL 当前分支为 `zbw`。保留了 `.vscode/browse.vc.db*``.codex``resource/``src/navigation/``src/obstacle_scanner/``src/origincar_birdseye/``src/third_party/``tf_bag/` 等已有 dirty files未暂存、未清理、未纳入本任务提交。 - WSL 当前分支为 `zbw`。保留了 `.vscode/browse.vc.db*``.codex``resource/``src/navigation/``src/obstacle_scanner/``src/origincar_birdseye/``src/third_party/``tf_bag/` 等已有 dirty files未暂存、未清理、未纳入本任务提交。
- 未修改 `.bashrc`、路由表、防火墙、网卡 metric、Nav2 参数、ROS package、SSH 或 VS Code 配置;配置仅在终端中显式 `source` 后生效。 - 未修改 `.bashrc`、路由表、防火墙、网卡 metric、Nav2 参数、ROS package、SSH 或 VS Code 配置;配置仅在终端中显式 `source` 后生效。
WSL 最终 XML 完整内容: ### 2026-07-23 18:51 后续卡顿诊断与恢复计划
#### 只读诊断证据
- 重启前 `ip route get 192.168.10.151 from 192.168.10.164` 返回 `dev wlx200db0c3fca5 table 164`;活动 Nav2 participant 的专用 UDP socket 绑定 `192.168.10.164`。因此已加载专用 profile 的 DDS 当时确实走 `.164`
- 同一启动周期累计计数显示:`.210``wlan0` 发送约 `11.58 GB / 3611 万包``.164` 网卡发送约 `64.5 MB / 22 万包`。该数量差异表明 `.210` 另有非专用 DDS 环境的流量。
- Windows 对 `.210` 的 20 次 ping 为平均 `4 ms`、最大 `55 ms``.164` 为平均 `2 ms`、最大 `5 ms`
- 18:52:55 启动的两个只读 `tcpdump` 均由 `timeout 8` 控制,并在 18:53:03 正常关闭 sudo session没有遗留 tcpdump。随后 RDK 网络失联并在 18:57:03 重新启动,上一启动日志末尾没有正常 shutdown 记录,因此只能确认发生了非正常重启,不能从现有日志证明触发源。
- 重启后 `wlx200db0c3fca5``NO-CARRIER`,没有 `.164` 地址、table 164 或 source rule`openwrt_5G` 当前扫描不可见。
- `.210` 管理网卡改连 `kskbl_2.4G`,协商 TX 约 `52 Mbit/s`。一个未设置 `FASTRTPS_DEFAULT_PROFILES_FILE` 的 ROS 2 daemon 绑定 `192.168.10.210`,说明未显式 source 专用脚本的 ROS CLI 会绕过 `.164` 配置。
#### 方案与实施顺序
采用回退连接方案:保留 `/etc/NetworkManager/dispatcher.d/90-wlx164-policy-route``.210` 管理连接和两个 Fast DDS XML 不变;克隆现有 `kskbl_2.4G` 凭据为只绑定 `wlx200db0c3fca5` 的回退 profile。原 `openwrt_5G 1` 保持为 `.164` 的 5G profile并将其自动连接优先级设为 `100`;回退 profile 优先级为 `50`
执行步骤:
1. RED 基线:确认 `.164` 不存在、`use_rdk_dds_164.sh` 返回失败、错误 ROS daemon 的环境中没有 Fast DDS profile 且 socket 位于 `.210`
2. 创建 `kskbl_2.4G-rdk164`,绑定 `wlx200db0c3fca5` 并试连接。只有 DHCP 返回 `192.168.10.164` 才继续;否则立即断开并删除该 profile。
3. 确认现有 dispatcher 自动恢复 `from 192.168.10.164/32 lookup 164`,且 `.164 -> .151` 走 USB 网卡不直接编辑路由表、dispatcher、网卡 metric 或防火墙。
4. 停止错误环境创建的 ROS 2 daemon从专用 DDS 环境启动新的 daemon检查其环境变量与 UDP socket。
5. 使用双向一次性 ROS 2 消息、短时只计数抓包和 ping 验证 `.164` 承载 DDS、`.210` 没有同一批 DDS 包且 SSH 保持可用。
6. 将实际 profile UUID、命令、结果、Git 状态和残留进程检查追加到本节,只提交本 Markdown。
精确回滚:
```bash
nmcli connection down 'kskbl_2.4G-rdk164' 2>/dev/null || true
nmcli connection delete 'kskbl_2.4G-rdk164'
nmcli connection modify 'openwrt_5G 1' connection.autoconnect-priority 0
```
上述回滚只删除本次新增的回退 profile并把既有 `openwrt_5G 1` 优先级恢复为实施前的 `0`;不得删除 `kskbl_2.4G``openwrt_5G 1`、策略路由脚本或 DDS 文件。
#### 后续恢复实施结果
- RDK 非正常重启后,`openwrt_5G` 扫描不可见,既有 `.164` profile 无法连接;`wlx200db0c3fca5` 没有地址,专用 DDS 脚本按设计返回失败。
- 新增 NetworkManager 回退连接:
- 名称:`kskbl_2.4G-rdk164`
- UUID`98eb5d04-3bf5-49a2-96e7-4ec44171154f`
- 绑定接口:`wlx200db0c3fca5`
- 自动连接优先级:`50`
- DHCP 实际地址:`192.168.10.164/24`
- 既有 `openwrt_5G 1` UUID `9e4f4ea7-f087-4369-8faf-fa3d0faa9839` 继续绑定 USB 网卡,自动连接优先级由 `0` 改为 `100`,保持 5G 为下次启动时的首选。
- 既有 `/etc/NetworkManager/dispatcher.d/90-wlx164-policy-route` 未修改;回退连接成功后自动恢复:
```text
1000: from 192.168.10.164 lookup 164
192.168.10.173 from 192.168.10.164 dev wlx200db0c3fca5 table 164
```
- WSL/Windows 有线 LAN 的 DHCP 地址在网络重启后变为 `192.168.10.173`。仅在 WSL 内临时添加 `.151`WSL 能发出但 RDK 无法反向 ARP该临时地址随后已删除。
- 尝试用 Windows `New-NetIPAddress` 添加持久 `.151` 辅助地址时系统返回 `Access is denied`,没有产生 Windows 地址或路由修改。
-`.173` 是当前真实可双向访问的 LAN 地址,最终将 WSL Fast DDS 本地地址和 RDK initial peer 从 `.151` 调整为 `.173`
- RDK `/home/sunrise/yiliao_ws/config/dds/fastdds_rdk_164.xml`:仅把远端 peer `192.168.10.151` 改为 `192.168.10.173`
- WSL XML 从 `fastdds_wsl_151.xml` 重命名为 `fastdds_wsl_173.xml`transport/profile ID 改为 `wsl_udp_173` / `wsl_dds_173`,本地白名单与本机 peer 改为 `.173`,对端仍为 `.164`
- WSL `use_wsl_dds_164_link.sh` 改为检查 `.173` 并加载 `fastdds_wsl_173.xml`
- 新文件校验:
- RDK XML`0644 sunrise:sunrise`SHA-256 `41c2fcac3c23218c40c3d4cf4273504f8233296e5db6ac44c3bc120c5d989dd1`
- RDK 脚本未变SHA-256 `5b40b2d3c61bd9d7eedfdb11ef1bb43dd60b3cdbb67ddcb1e2da01ab79996059`
- WSL XML`0644 hikos:hikos`SHA-256 `fa95118ced19bb0888789c8a0a59cbee1db2a01b00d3592a31b4bd9214ef7b4a`
- WSL 脚本:`0755 hikos:hikos`SHA-256 `85a1390cbda47fed4f42c01210067a575775b79c267def83d24abdde0f232543`
- Git 提交RDK XML `87f562d`WSL XML/脚本 `c383338`。两个提交均只包含上述明确路径。
#### daemon 与运行中节点恢复
- 重启后发现 Domain 22 的 ROS 2 daemon 没有 Fast DDS profileUDP socket 位于 `.210`。普通 `ros2 daemon stop``SIGTERM` 均未使该孤儿进程退出;在严格核对命令行后仅对该 daemon 使用 `SIGKILL`
- 新 RDK Domain 22 daemon 从专用环境启动,环境包含两个 Fast DDS profile 变量UDP socket 全部位于 `.164`
- WSL 旧 daemon 同样绑定已失效 `.151`,按相同方式清理后从 `.173` 环境重启UDP socket 全部位于 `.173`
- WSL 原有 `origincar_birdseye offline_validation.launch.py` 的父进程没有 DDS profile两个子节点仍绑定 `.151`。对明确 PID/命令行发送 `SIGINT` 正常停止后,用原命令在 `.173` 专用环境重启;`synthetic_camera_node``birdseye_node` 的 socket 均位于 `.173`
- `.210` 仍有一个 `ROS_DOMAIN_ID=23` 的独立 daemon它不属于本任务的 Domain 22未终止、未修改。
#### 最终数据路径与延迟证据
- 双向一次性 ROS 2 消息通过WSL 收到 `rdk_to_wsl_via_164`RDK 收到 `wsl_to_rdk_via_164`
- 在 RDK 从专用环境订阅 WSL `/image` 8 秒,第一次接口增量:
- `.164` RX `88,225,838` bytesTX `345,016` bytes
- `.210` RX `2,042` bytesTX `1,092` bytes
- 第二次同样负载:
- `.164` RX `90,334,970` bytesTX `346,092` bytes
- `.210` RX `1,194` bytesTX `1,092` bytes
- 结论:这两批约 8486 MiB 的图像 DDS 数据经过 `.164`,没有经过 `.210`
- 无负载时 `.210` 的 20 次 ping 为 `0%` 丢包、平均 `2 ms`、最大 `8 ms`。约 90 MB/8 秒图像负载期间15 次 ping 仍为 `0%` 丢包、平均 `5 ms`、最大 `52 ms`
- 剩余延迟尖峰不是 IP/DDS 泄漏:当前 `.164` 回退网卡与 `.210` 管理网卡都连接同一个 `kskbl_2.4G` AP共享 2.4 GHz 空口。只有 `openwrt_5G` 恢复可见并由优先级 `100` 的 profile 在启动时选中,或使用独立有线/5G 链路,才能进一步消除射频竞争。
#### 后续配置精确回滚
```bash
# RDK撤销 peer 地址提交,并删除本次新增回退连接。
cd /home/sunrise/yiliao_ws
git revert 87f562d
nmcli connection down 'kskbl_2.4G-rdk164' 2>/dev/null || true
nmcli connection delete 'kskbl_2.4G-rdk164'
nmcli connection modify 'openwrt_5G 1' connection.autoconnect-priority 0
```
```bash
# WSL恢复 .151 文件名、XML 与脚本。
cd /home/hikos/Yiliao2026
git revert c383338
```
回滚后应停止并重新启动 Domain 22 daemon/ROS 节点,使 participant 重新读取旧 XML。不要删除 `.210` 管理连接、现有策略路由脚本、Domain 23 daemon 或用户 dirty files。
WSL 最终 XML 完整内容(本节以下为最初 `.151` 版本的历史快照;当前生效版本和精确差异以上述后续实施结果为准):
```xml ```xml
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>