Files
code-test-drone/docs/双目测距方案.md
T

433 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 双目目标测距技术规格(基于对偶检测)
> **范围**:平台无关、语言无关的技术规格。通过立体相机对与目标检测器估计被检测目标的距离(及可选三维位置),不依赖稠密立体匹配或端到端深度网络。
>
> **版本**:1.0(由项目专用路线图抽取并泛化而成)。
---
## 1. 目的与定位
### 1.1 动机
单目目标检测只能给出像素位置,无法提供度量距离。立体相机对提供几何约束,可将对应检测结果转换为距离。该方法适用于:
- 只需关心少量离散目标(而非稠密环境地图);
- 稠密立体匹配代价过高或不必要;
- 已有互补测距传感器(如激光雷达),双目估计可作为次要或近场来源。
### 1.2 一句话概述
左右图像各自独立运行轻量目标检测器;从对应检测框的边缘(或中心)提取视差;通过经典立体公式 \(Z = F \cdot B / D\) 将视差转换为度量距离。不生成稠密对应场或深度图。
### 1.3 能力边界
- 仅对被检测器报告的目标(如特定类别)测量距离;
- 有效工作距离由基线、焦距与可接受误差决定(见第 5 章);
- 不输出稠密深度、实例掩码或目标以外的场景几何;
- 不替代主远程测距传感器,定位为近中距离的互补来源。
---
## 2. 硬件与输入假设
所有数值参数均为配置项,禁止硬编码。
| 项目 | 典型/示例值 | 说明 |
|------|-------------|------|
| 基线 \(B\) | 0.06 m(示例) | 可配置;误差与 \(1/B\) 成正比 |
| 图像分辨率 | 如 1920×1080 | 检测流水线支持的任意分辨率 |
| 帧率 | 如 30 fps | 流水线须满足所选帧率的周期 |
| 焦距 / 视场 / 传感器尺寸 | — | 须由标定或厂商数据获得 |
| 内参与外参 | — | 立体校正所必需(见第 3 章) |
| 同步方式 | 优先硬件同步 | 软件同步可行,但须量化残余误差 |
| 检测器输入尺寸 | 如 640×640 | 左右目的 letter-box / 缩放变换必须完全一致 |
---
## 3. 前置条件:标定、立体校正与帧同步
### 3.1 标定与立体校正
本方法假设图像对已完成立体校正,使得:
- 对应极线水平且对齐(同一物理点在两图中 \(y\) 坐标相同);
- 视差纯为水平分量:\(D = x_L - x_R\)。
所需数据:
1. 左右相机各自的内参(\(f_x, f_y, c_x, c_y\))与畸变系数;
2. 两相机之间的相对旋转与平移;
3. 应用于每一帧的校正映射(或等效处理)。
**验证方法**:校正后收集匹配检测框,统计垂直残差 \(|\Delta y|\)。实用接受准则为 P95 \(\le 1\) px(实测后确定)。若残差过大,须进行离线自标定(如棋盘格)并在线重映射。
### 3.2 帧同步
若两路曝光时刻不一致,运动目标会产生虚假视差。
| 采集形态 | 同步质量 | 建议处理方式 |
|----------|----------|--------------|
| 同帧拼接单流(side-by-side) | 硬件保证同曝光 | 解码一次,裁切为左右图 |
| 双独立流 | 取决于硬件触发或软件时间戳 | 按序号 + 接收时间窗配对;监测残余时序抖动 |
无硬件同步时,须在预期目标速度下量化距离误差,必要时限制仅用于低速场景。
### 3.3 时间戳约定
优先使用处理平台上的单调接收时间戳。不得伪造传输层未提供的采集时间戳。
---
## 4. 数学模型
### 4.1 符号约定
| 符号 | 含义 | 单位 |
|------|------|------|
| \(B\) | 基线(左右光心间距) | m |
| \(F\) | 像素焦距(校正后 \(f_x = f_y\)) | px |
| \(c_x, c_y\) | 主点 | px |
| \(x_L, y_L\) | 特征点在**左目(参考目)**图像中的像素坐标 | px |
| \(x_R\) | 同一特征点在右目图像中的像素坐标 | px |
| \(D\) | 视差 \(= x_L - x_R\) | px |
| \(Z\) | 前向距离(沿光轴分量) | m |
| \(X, Y\) | 左目坐标系下的横向 / 纵向偏移 | m |
| \(R\) | 斜距 \(\sqrt{X^2+Y^2+Z^2}\) | m |
约定:校正后以左目为参考系;目标位于相机前方时视差为正。
### 4.2 核心公式(校正后坐标系)
\[
\begin{align*}
D &= x_L - x_R \\
Z &= \frac{F \cdot B}{D} \\
X &= \frac{(x_L - c_x) \cdot Z}{F} \\
Y &= \frac{(y_L - c_y) \cdot Z}{F} \\
R &= \sqrt{X^2 + Y^2 + Z^2}
\end{align*}
\]
- 当主测距传感器同样报告前向距离时,优先使用 \(Z\)(前向分量);仅在需要真实欧氏距离时使用 \(R\)。
- 小角度下 \(Z \approx R\);大偏航角时二者差异增大。
### 4.3 检测器预处理后的坐标映射
检测器通常接收固定尺寸的 letter-box 或缩放图像。必须遵守两条约束:
1. **左右图像使用完全相同的几何变换**(同缩放、同填充)。否则垂直对齐性质被破坏。
2. **视差在原始图像坐标系下计算**。将检测框映射回原生分辨率后再计算 \(D\),可保留传感器的全部像素精度。
内参 \(F, c_x, c_y\) 同样须对应原生分辨率。
### 4.4 有损压缩的影响
帧内压缩(如 MJPEG)会在框边缘引入定位噪声。其对视差不确定度 \(\delta D\) 的贡献应计入第 5.2 节误差预算。若实测影响显著,可提高码流质量档位,或在带宽允许时改用无压缩 / 轻压缩格式。
---
## 5. 视差取点与误差分析
### 5.1 对应点选择
同一目标在两目中的检测框宽度很少严格相等(检测抖动、外观差异)。使用框中心会使宽度差的一半混入视差。
| 方法 | 主要误差来源 | 建议 |
|------|--------------|------|
| 框中心 | 宽度差直接进入视差 | 对照 / 回退方案 |
| **同侧边缘**(如两框左边缘) | 仅边缘定位噪声 | **主方案** |
| 多边缘 + 亚像素精化 | 实现成本更高 | 可选后续精化 |
实用取法:
\[
D = x_L^{\text{左边缘}} - x_R^{\text{左边缘}}
\]
(若检测器直接给出左上角坐标,该值可直接使用。)当边缘测量被判定不可靠时,回退到中心视差并输出诊断警告(需节流)。
### 5.2 误差传播
由 \(D = F B / Z\) 得:
\[
\begin{align*}
\delta Z &\approx \frac{Z^2 \cdot \delta D}{F B} && \text{(绝对误差)} \\
\frac{\delta Z}{Z} &\approx \frac{Z \cdot \delta D}{F B} && \text{(相对误差)}
\end{align*}
\]
\(\delta D\) 的构成:
- 检测框边缘定位噪声;
- 校正后残余垂直失配;
- 运动目标的时序不同步;
- 压缩伪影。
基线与焦距的标定误差线性传递,完成出厂或自标定后通常可忽略。
### 5.3 示例误差表
下表仅为**示意**。假设 \(B = 0.06\,\text{m}\)、\(\delta D = 1\,\text{px}\)、原生宽度 1920 px。给出两种示例水平视场;真实焦距须由标定数据代入。
像素焦距近似:\(F = (W/2) / \tan(\text{HFOV}/2)\)。
| 距离 \(Z\) | \(D\) @ \(F\approx960\,\text{px}\)(HFOV \(\approx90^\circ\)) | \(D\) @ \(F\approx1663\,\text{px}\)(HFOV \(\approx60^\circ\)) | \(\delta Z\) @ 90° | \(\delta Z\) @ 60° |
|-----------:|----------------------------------------------------------:|------------------------------------------------------------:|-------------------:|-------------------:|
| 5 m | 11.5 px | 20.0 px | 0.43 m | 0.25 m |
| 10 m | 5.8 px | 10.0 px | 1.7 m | 1.0 m |
| 15 m | 3.8 px | 6.7 px | 3.9 m | 2.3 m |
| 20 m | 2.9 px | 5.0 px | 6.9 m | 4.0 m |
| 30 m | 1.9 px | 3.3 px | 15.6 m | 9.0 m |
| 50 m | 1.2 px | 2.0 px | 43 m | 25 m |
| 100 m| 0.6 px | 1.0 px | 174 m | 100 m |
\(\delta D\) 加倍则表中所有误差加倍。取得真实焦距后必须重算本表。
### 5.4 有效工作距离
实用有效性判据(可调):
\[
\text{valid} \;\Leftrightarrow\; D \ge D_{\min}\;\text{(如 3 px)} \;\land\; \delta Z(\delta D=1\,\text{px}) \le Z_{\text{tol}}\;\text{(如 2 m)}.
\]
按上表示例,广角镜头有效域约 \(\le 15\,\text{m}\),较窄视场约 \(\le 20\,\text{m}\)。域外估计标记为无效;方位信息仍可发布,距离由其他传感器承担。
敏感性:误差 \(\propto 1/B\)。基线加倍可使误差减半、有效域约扩大一倍——这是提升远距离能力最直接的杠杆。
### 5.5 远距离扩展(最小实现范围之外)
- 亚像素边缘精化(灰度重心、抛物线拟合等);
- 距离估计的时间滤波;
- 更大基线或更长焦距;
- 相对真值传感器拟合的经验修正项;
- 优雅降级为“仅方位 + 外部距离”。
---
## 6. 左右目关联
**输入**:属于同一逻辑帧的两路检测结果(见第 7 章)。
**硬约束**(任一不满足即拒绝配对):
- 类别标识一致;
- 垂直残差 \(|\Delta y| \le \tau_y\)(校正后,如 2 px);
- 视差落在目标距离上下限对应的区间内;
- 相对高度相近:\(|h_L - h_R| / \max(h_L,h_R) \le \tau_h\)(如 0.25)。
**代价与贪心匹配**:
\[
\text{cost} = \frac{|\Delta y|}{\tau_y} + \frac{|\Delta h|}{\tau_h\cdot\max(h_L,h_R)}.
\]
按代价升序排列候选对;仅当 \(\text{cost} < 1\) 时接受;强制一一配对。
多数跟踪场景目标数极少(一两个),\(O(n^2)\) 贪心算法足够。匹配器应通过接口注入,以便后续可替换为匈牙利算法、网络流等而不改动调用方。
**失败处理**:未匹配的检测本帧不产生距离,方位仍可发布;流水线其余部分继续运行。
**可选连续性线索**:若存在轨迹标识,优先匹配相同 track id 的框。
---
## 7. 单周期数据流水线
目标周期为所选帧率的倒数(如 30 fps 时 \(\le 33\,\text{ms}\))。
```
采集(优先硬件同步的立体对)
→ 解码 / 去马赛克 / 色彩转换
→ 几何预处理(校正映射、左右完全一致的 letter-box / 缩放)
→ 左右图像并行推理
→ 检测框映射回原生分辨率
→ 关联(第 6 章)
→ 视差 → (Z, X, Y, R)
→ 有效性判定(第 5.4 节)
→ 可选时间滤波
→ 发布结果
```
- **配对键**:共用帧序号(或序号不可用时采用紧接收时间窗)。
- **时间滤波(轻量)**:对 \(Z\) 做一阶低通,配合跳变重置门限。跨帧关联可用类别 + 最近邻连续性;完整多目标跟踪为可选项。
- **失败路径**:任一阶段失败(解码、推理、关联)导致丢帧或发布 `valid = false` 消息。失败日志须节流。
---
## 8. 图像通路考虑
具体编解码与加速硬件因平台而异,此处仅陈述逻辑要求。
- 优先从相机缓冲到校正、letter-box 直至检测器输入张量的零拷贝通路。
- 校正与 letter-box 对左右两目必须位级一致。
- 若采集格式为有损,须量化其对边缘噪声的贡献(见第 4.4 节)。
---
## 9. 性能预算
具体数值取决于所选检测器、加速器与图像尺寸。关键架构要求是:
> 左右推理**必须并发执行**。串行执行通常使时延翻倍,可能无法满足帧周期预算。
代表性预算骨架(用实测值填充):
| 阶段 | 预算(示意) |
|------|--------------|
| 采集周期 | 1 / 帧率 |
| 解码 + 预处理 | 待实测 |
| 左目推理 | 单设备 / 单核上的检测器时延 |
| 右目推理 | 与左目并发 |
| 关联 + 测距 | 少量目标时 < 1 ms |
| 端到端时延 | 实测;须为控制或融合消费方留有余量 |
---
## 10. 模块分解(语言无关)
以下逻辑模块将算法、I/O 与配置清晰分离。
| 模块 | 职责 |
|------|------|
| StereoRanger | 纯算法:关联、视差提取、距离计算、有效性、可选滤波。接收检测结果 + 相机参数,输出距离消息。可完全单元测试。 |
| 检测前端 | 两个独立检测实例(或同一实例调用两次),输出原生坐标下的框。 |
| 图像采集与预处理 | 采集、解码、校正、左右完全一致的几何变换。 |
| 配置 | 基线、内参、视差上下限、关联阈值、滤波系数——全部外置。 |
建议的结果记录(字段名仅为示意):
```
header // 时间戳、序号、健康状态
frame_sequence
class_id
track_id // 未知时为 0
forward_distance_m // Z
slant_range_m // R(可选)
disparity_px
confidence // [0,1]
valid
centre_pixel_x_mid // 虚拟双目中心(见第 11.2 节)
bbox_* // 参考目框,供诊断
```
---
## 11. 传感器融合与控制接口
### 11.1 距离源优先级(示例策略)
```
主传感器有效 → 使用主传感器
主传感器无效 / 超龄,
双目有效 → 使用双目
双目超出有效距离域 → 标记无效
两者均不可用 → “无距离”降级模式
```
### 11.2 交叉校验
两者同时有效且 \(|Z_{\text{stereo}} - d_{\text{primary}}|\) 超过相对或绝对阈值时,记录节流警告并以主传感器为准。注意 \(Z\) 为前向分量;大偏航角时与纯径向测量存在差异。
### 11.3 方位:虚拟双目中心
每枚物理相机相对模组中线偏移 \(\pm B/2\)。直接使用单目像素偏移会引入恒定角度偏差
\[
\beta_{\text{bias}} \approx \arctan\bigl((B/2)/Z\bigr)
\]
近距离时不可忽略(如 \(B=60\,\text{mm}\) 时 3 m 处约 0.6°)。
校正后,位于基线中点的**虚拟相机**对同一目标的投影恰为两目像素的平均值:
\[
\begin{align*}
x_{\text{mid}} &= \frac{x_L + x_R}{2}, \\
y_{\text{mid}} &= y_L = y_R.
\end{align*}
\]
因此:
- 存在立体匹配时,发布 \(x_{\text{mid}}\)(及 \(y_{\text{mid}}\))作为方位源;
- 仅单目检出时,回退到该目原始坐标(接受偏差),或在存在最近有效距离时施加单侧修正 \(\Delta x = F\cdot(B/2)/Z\)。
模组中线与机体中轴之间的固定安装偏移属于外参标定问题,与双目几何无关。
### 11.4 互补工作域
双目测距通常在近中距离最准确,而窄波束主传感器在此区间可能丢靶;主传感器在远距离(双目视差坍缩处)保持优势。简单的优先级或融合规则即可实现全程覆盖。
---
## 12. 建议实施阶段
| 阶段 | 内容 | 出口条件 |
|------|------|----------|
| **v1.0** | 同步对采集、一致预处理、双路检测、同侧边缘视差、贪心关联、\(Z=F B/D\)、有效性标志、结果发布、可选与主测距传感器融合 | 标定数据可用;实测误差与第 5 章模型一致;基本时延预算满足 |
| **v1.1** | 出厂校正不足时的自标定 / 重映射、亚像素边缘精化、时间滤波、track-id 关联、相对真值的经验偏差修正 | 具备 v1.0 外场数据 |
| **v2.0**(可选) | 用实例分割掩码替代检测框、评估学习式立体或单目深度网络、更大基线或更长焦距硬件、框内局部稠密精化 | 单独可行性研究 |
---
## 13. 验证清单
| 项目 | 方法 | 通过标准(示意) |
|------|------|------------------|
| 校正质量 | 静态场景,匹配框 \(|\Delta y|\) 直方图 | P95 \(\le 1\) px(实测后调整) |
| 测距精度 | 多个已知距离的静态标靶 + 真值传感器 | 误差趋势与第 5.3 节一致;有效域内 \(\delta Z\) 在容限内 |
| 同步性 | 目标快速横向运动 | 无系统性虚假视差 |
| 时延与吞吐 | 并发负载下的端到端计时 | 满足所选帧率预算 |
| 融合 / 降级 | 主传感器丢失、超龄、双目超距的回放或仿真 | 所有降级路径行为符合规格 |
| 日志纪律 | 注入失败 | 仅输出节流后的诊断信息 |
---
## 14. 设计取舍记录
| 决策 | 理由 |
|------|------|
| 不做稠密立体匹配 | 稀疏目标无需;全分辨率对应计算代价高 |
| 几何公式而非学习深度 | 可解释、无需额外训练数据,并为后续网络评估提供干净真值基线 |
| 贪心关联 | 目标基数极小;接口保留后续升级空间 |
| 前向分量 \(Z\) 作为主距离输出 | 与多数单点测距传感器语义对齐 |
| 虚拟双目中心作为方位源 | 消除物理相机偏移引起的恒定近场角度偏差 |
| 同侧边缘视差 | 抵消两目框宽差 |
| 双目作为次要 / 互补源 | 绝对误差随 \(Z^2\) 增长;方法在主传感器最弱处价值最大 |
---
## 15. 开放问题 / 配置检查清单
具体部署前须用真实数值填补以下项:
1. 焦距(或完整内参)与畸变模型。
2. 出厂立体标定是否可用及其格式;否则规划自标定。
3. 采集形态(同帧拼接单流 vs 双流)与同步方式。
4. 有损压缩对边缘噪声的实测贡献。
5. 目标计算设备上所选检测器的实测时延(并确认左右推理可并发)。
6. 可接受的绝对 / 相对距离误差及由此确定的有效工作包络。
7. 未来硬件是否考虑更大基线或不同光学配置。
---
## 附录 A – 公式速查
\[
\begin{align*}
D &= x_L - x_R \\
Z &= \frac{F B}{D} \\
\delta Z &\approx \frac{Z^2\,\delta D}{F B} \\
x_{\text{mid}} &= \frac{x_L + x_R}{2}
\end{align*}
\]
有效性(示例):\(D \ge 3\,\text{px}\) 且 \(\delta Z(\delta D=1\,\text{px}) \le 2\,\text{m}\)。
---
*文档结束。*