一个点从世界坐标变成屏幕上的像素,中间要过好几个坐标系。 这一页把这条链拆开数一遍:一共多少个可错的量,哪些是量出来的,哪些是约定的。
世界 / 地图
↓ ← 自车在世界里的位姿(GPS + IMU + 里程计)
自车坐标系
↓ ← 传感器相对车的位置和朝向
传感器坐标系(雷达 / 相机底座)
↓ ← 相机装歪的一点修正
相机光学系(Z 向前,X 向右,Y 向下)
↓ ← 内参 + 畸变
像素坐标
每一个箭头都是一次坐标变换。每一层都可能错,而且错法不一样。
| 段 | 自由度 | 具体是什么 |
|---|---|---|
| 世界到自车 | 6 | 位置 3 加姿态 3,由定位系统提供,通常不标定 |
| 自车到传感器 | 6 | 外参。平移 3 加旋转 3 |
| 相机内参 | 4 | fx、fy、cx、cy |
| 畸变 | 1 到 8 | 看用哪个模型,径向和切向若干项 |
| 时间 | 1 | 两个传感器的时间偏移 |
所以一整套参数是十几个到二十几个数。数量不多,但每一个错法都不同, 而且错在不同自由度上,症状完全不一样。这是后面诊断那页的地基。
比"数自由度"更有用的分类,是问这个量是怎么来的。
| 类型 | 怎么得到 | 错了怎么办 |
|---|---|---|
| 标定量 | 用靶标测出来,或者用数据拟合出来 | 重标。有办法改进 |
| 可在线估计量 | 跑的时候用数据自己估 | 滤波器会收敛。有反馈 |
| 纯约定 | 人为规定的,没有对错 | 标得再准也救不回来 |
标定量错了,你能重标;在线估计量错了,滤波器能收敛。 而约定错了,你手上没有任何信号告诉你错了,因为它是人为规定的,不存在"真值"。
它只会在某一天以一个诡异的现象暴露出来:自己的视图一切正常,跨系统的视图整体错位。
这些在业界都有两套以上的流行写法,而且每一套都有一大批系统在用。 所以"哪种对"这个问题没有意义,有意义的是"两边一致不一致"。
因为两套约定都是自洽的。一个用列优先写的系统,自己跑起来完全正常; 一个用行优先写的系统,自己跑起来也完全正常。
错位只发生在交接处:把 A 的矩阵喂给 B 的时候。 而那时候通常是一堆数字,看不出哪边错了。
如果你要接手一套陌生的数据,按这个顺序做:
① 先列清楚这条链上有几个坐标系,各自叫什么
② 每一段变换,写明它由谁提供、什么格式、什么约定
③ 找出所有"纯约定"项,逐个确认两边一致
④ 剩下才是标定和估计的事
第 ③ 步最容易被跳过,也最容易在联调那天爆炸。
拿一个已知的、简单得能心算的点,比如正前方 10 米、地面上一个点, 手动把它走完整条链,看落点对不对。
如果落点差了一个整数倍的旋转或者整体翻转,那多半是约定问题,不是精度问题。 精度问题不会让结果翻面。
变换链上有十几个可错的量,但真正需要警惕的不是数量,是它们分三类: 量出来的、估出来的、规定出来的。
前两类错了有反馈,第三类没有。所以一套陌生数据到手, 先做约定的一致性检查,再谈标定精度。