钉死结论: 锁定后仍无表4,并补协议级硬证据
复测(--detect person --auto-lock, 60s): 表3 1200帧@20Hz, 表2-2 3599帧@60Hz, 首次锁定 0.13s 且全程保持, 表4 仍 0 帧。→ 排除「没锁定所以不解算」。 协议级硬证据: 激光测距字段只存在于表2-2(吊舱→控制器); 表2-1/表3 均无距离 输入字段, 故即便 stereo_ranger 算出距离也无法回灌让吊舱解算 —— 连补救通道都没有。 架构走向: 目标经纬度改由我方自算(视觉测距+载机GPS/姿态+吊舱框架角), 吊舱退化为伺服指向+脱靶量传感器。附待改点 bridge.py:169 / guidance.py 输入。 唯一翻盘途径: 问厂商无激光配置下表4是否设计上就不输出。
This commit is contained in:
+60
-15
@@ -191,16 +191,52 @@ WantedBy=multi-user.target
|
||||
0x07 / 0x0F / 0x10(实测结论,2026-09-28 纠正)。只有发了 `0x08 目标识别关`
|
||||
才真正退出识别,此时才需要按 `d` / `a` 重新开启。
|
||||
|
||||
### 10.0 实测结论:无激光 → 表4 不输出(2026-10-08)
|
||||
### 10.0 实测结论:无激光 → 表4 不输出(✅ 已钉死,2026-10-09)
|
||||
|
||||
**实验**:用 `sim_fc.py` 以 20Hz 持续喂伪造 表3(lat 39.9042 / lon 116.4074 /
|
||||
rel_alt 50m,真实 UTC 递增时戳),同时观测下行。
|
||||
#### 决定性复测(2026-10-09,结论已坐实)
|
||||
|
||||
**结果**:只收到 表2-2 遥测(约 60Hz),**表4 一帧都没有**。
|
||||
```
|
||||
python -m pod_bridge.sim_fc /dev/ttyAMA0 --detect person --auto-lock \
|
||||
--seconds 60 --json ~/pod_logs/phase1.json
|
||||
```
|
||||
|
||||
**判读**:吊舱的目标地理解算**依赖激光测距**。没有距离输入时,它拿不到目标的
|
||||
斜距,无法把视场角换算成地面坐标,于是**根本不发 表4**(不是发 0、不是发旧值)。
|
||||
此前"无激光时如何解算高度/是否假设目标贴地"的问题随之作废——**根本没解算**。
|
||||
| 观测项 | 实测值 | 说明 |
|
||||
|---|---|---|
|
||||
| 表3 发送 | 1200 帧 / 20.0Hz | 我方喂入正常 |
|
||||
| 表2-2 遥测 | 3599 帧 / 59.98Hz | 链路正常、无丢帧 |
|
||||
| **锁定** | **锁定次数 1,首次 0.13s** | ✅ **确实锁定了**(bit2 已置位),排除了"没锁定所以不解算"的猜测 |
|
||||
| **表4 目标** | **0 帧 / 0.00Hz** | ❌ 持续锁定 60s,一帧都没发 |
|
||||
| 回环/其他帧 | 0 / 0 | 接线正常,非自发自收 |
|
||||
|
||||
结论:**吊舱在已锁定 + 表3 持续合法喂入的条件下,依然完全不输出 表4。**
|
||||
|
||||
#### 判读
|
||||
|
||||
吊舱的目标地理解算**依赖激光测距**——没有斜距就无法把视场角换算成地面坐标,
|
||||
于是**根本不发 表4**(不是发 0、不是吐旧值)。此前"无激光时如何解算高度/是否
|
||||
假设目标贴地"的疑问随之作废:**它压根没解算**。
|
||||
|
||||
#### 🔴 硬证据:协议上根本没有"把距离喂给吊舱"的通道
|
||||
|
||||
这一条比实测更致命,它决定了**连补救都没门**:
|
||||
|
||||
- 激光测距字段**只存在于 表2-2(吊舱 → 控制器)**,是吊舱**上报**给我们看的;
|
||||
- 控制器 → 吊舱方向的两个帧——**表2-1 控制帧**、**表3 载机姿态帧**——
|
||||
**都没有任何距离/测距输入字段**(`protocol.py:111` `ControlCommand` 与
|
||||
`protocol.py:248` `CarrierAttitude` 可逐字段核对)。
|
||||
|
||||
→ 即便我方 `stereo_ranger` 算出了精确距离,**也无法通过本协议回灌给吊舱让它
|
||||
去解算表4**。外挂激光模块也帮不上(除非硬件直连吊舱的测距接口或换固件)。
|
||||
|
||||
#### 两种"翻盘可能"的处置
|
||||
|
||||
| 此前保留的可能 | 现状 |
|
||||
|---|---|
|
||||
| ① 本次没真锁定,所以不解算 | ❌ **已排除**:实测首次锁定 0.13s,bit2 已置位 |
|
||||
| ② 吊舱校验 表3 时戳/位置有效性 | ❌ **无必要再测**:本次喂的是**真实 UTC 递增 + 合法经纬度**,已经是它能拿到的最标准输入;`--freeze-time` 只会让输入更不合法,测了也证明不了什么 |
|
||||
|
||||
**唯一还能翻盘的途径是问厂商一句话**:该型号在无激光配置下,表4 是否设计上就
|
||||
不输出?是否支持外挂测距接入?——在拿到答复前,按"表4 不存在"设计架构。
|
||||
|
||||
**直接后果(务必读完再决定下一步)**:
|
||||
|
||||
@@ -208,15 +244,24 @@ rel_alt 50m,真实 UTC 递增时戳),同时观测下行。
|
||||
|---|---|
|
||||
| `guidance.py` 地理位置引导律 | **永久刹车**。桥接层 `bridge.py:169` 的 `target_valid` 依赖表4;表4 恒缺 → `_latest_target` 恒 None → `GuidanceLaw.update()` 每周期走 `_brake("载机位置或目标不可用/超龄")`。安全方向正确(降级刹车、不会乱飞),但**吊舱表4 这条引导路径在本设备上等于不存在** |
|
||||
| 目标距离/坐标来源 | 必须改由**我方自有链路**提供:`stereo_yolo` 检测 → `stereo_ranger` 双目视距。吊舱只当作"稳定指向 + 表2-2 脱靶量"的伺服/传感器用 |
|
||||
| `--auto-unlock`(§10.1) | **必然误触发,已实测禁用**。见 §10.1 |
|
||||
| 后续选型 | 若要保留吊舱侧目标定位,只能换**带激光测距的吊舱型号**,或外挂测距模块 |
|
||||
| `--auto-unlock`(§10.1) | **必然误触发,已实测禁用**:`last_tgt_s` 恒 None 被当成超时。见 §10.1 |
|
||||
| 后续选型 | 若要保留吊舱侧目标定位,只能换**带激光测距的吊舱型号**(且需确认激光能接入吊舱解算链路) |
|
||||
|
||||
**尚未排除的两种可能(值得再花 10 分钟钉死)**:
|
||||
1. 吊舱需要**先真正锁定**才解算,而本次测试未必锁定成功(bit2 未置位)。
|
||||
→ 复测时加 `--detect person --auto-lock`,并在汇总里确认"首次锁定"有值;
|
||||
若锁定后仍无表4,结论才完全坐实。
|
||||
2. 吊舱要求 表3 的**时戳/位置有效性**满足某种条件(例如 GPS 有效标志)。
|
||||
→ 可用 `--freeze-time` 做一次对照。
|
||||
#### 架构该怎么办(分叉已选边)
|
||||
|
||||
既然距离无法回灌、表4 不会有,目标地理坐标就**必须由我方自己解算**:
|
||||
|
||||
```
|
||||
stereo_yolo 检测 → stereo_ranger 双目视距(斜距/前向距离)
|
||||
→ 载机 GPS + 姿态(表3 我方已有) + 吊舱框架角(表2-2)
|
||||
→ **我方自己算出目标经纬度**,再喂给 guidance.py
|
||||
```
|
||||
|
||||
吊舱在本设备上退化为:**伺服稳定指向 + 表2-2 脱靶量/框架角传感器**。
|
||||
它仍然很有用(稳像、跟得住、给得出视场角),只是不再提供坐标。
|
||||
|
||||
> 这意味着 `guidance.py` 的输入要从"吊舱表4"换成"我方自算的目标经纬度",
|
||||
> `bridge.py:169` 的 `target_valid` 判据也要跟着改。**动手前先对齐方案再实现。**
|
||||
|
||||
> 复测命令(`--json` 后是**输出产物路径**,非预置输入文件,建议给绝对路径):
|
||||
> ```
|
||||
|
||||
Reference in New Issue
Block a user