From fc364656ec1429b134a4d2840b1e898eead41210 Mon Sep 17 00:00:00 2001 From: keita <16924591+keita_sakura@user.noreply.gitee.com> Date: Mon, 28 Sep 2026 16:20:07 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=950x0E=E8=A7=A3=E9=99=A4?= =?UTF-8?q?=E9=94=81=E5=AE=9A=E6=9C=89=E6=95=88;=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=A7=A3=E9=94=81=E5=88=A4=E6=8D=AE=E8=BD=AC=E4=B8=BA=E5=BE=85?= =?UTF-8?q?=E5=AE=9A=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实测0x0E停止跟踪后bit2复位(厂商软件锁定框同步消失); --auto-unlock 的触发判据 (表4超时)对本设备存疑(无激光时表4可能根本不发→一锁定就误解锁), 已在代码标注 风险并在部署文档新增§10.1列出待确认项与5种候选判据。全量351条通过 --- docs/树莓派4B部署注意事项.md | 23 +++++++++++++++++++++++ utils/pod_bridge/pod_console.py | 7 ++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/docs/树莓派4B部署注意事项.md b/docs/树莓派4B部署注意事项.md index 3794c94..8e6cc37 100644 --- a/docs/树莓派4B部署注意事项.md +++ b/docs/树莓派4B部署注意事项.md @@ -177,4 +177,27 @@ WantedBy=multi-user.target 表2-2 脱靶量是定长字段且协议**没有无效标志位**,丢失时表现为 0, 无法区分"不输出"与"输出 0"。 → 单靠 bit2 会在目标丢失后继续朝过期坐标飞,**必须有第二判据**(见 §8/§11)。 +- **主动解除锁定有效**:发 `0x0E 停止跟踪` 后 bit2 复位为未锁定,厂商测试软件的 + 锁定框同步消失(2026-09-28 实测)。重新锁定:重发 0x07 或 0x0F+0x10。 + +### 10.1 自动解锁机制(待定,勿贸然启用) + +`pod_console.py --auto-unlock SEC` 现按「锁定中 + 表4 超过 SEC 秒未更新」触发 0x0E。 +**该判据对本设备存疑**,开箱前需确认: + +| 待确认项 | 影响 | +|---|---| +| 本设备无激光,锁定后**到底发不发 表4** | 若表4 根本不发,`last_tgt_s` 恒空 → 一锁定就被误解锁,机制不可用 | +| 表4 的实际发送频率(规格 1~60Hz) | SEC 必须远大于实际周期(建议 ≥5s 且 ≥3 倍周期),否则误杀 | +| 解锁后是否自动重发 0x0F/0x10 重新捕获 | 自动重发可能与"假锁定"形成震荡;建议单次解锁 + 告警,不循环 | + +候选替代判据(按可靠性排序): +1. **操作员按键 `u`**(台架阶段推荐,零误杀); +2. 表4 超时(需先确认表4 存在); +3. 锁定持续超过 T 秒且**从未**收到表4 → 判为假锁定,解锁一次并告警(不循环); +4. 脱靶量恒为 0 持续 T 秒 —— 居中跟踪时也会为 0,**误杀风险高**,不推荐; +5. 由我方视觉链路(stereo_yolo / target_tracker)交叉验证 —— 最可靠,待集成。 + +飞行期的正确行为是**刹车保护**(现有 `target_stale_ms` 已覆盖),与"解锁以便重新 +搜索"是两件事,不要混为一谈。 diff --git a/utils/pod_bridge/pod_console.py b/utils/pod_bridge/pod_console.py index a3d52b0..d936b61 100644 --- a/utils/pod_bridge/pod_console.py +++ b/utils/pod_bridge/pod_console.py @@ -133,7 +133,9 @@ def main() -> int: help="在识别开之后追加 发现目标自动锁定(0x0F)与 识别转跟踪(0x10)") ap.add_argument("--motor-on", action="store_true", help="启动时先下发 开电机(0x27)") ap.add_argument("--auto-unlock", type=float, default=0.0, metavar="SEC", - help="锁定中若表4 超过 SEC 秒未更新,自动发 0x0E 解除锁定") + help="锁定中若表4 超过 SEC 秒未更新,自动发 0x0E 解除锁定。" + "⚠ 触发判据依赖表4;本设备无激光测距,表4 可能根本不发, " + "启用前须实测确认(见部署文档 §10)") ap.add_argument("--unlock-on-exit", action="store_true", help="退出前发一帧 0x0E 解除锁定") args = ap.parse_args() @@ -218,6 +220,9 @@ def main() -> int: latest_tgt = frame # ---- 自动解除锁定:锁定中但表4 长时间不更新 ---- + # ⚠ 本设备无激光测距,表4(目标经纬度)可能始终不发 → last_tgt_s 恒为 + # None,此判据会一锁定就误解锁。启用前先用控制台观察「目标帧 距今」, + # 确认锁定后表4 真的在发。触发判据的替代方案见部署文档 §10。 if (args.auto_unlock > 0 and latest is not None and latest.is_target_locked and (last_tgt_s is None or now_s - last_tgt_s > args.auto_unlock)