速腾Helios-16P使用Lego-loam实时构建点云地图(三)——使用雷达实时运行lego-loam

当确定好雷达正常运行、lego-loam正常运行后,就可以开始使用雷达实时运行lego-loam了。

步骤一:连接硬件

步骤二:修改电脑IP地址

        (用完雷达记得将设置中有线地址选择之前的默认地址,否则上不了网)

步骤三:使用雷达实时建图需要修改lego-loam的launch文件

        打开~/lego-loam_ws/src/LeGO-LOAM/LeGO-LOAM/launch/run.launch文件,将<param name="/use_sim_time" value="true" />的true改为false(用数据集运行lego-loam则将false改为true)。

步骤四:运行雷达

cd RS_Helios_16P_ws
source devel/setup.bash
roslaunch rslidar_sdk start.launch

步骤五:运行lego-loam

cd lego-loam_ws
source devel/setup.bash
roslaunch lego_loam run.launch

步骤六:保存pcd

        勾选rviz左侧Map Cloud(不是Map Cloud(stack)),map cloud(stack)对应的话题为:/registered_cloud,此话题发布的是每一帧新加入地图的点云,使用栈的原理累加生成点云地图,当地图范围到一定程度时,就会丢弃最初建立的部分点云地图。map cloud对应的才是真正保存的全局地图,话题名为:/laser_cloud_surround。
建图快结束时新开终端执行(因为地图是累积的,快结束的时候录制/laser_cloud_surround就可以):

rosbag record -o out /laser_cloud_surround

在当前目录会生成一个bag文件,例如out_2023-04-18-21-36-51.bag。

等待建图结束后,Ctrl+C结束掉rosbag命令,存为pcd格式的文件:

rosrun pcl_ros bag_to_pcd 包名.bag /laser_cloud_surround pcd

最后的pcd的意思是在当前目录下创建一个名为pcd文件夹,保存bag包中每一帧的/laser_cloud_surround话题生成的pcd点云文件,其中最后一个生成的(也是内存最大的)pcd文件即为建立的点云地图。

会在当前文件夹下生成一个pcd文件夹,这里面的最后一个pcd文件为最终的建图结果,使用pcl_viewer查看:

pcl_viewer 包名.pcd

也可下载CloudCompare查看。

如果觉得建立出来的点云地图较稀疏,可以修改lego-loam源码中imageProjection.cpp中的labelComponents函数,修改聚类阈值可改变点云的稀疏度。

关于雷达静止不动,rviz上雷达坐标一直在缓慢偏移可参考:

关于lego-loam的总结(一)_虚函数机器人的博客-CSDN博客最近在测试legoloam的时候,总是会碰到雷达坐标系剧烈漂移的情况,即使现实中雷达静止,在rviz中的显示也漂移的很厉害。建的地图也十分糟糕。那么雷达的坐标为什么会漂移,雷达的位置信息是如何计算和确定的?在我想要加入imu,试图通过订阅imu话题来取代雷达的位置信息时,我发现全部代码中,IMU的句柄函数只有两个,且未被使用。继续查找,我发现雷达的位置信息发布被写在了featureAssociation中的PublishOdometry函数中,具体变量为transform数组!...https://blog.csdn.net/qq_31775031/article/details/116054444?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-1-116054444.pc_agg_new_rank&utm_term=lego+loam+z%E8%BD%B4%E6%BC%82%E7%A7%BB&spm=1000.2123.3001.4430

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
LeGO-LOAM中的地图配准主要是通过ICP算法实现的。下面是配准的代码: ```c++ void mapOptimization::scan2MapOptimization(){ ... // Step 1: Transform current scan to global map PointCloudT::Ptr transformed_scan_ptr (new PointCloudT()); pcl::transformPointCloud(*laserCloudCornerLast, *transformed_scan_ptr, laserOdometry); // Step 2: Add current scan to global map *laserCloudCornerFromMap += *transformed_scan_ptr; laserCloudCornerFromMapDS->clear(); downSizeFilterCorner.setInputCloud(laserCloudCornerFromMap); downSizeFilterCorner.filter(*laserCloudCornerFromMapDS); // Step 3: Apply ICP algorithm to align current scan with global map pcl::IterativeClosestPoint<PointT, PointT> icp; icp.setInputSource(transformed_scan_ptr); icp.setInputTarget(laserCloudCornerFromMapDS); icp.setMaxCorrespondenceDistance(0.5); icp.setMaximumIterations(50); icp.setTransformationEpsilon(1e-8); icp.align(*transformed_scan_ptr); // Step 4: Transform current scan back to its local frame if (icp.hasConverged()) { laserOdometry = icp.getFinalTransformation().inverse() * laserOdometry; pcl::transformPointCloud(*transformed_scan_ptr, *laserCloudCornerLast, laserOdometry); } ... } ``` 在这个函数中,我们首先将当前的点云数据通过位姿转换,转换到全局地图的坐标系下。然后将当前点云添加到全局地图中。接着,我们使用ICP算法,将当前点云与全局地图进行匹配,得到它们之间的变换关系。最后,我们将当前点云通过变换关系转换回到它的本地坐标系下。 需要注意的是,在LeGO-LOAM中,我们是将当前点云的角点部分与全局地图的角点部分进行匹配,因为角点更具有特征性。另外,我们使用了一个体素滤波器对全局地图进行了下采样,这样可以加快匹配速度,同时也可以去除一些不必要的噪声点。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值