Add light bar detector and detect_test
- traditional CV pipeline referencing jlu_vision_26: HSV mask -> contour LightBar -> PCA corner refine -> pairing gates - big/small armor classification (bar distance / bar length ratio) - detect_test with synthetic selftest, 6/6 passed - measured armor size 131.56x55mm, solver NaN guard + ITERATIVE fallback
This commit is contained in:
@@ -27,13 +27,15 @@ xmake project -k compile_commands .vscode
|
||||
| `capture_calib` | **相机标定图采集工具** |
|
||||
| `calibrate` | **标定计算工具**(照片 → 内参/畸变 → `configs/camera.yaml`) |
|
||||
| `pose_test` | **几何链路验证工具**(4 角点 → 距离/yaw/pitch,含合成自检) |
|
||||
| `detect_test` | **灯条检测验证工具**(检测 → PnP 一条龙,含合成自检) |
|
||||
|
||||
## 配置
|
||||
|
||||
```
|
||||
configs/
|
||||
├── camera.yaml # 相机内参 + 畸变 + 标定元信息(由 calibrate 生成,需入库)
|
||||
└── camera_runtime.yaml # 运行时参数:曝光/增益/白平衡/帧率(手工维护,需入库)
|
||||
├── camera_runtime.yaml # 运行时参数:曝光/增益/白平衡/帧率(手工维护,需入库)
|
||||
└── light_bar.yaml # 灯条检测参数:HSV 范围/配对门限/PCA(手工维护,需入库)
|
||||
```
|
||||
|
||||
代码里这样用(`inc/camera_calib.hpp`):
|
||||
@@ -76,7 +78,7 @@ cam.setFrameSpeed(2); // 帧率档位 0/1/2
|
||||
## pose_test:几何链路验证
|
||||
|
||||
写检测器之前,先用它验证「标定 + 坐标约定 + PnP 解算」:
|
||||
拿真的装甲板(或打印 135mm 矩形)摆在相机前,鼠标点 4 个角,
|
||||
拿真的装甲板(或打印 131.56×55mm 矩形)摆在相机前,鼠标点 4 个角,
|
||||
输出的距离/yaw/pitch 与卷尺、量角器核对。之后接检测器出问题必是检测的锅。
|
||||
|
||||
```bash
|
||||
@@ -96,12 +98,55 @@ cam.setFrameSpeed(2); // 帧率档位 0/1/2
|
||||
|
||||
### 两个踩过的坑(写检测器时别重蹈)
|
||||
|
||||
1. **IPPE + 畸变 + 板内旋转 = 垃圾解**(OpenCV 4.x/5.x 都中招)。
|
||||
解法:角点先去畸变再喂 IPPE,重投影回原图算(`solvePose` 已内置)。
|
||||
1. **OpenCV 4.x 的 IPPE 有两个数值雷区**(实测):
|
||||
①「畸变 + 板内旋转」→ 解出垃圾解;②「完美轴对称矩形」→ 返回 NaN。
|
||||
解法:IPPE 全候选逐个筛(有限值/z>0/重投影),**全被筛掉就自动退回
|
||||
`SOLVEPNP_ITERATIVE`**——两条退化路径都稳(`solvePose` 已内置)。
|
||||
2. **4 个共面点的顺序错误查不出来**:循环/镜像顺序 = 同一个四边形 =
|
||||
同一个解(无害);交叉乱序会被重投影门限拦下。真正需要 roll 门限的是
|
||||
「检测器给出假四边形」场景,等写检测器时照搬 jlu 的 `roll_thres 15°`。
|
||||
|
||||
### 装甲板尺寸(2026-09-16 实测)
|
||||
|
||||
| 板型 | W 灯条中心距 | L 灯条长度 | 来源 |
|
||||
|---|---|---|---|
|
||||
| 小装甲(2/3/4/5 号、哨兵) | **131.56 mm** | **55.0 mm** | 实测 3 号板,与官方规格 131.5mm 一致 |
|
||||
| 大装甲(英雄 1 号) | 230 mm(名义值) | 55.0 mm | 待实测校正 W |
|
||||
|
||||
⚠️ 尺寸误差 1% = 距离误差 1%;拿 135mm 模型解 230mm 大板,距离会差 0.59 倍。
|
||||
检测器将来必须同时输出「4 角点 + 大小装甲分类」。
|
||||
|
||||
## detect_test:灯条检测 + PnP 一条龙
|
||||
|
||||
传统 CV 管线(借鉴 jlu_vision_26):HSV 颜色掩膜 → 轮廓 → LightBar
|
||||
(minAreaRect+质心+端点)→ PCA 角点修正(灰度矩对称轴 + 亮度梯度找端点)
|
||||
→ 左右配对五道门 → 大小装甲分类 → 4 角点 → `solvePose`。
|
||||
|
||||
```bash
|
||||
./build/linux/x86_64/debug/detect_test # 相机实时
|
||||
./build/linux/x86_64/debug/detect_test --image 照片.jpg # 静态图
|
||||
./build/linux/x86_64/debug/detect_test --selftest # 合成自检(无需相机)
|
||||
```
|
||||
|
||||
- 按键:`q` 退出 | `s` 截图 | `c` 切换敌方颜色(红方打蓝,默认蓝) | `r` 重载参数
|
||||
- 参数都在 `configs/light_bar.yaml`,现场按 `r` 热重载调参
|
||||
- 敌方颜色默认 `blue`(主人是红方);拿自己红板测试时改 `red` 或现场按 `c`
|
||||
- `--selftest` 自检已通过 6/6:正前方/右偏/上仰/复合/板内滚转/大装甲,
|
||||
距离误差 ≤3.1%、yaw/pitch 误差 ≤0.05°,大小分类全部正确
|
||||
|
||||
### 调参时踩过的三个坑(已在默认参数里避开)
|
||||
|
||||
1. **形态学闭运算别开 2 次**:远景灯条只有 2~3px 宽,腐蚀两轮整个抹掉
|
||||
2. **长宽比门限别设太高**(默认 1.5):远景灯条模糊+阈值后掩膜被撑到
|
||||
10px 宽,实测比只剩 1.7;防误检主要靠配对五道门
|
||||
3. **角点顺序的镜像坑**:板子朝向相机时,板的左条出现在画面右侧
|
||||
(面对面镜像),输出角点已按模型约定「板左下→板左上→板右上→板右下」处理
|
||||
|
||||
### 渲染自检的教训(写自检时别重蹈)
|
||||
|
||||
圆管式画灯条会让端弧超出模型端点 4px+,距离直接偏 17%;用填充四边形、
|
||||
端点严格对齐模型点。
|
||||
|
||||
## 相机标定流程
|
||||
|
||||
> **本工程标定板规格**:10 × 7 内角点、**方格 20.0 mm**(卡尺实测值,不是打印标称值)
|
||||
|
||||
Reference in New Issue
Block a user