From 5e7e0d9713fb767454fc0045bacfe7af10aa8bfd Mon Sep 17 00:00:00 2001 From: keita <16924591+keita_sakura@user.noreply.gitee.com> Date: Fri, 9 Oct 2026 10:01:40 +0800 Subject: [PATCH] =?UTF-8?q?=E9=92=89=E6=AD=BB=E7=BB=93=E8=AE=BA:=20?= =?UTF-8?q?=E9=94=81=E5=AE=9A=E5=90=8E=E4=BB=8D=E6=97=A0=E8=A1=A84,?= =?UTF-8?q?=E5=B9=B6=E8=A1=A5=E5=8D=8F=E8=AE=AE=E7=BA=A7=E7=A1=AC=E8=AF=81?= =?UTF-8?q?=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 复测(--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是否设计上就不输出。 --- docs/吊舱解算验证方案-模拟飞控喂表3.md | 54 ++++++++++++------- docs/树莓派4B部署注意事项.md | 75 ++++++++++++++++++++------ 2 files changed, 96 insertions(+), 33 deletions(-) diff --git a/docs/吊舱解算验证方案-模拟飞控喂表3.md b/docs/吊舱解算验证方案-模拟飞控喂表3.md index 154f801..99e3ee8 100644 --- a/docs/吊舱解算验证方案-模拟飞控喂表3.md +++ b/docs/吊舱解算验证方案-模拟飞控喂表3.md @@ -1,8 +1,22 @@ # 用「模拟飞控」喂表3 验证吊舱目标解算能力的实验方案 -> 状态:**Q1 已有实测答案 —— 无激光时吊舱不输出 表4**(2026-10-08,见 §0.1)。 -> 工具 `sim_fc.py` 已落地并配套 21 个纯软单测,参数已敲定见 §7。 -> 日期:2026-09-29 立项 / 2026-10-08 实测收敛 关联:`docs/树莓派4B部署注意事项.md` §10.0 +> 状态:**✅ 已收敛 —— Q1 = 否,无激光时吊舱不输出 表4,结论已钉死**。 +> 初测 2026-10-08(§0.1)→ 复测钉死 2026-10-09(§0.2,锁定后仍 0 帧)。 +> 工具 `sim_fc.py` 已落地并配套 21 个纯软单测,参数见 §7;阶段2/阶段3 已取消。 +> 日期:2026-09-29 立项 / 2026-10-09 收敛 关联:`docs/树莓派4B部署注意事项.md` §10.0 + +--- + +## 0. 一句话目标 + +在**没有飞控、没有激光、无人机不动**的条件下,由树莓派单独向吊舱持续喂一套 +「假飞控数据」(表3),逼吊舱输出目标经纬度(表4),从而判定: + +**这台无激光吊舱到底能不能自主完成目标地理定位,以及精度是多少。** + +如果它能输出表4 → 引导链路有输入;如果不能 → 目标距离与坐标必须由我方 +`stereo_ranger` 双目视距链路提供,`pod_bridge` 的架构要改。 +所以这是**分叉点实验**,值得先做。 --- @@ -36,28 +50,32 @@ rel_alt 50m,真实 UTC 递增时戳),同时观测下行。 4. `--auto-unlock` **已实测禁用**(`pod_console.py:232` 把 `last_tgt_s is None` 当成超时,会一锁定就误解锁并循环震荡)。 -**尚未完全排除的两种可能**(值得再花 10 分钟钉死,钉死前不要把结论当成绝对): +**阶段2 / 阶段3 处置**:**取消**。精度比对与高度敏感性扫描都以表4 存在为前提, +前提已不成立,不要再往这条路上投时间。 -1. 本次测试**未必真的锁定成功**(bit2 未置位)→ 吊舱可能要求先锁定才解算。 - 复测加 `--detect person --auto-lock`,看汇总里"首次锁定"是否有值; - 若**锁定后仍无表4**,结论才完全坐实。 -2. 吊舱可能对 表3 的**时戳/位置有效性**有额外要求 → 用 `--freeze-time` 做一次对照。 +### 0.2 ✅ 结论钉死(2026-10-09 复测) -**阶段2 / 阶段3 处置**:**取消**(精度比对与高度敏感性扫描都以表4 存在为前提)。 -除非上面第 1 条复测翻盘,否则不要再往这条路上投时间。 +复测命令(`--detect person --auto-lock --seconds 60`)关键数据: ---- +| 观测项 | 实测值 | +|---|---| +| 表3 发送 / 表2-2 遥测 | 1200 帧 @20.0Hz / 3599 帧 @59.98Hz | +| **锁定** | **锁定次数 1,首次 0.13s**(bit2 已置位,全程保持) | +| **表4** | **0 帧** | -## 0. 一句话目标 +**两种翻盘可能的处置:** -在**没有飞控、没有激光、无人机不动**的条件下,由树莓派单独向吊舱持续喂一套 -「假飞控数据」(表3),逼吊舱输出目标经纬度(表4),从而判定: +| 可能 | 结果 | +|---|---| +| ① 本次没真锁定,所以不解算 | ❌ **已排除**——实测确实锁定了(0.13s) | +| ② 吊舱校验表3 时戳/位置有效性 | ❌ **无需再测**——本次喂的是真实 UTC 递增 + 合法经纬度,已是它能拿到的最标准输入;`--freeze-time` 只会更不合法,测了证明不了什么 | -**这台无激光吊舱到底能不能自主完成目标地理定位,以及精度是多少。** +**另有一条比实测更致命的硬证据**:激光测距字段**只存在于表2-2(吊舱→控制器)**; +控制器→吊舱方向的表2-1、表3 **都没有任何距离输入字段**。所以即使 `stereo_ranger` +算出了距离,**也无法回灌给吊舱让它去解算表4**——连补救的通道都没有。 -如果它能输出表4 → 引导链路有输入;如果不能 → 目标距离与坐标必须由我方 -`stereo_ranger` 双目视距链路提供,`pod_bridge` 的架构要改。 -所以这是**分叉点实验**,值得先做。 +**唯一还能翻盘的途径**:问厂商一句话——该型号无激光配置下表4 是否设计上就不输出、 +是否支持外挂测距接入。拿到答复前一律按"表4 不存在"设计架构。 --- diff --git a/docs/树莓派4B部署注意事项.md b/docs/树莓派4B部署注意事项.md index aedf3b3..8ae01be 100644 --- a/docs/树莓派4B部署注意事项.md +++ b/docs/树莓派4B部署注意事项.md @@ -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` 后是**输出产物路径**,非预置输入文件,建议给绝对路径): > ```