第一步 雷达型号

本节将对4种雷达进行室外环境下的对比建图实验,并进行地图分析,最终给出每种雷达的最优参数。

4种雷达分别为:

1 倍加福的二维激光雷达-R2000(型号貌似只有一种):

在10Hz频率下角分辨率能达到0.042度,频率越高角分辨率越大。当出点数太多时carto会出现drop points 的情况,如下实验是在25Hz的最大出点数的情况下进行的,也就是25Hz允许的最小角分辨率。跑carto雷达的频率最好是35-40Hz之间,这个频率caro不出现drop points的出点数还需再进行试验。雷达最远范围大致为30m.

2 velodyne的VLP-16:

16线雷达,18.08Hz,每秒点数为30万;逆时针旋转,Y轴向前,X轴向右;电机RPM可以为300,600,900,1200,对应的角分辨率分别为0.1,0.2,0.3,0.4度。最远大致为130m。

需要用VLP-16分别进行二维与三维的建图实验。

3 hokuyo:

4 sick:

第二步 实验结果对比

1 倍加福雷达-2D-室内:

1.1 只用倍加福雷达,雷达频率25hz,打开online这个参数,其余默认。

1.2 倍加福雷达25hz+9轴imu,没开online

雷达最远范围设置为15米(因为距离远了偏差一点角度,最远处的偏差就很明显)。

经过调参之后的建图效果(使用默认参数建不成地图):

2 倍加福雷达-2D-室外:

2.1 25hz雷达+online

下图中绿点是起始点,红点是终止点,可以看到,图中的圆弧部分产生了偏移,并且非常明显。后来找原因是由于闭环没有闭环上导致的。

下图为carto中的约束的显示,中间部分相距10米左右的部分并没有检测出来闭环约束,导致了建图的偏差很大。

所以,第二次又进行实验,这次控制机器人回到起始点,以让他能够找到闭环。可以看到,圆弧部分的偏差很小,成功的添加了闭环约束并进行了累计误差的消除。同时,也可以得到,carto的后端优化不能很好的消除累计误差,主要是靠闭环约束来消除累计误差的。 

3 vlp16-室内-2D

3.1 imu猜测

室内环境下进行建图,实验了半个月始终建不成图,困扰了很久。什么叫建不成图呢,结果如下图所示:

这是在配置了使用imu的时候才出现这种情况。如果是laser+online,或者是laser+odom,都不会出现这种状况。所以基本可以确定是imu的原因,但具体是什么就不知道了。

那原因是什么呢?探索了很久。。。很久。。。得有半个月吧。这期间实验了carto的各种调参,各种录制数据包,都是不行。

原因猜测1:

加速度太大,导致Imu数据不好。结果录制了全程慢速的数据包,还是会飘。。。

原因猜测2:

urdf的问题。由于我用的是9轴的Imu,型号如下,但是我实际放置imu的位置和urdf的位置不一致。在carto的github的issue中官方人员说这种强烈的旋转是由于urdf不对导致的。之后我又把urdf调整正确,发现效果确实好很多,但是还是会在某一时刻发生莫名的旋转导致图重叠。所以这个原因也不能解决我的问题。

原因猜测3:

carto的github的issue中遇到差不多问题的人提供了一种解决方案,就是将 imu的角速度中的x ,y 设置为0,他说他imu不准,这样只用z轴的角速度。我自己试了,还是不行。。。

这没啥办法了。。。换一个Imu试试,由于carto需要角速度和线速度,实验室还有一个4轴的Imu,数据量不够所以一直不愿意用。。。而且9轴的频率可以设置为200hz,最好400hz。4轴的这个最高只有100hz。为了让大家少走弯路所以我将具体型号放出来了。换上了这个imu之后发现数据非常稳定,一点也不漂,就是在突然停车时点云会冲出去一下,不能瞬间停住,但是caro会将他修回来,不会影响建图效果。

真实原因(补充):

经过对4轴和9轴的imu进行对比测试,发现9轴imu的数据准确度确实没有4轴imu高,但是也没有差很多。后来经过对lua文件进行调参,发现imu并不是影响地图强烈旋转的主要因素。

主要因素是ceres的平移和旋转的权重没有进行重新配置,当时使用的是默认的权重参数。

3.2 使用默认参数 建图效果如下:

参数配置为 laser(20hz)+imu,

submap.num_range_data=60,

num_accumulated_range_data = 2 (velodyne在20hz时只能输出一半的点云,所以这个参数设置为2,2帧scan为一个完整的点云)

 (注:velodyne 在20hz下可以输出360度范围的点云,当时只改了launch里的电机转速为1200,没进雷达的配置网页里改rpm。)

POSE_GRAPH.optimize_every_n_nodes = 60. 没开online的结果如下:

开了online,并把submap.num_range_data=40(因为发现地图的偏移比较大)。结果如下:

好吧,开与不开感觉没啥区别。。。github的issue中官方人员说,在urdf不准时只用laser+online 依然可以很好的建图。urdf和imu准了online的效果就一般了???

虽然稍微有点偏,但是终于建成图了,还是很开心的。同时,在调参时发现,室内场景下,当雷达的范围为100米时,建图时只要稍微偏了一度,那这个100米的边就偏出去很大,所以可以得知,并不是雷达的范围越远越好。而且,velodyne的频率为10hz,在20hz时只有一半的点云,而carto的扫描匹配 是 对雷达的频率 依赖比较高的。因为只有频率越高,2帧间的时间越短,误差才能越小。所以20hz的频率的累积误差是很大的,室内环境下都会发生较明显的偏移。

caro的demo的数据包的雷达频率不知道怎么写的驱动,雷达的频率能达到1500hz,每一帧数据只有大概10度的点云,可能是这样数据处理起来比较省资源???

3.3 经过调参之后的效果:

图的质量总是上不去,每次旋转都会有偏差,虽然后端优化能够修正一下但不会完全消除误差。

大致猜测是由于雷达频率的问题,20hz的点云只有一半,就相当去10hz的雷达数据,频率太低导致预测的偏差很大,难以修正回来。之前使用倍加福雷达在30hz时这样的旋转偏差就很微小。

不管怎么调参,在旋转时机器人位姿都会向当前朝向的右侧偏,还不知道原因,还有待深入发掘实验。

4 vlp16-室内-3D

还是用的20hz的velodyne,4轴的imu,submap.num_range_data=90, POSE_GRAPH.optimize_every_n_nodes = 90

一次成图,实验了将 POSE_GRAPH.optimize_every_n_nodes = 0 ,即不进行后端优化,发现建图效果依然很好,从房间里走出去,在走廊转一圈回到房间时点云依然能房间匹配上。

点云图如下:

 

4.1 如何生成点云:

使用asset,具体说明https://google-cartographer-ros.readthedocs.io/en/latest/assets_writer.html

voxel_filter_and_remove_moving_objects 这个配置可以去处移动的物体。这个配置文件读取pbstream,和bag,可以生成ply和pcd 两种类型的点云。还可以生成点云的图片的3视图图片,透视效果。

--assets_writer_vlp16_3d.lua
 
VOXEL_SIZE = 5e-2
include "transform.lua"
 
options = {
  tracking_frame = "footprint",
  pipeline = {
    {
      action = "min_max_range_filter",
      min_range = 0.2,
      max_range = 100.,
    },
    {
      action = "voxel_filter_and_remove_moving_objects",
      voxel_size = 0.1,
    },
    {
      action = "dump_num_points",
    },
 
    {
      action = "intensity_to_color",
      min_intensity = 0.,
      max_intensity = 4095.,
    },
 
    -- We also write a PLY file at this stage, because gray points look good.
    -- The points in the PLY can be visualized using
    -- https://github.com/googlecartographer/point_cloud_viewer.
--    {
--      action = "write_ply",
--      filename = "points.ply",
--    },
    {
      action = "write_pcd",
      filename = "b3-2imu-backend+offline.pcd",
    },
 
    {
      action = "write_xray_image",
      voxel_size = VOXEL_SIZE,
      filename = "xray_xy_all_intensity",
      transform = XY_TRANSFORM,
    },
  }
}
return options

第一个点云地图是没加voxel_filter_and_remove_moving_objects的效果,下图是加了voxel_filter_and_remove_moving_objects之后的结果,发现点云图确实干净了一些,但是它也把地面删去了不少。

4.2 如何看点云:

谷歌的文档说可以通过 point_cloud_viewer or meshlab 看 ply的点云。point_cloud_viewer 的安装可以参考如下链接:

https://blog.csdn.net/chongzi865458/article/details/84137531 

我根据这个安装了一下,安装过程特别繁琐。。。装完了之后发现是全黑屏,以为没打开,结果是太黑了。。。我真是醉了,一直按8调亮亮度,发现了点云,结果动起来特别卡,旋转操作也没太清楚,一卡一卡的根本调整不到好视角,可能是由于我工控机的显卡驱动没装的原因。

也装了meshlab。。。没找到能打开的文件。。。不懂这个。

我是用hdl_localization看的点云图,他能加载pcd的点云。

 

下图是我用9轴的Imu和20hz的雷达 使用 hdl_graph_slam 建的点云图,这个slam能够时实的生成点云图,不像carto只能后期处理。大致一看效果还不错,但是发现他的地面翘起来了。

在配置hdl的时候出现了一个问题,就是机器人在不动的时候始终 向上 或者 向下 跳动,并且一下向下。后来发现是launch配置雷达高度的问题,hdl根据雷达高度检测地面,而地面对于hdl是一个很强的约束,后来把高度调对了就好了很多。

4.3 调参之后的效果

vlp+9轴imu,没开online,参数大致调了调,没太细调,还是有点偏差的。由于我对点云还不太了解,很难查看偏差的程度,只能通过肉眼观察偏差。

以为pbstream单纯保存位姿,想着用3d 的pbstream文件生成二维的栅格地图,结果发现pbstream文件中会将点云也保存下来,并不能用于生成二维地图。

5 vlp16-室外-2D

还是存在和室内一样的问题,在纯旋转时地图会偏移很大。

经过调参之后的地图:

在走到尽头之后再回来之后的地图不能完全重叠,会产生偏移,因此这是走了一遍的结果。

在建图的过程中发现,雷达点的跳动达到10CM,因此地图的边为10cm,由于旋转导致的偏移能够到30cm。

 

6 vlp16-室外-3D

室外环境,使用vlp-16 20hz + 9轴imu 。这9轴imu在后续的实验中发现imu数据本身问题不太大,只不过数据没有4轴的那个准。后来我将使用200hz的imu建成了室外环境的3d图。当然,我把imu的link 改成正确的了,之前imu是随意贴的。

效果非常好,墙很直,误差也很小。跑的过程中的内存占用和cpu占用都不多。

但是2d的内存占用非常高,跑5分钟就已经占7个G了,所以到现在为止vlp-16室外的二维图还没有做出来。不过有一点很奇怪,我用倍加福25hz跑室外时内存占用不高,用vlp16 20hz(可以看成10hz) 时内存占用就很高。(原因为 submap大小的值设置的太小,室外环境下设置为40,太小,导致了内存占用过高)。

 

 

第三步 实验分析

1 carto对雷达频率要求比较高

在纯旋转的状态下,分别用10hz, 20hz, 30hz +9轴imu 进行建图实验。

10hz情况下:

20hz情况下:

30hz情况下:

结果:

发现当频率达到30hz时,做纯旋转运动时不会产生地图的偏移。

2 vlp16 20hz 时整体地图会向前进方向的右侧偏,目前没找到原因。

 

3 vlp16 室外情况下,地图的边为10cm,旋转导致的偏移将偏差30cm,并且在远处偏移更多。