Livox_ros_driver2 消息 (msg) 类型对 SLAM 应用程序的适配

2023-12-07 22:36

本文主要是介绍Livox_ros_driver2 消息 (msg) 类型对 SLAM 应用程序的适配,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Title: Livox_ros_driver2 消息 (msg) 类型对 SLAM 应用程序的适配

文章目录

  • I 前言
  • II. 查看 ROS 消息
  • III. Livox ROS 驱动的消息类型
  • IV. 适配修改应用程序
  • V. 总结


I 前言

有时候, 拿到最新的 Livox 激光传感器, 比如 HAP, 原厂也提供了 ROS 驱动支持 livox_ros_drivers2 (https://github.com/Livox-SDK/livox_ros_driver2).

但是之前的开源 SLAM 代码 (比如 FAST_LIO, https://github.com/hku-mars/FAST_LIO) 还没支持 livox_ros_drivers2 呢, 都还只支持 livox_ros_driver (https://github.com/Livox-SDK/livox_ros_driver).

这里简单记录一下这个适配过程.

要让老应用程序 (FAST_LIO) 适配新传感器 (Livox HAP) 包含驱动的适配、消息的适配、传感器参数配置的适配等. 这里只涉及驱动和消息的适配. 传感器参数适配只需按照实际参数值修改应用程序的 .yaml 配置文件就可以.

相关博文介绍
Docker 环境下运行 Fast_LIO 进行三维建模的前/后处理设置

II. 查看 ROS 消息

如预料中那样, 使用 livox_ros_driver 是获得不了 HAP 的点云消息的, 本来也不支持 HAP.

driver1-Null-topic

使用 livox_ros_driver2 当然能拿到 HAP 的点云 topic “/livox/lidar”, 本来就支持 HAP. 且消息类型是 “livox_ros_drivers2/CustomMsg” (已在 .launch 文件中将参数 “xfer_format” 设置为 “1”).

driver2-topic1

而 FAST_LIO 虽然订阅了 “/livox/lidar”, 但消息类型却为 “livox_ros_drivers/CustomMsg”. 也就 fast_lio 兼容驱动 livox_ros_drivers, 而不兼容驱动 livox_ros_drivers2.

fast_lio_msg

III. Livox ROS 驱动的消息类型

不管是 livox_ros_drivers 还是 livox_ros_drivers2 都能通过 .launch 文件配置激光点云的消息类型. 这里只用到 “xfer_format” 的可选参数 “1”, 即 Livox 自定义点云格式.

ParameterDetailed descriptionDefault
xfer_formatSet pointcloud format
0 —— Livox pointcloud2(PointXYZRTLT) pointcloud format
1 —— Livox customized pointcloud format
2 —— Standard pointcloud2 (pcl :: PointXYZI) pointcloud format in the PCL library
0

事实上, 两个版本驱动的 “Livox customized pointcloud format” 的格式也是一样的.

driver1-2的msg格式
两者就消息格式发布的内部代码实现也是类似的.

Livox_ros_driver 中 livox_ros_driver/livox_ros_driver/lddc.cpp 的内部实现

    *pub = new ros::Publisher;if (kPointCloud2Msg == transfer_format_) {**pub =cur_node_->advertise<sensor_msgs::PointCloud2>(name_str, queue_size);ROS_INFO("%s publish use PointCloud2 format, set ROS publisher queue size %d",name_str, queue_size);} else if (kLivoxCustomMsg == transfer_format_) {**pub = cur_node_->advertise<livox_ros_driver::CustomMsg>(name_str,queue_size);ROS_INFO("%s publish use livox custom format, set ROS publisher queue size %d",name_str, queue_size);} else if (kPclPxyziMsg == transfer_format_) {**pub = cur_node_->advertise<PointCloud>(name_str, queue_size);ROS_INFO("%s publish use pcl PointXYZI format, set ROS publisher queue ""size %d",name_str, queue_size);}

Livox_ros_driver2 中 src/lddc.cpp 的内部实现

    *pub = new ros::Publisher;if (kPointCloud2Msg == transfer_format_) {**pub =cur_node_->GetNode().advertise<sensor_msgs::PointCloud2>(name_str, queue_size);DRIVER_INFO(*cur_node_,"%s publish use PointCloud2 format, set ROS publisher queue size %d",name_str, queue_size);} else if (kLivoxCustomMsg == transfer_format_) {**pub = cur_node_->GetNode().advertise<livox_ros_driver2::CustomMsg>(name_str,queue_size);DRIVER_INFO(*cur_node_,"%s publish use livox custom format, set ROS publisher queue size %d",name_str, queue_size);} else if (kPclPxyziMsg == transfer_format_) {**pub = cur_node_->GetNode().advertise<PointCloud>(name_str, queue_size);DRIVER_INFO(*cur_node_,"%s publish use pcl PointXYZI format, set ROS publisher queue ""size %d",name_str, queue_size);}

IV. 适配修改应用程序

有了上面的分析, 可知只需修改应用程序的依赖、头文件、数据类型就可以了. 直白一点就是在应用程序中遇见 “livox_ros_driver” 全替换为 “livox_ros_driver2” 就行了.

SLAM 前端应用程序 FAST_LIO 兼容 livox_ros_drivers2 的修改:

fast_lio中修改

同样地, 激光雷达和 IMU 初始标定的应用程序 LiDAR_IMU_Init (https://github.com/hku-mars/LiDAR_IMU_Init) 兼容 livox_ros_drivers2 的修改:

lidar_IMU_Init中修改

这样就可以硬件使用 Livox HAP 这些只和驱动 livox_ros_drivers2 兼容的新传感器, 继续学习原有开源 SLAM 程序了.

V. 总结

只是一个简单小技巧的记录,
关于 SLAM 应用程序适配新的机关雷达 Livox HAP 和新的 ROS 驱动 Livox_ros_driver2,
具体例子有 FAST_LIO 和 LiDAR_IMU_Init.

(有了 ROS 确实方便, 至少在 demo 层面.)

这篇关于Livox_ros_driver2 消息 (msg) 类型对 SLAM 应用程序的适配的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/467598

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

Mysql BLOB类型介绍

BLOB类型的字段用于存储二进制数据 在MySQL中,BLOB类型,包括:TinyBlob、Blob、MediumBlob、LongBlob,这几个类型之间的唯一区别是在存储的大小不同。 TinyBlob 最大 255 Blob 最大 65K MediumBlob 最大 16M LongBlob 最大 4G

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla

ActiveMQ—消息特性(延迟和定时消息投递)

ActiveMQ消息特性:延迟和定时消息投递(Delay and Schedule Message Delivery) 转自:http://blog.csdn.net/kimmking/article/details/8443872 有时候我们不希望消息马上被broker投递出去,而是想要消息60秒以后发给消费者,或者我们想让消息没隔一定时间投递一次,一共投递指定的次数。。。 类似