研究选读:PnP 观测误差与验证
用受控实验研究角点噪声、平面深度弱约束和 PnP 观测误差;本页可跳过。
本页是研究补充,不影响完整自瞄流程。初次阅读可以跳过,直接进入跟踪与预测。
研究问题
上一页已经讲完从四角点到 tracker-frame 位姿的完整主线。本页只继续研究三个问题:
- 图像角点偏移怎样传播到视线深度和横向位置?
- 误差怎样随距离、姿态和投影尺寸变化?
- 当单帧 PnP 进入连续跟踪后,固定高斯噪声假设还缺少哪些证据?
本节统一使用跟踪坐标系:
x指向云台前方,目标位于视野中央附近时近似对应相机深度;y是水平横向;z是竖直方向;- 每条检测与完全相同曝光时刻的模拟器真值比较。
以下受控样本用于展示误差传播方法和图表读法。新一轮 Linux 全条件采集完成后,研究页会用独立 session、真实时间和显式缺失重新生成数值结论;主线 PnP 接口不会因此改变。
受控实验:只改变目标距离
实验只改变场景中的目标距离,其余条件保持一致:
| 项目 | 设定 |
|---|---|
| 场景 | Daedalus Simulator 原生靶场 |
| 目标 | 3 号靶车,车体位置不变 |
| 自转角速度 | 30°/s |
| 相机 | 6 mm 镜头,1440 × 1080 |
| 场景设置距离 | 2 m、4 m、6 m |
| 单组采集时间 | 20 s |
| 对照真值 | 与图像完全相同曝光时刻的装甲板三维状态 |
逐帧处理顺序如下:
- 从识别输出中读取原始角点和送入 PnP 的修正角点;
- 根据模拟器给出的装甲板中心、法向、固定尺寸和
15°pitch,将真实四个角点投影到同一张图像; - 按检测器的屏幕顺序
左下 → 左上 → 右上 → 右下对齐四个角点; - 将检测角点减去真值角点,得到
(Δu, Δv); - 将 PnP 的
x/y/z减去同一物理装甲板的三维真值。
这里的“左下、左上、右上、右下”只是当前检测器的输出约定。PnP 真正需要的是图像点和三维模型点顺序一致,而不是某一种固定命名。
三组数据最终得到:
| 设置距离 | 匹配后的 PnP 候选 | 独立角点样本 | 唯一曝光 | 时间跨度 | 有效匹配事件率 |
|---|---|---|---|---|---|
2 m | 1974 | 7896 | 1251 | 20.56 s | 60.8 Hz |
4 m | 1625 | 6500 | 1183 | 20.48 s | 57.7 Hz |
6 m | 1408 | 5632 | 1168 | 20.51 s | 56.9 Hz |
| 合计 | 5007 | 20028 | 3602 | — | — |
一帧可以出现多个候选,所以“PnP 候选数”大于“唯一曝光数”。本页绘制空间误差分布时保留匹配后的每个候选;讨论时间相关性时则必须按唯一曝光的真实 timestamp_ns 排序,不能把 CSV 行号当作固定采样时钟。
先看原始角点的误差分布
这张图分三步读
先看图 A:一帧里究竟错在了哪里。 横轴 u 向右增大,纵轴 v 向下增大,这是图像坐标而不是三维坐标。蓝色圆点是依据同一曝光时刻真值计算出的理想角点,红色方点是识别器给出的原始角点。对任意一个角点,都定义
Δu = u_检测 - u_真值,Δv = v_检测 - v_真值。
橙色箭头从真值指向检测结果的方向。为了让一两个像素的偏差能够被看见,箭头长度放大了 4 倍,不能拿箭头的显示长度直接读取误差数值。以左上角为例,箭头主要指向左侧,表示该点的水平坐标被识别得偏小;右下角箭头主要向上,表示其 v 坐标被识别得偏小。四个箭头方向不一致时,识别器不只是把整块装甲板平移了,还改变了四边形的宽度、面积和形状,这些变化会继续传入 PnP。
再看图 B:把 20028 个角点叠在一起。 每个半透明小点代表一个角点,横坐标是它的 Δu,纵坐标是它的 Δv;不同颜色表示 2/4/6 m。十字线交点 (0, 0) 代表完全准确。读这张残差云时可以依次观察三件事:
- 云团中心相对原点的偏移表示系统性偏差。例如整体偏左,意味着检测结果的
u往往比真值小; - 云团在水平、垂直方向上的宽窄表示两个方向的波动大小;椭圆若发生倾斜,则表示
Δu与Δv会一起变化; - 彩色椭圆是根据均值和二维协方差画出的 95% 高斯参考椭圆,用来概括主要方向和尺度,并不是角点合格线。真实分布存在长尾,因此仍会有点落到椭圆外。
最后看图 C:直接读取“误差不超过多少”。 横轴是径向误差 r = sqrt(Δu² + Δv²),只表示误差大小,不再保留方向;纵轴是累计比例。读法是从纵轴选择一个比例,水平移动到曲线,再向下读取像素值。例如纵轴 0.5 与三条曲线的交点就是 p50:一半角点的误差不超过该值;纵轴 0.95 对应 p95。曲线越靠左,整体误差越小;曲线接近 1.0 后仍缓慢延伸,表示少数长尾样本。
| 距离 | 原始角点 p50 | 原始角点 p95 | 原始角点 p99 | Δu 均值 | Δv 均值 |
|---|---|---|---|---|---|
2 m | 1.48 px | 3.77 px | 6.56 px | -0.16 px | -0.21 px |
4 m | 1.24 px | 3.16 px | 4.70 px | -0.30 px | -0.29 px |
6 m | 1.31 px | 3.30 px | 5.00 px | -0.03 px | -0.18 px |
这些数据表现出四个规律。
第一,多数角点落在 1–2 px 的误差范围内,但 95% 和 99% 分位明显更大。后续算法如果只根据平均值生成高斯噪声,会低估偶尔出现的大误差。
第二,像素误差没有随距离单调增加。角点误差首先由成像、检测器和局部图像纹理决定;真正随距离迅速放大的是同一像素误差传到三维空间后的结果。
第三,四个角点并不服从完全相同的分布。以 4 m 为例,左下角的水平残差均值约为 -0.76 px,右上角约为 +0.18 px。这类相反方向的误差会改变四边形宽度或面积,比四个点一起平移更容易扰动深度和 yaw。
第四,亚像素修正会改变误差分布,却不保证每一个工况、每一个角点都更接近物理真值。本次数据中,修正角点径向误差的 p50 分别为 1.79 px、1.34 px、1.06 px。因此应当用真值实验评价修正算法,而不是仅凭“使用了亚像素”判断角点更准。
四个角点的误差可以拆成哪些形态
观察一个四边形时,可以把四个角点的联合扰动粗略拆成几类:
- 四个点同向移动:主要改变图像中心,横向和竖直位置随之变化;
- 左右两侧向内或向外移动:改变投影宽度和面积,主要扰动深度;
- 上下两侧反向移动:改变高度、pitch 相关约束和竖直位置;
- 两条边发生不一致的倾斜:改变四边形形状,影响 yaw、候选解和重投影误差。
这也是为什么角点网络除了平均误差,还值得观察每个角点的偏差、协方差、置信度以及四个点之间的相关性。
为什么相同的像素误差会放大成深度误差
先把装甲板简化成已知宽度为 W 的平面目标。它在图像中的投影宽度为 w,相机焦距为 f_x,则有近似关系:
Z_c ≈ f_x W / w
对投影宽度施加一个小扰动,可以得到:
ΔZ_c / Z_c ≈ -Δw / w
当目标变远时,装甲板在图像里占用的像素更少,同样 1 px 的宽度误差会占据更大的相对比例,于是深度误差被放大。实际装甲板带有 yaw 和固定 pitch,四边形也可能是梯形,因此实验图使用 sqrt(投影面积) 描述整体尺度;它和上面的宽度近似表达的是同一个几何机制。
图像中心更直接地约束横向和竖直方向,投影尺度则承担了主要的深度约束。平面目标的深度通常是较弱的方向,所以误差不会平均分配到 x/y/z。
PnP 之后的 x、y、z 是三种不同的分布
小提琴图应该怎样读
这里画的是有符号坐标误差:e_x = x_PnP - x_真值,e_y 和 e_z 同理。横轴的黑色虚线是零误差。点落在虚线左侧表示 PnP 算出的坐标比真值小,落在右侧表示比真值大。由于 x 指向前方,e_x < 0 可以直观理解为“距离算近了”,e_x > 0 则是“距离算远了”。
每个横向“小提琴”对应一个距离下的全部观测。某个误差位置越厚,说明数据越常出现在这里;它的厚度是出现密度,不能当成误差数值。图中符号的含义是:
- 白心圆点:中位数,左右各有一半样本;
- 粗线:25%–75% 区间,也就是最中间的一半样本;
- 细线:5%–95% 区间,表示大部分常见观测的跨度;
- 淡色外形:误差密度。为避免极端值把主体压得太窄,只显示 0.5%–99.5% 范围,窗口外的 52 个点仍保留在统计中。
读图时先在同一个子图中从 2 m 比到 6 m。最上面的 x 图从十几厘米逐渐扩展到接近米级,而 y/z 仍集中在几厘米内,说明距离增加后主要被放大的是前向深度误差。三个子图使用各自的横轴尺度,所以不能用蓝、橙、绿“小提琴”的视觉宽度直接比较三个坐标;应当读取横轴刻度或下表的绝对误差分位数。
还可以观察小提琴是否以零线为中心、左右是否对称。偏离零线表示偏差,左右长短不同表示正负方向的长尾不同,中间出现多个鼓包则意味着不同姿态或候选解可能形成了不同的误差群体。
下面再用绝对误差分位数比较三个方向,单位均为厘米:
| 距离 | x 绝对误差 p50 / p95 | y 绝对误差 p50 / p95 | z 绝对误差 p50 / p95 |
|---|---|---|---|
2 m | 6.18 / 20.17 | 0.27 / 1.69 | 0.49 / 1.51 |
4 m | 16.06 / 66.65 | 0.39 / 1.90 | 0.65 / 2.68 |
6 m | 28.81 / 102.88 | 0.37 / 1.79 | 0.81 / 2.91 |
最明显的规律是 x 方向误差随距离迅速增长:中位绝对误差从约 6 cm 增加到约 29 cm,95% 分位在 6 m 已超过 1 m。y/z 的典型误差仍在厘米量级,说明弱约束主要沿前向、近似深度方向传播。
误差还包含随工况变化的偏差。x 的有符号均值在 2/4/6 m 分别约为 -1.39 cm、+8.10 cm、-16.04 cm。它不是一个可以从所有观测中减掉的固定常量,而会随距离、姿态、角点形状和当前候选解变化。
三个坐标也不是彼此独立的
只分别画 x/y/z 的直方图叫作边缘分布;EKF 的观测协方差还关心它们的联合变化。本次数据中,x 与 z 的误差相关系数始终很高:
| 距离 | corr(e_x, e_z) | corr(e_x, e_y) |
|---|---|---|
2 m | -0.961 | +0.069 |
4 m | -0.978 | -0.385 |
6 m | -0.971 | -0.161 |
这意味着观测噪声的主要方向在三维坐标中是倾斜的。把 R 写成三个互不相关的固定方差,会丢掉这条几何耦合;更完整的模型应当使用协方差矩阵,并继续研究它怎样随距离和装甲板朝向变化。
从误差分布走向 EKF
图 A:从四边形尺度一路读到深度
横轴描述送入 PnP 的四边形看起来比真值大了还是小了。这里用 sqrt(四边形面积) 作为线性尺度,因此 +5% 表示检测四边形的线性尺度比真值大约 5%,-5% 表示大约小 5%。纵轴是视线方向的位置误差除以真实距离;纵轴 -5% 表示算出的距离比真值近约 5%。
每个淡色点是一帧观测,颜色区分 2/4/6 m。同一种颜色的粗折线先把横轴分段,再计算每一段的纵轴中位数,因此它显示的是大量散点的总体趋势。灰色虚线是小扰动近似 相对深度误差 ≈ -尺度误差。
从左上到右下的趋势就是本图的核心:四边形偏大时,PnP 会认为同样大小的实体离相机更近;四边形偏小时,PnP 会把它算远。例如横轴约为 +5% 时,三条中位趋势大多落在负值一侧。三组数据的相关系数分别为 -0.57、-0.67、-0.68,说明尺度是深度误差的重要来源,但不是唯一来源。散点没有全部落在虚线上,是因为 PnP 还同时利用梯形形状、四个角点各自的位置、固定尺寸、15° pitch 和相机模型。
这张图把角点误差与 EKF 连了起来:后续设置测量噪声时,投影尺度、距离或角点质量都可以成为调整深度方向 R 的依据。
图 B:为什么滤波器还要关心时间
这一部分不属于单帧 PnP。PnP 只求当前曝光的位姿;只有把一串 PnP 观测送入 tracker/EKF 后,才需要研究相邻观测之间的时间和相关性。
横轴“滞后帧数”表示把误差序列与向后错开多少帧的自己比较,纵轴是两者的相关系数。滞后 0 时比较的是序列与自身,所以必然等于 1。滞后 1 才回答“这一帧与下一帧有多像”。
以 2 m 蓝线为例,滞后 1 个有效曝光约为 0.66,表示相邻有效观测的深度误差具有明显的同向关系:这一条若算得偏远,下一条也更容易继续偏远。它不表示“66% 的误差数值会原样保留”。4 m 和 6 m 的一事件相关系数约为 0.50、0.38,随后随滞后增加逐渐衰减。
但这张历史图的横轴不是稳定的物理时间。三组数据的唯一曝光间隔中位数约为 12.0–15.5 ms,p95 已达到 29.3–37.3 ms,最大间隔为 90.5–187.7 ms。所以它只能说明“相邻有效观测不是白噪声”,不能说明相关性会在固定多少毫秒后消失。
当前 120-run 证据把这个问题改为真实时间合同:
| 运动 | valid-event 间隔 p50 / p95 / p99 / max | valid-event 缺失段 p95 / p99 / max |
|---|---|---|
| spin | 7.95 / 23.48 / 32.75 / 592.19 ms | 144.09 / 275.18 / 558.00 ms |
| combined | 7.93 / 24.05 / 33.13 / 339.43 ms | 79.74 / 191.78 / 15021.28 ms |
combined 的最大缺失段包含整轮零观测。典型间隔接近 8 ms 与数百毫秒、甚至整轮缺失并不矛盾;平均 FPS、预览 FPS、物理 250 Hz 和采集配置上限 200 Hz 都不能替代逐事件时间戳。
相邻图像具有相似的姿态、像素占用、边缘纹理和检测状态,因此角点偏差可能连续多个事件朝同一方向。EKF 常用的白噪声假设把各次噪声视为独立;这张图说明它在这里是近似。后续评价滤波器时,需要按真实时间检查创新序列、自相关和 missingness,否则滤波器可能把连续偏差当成真实运动。
图 C:实际分布与理想高斯分布差在哪里
Q–Q 图不是误差随时间的曲线。它先把每组视线误差减去均值、除以标准差,再将从小到大的实测分位数与理想标准高斯分位数逐一配对。横轴是“如果数据服从高斯分布,这个排序位置应该是多少”,纵轴是“实测数据在同一排序位置是多少”。标准化去掉了厘米尺度差异,因此这里比较的是分布形状。
灰色虚线代表理想高斯分布。中部曲线靠近直线,说明多数普通观测可以用高斯模型近似;两端逐渐离开直线,尤其左端的 6 m 和右端的 2/4 m 更远,说明极端误差出现得比理想高斯更频繁,也就是长尾。曲线两端的上下方向还反映正、负尾部并不完全对称。
因此,EKF 的协方差 R 可以描述主体噪声,却不适合独自解释所有极端观测。距离和观测质量可以用来调整 R,超出当前模型的样本则需要创新门控或稳健处理。
观测轨迹与运动模型
目标绕固定中心做刚体旋转时,同一块装甲板在水平面内的真实位置可以写成:
q(t) = p(t) - c
q(t) = r [cos θ(t), sin θ(t)]ᵀ这里 c 是旋转中心,r 是装甲板到中心的固定半径。若转速近似恒定,还可以写成 θ(t) = θ₀ + ωt。圆模型因此只需要圆心、半径、初相位和角速度;如果轨迹不是圆,这几个量就不再足够。
先看俯视图
下图固定 yaw=0°、spin=4 rad/s 和同一物理装甲板槽位,只改变目标距离。每个浅蓝点是一帧 PnP 观测;所有位置都减去了同曝光真值旋转中心。黑色虚线是真值圆弧,深蓝线和红线分别是在这些离散观测上拟合的圆模型和椭圆模型。
图上可以直接看到:2.2 m 时离散点仍围绕真值圆弧;距离增加后,点云主要沿前向拉开。6.0 m 的这段观测确实可以被一条椭圆曲线贴合,但这只能说明当前片段“看起来像椭圆”,还不能证明换一个 session 或相位区间后仍是同一个椭圆。
完整的 63,029 条纯旋转配对数据给出了误差来源:相机射线夹角误差 p95 只有 0.104°,横向误差 p95 为 28.3 mm,视线深度误差 p95 却达到 0.814 m;半径误差与视线深度误差的相关系数为 0.942。因此图中的前向拉伸主要来自 PnP 深度,而不是目标真的改变了旋转半径。
再用独立 session 和未见相位检验拟合曲线:
| 检验 | 圆模型 | 椭圆模型 |
|---|---|---|
| 跨独立 session 的 RMSE 中位数 | 0.266 m | 0.257 m |
| 连续相位留出的 RMSE 中位数 | 0.251 m | 0.300 m |
椭圆能够更贴近某些已见片段,却没有表现出稳定的跨 session、跨相位优势。教程因此不把“圆必然被观测成椭圆”作为固定规律,也不会因为真值是圆就强迫所有 PnP 点落在圆上。
怎样选择后续模型
- PnP 把圆周观测成了非圆形。 先建模深度不确定性;短时旋转相位和瞄准方向可以优先在射线或角度域估计。
- 目标的真实轨迹本身就不是圆。 此时“固定半径 + 单一
ω”确实不够,需要同时估计椭圆长短轴与朝向,或使用随相位变化的半径、曲率和更一般的轨迹模型。
短圆弧、短椭圆弧和一般平滑曲线在有限视角下可能很相似。真正决定采用哪一种模型的,不是曲线的名字,而是它能否在未见 session 和未见相位上继续预测准确。
yaw 正对时为什么更容易抖动
装甲板正对相机时,投影面积和水平宽度接近最大值。此处 area ≈ |cos(yaw)| 的曲线接近平坦:yaw 发生一个很小的变化,图像面积几乎不变。相同大小的角点扰动便可能对应更大的 yaw 变化,这就是正对姿态附近的弱可观性。
左边看斜率,右边看同一扰动对应多少种姿态
左图横轴是 yaw,中央橙色虚线表示 yaw = 0°,也就是装甲板正对相机;纵轴是装甲板在图像中的投影面积。蓝色曲线使用简化关系 area ∝ |cos(yaw)|。正对时面积最大,但曲线顶部接近平坦:yaw 从 0° 发生很小变化时,投影面积只发生二阶小量的变化。换句话说,图像面积几乎没有提供足够斜率去反推出这个很小的 yaw。
右图把这种弱约束放回四个角点。橙点代表理想角点,红色短线表示相同量级的像素扰动。正对附近,若几组不同 yaw 产生的宽度和面积差异本来就很小,那么同样的一两个像素扰动就能让多个 yaw 候选都解释当前图像,单帧解算值便容易跳动。面积关系对 +yaw 与 -yaw 还是对称的,四边形的其他形状信息需要共同承担方向判别。
因此,图中“曲线平坦”不是说 PnP 在正对时必然失败,而是说 yaw 对角点噪声更敏感。深度误差和正对时的 yaw 抖动属于同一类问题:当前图像对某个状态量提供的几何约束较弱。进入 EKF 后,可以利用连续帧运动约束平滑单帧 yaw,但滤波器的观测可信度仍应随姿态变化。
带着哪些数据进入下一节
后续讲 EKF 时,我们会把这一节的历史观测当作机制示例,把最新证据登记当作数值边界,而不是先凭经验给 R 填一个常数。当前还没有通过 condition-wise repeat-held coverage 的概率校准,因此不能宣称已有生产可用的观测协方差。需要继续使用的信息包括:
x/y/z/yaw的有符号误差、方差和协方差;- 目标距离、投影面积、角点误差与装甲板朝向;
- 误差的长尾分位数和创新门控覆盖率;
- 同一物理装甲板连续观测的真实时间间隔、自相关与缺失段;
- 观测轨迹的半径、曲率、相位和候选几何模型在留出 session 上的残差;
- 装甲板切换、候选解切换和短暂漏检发生的时刻。
实验脚本、三组受控采集清单、逐角点 CSV、逐观测 CSV、完整统计摘要和探索性分析报告可从教程站直接打开:experiments/pnp-coordinate-error。该页面不依赖 GitHub 仓库权限;PNG 用于网页阅读,SVG 可以继续编辑或用于后续排版。