自学内容网 自学内容网

【Chrono Engine学习总结】5-sensor-5.3-LiDAR扫描顺序、时间戳计算与去畸变

Chrono仿真LiDAR是可以模拟出运动畸变的,也可以根据扫描顺序赋予每个点一个时间戳。本文用于记录整理。

1、如何开启去畸变

Chrono中,每个sensor都有一个 采集窗口(collection window),经测试,需要将这个采集窗口设置非0,才能看出来畸变。
一个典型的LiDAR.json配置文件如下(按照Ouster32线雷达):

{
  "Name": "Ouster32",
  "Type": "Sensor",
  "Template": "Lidar",
  "Properties": {
    "Update Rate": 10,
    "Width": 1024,
    "Height": 32,
    "Horizontal Field of View": 6.28318530718,
    "Max Vertical Angle": 0.3926990817, // 22.5 deg
    "Min Vertical Angle": -0.3926990817, // -22.5 deg
    "Max Distance": 200.0,
    "Lag": 0.00,
    "Collection Window": 0.1,
    "Divergence Angle": 0.0,
    "Sample Radius": 2,
    "Return Mode": "STRONGEST_RETURN"
  },

其中"Collection Window"设置为0.1s,这意味着10Hz更新,每次更新的窗口是0.1s,符合机械式雷达扫描的基本原理。

2、确定扫描方向

Chrono文档中并没有找到哪里描述LiDAR的扫描方向,所以测一下。
首先在chrono中搭建了四面墙,lidar放到中间,然后沿x正方向高速运动,此时墙的“缺口”就是扫描的起止点。
在这里插入图片描述
这个图中可以看到,缺口在x的负方向。地面一个格子1m,缺口0.5m,我们设置的速度5m/s,符合预期。由于lidar向x+方向运动,所以x-方向应该是开始时近、结束时远,因此我们可以确定,扫描顺序是从 x的负轴,逆时针旋转。即:(x -) -> (y-) -> (x+) -> (y+) -> 回(x -)。

3、时间戳计算

确定了扫描的方向,我们就可以根据扫描的角度判断是什么时刻扫到的。
采用atan2(y,x)函数进行计算。该函数的输出范围是 (-pi, pi]:
在这里插入图片描述
那么,就可以根据这个点到的角度,在(-pi, pi]之间的占比,判断扫描时间。部分代码如下:

double angle = atan2(y, x);
angle += PI;
vp.t = (angle / (2*PI)) * dt;

在rviz中按照t字段颜色显示(从红到绿),如下:
在这里插入图片描述
可以看出,扫描开始时红色,截止时绿色,符合预期。

4、注意事项

如果运行SLAM算法需要去畸变,用chrono仿真的结果需要注意:

  1. 去畸变有两类代码实现,一种是根据时间戳,直接去畸变,例如fastlio、liosam、pointlio等;另一种是根据这个点的角度推算时间戳,一些早期的代码可能当时并没有带时间戳的lidar,所以用这种方式进行推断,例如LOAM, Lego-LOAM, Lio-Mapping等,这类方法需要注意他们的计算的lidar可能并不是和chrono的扫描方向一致。例如,liomapping采用ouster/velodyne的扫描方向如下:
    在这里插入图片描述

所以这种情况下需要去改源码,搞清楚 ±pi 的一些操作。

  1. 如果要给时间戳,注意单位,有的是ns,有的是s

原文地址:https://blog.csdn.net/tfb760/article/details/143694666

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!