今天找了近两个小时的室内激光SLAM,目的是为了获得ground true,以方便检验我程序的准确度。毕竟只用室外环境的话,从效果来讲和室内还是不太一样的。室内环境更加复杂,特征更多,配准精度应该更高。
哦,从这个角度讲,我可以用kitti数据集的,只要kitti数据集效果过的去,室内就没啥问题了。
后续,自己用机器人来录个包,手动控制机器人沿着固定的路线走就可以了。比如走在正中间,之后想办法在点云中做出一个正中间的轨迹,用evo评估也可以的。
之所以希望精确,其实还是希望能够更加科学。
我以为Cartographers的3D数据集包含了ground true,显然我想多了。
更夸张的是,他的点云数据很诡异,刷新频率超级高(每次一个小的扫描角),以至于我怀疑根本没办法用我们之前的算法配准,还得先做个预处理。最尴尬的是,这个预处理是没必要的。因为现在开发的激光雷达基本都不是那个模式的。
另一个尴尬的地方是,他的点云数据竟然会分为horizontal和vertical。我不太懂怎么会这个样子的。
不过还是讲讲拿到点云包以后怎么在rviz中演示吧。
最自然的想法是,打开Terminal,输入rviz
,然后rosbag play xx.bag
,再在rviz中Add一个PointCloud2类型,选择为点云的topic。
然而事情总是不会这么简单,你会看到这样一个报错:For Frame [xx]: Frame [yy] does not exist.
原因很简单,我们打开rviz,全局视图应该是map,但我们接收的是点云的话题xx,这样两个信息融合的时候必须要一个tf信息。
解决办法也很简单,直接用tf来发布一个就好了。
于是打开新的terminal,输入rosrun tf static_transform_publisher 0 0 0 0 0 0 xx yy 100
参数分别是 x y z yaw pitch roll frame id child_frame_id period(ms)。
然而,新的问题会出现,大概会告诉你:Message removed because it is too old
。
解决方法是,在rosbag play 的命令中加入 --clock
再打开terminal,输入rosparam set use_sim_time true
。
以上操作的目的是让所有结点使用仿真时间而不是wall time,时间统一后,也就不存在时间戳太老的问题。
Over。