第一步 雷达型号
本节将对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时,做纯旋转运动时不会产生地图的偏移。