BLAM跑自己的数据包无法显示全局点云地图解决(速腾聚创RS-LiDAR-16 雷达 )-SLAM不学无术小问题

2023-11-18

BLAM算法跑自己的数据包无法显示全局点云地图解决(适配速腾聚创RS-LiDAR-16 雷达 )

提示:本文笔者使用环境Ubuntu18.04,ROS melodic版本

  首先放一个效果链接(由b站up:VladimirDuan上传,非官方)官方视屏外网才可播放。up使用的是64线雷达,效果可以说是很不错了链接: 64线激光雷达数据BLAM算法测试.(侵删)

背景

  3D SLAM新手,笔者目前执着与尝试一些3D SLAM 算法,比较其优劣。所以在运行各种算法的时候难免因为各方面条件的差异导致建图失败,这里总结了笔者所遇到的一些问题以及解决方法,一方面记录日志,一方面帮助遇到相似问题的朋友提供解决问题的参考。笔者安装BLAM使用教程是这个:链接: BLAM(Berkeley Localization And Mapping)安装使用教程.大佬的教程已经非常详细,可能因为网络问题,安装过程可能需要多次update才可下载完毕,请耐心使用。
  正文开始,笔者目前在尝试一种新的算法-----BLAM(Berkeley Localization And Mapping),在看到官网给出的图之后觉得算法非常不错,但是没有找到官方的数据集,只能用自己的数据集测试了,但是同笔者的另一文一样( 链接.),也出现了无法查看全局地图的情况,如下图
在这里插入图片描述
  但是因为有了上次跑lego-LOAM的经验之后,解决相对容易些。 下面就此算法遇到的问题与解决方法各位分享。

一、确定自己的激光雷达类型

  激光雷达的类型一直是建图的一个主要问题,因为经典的的算法源码作者无论是在编写过程还是测试调试过程使用的都倾向于—Velodyne 16线激光雷达VLP-16,对其他的雷达兼容性并不是很好,所以在算法使用过程中难免遇到各种矛盾。BLAM 算法可以处理VLP-16中的Nan点,但是对其它品牌的雷达式中的Nan点处理的不是那么兼容 所以在开始就要确认好自己的雷达,或者是自己使用的数据包的雷达类型及其参数,有了这个基础以后相对容易些去修改兼容。
  笔者自己使用的激光雷达是 RS-LiDAR-16 一款速腾聚创的自动驾驶激光雷达。这两款雷达的参数在笔者另一文中有介绍:链接: SLAM不学无术小问题:lego-LOAM跑自己的数据包无法显示全局点云地图解决(速腾聚创RS-LiDAR-16 雷达 ).了解了区别之后就可以开始修改了,主要是针对launch文件以及原文中添加一些去NAN点的滤波器算法。

二、修改源码

1.修改 PointCloudFilter.cc

一般情况下,不是使用VLP-16雷达,可能会出现这样的报错:

Invalid (NaN, Inf) point coordinates given to nearestKSearch!

出现这个报错的原因是VLP-16雷达可以对NAN点进行很好的处理,但是其他雷达可能没那么兼容,所以需要自己在源码中添加一个滤波的过程滤除NAN点。 当出现以上错误时,打开文件

//blam/internal/src/point_cloud_filter/src/PointCloudFilter.cc

在最后添加如下语句:(在最后一个大括号里面添加)

	if (!points->is_dense)
	{
	    points_filtered->is_dense = false;
	    std::vector<int> indices;
	    pcl::removeNaNFromPointCloud(*points_filtered,*points_filtered, indices);
	}

2.修改BlamSlam.cc

第一步修改之后效果不是那么好,那么打开文件

//blam/internal/src/blam_slam/src/BlamSlam.cc

修改以下三处:(即将msg的地方改为msg_filtered)

1、 loop_closure_.AddKeyScanPair(0, msg); 改为:
loop_closure_.AddKeyScanPair(0, msg_filtered);  

2if (HandleLoopClosures(msg, &new_keyframe)) 改为:
if (HandleLoopClosures(msg_filtered, &new_keyframe))

3、localization_.TransformPointsToFixedFrame(*msg, msg_fixed.get()); 改为:
localization_.TransformPointsToFixedFrame(*msg_filtered, msg_fixed.get());

3.修改PointCloudMapper.cc

  这一步非必要,视情况而定,一般情况下修改以上两处即可,但是笔者在经过以上两步的修改之后,运行launch问件没有问题都正常,但是一播放数据包时就会报错,类似下文:

process[blam/blam_slam-1]: started with pid [26609] [ INFO] [1541090716.155156906]: 
/blam/blam_slam/BlamSlam: Registering online callbacks. blam_slam_node: /build/pcl-OilVEB/pcl-
1.8.1+dfsg1/octree/include/pcl/octree/impl/octree_pointcloud.hpp:688: void 
pcl::octree::OctreePointCloud::genOctreeKeyforPoint(const PointT&, pcl::octree::OctreeKey&) const [with PointT = 
pcl::PointXYZ; LeafContainerT = pcl::octree::OctreeContainerPointIndices; BranchContainerT = 
pcl::octree::OctreeContainerEmpty; OctreeT = pcl::octree::OctreeBase<:octree::octreecontainerpointindices 
pcl::octree::octreecontainerempty>]: Assertion key_arg.x <= this->max_key_.x' failed. [blam/blam_slam-1] process 
has died [pid 26609, exit code -6, cmd /home/jun/catkin_ws/src/blam/internal/devel/lib/blam_slam/blam_slam_node ~pcld:=/velodyne_points 
__name:=blam_slam __log:=/home/jun/.ros/log/4cd720f2-ddec-11e8-bc37-e4a7a0130394/blam-blam_slam-1.log]
. log file: /home/jun/.ros/log/4cd720f2-ddec-11e8-bc37-e4a7a0130394/blam-blam_slam-1*.log all processes on 
machine have died, roslaunch will exit shutting down processing monitor... ... shutting down processing monitor 
complete done</:octree::octreecontainerpointindices>

其实主要的错误是这一句:

Assertion key_arg.x <= this->max_key_.x' failed 

解决这个问题需要打开文件:

blam/internal/src/point_cloud_mapper/src/PointCloudMapper.cc

找到  if (!map_octree_->isVoxelOccupiedAtPoint(p)) {   此句注释,改为以下内容:

   double min_x, min_y, min_z, max_x, max_y, max_z;
   map_octree_->getBoundingBox(min_x, min_y, min_z, max_x, max_y, max_z);
   bool isInBox = (p.x >= min_x && p.x <= max_x) && (p.y >= min_y && p.y <= max_y) && (p.z >= min_z && p.z <= max_z);
   if (!isInBox || !map_octree_->isVoxelOccupiedAtPoint(p)) {

重新编译workspace通过。

三、修改launch文件(针对test_online.launch)

1.添加rviz(非必要)

  关于lidar_slam.rviz文件,原作原文可能考虑到诸多因素并没有将初始化rviz的文件写入launch文件,需要另外的指令打开,但是笔者做测试用,希望launch以后直接打开rviz界面,所以这一部分是非必要修改,仅仅是为了直观方便。下面是操作步骤:
  因为原作虽然未将rviz文件直接在launch文件中调用,但是仍然写了完整的rviz文件,在此目录下

/blam/internal/src/blam_example/rviz/lidar_slam.rviz

如果希望直接使用原作者的rviz文件,可以在launch文件添加如下语句:

 <!--- Run Rviz-->
 <node pkg="rviz" type="rviz" name="rviz" args="-d $(find blam_example)/rviz/lidar_slam.rviz" />  

注意!!! 添加时最好不要在group标签内添加,会报错(笔者深受其害)

2.重映射

这是SLAM学者比较基础的问题了,首先查看自己的数据包的话题:

rosbag info bagfile.bag

这是笔者自己的数据包的topic:

在这里插入图片描述

在launch 文件中作如下修改:(依照个人话题不同做修改)

//将第一行注释或删掉都可,添加第二句重映射即可
<remap from="~pcld" to="/velodyne_points"/>
<remap from="~pcld" to="/points_raw"/> 

当然跑数据包不要忘记这里

// <!-- True for simulation, false for real-time and bagfiles -->
     <param name="/use_sim_time" value="true"/>

  到此,笔者所遇到的问题基本上就这些,对原作的处理基本也就是这些。下面放上大家可能最感兴趣的launch即笔者自己的launch文件,仅供参考!!!

<launch>
  <!-- True for simulation, false for real-time and bagfiles -->
  <param name="/use_sim_time" value="true"/>
  <!--- Run Rviz-->
  <node pkg="rviz" type="rviz" name="rviz" args="-d $(find blam_example)/rviz/lidar_slam.rviz" />  
  <group ns="blam">
    <!-- SLAM -->
    <node pkg="blam_slam"
          name="blam_slam"
          type="blam_slam_node"
          output="screen">

      <!-- Topics -->
      <!--  <remap from="~pcld" to="/velodyne_points"/>   -->
      <remap from="~pcld" to="/points_raw"    /> 
     
      <!-- Initial pose -->
      <rosparam param="init">
        position: {x: 0.1, y: 0.1, z: 0.1}
        orientation: {roll: 0.0, pitch: 0.0, yaw: 0.0}
        position_sigma: {x: 0.1, y: 0.1, z: 0.1}
        orientation_sigma: {roll: 0.02, pitch: 0.02, yaw: 0.02}
      </rosparam>

      <!-- Rates -->
      <rosparam file="$(find blam_example)/config/blam_rates.yaml"/>

      <!-- Frames -->
      <rosparam file="$(find blam_example)/config/blam_frames.yaml"/>

      <!-- Point cloud filter -->
      <rosparam file="$(find point_cloud_filter)/config/parameters.yaml"/>

      <!-- Point cloud odometry -->
      <rosparam file="$(find point_cloud_odometry)/config/parameters.yaml"/>

      <!-- Point cloud localization -->
      <rosparam file="$(find point_cloud_localization)/config/parameters.yaml"/>

      <!-- Point cloud mapper -->
      <rosparam file="$(find point_cloud_mapper)/config/parameters.yaml"/>

      <!-- Point cloud visualization -->
      <rosparam file="$(find point_cloud_visualizer)/config/parameters.yaml"/>

      <!-- Loop closure -->
      <rosparam file="$(find laser_loop_closure)/config/parameters.yaml"/>
    </node>
  </group>
</launch>



四、整合测试

1.重新编译

做完以上所有步骤以后,需要重新编译整个workspace

catkin_make

2.运行

启动launch、数据包: 播放数据包注意加–clock

//笔者暂时只测试了这个launch
 roslaunch blam_example test_online.launch
 
 rosbag play bagfile.bag  --clock
 

在这里插入图片描述

没有挂掉的线程,继续

此处注意,如果你未在第一步同笔者一样在launch文件中添加rviz文件,此时是没有变化的,(添加之后会直接弹出rviz)你需要再开一个终端运行另外一条打开rviz的指令:

rosrun rviz rviz -d blam_example/rviz/lidar_slam.rviz

这条指令以原作的初始化文件打开rviz。

3.笔者自己数据包建图效果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

笔者使用的是16线的激光雷达,效果没有64线的好,但是也还可以。

总结

  再次附上大佬链接: BLAM(Berkeley Localization And Mapping)安装使用教程.BLAM算法一个特点就是可调参数多,坏处是处处需要自己调,好处是处处可以自己调,可以说是相当个性化了,你可以根据自己建图的效果适时的自己去改变各种参数使得建图效果更佳精确。再次附上链接的原因是大佬在他的教程中给出了各种参数配置的一个参考,笔者在此就不一一赘述了。深入学习的话这些参数是需要自己去调试的。
  好,感谢各位看到这里。3D SLAM新手,难免踩坑,难免出错,以上内容经供参考,也欢迎大家交流指正。

关于ROS
关于3D SLAM算法
关于 BLAM
    不学无术的又一天

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42141088/article/details/115875890

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BLAM跑自己的数据包无法显示全局点云地图解决(速腾聚创RS-LiDAR-16 雷达 )-SLAM不学无术小问题 的相关文章

随机推荐

  • WPF之UI虚拟化

    在WPF应用程序开发过程中 大数据量的数据展现通常都要考虑性能问题 有下面一种常见的情况 原始数据源数据量很大 但是某一时刻数据容器中的可见元素个数是有限的 剩余大多数元素都处于不可见状态 如果一次性将所有的数据元素都渲染出来则会非常的消耗
  • neutron的DHCP错误之”sudo: unable to resolve host node-1\novs-vsctl:“

    问题背景 使用ESX创建虚拟机 并在虚拟机上创建一个三节点的openstack环境 参考官方的ICEHOUSE版本 注 ubuntu 14 04只支持到icehouse版 为加快虚拟机的创建时间 本文首先创建了一个控制节点c 1 并进行更新
  • pci无线配置服务器,PCI配置空间(中文).doc

    PCI Configuration 名词说明 PCI为Peripheral Component Interconnect 的缩写 它是由 Intel 所发表的另一种局部总线 另一种为 VESA Local Bus 以配合 Pentium 系
  • ACE_Proactor实现

    ACE Proactor实现了Facade模式 其方法可以分为四类 生命周期管理方法 事件循环管理方法 定时器管理方法 IO操作facilitator方法 须知ACE Proactor是使用Bridge模式的 ACE aynch Read
  • 内网安全-隧道搭建&穿透上线&FRP&NPS&Ngrok

    目录 环境介绍 内网穿透 Ngrok 入门 上线 tcp协议 内网穿透 Frp 简易型 上线 内网穿透 Nps 自定义 上线 环境介绍 实验目的 让msf上线外网 通常情况下 内网可以访问外网 但是外网无法访问到内网 所以外网的木马通常情况
  • 将二叉树转为有序的双向链表

    一 题目要求 输入一棵二叉排序树 现在要将该二叉排序树转换成一个有序的双向链表 而且在转换的过程中 不能创建任何新的结点 只能调整树中的结点指针的指向来实现 include
  • AHB to APB bridge

    目录 SPEC 验证框架图 测试点分解以及设计测试用例 测试点分解 设计测试用例 具体的Sequence及testcase Sequence testcase SPEC DUT如下 具体功能描述可参考ARM官方文档 AHB to APB s
  • 驾驭计算机视觉的翅膀:论文找代码的几种必杀技!

    摘要 对于CVer来说 代码和找代码 能力都是一种很重要的能力 毕竟idea再好只有通过代码实现出来才能发文章和刷榜 当我们阅读一篇高质量或者英文论文时 如何去找到该文章实现的代码 进而结合文章内容和代码实现去更好的理解作者所做的工作 只有
  • 什么是MVC设计模式

    直接上图 其中model 和view大家经常写 就不说了 有人可能并不清楚controller 到底是啥 其实就是经常写的 data source delegate outlet什么的 先撇开那些乱七八糟的箭头单看他们之间的分界线 view
  • C# 中BindingSource 的用法

    C BindingSource 1 引言 BindingSource组件是数据源和控件间的一座桥 同时提供了大量的API和Event供我们使用 使用这些API我们可以将Code与各种具体类型数据源进行解耦 使用这些Event我们可以洞察数据
  • mac os 搭建fortran环境

    首先从App Store下载Xcode 然后安装命令行工具 终端下输入 xcode select install 然后终端下输入如下命令 安装Homebrew ruby e curl fsSL https raw githubusercon
  • 使用缺省的拷贝构造函数带来的危险性

    我此前另外一篇文章通过类String看拷贝构造函数 赋值函数的作用和区别 对于更深的拷贝构造函数讨论大家可以参见这篇帖子 C 类对象的复制 拷贝构造函数 通过编写类String的拷贝构造函数和赋值函数介绍了一些拷贝构造数 本文着重介绍拷贝构
  • 前端面试题有哪些,有没有前端面试题库?

    全篇干货总结前端跳槽面试必备技能 如何看待面试 如何准备面试 注意事项有哪些 面试各环节考察的是什么 一面 考察基础知识 二面 考察能力广度和深度 三面 考察项目业务能力 终面 hr面 考察沟通能力 性格 潜力等等 一面的基础知识 在这分享
  • java定义一个周长类三角形_point类 三点的三角形的周长、面积 编程求解矩形和圆面积 java 三角形的定义...

    三角形的定义 1 先创建一个Point类 然后定义Trianglele类 在Trianglele类中定义三个Point的实体来表示一个三角形的三个点 再定义构造方法对这三个点进行初始化 然后定义两个方法求三角形的周长 面积 定义一个测试类
  • 算法:点与点之间欧式距离最小

    2017 03 10 问 知道一堆点 如何求出其中距离最近的一对 按欧式距离 除了暴力求解 还有没有其他的办法 这个算是最笨的办法 复杂度也比较高 我在另外一个博客里看到 他是用分治法的方式进行处理 而且也指出这个算法的难点在于如何将各种情
  • YOLO,VOC数据集标注格式解析

    YOLO数据集txt标注格式 0 0 160938 0 541667 0 120312 0 386111 分别指所标注内容的类别 归一化后的中心点x坐标 归一化后的中心点y坐标 归一化后的目标框宽度w 归一化后的目标况高度h 此处归一化指的
  • Fildder无法抓不到Firefox的包

    起因 Firefox这个浏览器对开发者太友好了 开发者工具看着很清爽 功能也很实用 就安装来用这个浏览器做项目测试 某次开发中发现某个请求有些问题 想用强大的Fiddler来看下前端到底是怎么发送的请求 问题来了 Fildder死活抓不到f
  • 什么是网络空间测绘?到底有什么作用?

    据X视新闻客户端报道 当地时间4月18日 谷歌地图服务开始以最大分辨率提供俄罗斯所有军事和战略设施的卫星图像 目前 包括各种洲际弹道D弹发射井 指挥所 秘密试验场等在内的俄战略要地均可以每像素约0 5米的分辨率查看 随后 谷歌公司已否认了
  • 前端UI框架整理

    1 TDesign 腾讯最近刚刚公开的一套UI框架 个人感觉不错 桌面与移动端都有 下面是官网介绍 TDesign 是什么 TDesign 是腾讯各业务团队在服务业务过程中沉淀的一套企业级设计体系 TDesign 具有统一的 设计价值观 一
  • BLAM跑自己的数据包无法显示全局点云地图解决(速腾聚创RS-LiDAR-16 雷达 )-SLAM不学无术小问题

    BLAM算法跑自己的数据包无法显示全局点云地图解决 适配速腾聚创RS LiDAR 16 雷达 提示 本文笔者使用环境Ubuntu18 04 ROS melodic版本 首先放一个效果链接 由b站up VladimirDuan上传 非官方 官