在将rslidar通过github上开源的工具包转换成velodyne的点云格式后,运行测试lego-loam时遇到了关于kdtree的报错问提:
[pcl::KdTreeFLANN::setInputCloud] Cannot create a KD Tree with an empty input cloud!
然后在lego-loam的github主页上找到了最相关的issue,原因是Lego-loam可以处理VLP-16中的Nan点,但是对其它Lidar sensor的数据格式中的Nan点不能很好地处理
截图如下:
将上述代码添加到lego-loam自带的run.launch文件中即可,如下:
<launch>
<!--- Sim Time -->
<param name="/use_sim_time" value="true" />
<param name="/use_sim_time" value="true" />
<node pkg="nodelet" type="nodelet" name="pcl_manager" args="manager" output="screen" />
<!-- Run a passthrough filter to clean NaNs -->
<node pkg="nodelet" type="nodelet" name="passthrough" args="load pcl/PassThrough pcl_manager" output="screen">
<remap from="~input" to="/rslidar_points" />
<remap from="/passthrough/output" to="/velodyne_points" />
<rosparam>
filter_field_name: z
filter_limit_negative: True
</rosparam>
<rosparam>
filter_field_name: x
filter_limit_negative: True
</rosparam>
<rosparam>
filter_field_name: y
filter_limit_negative: True
</rosparam>
</node>
<!--- Run Rviz-->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find lego_loam)/launch/test.rviz" />
<!--- TF -->
<node pkg="tf" type="static_transform_publisher" name="camera_init_to_map" args="0 0 0 1.570795 0 1.570795 /map /camera_init 10" />
<node pkg="tf" type="static_transform_publisher" name="base_link_to_camera" args="0 0 0 -1.570795 -1.570795 0 /camera /base_link 10" />
<!--- LeGO-LOAM -->
<node pkg="lego_loam" type="imageProjection" name="imageProjection" output="screen"/>
<node pkg="lego_loam" type="featureAssociation" name="featureAssociation" output="screen"/>
<node pkg="lego_loam" type="mapOptmization" name="mapOptmization" output="screen"/>
<node pkg="lego_loam" type="transformFusion" name="transformFusion" output="screen"/>
</launch>
其实从上面的launch文件可以看到:去除Nan点的程序中已经将rslidar_points作为输入,输出是velodyne_points,因此在最开始提到的将rslidar_points转换成velodyne_points是没有必要的.
接下来记录用robosense的lidar录制到的原始数据包(.bag)跑通lego-loam:
测试时报错:Failed to find match for field 'ring'
因为Velodyne的雷达单独有一个ring通道,而robosense的雷达好像并没有,在代码中可以将这一功能关闭,在include文件夹的utility.h文件中,将
extern const bool useCloudRing = false;
即可.(Notes:改完之后要记得重新catkin_make整个lego-loam项目,最开始我就忘了,导致浪费很多时间~~~~~)
接下来分别执行
source devel/setup.bash
roslaunch lego_loam run.launch
和
rosbag play LI_calib_songling.bag --clock
即可(Notes:别忘记加--clock参数,否则也无法成功运行),附上最终的测试效果:
主要参考: