1. 单目运动估计的困局与破局思路
1.1 为什么单目目标运动估计是个“老大难”
做视觉感知的同行都有个共识:单目相机便宜、轻量、功耗低,但要用它来估计目标的运动状态,尤其是三维空间里的速度和轨迹,难度比双目和激光雷达高出不止一个量级。核心原因就一个——深度不可直接观测。一个目标在图像上变大,可能是因为它在靠近你,也可能是因为它本身在膨胀;一个目标在图像上横向移动,可能是它在横穿,也可能是相机自己在动。这种“一个观测对应多个物理解释”的现象,就是典型的可观性不足。
我在实际项目中反复遇到过这种情况:无人机追一个移动目标,视觉端给出的距离估计一会儿跳一会儿飘,滤波器收敛慢,控制环跟着抖。后来排查下来,问题往往不在滤波器本身,而在于观测模型给的信息不够,导致状态估计的可观性矩阵秩亏,某些状态分量根本不可观测。
Bearing-Box 这个工作瞄准的就是这个痛点。它的核心思路是:既然单目图像本身信息有限,那就把三维检测框这个中间表示利用起来,再叠加动力学约束,从两个方向同时增强系统的可观性。这不是简单的“多加几个观测”,而是从系统可观测性的角度重新设计了观测模型和约束结构。
1.2 Bearing-Box 到底做了什么
用一句话概括:Bearing-Box 把目标的三维检测框的几何信息(角点、边、面)与传统的方位向量(Bearing)观测结合起来,构建了一个增强型观测模型,同时引入目标运动的动力学先验(比如匀速、匀加速假设)作为约束,使得原本不可观测或弱可观测的状态分量变得可观测或强可观。
具体来说,传统单目 Bearing-only 方法只利用目标在图像上的方位角信息,观测维度低,深度方向几乎不可观。Bearing-Box 则从三维检测框的八个角点中提取出尺度信息、朝向信息、位置信息,把这些都纳入观测方程。再加上动力学约束对方程的补充,整个系统的可观性矩阵的秩得到提升,条件数也显著改善。
这个思路的价值在于:它不需要额外的传感器,不需要改变硬件配置,纯粹从算法层面把现有信息的利用率拉满。对于 MAV(微型飞行器)这类对载荷和功耗极度敏感的平台来说,这是非常务实的方案。
1.3 适合谁来读这篇内容
如果你正在做以下任何一件事,这篇内容都值得你花时间:
- 用单目相机做目标跟踪或运动估计,被深度漂移和滤波器不收敛折磨过
- 在无人机或移动机器人上做视觉伺服、目标跟随,需要稳定的相对运动估计
- 对可观性分析感兴趣,想看看怎么从系统理论角度指导观测模型设计
- 做三维检测但还没想好怎么把检测结果用到状态估计里
我下面会从设计思路、核心原理、实操细节、问题排查几个层面展开,尽量把“为什么这么设计”和“具体怎么做”都讲透。
2. 核心原理拆解:可观性增强的底层逻辑
2.1 可观性到底在说什么
先把这个概念说清楚。一个动态系统,如果给定足够长时间的观测输出,能够唯一确定系统的初始状态,那它就是可观的。对于线性系统,看可观性矩阵的秩就行;对于非线性系统,要看李导数生成的可观性矩阵的秩。秩亏意味着某些状态方向上的信息在观测中“消失”了,滤波器只能靠先验去猜,猜久了就飘。
单目 Bearing-only 跟踪的经典问题就是:目标距离(深度)和目标的绝对尺度之间存在耦合,观测只给方位角,深度方向的可观性极弱。你从图像上只能看到目标在视野中的方向变化,但目标沿视线方向靠近还是远离,图像上的变化非常微小,信噪比极低。
Bearing-Box 的切入点很聪明:三维检测框的表观尺寸直接与深度相关。框越大,目标越近;框越小,目标越远。虽然单帧的尺寸-深度关系受目标真实尺寸未知的影响,但在多帧时序中,尺寸变化率提供了深度方向运动的强约束。再加上框的朝向信息,目标的姿态运动也变得可观测。
2.2 三维检测框提供了哪些额外观测
一个三维检测框在图像上的投影,本质上是一个透视投影后的二维框。但如果我们能从二维框反推出三维框的八个角点在图像上的位置,那每个角点都提供了一组方位观测。八个角点就是八组方位观测,信息量远超单点 Bearing。
更重要的是,三维框的几何结构本身携带约束:对边平行、角点共面、框的尺寸在短时间内的变化受刚体运动约束。这些约束可以写成等式形式,直接加入观测方程或作为伪观测。
我在实践中发现,框的朝向角(Yaw)对可观性的贡献经常被低估。当目标做横向运动时,朝向角的变化率与横向速度强相关;当目标做旋转运动时,朝向角的变化更是直接观测。把朝向角纳入观测向量后,滤波器对目标角速度的估计收敛速度明显加快。
2.3 动力学约束怎么补上最后一块拼图
光有几何观测还不够。如果目标做匀速直线运动,但观测噪声大,滤波器仍然可能给出抖动的速度估计。动力学约束的作用是限制状态转移的可行空间,把不可能的轨迹排除掉。
Bearing-Box 里用的动力学约束,根据我的理解,至少包括以下几类:
- 匀速模型(CV):位置的一阶导为速度,速度的一阶导为零。这是最基础的约束,适用于大多数平稳运动场景。
- 匀加速模型(CA):允许加速度存在但假设其为常数或慢变。对机动目标更友好。
- 运动学一致性约束:比如目标不能侧滑(非完整约束),或者速度方向与朝向角对齐(车类目标)。
这些约束在滤波框架里通常体现为过程模型的设计,但在 Bearing-Box 中,它们还被用来增强可观性——通过约束把不可观测的状态分量与可观测分量耦合起来,间接使其可观测。
举个例子:如果目标做匀速运动,那么深度方向的速度可以通过横向运动与朝向角的几何关系间接推断出来。这个推断链条就是动力学约束提供的“信息通道”。
2.4 可观性增强的数学直觉
不用太复杂的推导,我用一个直观的例子说明。假设状态向量是 [px, py, pz, vx, vy, vz],观测只有方位角 [azimuth, elevation]。方位角只与位置有关,与速度无关。那么速度分量的可观性从何而来?只能通过位置随时间的变化间接推断。如果位置本身的可观性就弱,速度就更不可观。
现在加入三维框的尺寸观测。尺寸 s 与深度 pz 的关系大致是 s ∝ 1/pz。这个非线性关系提供了 pz 的直接观测。pz 可观测了,vz 通过时序差分也变得可观测。再加入朝向角观测,目标的角速度也变得可观测。整个系统的可观性矩阵的秩从原来的 3 或 4 提升到 6,条件数也大幅下降。
这就是 Bearing-Box 的核心贡献:不是发明新的滤波器,而是重新设计观测模型,让滤波器能“看到”更多信息。
3. 实操落地:从检测框到运动估计的完整链路
3.1 系统架构与数据流
一个典型的 Bearing-Box 实现链路大致如下:
- 图像采集:单目相机,常规帧率 30fps 或更高。
- 三维目标检测:可以用任何能输出三维框的方法,比如基于单目的 3D 检测网络,或者基于已知目标尺寸的几何反推。
- 观测提取:从三维框的投影中提取角点方位、框尺寸、朝向角等观测。
- 动力学建模:根据目标类型选择 CV 或 CA 模型,设定过程噪声。
- 滤波器更新:用扩展卡尔曼滤波(EKF)或无迹卡尔曼滤波(UKF)融合观测与动力学约束。
- 输出:目标的位置、速度、加速度估计,以及协方差。
这个链路里,观测提取和动力学建模是两个最关键的环节,直接决定可观性增强的效果。
3.2 三维检测框的获取与预处理
如果你用的是现成的三维检测网络,输出通常是框的中心、尺寸、朝向。但 Bearing-Box 需要的是角点级别的信息。所以第一步是把框参数转成八个角点在相机坐标系下的坐标,再投影到图像平面。
这里有个细节:检测框的朝向角通常有周期性模糊(Yaw 差 π 等价)。在时序滤波中,这个模糊会导致观测跳变。我的处理方式是:在观测方程里用朝向角的连续表示(比如用 sin/cos 双分量),或者在数据关联阶段做朝向一致性检查。
另一个坑是框的尺寸抖动。检测网络输出的框尺寸往往有噪声,直接用来估计深度会引入高频抖动。我通常会对框尺寸做低通滤波或滑动平均,但要注意不能过度平滑,否则会引入相位滞后,影响速度估计。
3.3 观测方程的构建
观测向量 z 可以设计为:
z = [u1, v1, u2, v2, ..., u8, v8, yaw, s]
其中 (ui, vi) 是八个角点的图像坐标,yaw 是朝向角,s 是框的表观尺寸(比如对角线长度或面积平方根)。
观测方程 h(x) 把状态 x 映射到 z。对于角点,h 就是透视投影;对于 yaw,需要根据状态中的朝向角计算;对于 s,需要根据状态中的位置和已知的目标真实尺寸计算。
这里的关键是:目标真实尺寸是否已知。如果已知,s 的观测方程很直接;如果未知,需要把尺寸也加入状态向量,或者用其他方式估计。Bearing-Box 的场景里,通常假设目标尺寸已知或可在线估计。
3.4 动力学约束的嵌入方式
动力学约束有两种嵌入方式:
- 硬约束:作为等式约束加入滤波,比如用投影法或拉格朗日乘子法。
- 软约束:作为伪观测加入,给一个很大的权重。
我倾向于用软约束,因为硬约束在数值上容易出问题,尤其是当约束之间不一致时。软约束的权重需要调,太大会导致滤波器忽略真实观测,太小则约束不起作用。
具体操作上,可以把动力学约束写成:
vx - v * cos(yaw) = 0 vy - v * sin(yaw) = 0
其中 v 是目标速度大小。这两个等式作为伪观测加入,权重根据对约束的置信度设定。
3.5 滤波器选型与参数整定
EKF 是最常用的选择,计算量小,工程实现成熟。但观测方程里有透视投影和三角函数,线性化误差可能较大。UKF 通过 sigma 点传播,对非线性处理更好,但计算量增加。
我的经验是:如果帧率高、目标运动平稳,EKF 够用;如果目标机动频繁或帧率低,UKF 更稳。参数整定方面,过程噪声 Q 和观测噪声 R 的比值决定了滤波器对模型和观测的信任程度。Bearing-Box 的观测信息量大,R 可以设得相对小一些,让滤波器更信任观测。
但要注意:R 不能设得太小,否则检测框的异常值会直接污染状态估计。我通常会用马氏距离做异常检测,超过阈值的观测直接丢弃或降权。
4. 常见问题与排查技巧实录
4.1 滤波器不收敛或收敛慢
这是最常见的问题。排查思路:
- 检查可观性矩阵的条件数。如果条件数过大,说明某些状态方向仍然弱可观,需要增加观测或调整约束。
- 检查观测噪声 R 是否设得过大,导致观测信息被淹没。
- 检查过程噪声 Q 是否设得过小,导致滤波器对模型过于自信,拒绝观测修正。
我遇到过一次,滤波器对深度估计始终不收敛,后来发现是三维检测框的尺寸观测被错误地关联到了另一个目标。数据关联错误是隐蔽性很强的问题,建议加门控机制。
4.2 深度估计漂移
深度漂移通常是因为深度方向的可观性仍然不足。Bearing-Box 虽然增强了可观性,但如果目标沿视线方向运动缓慢,深度变化在图像上仍然不明显。
应对方法:
- 增加尺度先验,比如已知目标大致尺寸范围,作为软约束。
- 在滤波器里加入深度平滑项,抑制高频漂移。
- 如果场景允许,让相机做主动运动(比如小幅平移),通过视差增强深度可观性。
4.3 朝向角跳变
朝向角的周期性模糊是老大难。我的处理方式:
- 在观测方程里用 sin/cos 表示,避免角度跳变。
- 在数据关联时检查朝向连续性,如果跳变超过阈值,尝试加 π 修正。
- 如果检测网络输出的朝向本身噪声大,考虑用时序滤波平滑。
4.4 计算资源紧张
MAV 上的计算资源有限,EKF 的矩阵运算虽然不大,但如果状态维度高、观测维度高,仍然可能成为瓶颈。优化方向:
- 用稀疏矩阵存储可观性矩阵和雅可比。
- 降低观测维度,比如只选四个角点而不是八个。
- 用固定点迭代代替完整的 UKF。
4.5 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决思路 |
|---|---|---|---|
| 滤波器不收敛 | 可观性不足 | 检查可观性矩阵秩和条件数 | 增加观测或调整约束 |
| 深度估计漂移 | 深度方向弱可观 | 分析深度观测信噪比 | 加尺度先验或主动运动 |
| 朝向角跳变 | 周期性模糊 | 检查朝向角时序连续性 | 用 sin/cos 表示或加 π 修正 |
| 速度估计抖动 | 观测噪声大 | 检查 R 矩阵和检测框抖动 | 低通滤波或增大 R |
| 计算超时 | 矩阵运算量大 | 分析各模块耗时 | 降维或稀疏化 |
5. 工程落地中的经验与建议
5.1 仿真验证先行
在真机上跑之前,强烈建议先在仿真环境里验证。Gazebo 或 AirSim 都可以,把目标运动、相机模型、检测噪声都建进去。仿真的好处是真值已知,可以定量评估估计误差,快速迭代参数。
我在仿真里通常会做几组对比实验:Bearing-only vs Bearing-Box,CV vs CA,EKF vs UKF。这样能清楚地看到可观性增强带来的收益。
5.2 检测框质量决定上限
Bearing-Box 的效果高度依赖三维检测框的质量。如果检测框本身抖动大、朝向不准,再好的滤波器也救不回来。所以检测网络的训练和调优不能省。如果检测框质量上不去,可以考虑用时序检测或跟踪-检测联合优化。
5.3 参数整定要有依据
Q 和 R 的整定不要靠试凑。我的做法是:先根据传感器手册和检测网络在验证集上的误差统计,给出 R 的初始值;再根据目标运动的典型加速度,给出 Q 的初始值。然后在这个基础上微调。
5.4 在线监控可观性
工程系统里,建议在线计算可观性矩阵的条件数,作为健康指标。如果条件数突然变大,说明系统进入了弱可观状态,可以触发降级策略,比如增大过程噪声、切换到更保守的控制模式。
5.5 后续扩展方向
Bearing-Box 的思路可以扩展到多目标场景:每个目标维护一个滤波器,共享相机运动信息。也可以扩展到多传感器融合:把 IMU 的加速度观测加进来,进一步增强可观性。如果目标类型已知,还可以加入形状先验或运动模式库,让动力学约束更精准。
我个人在实际操作中的体会是:单目运动估计的瓶颈往往不在滤波器,而在观测模型的设计。Bearing-Box 给了很好的示范——把检测框的几何信息用足,把动力学约束用对,可观性自然就上来了。这个思路值得在更多场景里尝试。