# usdj_air **Repository Path**: greymaner/usdj_air ## Basic Information - **Project Name**: usdj_air - **Description**: 优联拦截打击 拦截机代码 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2026-02-07 - **Last Updated**: 2026-09-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # fisheye_daji #### 介绍 fisheye daji #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 相机焦距(fx/fy)标定 用于标定实飞相机内参 `FOCUS_X` / `FOCUS_Y`(即焦距,决定视觉伺服的像素→角度换算 `rad_per_pixel`)。 焦距不准会导致目标方向解算系统性偏差(仿真曾因焦距错误产生约 13° 的 tgt 误差)。 **原理**:目标静止时,世界系目标方向 `tgt_true` 恒定。用当前姿态 + 检测框中心反推 `tgt_est`, 若焦距正确则所有帧的 `tgt_est` 重合于一点(散布最小);焦距错误则随姿态晃动而分散。 **操作步骤**: 1. 准备工作 - 目标(靶机)悬停/静止在空中某个位置不动。 - 无人机放地上,**只通电不飞行**(mavros、识别节点正常跑即可,无需解锁/起飞)。 - 确保以下话题正常发布: - `/mavros/local_position/odom`(姿态) - `/air/capture_drone`(检测框,`swarm_msgs/BoundingBoxes`) 2. 启动标定脚本 ```bash python3 px4_offboard_controller/script/calib_focal.py ``` 无需任何命令行参数。脚本**联合标定焦距与光心**(`fx, fy, cx, cy`), 采用「粗扫 → 自动围绕最优点细化」,并对焦距和光心交替优化。 默认焦距扫描范围 `FX_MIN~FX_MAX`(300~1800),覆盖约 43°~110° 水平视场。 (可用 `python3 _selftest_calib.py` 自检:用已知真值合成数据验证反解精度。) 3. 手动晃动 —— **必须"纯转动",且尽量"转慢/停稳"** - 在原地**大幅度俯仰 + 滚转**机身(各方向至少 ±20°),让目标扫过画面四角。 - **本方法假设"目标在世界系方向恒定",只有纯转动才成立**。若**只是平移**无人机 (举着走动但姿态不变),目标世界方向随之改变,判据失效,焦距会被推到搜索上限 (实测顶格 1010.2,完全不是真值)。 - **【延迟问题 —— 最容易导致"一直收敛不了"】** 姿态与检测来自不同话题,存在时间差 Δt。 机身以角速度 ω 转动时,会产生 ≈ **ω·Δt** 的姿态误差: | 转速 | Δt=50ms | 100ms | 200ms | |---|---|---|---| | 2.0 rad/s (115°/s) | 5.7° | 11.5° | 22.9° | | 0.5 rad/s (29°/s) | 1.4° | 2.9° | 5.7° | | 0.1 rad/s (5.7°/s) | 0.29° | 0.57° | 1.15° | 而收敛阈值仅 0.05° —— 即使慢慢转,延迟误差仍是阈值的数倍。且该误差是**姿态上的加性 误差**,调 fx/fy 消不掉,构成**不可约的散布地板**。 - **程序已内置三重对策**:① 按检测时间戳插值对齐姿态;② 把 Δt 作为第 5 个参数 联合估计(自检验证:注入 150ms 延迟,估出 150.2ms,散布 0.125°→0.014°); ③ 角速度门控,丢弃转太快的帧。 - **仍强烈建议"转到一个姿态停稳 1 秒再采"**:停稳时 ω≈0,延迟影响归零,效果最好。 - 脚本会实时打印数据质量,据此判断: ``` 数据质量: 光轴指向散布=15.3°(需>8) | 目标最大偏移 620/480 px(需>200) ``` - **光轴指向散布** 是最重要指标(需 > 8°,越大越好)→ 不够就是"转得不够"。 - 目标最大偏移 需 > 200 px → 不够就是"目标没走出画面中心区域"。 4. 读取结果 —— **自闭环,达标自动结束,无需人工判断** - 脚本每 2 秒把【自己标定出的参数喂回自己】迭代一次,打印当前内参与 tgt 的 RMS 角散布: ``` [迭代] 帧=180 fx=866.3 fy=866.3 cx=938.1 cy=482.6 Δt=82ms | 散布=0.0181° | 达标 3/3 ``` (`Δt` 为估计出的链路延迟,已自动补偿) - 当 **散布 < 0.05°** 且连续 3 次满足(且数据质量达标)时,脚本打印最终结果并**自动退出**: ``` ============================================================== 标定完成! tgt RMS 角散布 = 0.0181° < 阈值 0.050°(连续 3 次) 焦距 fx / fy : 866.33 / 866.33 光心 cx / cy : 938.08 / 482.57 视场 hFOV / vFOV: 95.94° / 63.66° -------------------------------------------------------------- 填入 main.launch (或 config/camera_calib.yaml): ... ============================================================== ``` - 结果同时落盘到 `script/camera_calib_result.txt`,便于直接拷贝。 - 若长时间不收敛,看告警:`姿态变化不足` / `顶格告警` / `像素行程不足`,按提示重采。 5. 写入实飞 - 把 `fx` / `fy` / `cx` / `cy` 填入实飞 `main.launch` 的 `FOCUS_X` / `FOCUS_Y` / `CENTER_X` / `CENTER_Y`, 或写入 `px4_offboard_controller/config/camera_calib.yaml`(字段 `fx`/`fy`/`cx`/`cy`, 启动时自动加载并覆盖 launch 默认值)。 - **注意**:`CENTER_X/CENTER_Y` 必须用**标定光心**,不能用画面几何中心(960/540)。 实测二者相差 (21.5, 57.5) px;光心用错会把焦距系统性推大(实测 fy 偏 +12%)。 **判据说明**:该判据依赖"目标世界方向恒定",因此采集时必须**纯转动**。 若只平移无人机,或转动幅度太小,标定会失效并把焦距推向搜索上限。务必大幅度俯仰/滚转。 #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)