LIO-SAM是一个基于多传感器紧耦合的程序包:
https://github.com/TixiaoShan/LIO-SAM

SC-LIO-SAM在LIO-SAM的基础上把回环检测修改为Scan Context:

https://github.com/gisbi-kim/SC-LIO-SAM

感谢并膜拜大佬的开源!

详细安装配置步骤请直接查看github作者提供的步骤,

本文主要描述了如何在自己的设备上运行SC-LIO-SAM得到点云地图。

一.激光雷达数据准备

首先由于激光雷达是速腾聚创的,然而SC-LIO-SAM中默认的参数配置中只有velodyne和ouster的。其实很多SLAM的开源程序包都是基于velodyne参数的,每次都去修改各种参数很是麻烦,所以这里就一劳永逸即直接把rslidar的数据转化为velodyne的数据发布出去!

参考: https://blog.csdn.net/weixin_42141088/article/details/117222678?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163048329916780357259963%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163048329916780357259963&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-1-117222678.first_rank_v2_pc_rank_v29&utm_term=%E9%80%9F%E8%85%BE%E8%81%9A%E5%88%9B%E8%BD%ACvelodyne&spm=1018.2226.3001.4187

rslidar_to_velodyne的代码如下:

#include <ros/ros.h>#include <sensor_msgs/PointCloud2.h>#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <pcl_conversions/pcl_conversions.h>// rslidar和velodyne的格式有微小的区别
// rslidar的点云格式
struct RsPointXYZIRT {PCL_ADD_POINT4D;uint8_t intensity;uint16_t ring = 0;double timestamp = 0;EIGEN_MAKE_ALIGNED_OPERATOR_NEW
} EIGEN_ALIGN16;POINT_CLOUD_REGISTER_POINT_STRUCT(RsPointXYZIRT,(float, x, x)(float, y, y)(float, z, z)(uint8_t, intensity, intensity)(uint16_t, ring, ring)(double, timestamp, timestamp))// velodyne的点云格式
struct VelodynePointXYZIRT {PCL_ADD_POINT4DPCL_ADD_INTENSITY;uint16_t ring;float time;EIGEN_MAKE_ALIGNED_OPERATOR_NEW
} EIGEN_ALIGN16;POINT_CLOUD_REGISTER_POINT_STRUCT(VelodynePointXYZIRT,(float, x, x)(float, y, y)(float, z, z)(float, intensity, intensity)(uint16_t, ring, ring)(float, time, time))ros::Subscriber subRobosensePC;
ros::Publisher pubRobosensePC;bool has_nan(RsPointXYZIRT point)
{if (pcl_isnan(point.x) || pcl_isnan(point.y) || pcl_isnan(point.z)) {return true;} else {return false;}
}void rsHandler_XYZIRT(const sensor_msgs::PointCloud2& pc_msg)
{pcl::PointCloud<RsPointXYZIRT> pc_in;pcl::fromROSMsg(pc_msg, pc_in);pcl::PointCloud<VelodynePointXYZIRT> pc_out;if (pc_in.points.empty())return;double timestamp = pc_in.points.front().timestamp;for (auto& point : pc_in.points) {if (has_nan(point))continue;VelodynePointXYZIRT new_point;new_point.x = point.x;new_point.y = point.y;new_point.z = point.z;new_point.intensity = point.intensity;new_point.ring = point.ring;new_point.time = point.timestamp - timestamp;pc_out.points.emplace_back(new_point);}// publishsensor_msgs::PointCloud2 pc_new_msg;pcl::toROSMsg(pc_out, pc_new_msg);pc_new_msg.header = pc_msg.header;pc_new_msg.header.frame_id = "velodyne";pubRobosensePC.publish(pc_new_msg);
}int main(int argc, char** argv)
{ros::init(argc, argv, "rs_to_velodyne_node");ros::NodeHandle nh;pubRobosensePC = nh.advertise<sensor_msgs::PointCloud2>("/velodyne_points", 1);subRobosensePC = nh.subscribe("/rslidar_points", 1, rsHandler_XYZIRT);ROS_INFO("Listening to /rslidar_points ......");ros::spin();return 0;
}

二.IMU参数配置

设置imuTopic

//IMU和激光雷达的位姿关系
extrinsicRot: [1, 0, 0,0, 1, 0,0, 0, 1]extrinsicRPY: [1, 0, 0,0, 1, 0,0, 0, 1]

三.一些需要调整的地方

程序在运行的时候需要保存一些中间文件以及最后建立的点云地图,所以你需要设置好保存的位置。例如在yaml文件里进行修改路径:

savePCDDirectory: "/home/tf/ROS/auto_drive/src/slam/SC-LIO-SAM/map/"

当然我推荐是把yaml的设置路径注释掉,然后之间在launch文件里设置路径,这样更有泛用性:

<param name="lio_sam/savePCDDirectory" value="$(find lio_sam)/map/"/>

另外原程序中是ctrl+c后自动保存点云地图,但是我在建立一张比较大型的点云地图时出现了还没有保存完毕,程序就退出了的尴尬情况。于是需要稍微修改一下程序,大概就思想就是,添加的一个话题接口,然后再回调函数里保存点云地图,然后记得把原来保存地图的程序段删掉:

void saveCB(const std_msgs::String::ConstPtr& msg)
{// save pose graph (runs when programe is closing)cout << "****************************************************" << endl;cout << "Saving the posegraph ..." << endl; // giseopfor (auto& _line : vertices_str)pgSaveStream << _line << std::endl;for (auto& _line : edges_str)pgSaveStream << _line << std::endl;pgSaveStream.close();// pgVertexSaveStream.close();// pgEdgeSaveStream.close();const std::string kitti_format_pg_filename { savePCDDirectory + "optimized_poses.txt" };saveOptimizedVerticesKITTIformat(isamCurrentEstimate, kitti_format_pg_filename);// save mapcout << "****************************************************" << endl;cout << "Saving map to pcd files ..." << endl;// save key frame transformationspcl::io::savePCDFileASCII(savePCDDirectory + "trajectory.pcd", *cloudKeyPoses3D);pcl::io::savePCDFileASCII(savePCDDirectory + "transformations.pcd", *cloudKeyPoses6D);// extract global point cloud mappcl::PointCloud<PointType>::Ptr globalCornerCloud(new pcl::PointCloud<PointType>());pcl::PointCloud<PointType>::Ptr globalCornerCloudDS(new pcl::PointCloud<PointType>());pcl::PointCloud<PointType>::Ptr globalSurfCloud(new pcl::PointCloud<PointType>());pcl::PointCloud<PointType>::Ptr globalSurfCloudDS(new pcl::PointCloud<PointType>());pcl::PointCloud<PointType>::Ptr globalMapCloud(new pcl::PointCloud<PointType>());for (int i = 0; i < (int)cloudKeyPoses3D->size(); i++) {*globalCornerCloud += *transformPointCloud(cornerCloudKeyFrames[i], &cloudKeyPoses6D->points[i]);*globalSurfCloud += *transformPointCloud(surfCloudKeyFrames[i], &cloudKeyPoses6D->points[i]);cout << "\r" << std::flush << "Processing feature cloud " << i << " of " << cloudKeyPoses6D->size() << " ...";}// down-sample and save corner clouddownSizeFilterCorner.setInputCloud(globalCornerCloud);downSizeFilterCorner.filter(*globalCornerCloudDS);pcl::io::savePCDFileASCII(savePCDDirectory + "cloudCorner.pcd", *globalCornerCloudDS);// down-sample and save surf clouddownSizeFilterSurf.setInputCloud(globalSurfCloud);downSizeFilterSurf.filter(*globalSurfCloudDS);pcl::io::savePCDFileASCII(savePCDDirectory + "cloudSurf.pcd", *globalSurfCloudDS);// down-sample and save global point cloud map*globalMapCloud += *globalCornerCloud;*globalMapCloud += *globalSurfCloud;pcl::io::savePCDFileASCII(savePCDDirectory + "cloudGlobal.pcd", *globalMapCloud);cout << "****************************************************" << endl;cout << "Saving map to pcd files completed" << endl;
}

四.建图啦

程序开始会提示无法删除xxx,这个没啥事,只要你确定设置的路径是对的,就无视就好。。。

roslaunch lio_sam run.launch

建图效果还是非常nice的!

基于SC-LIO-SAM的SLAM实践相关推荐

  1. vins中imu融合_基于非线性优化算法—当视觉SLAM遇到VINS会碰撞出怎样的火花?

    今天来给大家分享一个视觉SLAM中比较综合且复杂的系统-VINS.VINS旨在通过融合两个传感器测量数据获得移动机器人的位姿和特征点在空间中的位置,在现代控制理论学科中属于最优估计问题.在移动智能机器 ...

  2. QXRService:基于高通QXRService获取SLAM Camera图像

    上一篇博文讲解了基于Snapdragon XR OpenXR SDK v1.x系列SDK怎么进行QXRService实战开发,以及通过QXRService相关API如何获取到头显位姿和IMU数据. 这 ...

  3. 基于环视相机的视觉SLAM在自动泊车系统上的应用

    作者 | dianyunPCL  编辑 | 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[全栈算法]技术交流群 摘要 自动泊车正成为 ...

  4. 基于ITIL的SCOM监控最佳实践

    1.  按照系统类别进行监控 很多朋友在使用SCOM进行监控的时候,往往只是导入管理包,推送代理,并不会思考很多,那么在这种情况下,SCOM在进行监控的时候都是基于缺省的类对象进行监控,比如说Wind ...

  5. 面向动态环境基于面元的RGB-D SLAM系统

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:robot L https://zhuanlan.zhihu.com/p/142175916 本 ...

  6. 基于 Spring Cloud 的服务治理实践

    http://www.infoq.com/cn/articles/spring-cloud-based-service-governance 大家好,我是来自贝壳金控的赵文乐,目前主要从事架构方面的工 ...

  7. 云知声 Atlas 超算平台: 基于 Fluid + Alluxio 的计算加速实践

    Fluid 是云原生基金会 CNCF 下的云原生数据编排和加速项目,由南京大学.阿里云及 Alluxio 社区联合发起并开源.本文主要介绍云知声 Atlas 超算平台基于 Fluid + Alluxi ...

  8. 快手基于 Flink 的持续优化与实践

    简介:快手基于 Flink 的持续优化与实践的介绍. 本文由快手实时计算负责人董亭亭分享,主要介绍快手基于 Flink 的持续优化与实践的介绍.内容包括: Flink 稳定性持续优化 Flink 任务 ...

  9. DTCC 2020 | 阿里云梁高中:DAS基于Workload的全局自动优化实践

    简介:第十一届中国数据库技术大会(DTCC2020),在北京隆重召开.在12.23日性能优化与SQL审计专场上,邀请了阿里巴巴数据库技术团队高级技术专家梁高中为大家介绍DAS之基于Workload的全 ...

  10. 基于docker-compose的Gitlab CI/CD实践排坑指南

    长话短说 经过长时间实操验证,终于完成基于Gitlab的CI/CD实践,本次实践的坑位很多, 实操过程尽量接近最佳实践(不做hack, 不做骚操作),记录下来加深理解. 看过博客园<docker ...

最新文章

  1. 免费的XShell替代品,同时支持Windows,macOS,Linux!又来一款国产良心工具....
  2. TortoiseSVN SendRpt.exe not found解决方案
  3. mybatis 代码生成器_spring Boot手把手教学(4): mybatis-plus 代码生成器,自动帮你生成代码
  4. Java 获取Web项目相对webapp地址
  5. matlab simplify,[求助]Matlab2016b里没有simple函数
  6. TensorFlow 多任务学习
  7. 贝壳“进社区”,让商业向文明靠拢
  8. java中复选框组件_Java Swing JCheckBox:复选框组件
  9. java中jdk api等概念的解释
  10. 设计原则(6):开闭原则
  11. linux安装五笔输入法centos,CentOS 7系统怎么安装极点五笔输入法?
  12. linux连接库参数-l,gcc编译时,什么时候需要用-l参数指明连接库?
  13. 迪杰斯特拉(Dijkstra)算法详解,通俗易懂
  14. 关于反病毒技术的想法
  15. 安装dreamwaver
  16. 云计算在未来一年的发展预测
  17. 赵小楼《天道》《遥远的救世主》深度解析(55)王庙村扶贫和格律诗事件的关键人物:冯世杰
  18. 自学 9个月 Java 找到了一份 12K 的工作,前辈的方式值得分享给大伙
  19. 封装一个自己的golang操作MySQL数据库工具
  20. 微软输入法 ——当前时间 快捷键

热门文章

  1. CSS3计数器的使用-遁地龙卷风
  2. 转:WinCE驱动开发问题精华集锦
  3. 如何创建 Ping app 中的 UIViewController 转换动画?
  4. 【Ant Design】下拉列表Select 、日期选择框DatePicker等跟随滚动条上下移动解决方案
  5. 青龙BOT机器人交互
  6. git中的revert和reset
  7. react学习—高阶组件HOC
  8. 章子怡对婚姻的憧憬:一生一世!——丹比奴
  9. 单选框按钮设置不可选中
  10. 如何快速地提高店铺销量