32线镭神雷达跑LeGO-LOAM:3D 激光SLAM

  • 安装LeGO-LOAM
  • 镭神雷达的相关修改
  • LeGO-LOAM的修改
    • 修改utility.h
    • 修改imageproject.cpp
  • Enjoy youself
    • 跑rosbag
    • 实时在线建图

最近老板给了个镭神的32线雷达让我搞一下3D SLAM,决定跑一下LeGO-LOAM。但是LeGO-LOAM用的是Velodyne雷达,需要自己修改一些东西。记录一下修改过程。

安装LeGO-LOAM

我的系统:
ubuntu 16.04
ros kinetic

具体的这个过程就不过多赘述了,有很多帖子是教安装的,我参考了以下博客:

https://blog.csdn.net/weixin_39781401/article/details/89526028https://blog.csdn.net/learning_tortosie/article/details/86527542

里面讲解的很细,向前辈致敬。
另外,贴上LeGO-LOAM源作者github

https://github.com/RobustFieldAutonomyLab/LeGO-LOAM

镭神雷达的相关修改

首先LeGO-LOAM默认的接受的topic name是velodyne_points,点云的frame_id是velodyne,镭神驱动发布的topic name为lslidar_point_cloud,frame_id为laser_link,这里需要修改一下lslidar_c32.launch文件,remap一下topic name,再修改frame_id为velodyne。这是我搞的最简单的方法,其他写程序转也可以。
贴一下launch文件:

<launch><arg name="device_ip" default="192.168.1.200" /><arg name="msop_port" default="2368" /><arg name="difop_port" default="2369" /><arg name="return_mode" default="1" /><arg name="time_synchronization" default="true" /><node pkg="lslidar_c32_driver" type="lslidar_c32_driver_node" name="lslidar_c32_driver_node" output="screen"><param name="device_ip" value="$(arg device_ip)" /><param name="msop_port" value="$(arg msop_port)" /><param name="difop_port" value="$(arg difop_port)"/><param name="frame_id" value="velodyne"/><param name="add_multicast" value="false"/><param name="group_ip" value="224.1.1.2"/><param name="rpm" value="600"/><param name="return_mode" value="$(arg return_mode)"/><param name="time_synchronization" value="$(arg time_synchronization)"/></node><node pkg="lslidar_c32_decoder" type="lslidar_c32_decoder_node" name="lslidar_c32_decoder_node" output="screen"><param name="min_range" value="0.15"/><param name="max_range" value="150.0"/><param name="return_mode" value="$(arg return_mode)"/><param name="time_synchronization" value="$(arg time_synchronization)"/><remap from="lslidar_point_cloud" to="/velodyne_points" /></node>

修改完以后LeGO-LOAM就能接收到雷达的点云数据了。

LeGO-LOAM的修改

这主要需要修改utility.h以及imageProjection.cpp[^2]

看一眼源作者告诉大家需要修改的地方:

New Lidar:The key thing to adapt the code to a new sensor is making sure the point cloud can be properly projected to an range image and ground can be correctly detected. For example, VLP-16 has a angular resolution of 0.2° and 2° along two directions. It has 16 beams. The angle of the bottom beam is -15°. Thus, the parameters in “utility.h” are listed as below. When you implement new sensor, make sure that the ground_cloud has enough points for matching. Before you post any issues, please read this.

新雷达:使代码适应新的传感器的关键是确保点云可以正确地投影到距离图像和地面可以正确地检测。例如,VLP-16沿两个方向的角分辨率分别为0.2和2。它有16根光束。底部横梁的角度是-15。因此,在“实用程序”中的参数。h”列出如下。在实现新传感器时,请确保地面云具有足够的匹配点。在你发布任何问题之前,请阅读这篇文章。

New: a new useCloudRing flag has been added to help with point cloud projection. Velodyne point cloud has “ring” channel that directly gives the point row id in a range image. Other lidars may have a same type of channel, i.e., “r” in Ouster. If you are using a non-Velodyne lidar but it has a similar “ring” channel, you can change the PointXYZIR definition in utility.h and the corresponding code in imageProjection.cpp.

新的:增加了一个新的useCloudRing标志来帮助点云投影。Velodyne点云有“环”通道,直接给点行id在一个范围内的图像。其他lidars可能具有相同类型的通道,即"r"是财产侵占。如果您使用的是非velodyne激光雷达,但是它有一个类似的“环形”通道,您可以在utility.h中更改PointXYZIR定义,并在imageproject .cpp中更改相应的代码。

更多详情到源作者github上看吧

修改utility.h

  1. 雷达参数修改

这位前辈已经说的很清楚了,可以移步以下博客
https://www.cnblogs.com/hgl0417/p/11067660.html

// LeiShen-32C-5Hz
// extern const int N_SCAN = 32;
// extern const int Horizon_SCAN = 4000;
// extern const float ang_res_x = 360.0 / float(Horizon_SCAN);
// extern const float ang_res_y = 26 / float(N_SCAN-1);
// extern const float ang_bottom = 16.5;
// extern const int groundScanInd = 10; //地面的线扫条数// LeiShen-32C-10Hz
extern const int N_SCAN = 32;//32线雷达
extern const int Horizon_SCAN = 2000;//每条线发射的点数
extern const float ang_res_x = 360.0 / float(Horizon_SCAN);//水平分辨率
extern const float ang_res_y = 26.0 / float(N_SCAN-1);//垂直分辨率
extern const float ang_bottom = 16.5;
extern const int groundScanInd = 10; //地面的线扫条数

参数一定要设置对,不然性能差别很大。确定自己的雷达设置的多少Hz,一般是默认10Hz。

  1. useCloudRing修改

镭神好像是没有Velodyne雷达的ring channel功能,所以useCloudRing设置为false了。

extern const bool useCloudRing = false; // if true, ang_res_y and ang_bottom are not used

修改imageproject.cpp

src文件夹找到imageproject.cpp,因为原作者可能一直在更新代码,所以说改哪一行不科学,行数可能变,所以我还是把修改的代码贴一下:

找到copyPointCloud函数

    void copyPointCloud(const sensor_msgs::PointCloud2ConstPtr& laserCloudMsg){cloudHeader = laserCloudMsg->header;cloudHeader.stamp = ros::Time::now(); // Ouster lidar users may need to uncomment this linepcl::fromROSMsg(*laserCloudMsg, *laserCloudIn);// Remove Nan pointsstd::vector<int> indices;pcl::removeNaNFromPointCloud(*laserCloudIn, *laserCloudIn, indices);// have "ring" channel in the cloudif (useCloudRing == true){pcl::fromROSMsg(*laserCloudMsg, *laserCloudInRing);if (laserCloudInRing->is_dense == false) {ROS_ERROR("Point cloud is not in dense format, please remove NaN points first!");ros::shutdown();}  }}

这里是把cloudHeader.stamp = ros::Time::now();的注释去掉了。

Enjoy youself

跑rosbag

这个没有什么好说的,用镭神启动雷达

roslaunch lslidar_c32_decoder lslidar_c32.launch --screen

然后录制rosbag

rosbag record -a

跑rosbag是不需要修改LeGO-LOAM的launch文件的,直接来就是。运行run.launch

roslaunch lego_loam run.launch

再播放rosbag,因为没有用到imu,所以只订阅雷达话题

rosbag play *.bag --clock --topic /velodyne_points

实时在线建图

这个应该是大家最想要的了
实时跑需修改launch文件

<launch><!--- Sim Time --><param name="/use_sim_time" value="false" /><!--- 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>

好吧,其实就是<param name="/use_sim_time" value="false" />这个,由true改为false.

接下来就是enjoy youself

roslaunch lslidar_c32_decoder lslidar_c32.launch --screen
roslaunch lego_loam run.launch

写博客也是力气活儿,转载请注明出处,谢谢。
注:开源不易,如果对你有益,请支持作者的工作。

32线镭神雷达跑LeGO-LOAM:3D 激光SLAM相关推荐

  1. 3D激光SLAM:LOAM 论文--算法详细解读

    3D激光SLAM:LOAM 论文--算法详细解读 LOAM简介 论文里面的符号表示 算法部分 激光雷达里程计 A 特征点提取 B 找特征点的匹配对 C 运动估计 lidar 建图 测试结果 LOAM是 ...

  2. SLAM学习笔记(十九)开源3D激光SLAM总结大全——Cartographer3D,LOAM,Lego-LOAM,LIO-SAM,LVI-SAM,Livox-LOAM的原理解析及区别

    本文为我在浙江省北大信研院-智能计算中心-情感智能机器人实验室-科技委员会所做的一个分享汇报,现在我把它搬运到博客中. 由于参与分享汇报的同事有许多是做其他方向的机器人工程师(包括硬件.控制等各方面并 ...

  3. 彻底搞懂基于LOAM框架的3D激光SLAM全套学习资料汇总!

    地图定位算法是自动驾驶模块的核心,而激光SLAM则是地图定位算法的关键技术,其重要性不言而喻,在许多AI产品中应用非常多(包括但不限于自动驾驶.移动机器人.扫地机等).相比于传统的视觉传感器,激光传感 ...

  4. 搭建实验室3d slam 移动小车 4.1jackal小车+镭神32线激光雷达lego-loam建图

    搭建实验室3d slam 移动小车 4.1.1jackal小车+镭神32线激光雷达lego-loam建图 镭神32线 lego-loam建图 视频链接 镭神32线 lego-loam建图 参考博客: ...

  5. 镭神16线激光雷达跑SC-LeGo-LOAM算法

    一.运行环境 环境:ubutu18.04+ros:melodic+pcl:1.8+gtsam+metis 环境配置: Eigen 3.3.4 PCL 1.8.1 (1.11不能用) ceres 2.0 ...

  6. 基于LOAM框架的激光SLAM开源程序集合

    一.前言 LOAM, 即Lidar Odometry and Mapping,是 Ji Zhang 博士于2014年提出的使用激光雷达完成定位与三维建图的算法.其算法流程如下: LOAM算法中主要包含 ...

  7. 搭建实验室3d slam 移动小车 3.3jackal移动平台 组合导航POMS-GI201C、镭神32线激光雷达 卫星授时

    搭建实验室3d slam 移动小车 3.3jackal移动平台 组合导航POMS-GI201C.镭神32线激光雷达 卫星授时 首先,为什么要授时: 参考博客: 激光雷达中是如何做到和GPS时间同步的? ...

  8. 搭建实验室3d slam 移动小车 2.3镭神32线激光雷达ROS-RVIZ上方向确定

    搭建实验室3d slam 移动小车 2.3镭神32线激光雷达ROS-RVIZ上方向确定 ROS上坐标系 参考博客: ROS坐标系统,常见的坐标系和其含义 如图红色为x轴,绿色为y轴,蓝色为z轴 确定镭 ...

  9. 镭神智能32线激光雷达调试

    1-连接 1.将电源线以及网线接好 2.还有一个HDMI的接口,可以不接 2-设置IP 1. 在有线设置那选择添加 2.以Ipv4格式添加 3.设置好,选择该IP,重启LiDAR 4.打开终端观察数据 ...

最新文章

  1. 梦幻西游手游服务器维护时段,梦幻西游手游2018合区时间服务器汇总详解
  2. 独家 | 数据科学家应该避免的5种统计陷阱(附链接)
  3. 那些实用与颜值齐飞的桌面!
  4. ITK:将图像翻转到指定的轴上
  5. 《VMware vSphere 6.5企业运维实战》已经出版
  6. 记一次nginx反向代理做转发遇到的坑
  7. 数据库性能优化之SQL语句优化(下)
  8. H264视频压缩原理详解
  9. python实现等量随机分组
  10. 共享充电宝APP小程序开发
  11. 收集利用 Kotlin 进行 Android 开发的开源库,扩展,工具,开源项目,资料等高质量资源
  12. CSS3实现360度循环旋转
  13. vue项目打包部署到与后台同一服务器上
  14. 第一款个人应用——《不做手机控》——终于上线啦!
  15. 面试官问:浏览器输入 URL 回车之后发生了什么?
  16. 极限学习机 Extreme Learning Machines 介绍
  17. 第四章 QAM调制方案仿真
  18. Hprose 是轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件
  19. 给硬件工程师的入门课-电子工程师常用网站
  20. 上海亚商投顾:成交量不足万亿,指数止步四连阳

热门文章

  1. 【C熟肉】字符串len cpy实现
  2. DynamicViT
  3. 【冰点】:重庆“高烧”不退
  4. 可逆计算机系统设计,计算机控制断续电流可逆系统的动态设计与仿真研究
  5. 认认真真做事,踏踏实实做人
  6. 【Python】文件操作(单文件操作)
  7. 我的读书笔记 -《厚黑学》
  8. 防火墙的基础配置(一)
  9. Python爬虫:抓取多级页面数据
  10. 2019/01/07 一位前端实习生 艰辛过程 励志 实习周记(三)——第二 三周