03.02 你信任你的激光雷达吗?(第2话)

专栏作者 / Sentinels

首发 / 汽车之心

声明:本文不是官方文档,亦不是某种形式的断言或结论,本文仅仅是技术讨论性质的文章,无论是否用了确定性的语气,作者都不保证内容的准确性和完整性,亦不明示或暗示此文章不是在胡说八道。(事实上,作者过去常常胡说八道并乐此不彼)。因此,所有因采用本文章涉及的方法、数据或其他任何信息,所造成的直接或间接损害,包括但不限于生命和财产损失,作者、撰写团队和平台概不负责。

说到激光雷达的误差校准,常常有一个误区,就是认为:雷达校准好了之后,这个雷达就能完美无瑕的工作.

其实,这只是幻象,我们来看一个完美的雷达依然会出错的例子,这个误差来源于目标,而非雷达本身:

因为众所周知的无奈原因,雷达的光斑在通常情况下存在 2~3mrad 发散角(有时候更是存在严重发散),在几十米外,光斑就有碗口甚至脸盆那么大(甚至更大)。

此时,假设光斑部分射入高反光目标时,将引发 APD 输出不恰当的反射信号,从而产生一个不存在的点,进一步使得整体目标测量产生偏差:

你信任你的激光雷达吗?(第2话)

多数情况下,光斑并不是圆形,APD 的信号波形也并非干净的抛物线,以上仅为示例。

所以,激光雷达在大多数情况下,能解决大部分的问题,但激光雷达不是灵丹妙药。

充其量,它作为主要传感器,只能拉升感知过程中贝叶斯定理的先验概率,让整个系统,看上去更可靠一点。

但过于依赖激光雷达的后果是严重的,无论是字面意思还是引申含义,你都会掉到沟里去。

接着上次的话题(你信任你的激光雷达吗?| 行家说),9 个校准参数中,我们已经讨论了 3 个参数:

我们留了个尾巴,我们在 25 米以上的距离采用固定补偿,25 米以内采用线性补偿,并应用了两点修正法(Two Point Calibration Methodology);

然而,这只是原厂说明书的建议:

你信任你的激光雷达吗?(第2话)

ROS 可不是这样,ROS 驱动其实把两点修正法写了一个全程,不管是不是 25 米,统统应用上去。

不过,它又在配置文件中,默默的把两点修正全关了,这个操作着实有点诡异:

你信任你的激光雷达吗?(第2话)

你信任你的激光雷达吗?(第2话)

所以 ROS 驱动中的写法,这一块也有问题。

不过问题也不大,因为误差并不大,也是 10 厘米以内。

其实 ROS 中打开两点校准,点云会有点「糊」,这涉及到另外一个问题,ROS 驱动即便是没有调用两点校准,它的两点校准法,也写错了。

抛开写错的 2 点校准,我们其实可以进行如下改进:

  • 改进 1: 也加一个 25 米的判断,对 25 米以上的距离,放弃治疗,爱谁谁;
  • 改进 2: 在 0-100 米,多立几个标靶,把 2 点修正法,改成 3 点、4 点甚至 N 点修正法;
  • 改进 3: 上一点黑科技,用其他高精度传感器,如 RTK,IMU 等进行无标靶无监督校准,用非常多的点加以修正,拟合一个标定方程,线性非线性通吃;

不管怎样,这些留待以后再说,我们继续讲解一下两点修正法:

首先的一个大问题:为啥要再修正一次?

上篇(你信任你的激光雷达吗?| 行家说)我们说了,激光雷达在整个量程中,满足一个近似线性变化关系,D = (1+A)*d + B。

这还没完,角度编码器也存在误差,而且这个误差也是根据距离的变化而变化。

按照最初的思想,25 米外,我们放弃治疗了,25 米内,存在一个这样的现象:

假设:我们通过工程模式,把 HDL-64E 的电机给关了,让它停止旋转,并且把整机的方向角调到 0 度,我们在远处拿一个标靶,从 100 米,沿着激光发射的方向,慢慢挪动到距离雷达 1 米处的地方。

如果不应用两点校正法,我们在重构的点云图像上,会看到什么?

你信任你的激光雷达吗?(第2话)

所以 25 米以内的数据,我们得想个办法,让它变成直线(当然,这个曲线曲率用肉眼很难看到)。

实际还原的点云中,XY 两个方向上,均有位移。因此,要对 XY 两个方向进行校正。

X 和 Y 方向是一样的,我们以 X 方向为例:

你信任你的激光雷达吗?(第2话)

Dx :代表在 25 米内的某个点,距离校准的修正值,该修正值仅应用在 x 方向上,这个数值,在 1-25 米处,是近似线性变化的;

D1x:代表在 x 轴方向 2.4 米处,距离校准的修正值,该修正值仅应用在 x 方向上,这个值就是 xml 文件中的「distCorrectionX_」;

你信任你的激光雷达吗?(第2话)

(为什么是 2.4 米,因为雷达在工厂校准站校准时,标靶就放在 2.4 米处,你也可以放在 1.8 米处,然后读个其他数出来)

D2x:这个是 25.04 米处,x 方向上应该被校正的数值,可是,在 25 米处,整体误差已经能够被接受,不再需要进行二次校正,因此 D2x 的值,就是 distCorrection 的值;

X:变量,表示目前,校准前雷达上报的距离;

X1:2.4 米,是个固定的常量,跟工厂的标靶设置有关;

X2:25.04 米,也是个固定的常量,表示需要额外校准的一个上限值,也和标靶的设置有关;

Y 方向是一样的,在此不赘述。

需要注意的是代码的写法,可不能够在 XY 轴上直接加,无论是 distCorrectionX 还是 distCorrectionY,都仅表示校准的是距离本身,不同的是应用在 X 还是 Y 轴方向;

ROS 驱动哪里写的有问题?

它无缘无故加了这么两条,使得整体修正值偏小,而且小不少:

你信任你的激光雷达吗?(第2话)

当然它默认并没有打开两点校正,所以,这个问题完美隐藏。

还有一个有意思的地方,Veloview 的代码,完全看不到两点校正,直接忽视掉了。

所以,HDL- 64E S3 是一款非常优秀的激光雷达(至少是曾经非常优秀)。

然而,大家都没有认真用。

无论是 ROS 驱动,还是 Veloview,甚至原厂说明书,大家都是粗人,谁也别笑话谁。

现在,我们已经讲了这些参数:

你信任你的激光雷达吗?(第2话)

接下来,我们开始讲第一个参数:

rotCorrection_

这个定义非常简单:仅仅是激光逻辑发射方向 PM 跟激光雷达定义发射方向的夹角。

你信任你的激光雷达吗?(第2话)

因此,由简单的几何关系可知(注意,以下为 XY 投影上的讨论,各点的名称在投影上是一样的):

  • P 点的横坐标 xx = PM* sin_rot_angle - OM* cos_rot_angle
  • P 点的纵坐标:yy = PM * cos_rot_angle + OM * sin_rot_angle

其中:

rot_angle = rot_angle_from_sensor + rotCorrection_

很明显,OM 就是那个 horizOffsetCorrection_

最后,回到空间坐标系,我们对 P 点的 Z 轴坐标的计算毫无悬念:

zz = PM* sin_vert_angle + vert_offset*cos_vert_angle;

至此,我们关于测距的 7 个参数就讲完了,总结一下:

  • 1. 激光雷达的原点往往在雷达几何中心,而激光的实际光路并不 care;
  • 2. 激光雷达需要有一个逻辑发射接收点,这个点决定各个参数;
  • 3. 不要信任从 GitHub 上下载的驱动,那是免费软件,是由一群缺乏 KPI 考核的,自由散漫的大神完成;
  • 4. 激光雷达的精度除了和雷达本身的硬件相关之外,既跟校准水平相关,也跟驱动代码的写法相关。
  • 5. 校准可以自己做,不用依赖厂家,校准的方法千变万化,我们之后再开个专题详聊,那简直是五花八门,令人叹为观止;

P.S. 未完待续。下一篇,我们讲解激光反射强度相关的内容,借此来一窥几何光学的玄妙。不要走开哦!


分享到:


相關文章: