15 Commits
Author SHA1 Message Date
keita df91b1110e 精简仓库结构并增强任务链路:归档双目可选后端、新增LOS判据与自定义返航
归档 legacy/:stereo_yolo/stereo_ranger/target_tracker 三包 + 175 条测试 + demo/配置/权重/三份规格;运行链路不再依赖,默认 pytest 446 条,归档测试按需运行。

目标有效性第二判据改为 LOS 运动学一致性(pod_bridge/los_consistency.py),删除 require_vision;pod_locked() 叠加该判据,状态机随之后退重搜。

自定义返航(task_runner/return_home.py):保持转场高度回起飞点 → 恢复初始航向 → 垂直降落,不再爬 RTL_RETURN_ALT;未起飞/无起飞点/超时/异常仍退回 PX4 原生 RTL。

任务链安全兜底:主循环异常→紧急返航、stop 幂等、landing_stop 保留遥测、in_air 流复用+超时、解锁/起飞与吊舱识别仅执行一次、rtl_timeout 上限。

入口共享件拆到 utils/sitl_support.py;pod_sitl_test.py→l1_sitl_test.py;删除旧架构 test.py;相机脚本移入 tools/。

新增 .gitignore 并剔除历史误跟踪的 59 个 .pyc;requirements 按实际依赖重写;文档全面对齐,新增 legacy/README.md 与 tools/README.md。
2026-10-21 14:48:41 +08:00
keita ded17d7995 实现预定流程全链路: 任务状态机 + 编排器 + 地面站 + 真机/SITL入口
- utils/task_runner: 6态状态机(WAIT→ARM_TAKEOFF→GOTO(L2)→TRACK(L1)→APPROACH→RTL)
  + 编排器(快照采集/状态动作) + 双层日志(事件JSONL/遥测CSV) + 吊舱控制指令(0x07/0x0F/0x0E/0x08)
- pod_bridge: ground_link 地面坐标UDP注入(超龄判无效,无激光替代表4);
  set_heading_servo_enabled() 运行时L1/L2切换(切换即reset清积分防输出跳变);
  pod_locked 提为公共门控; config 新增 ground_inject 段
- virtual_pod 模拟吊舱(无电机语义) + verify_px4 增量④仅飞控验证 +
  pod_sitl_test L1 SITL全流程(飞行编排不塞进 run_bridge, 保持纯offboard闭环入口)
- 入口: task_runner_sitl(VirtualPod+虚拟目标, SITL端到端跑通约1m24s) /
  task_runner_real(真串口+UDP注入+吊舱控制)
- 地面站 ground_station: 坐标注入 + 状态可视化(Flask)
- S1标定回填(2026-10-09): beta_sign=+1 / alpha_sign=-1, 加标定回归测试守护
- 新增测试: task_runner x4 + ground_link/virtual_pod*/bridge/px4_gateway 增量; 全量 483 passed
- 文档: 预定流程(需求) + 预定流程-操作指南(操作/待办) + L1方案补S1结论与实现状态
2026-10-13 15:50:32 +08:00
keita 5a944af4f5 实现L1航向伺服(路线A1): 吊舱角度直入控制律 + 桥接胶水 + 干跑入口
- visual_track_control: ControlSnapshot 加可选 los_beta_deg/los_alpha_deg,
  第④步角度直入优先否则回退像素路径(向后兼容); config 拆出 load_from_dict 供内嵌复用
- pod_bridge: BridgeConfig 内嵌 TrackingConfig + 新 HeadingServoConfig;
  bridge._build_snapshot 合成 β/α(姿态来自PX4/角度来自吊舱,信号双路适配无电机),
  step 按 heading_servo.enabled 切 L1/L2, DEGRADED_HOLD 补发刹车保 offboard 心跳;
  run() 循环频率按生效律取(修 L1 频率错配)
- run_bridge.py: 闭环 CLI 入口, --dry-run(S2 只接吊舱不发offboard) 与实飞优雅停机
- 配置落 L1 首飞值(slow_approach/0.2mps、垂直压低、无电机仅用脱靶量)
- 新增测试 29 条(vtc5+config9+bridgeL1 10+runner5); 全量 401 passed
2026-10-09 12:52:14 +08:00
keita 257721e035 实测记录: 无激光时吊舱不输出表4(目标经纬度)
20Hz喂伪造表3(lat39.9042/lon116.4074/rel_alt50m),只收到约60Hz表2-2,
表4一帧都没有。判读: 吊舱目标地理解算依赖激光测距,无斜距即不解算。

架构影响:
- guidance.py 引导律在本设备上永久刹车(bridge.py:169 target_valid 依赖表4),
  安全方向正确但吊舱侧不再提供目标坐标
- 目标距离/坐标必须改由自有链路 stereo_yolo -> stereo_ranger 提供
- --auto-unlock 实测禁用: pod_console.py:232 把 last_tgt_s is None 当超时,
  会一锁定就误解锁并与 0x0F 常驻自动重锁循环震荡
- 阶段2/阶段3 精度实验取消(前提不成立)

保留两种待排除可能: 未真锁定、表3时戳/有效性要求,给出复测命令。
2026-10-08 10:04:04 +08:00
keita e1dbf081ab 新增sim_fc.py: 模拟飞控喂表3验证吊舱解算(第1阶段)
- 伪造载机姿态/位置/时戳持续喂表3,单进程收发一体观测表2-2/表4
- 回答Q1(无激光是否仍解算表4)/Q2(表4实际频率)/Q3(丢失后行为)
- 自动判读「目标贴地」假设: 表4相对高度是否约等于喂入的载机高度
- 退出码0/1/2/3便于脚本串测; --json落逐帧采样供阶段2聚类分析
- 默认参数已敲定: lat=39.9042 lon=116.4074 rel-alt=50 rate=20Hz
- 纯软单测21条(注入fake serial), 全量回归372 passed
2026-09-29 14:39:26 +08:00
keita a2ca8bee0c 纠正说法: 0x0F自动锁定是常驻模式, 0x0E只停当前跟踪
实测: 按u后并未放弃自动锁定, 只是目标丢失无法锁定, 目标重新入画仍会自动锁定,
无需重发0x07/0x0F/0x10; 只有0x08关识别才真正退出。同步修正脚本按键说明、
面板提示与部署文档§10/§10.1, 并据此下调自动解锁的副作用风险评级
2026-09-28 16:50:19 +08:00
keita fc364656ec 记录0x0E解除锁定有效; 自动解锁判据转为待定项
实测0x0E停止跟踪后bit2复位(厂商软件锁定框同步消失); --auto-unlock 的触发判据
(表4超时)对本设备存疑(无激光时表4可能根本不发→一锁定就误解锁), 已在代码标注
风险并在部署文档新增§10.1列出待确认项与5种候选判据。全量351条通过
2026-09-28 16:20:07 +08:00
keita dbce0a862f pod_console: 支持主动解除锁定 + 控制台不再刷屏
解除锁定: 按键u发0x0E停止跟踪, s=0x0E+0x08关识别, d开识别, a自动锁定, c归中,
q退出; --auto-unlock SEC 在锁定中表4超时SEC秒自动发0x0E(针对本吊舱锁定位置位
丢失后不复位); --unlock-on-exit 退出前解锁。
显示: 新增Renderer原地重绘(光标上移+清行, 不再清屏刷屏), 刷新默认0.5s,
事件行追加在面板下方; 非TTY输出改为每周期一行紧凑记录。
打桩验证: 自动解锁与退出解锁均正确发出0x0E
2026-09-28 15:39:09 +08:00
keita d255d22fc9 激光门控改为可配置, 本设备(无激光)置false
链路: 新增link.require_laser_valid(默认true, 有激光机型的锁定位置位粘滞兜底);
本吊舱厂商确认不含激光测距 → pod_bridge.json 置false, 并加部署配置回归测试。
文档新增§10记录设备特性(无激光/锁定位置位丢失后不复位/脱靶量无无效标志位)。
全量351条通过(新增3条激光门控用例)
2026-09-28 15:22:14 +08:00
keita 6589a5215c pod_console: 补自动锁定指令序列与状态字诊断
--auto-lock 追加0x0F发现目标自动锁定+0x10识别转跟踪(只发0x07常不锁定),
--motor-on 可先开电机0x27, 指令间200ms间隔; 面板新增状态字行(s1/s2/s3、
视频源、电机、自检)便于判断吊舱实际状态; 退出汇总改为分级排查指引。
打桩验证: 序列0x27/0x07(param_x=1)/0x0F/0x10 与状态字解析均正确
2026-09-28 11:26:10 +08:00
keita 68ba92ff5b 新增pod_console.py: 吊舱目标识别实时控制台
清屏刷新显示锁定/激光/脱靶量/框架角/目标经纬度与实时帧率, Ctrl+C 退出并
输出本次运行汇总(锁定次数、每次起止与时长、累计占比、激光变化);
--detect 可先开目标识别, --duration 可定时结束(默认无限), 非TTY输出保留事件流水
2026-09-28 10:50:57 +08:00
keita 5340a5da07 新增send_control.py并给listen_pod.py加目标识别验证
send_control.py: 单帧表2-1指令下发(名字/数值均可解析, --list列全部控制码)
listen_pod.py: --detect {person,drone} 下发0x07目标识别开(参数X 0人车/1无人机)
并跟踪锁定状态变化与首次锁定时刻; 打桩验证通过(0x2B帧校验和a6与规格样例一致)
2026-09-28 10:30:53 +08:00
keita 11131e26c5 listen_pod.py 串口EIO异常不再崩栈并给出排查提示
Pi板载UART典型故障(errno 5): 捕获后打印串口控制台占用/mini-UART不稳的
排查指引与改用USB转串口建议, 退出码1; 打桩复现验证通过
2026-09-24 15:42:04 +08:00
keita 50372e6623 新增吊舱串口监听诊断脚本listen_pod.py
台架工具: 统计表2-2/表4帧数、打印首帧关键状态、按60Hz标称80%判读链路,
--center可下发归中验证下行; 打桩冒烟测试通过(帧解析/统计/判读/退出码)。
部署文档§7第3步改为引用该脚本
2026-09-24 15:19:51 +08:00
keita 477ad5f5de 新增pod_bridge吊舱桥接中间件(树莓派4B部署)
- pod_bridge: 协议G版编解码/地理位置引导律/PX4网关/串口链路/闭环主循环
- 含三项安全修复: position_time_ms拆分、表2-2锁定门控、run()异常护栏
- 测试92条全绿; 附树莓派4B(Ubuntu 24.04)部署注意事项与最小依赖清单
2026-09-23 14:38:23 +08:00