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 层面.)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE蓝图 里的函数,编辑模式在Sequence里执行

在蓝图里创建CustomFunction &#xff0c;把蓝图拖入Sequence &#xff0c;添加事件 即可调用 如果需要在Sequence里K 蓝图里的变量&#xff0c;需要勾上向过场动画公开

JS中Map对象与object的区别

若想了解Map对象可以阅读本人这篇ES6初步了解Map Map对象与object有什么区别&#xff1f;让我为大家介绍一下吧&#xff01; 共同点 二者都是以key-value的形式对数据进行存储 const obj {name:"zs",age:18}console.log(obj)let m new Map()m.set("name&quo…

《深入理解计算机系统》学习笔记 - 第三课 - 浮点数

Floating Point 浮点数 文章目录 Floating Point 浮点数分数二进制示例能代表的数浮点数的表示方式浮点数编码规格化值规格化值编码示例 非规格化的值特殊值 示例IEEE 编码的一些特殊属性四舍五入&#xff0c;相加&#xff0c;相乘四舍五入四舍五入的模式二进制数的四舍五入 浮…

带负离子的高速吹风筒方案介绍---【其利天下技术】

负离子吹风筒的产品概念&#xff0c;在吹风筒的产品系列里早就存在的。近年来&#xff0c;随着高速风筒的逐渐普及&#xff0c;产品商都开始把这些产品概念带了进来。一方面提升产品的核心竞争力&#xff0c;另一方面也是为了提升产品体验度&#xff0c;给用户带来不一样的产品…

夯实c基础

夯实c基础 区别&#xff1a; 图一的交换&#xff0c;&#xff08;交换的是地址而不是两数&#xff09;无法实现两数的交换。 题干以下程序的输出结果为&#xff08; c  &#xff09;。 void fun(int a, int b, int c){ ca*b; } void main( ){ int…

ssh安装和Gitee(码云)源码拉取

文章目录 安装ssh服务注册码云公钥设置码云账户SSH公钥安装git客户端和git-lfs源码获取 安装ssh服务 更新软件源&#xff1a; sudo apt-get update安装ssh服务 sudo apt-get install openssh-server检查ssh是否安装成功 which ssh输出&#xff1a; /usr/bin/ssh启动ssh 服…

虾皮定价公式:如何在Shopee上为您的商品设置合适的价格?

在Shopee这样的电商平台上销售商品&#xff0c;定价是一个至关重要的因素。一个合理的定价策略不仅可以吸引更多的买家&#xff0c;还可以确保您从每个商品中获得足够的利润。虾皮&#xff08;Shopee&#xff09;为卖家提供了一个简化的定价公式&#xff0c;考虑了多个因素&…

浅析AI智能视频监控技术在城市交通中的作用及意义

城市交通作为整个城市的整体脉络&#xff0c;每天都发挥着重要作用&#xff0c;为了最大程度地避免城市交通堵塞、提高城市交通效率&#xff0c;智能视频监控系统发挥了重要作用。具体表现在以下几个方面&#xff1a; 1、交通违规监管&#xff1a;TSINGSEE青犀智能视频监控系统…

【JavaScript】JS——Map数据类型

【JavaScript】JS——Map数据类型 什么是Map?特性Map与Object的比较 map的创建map的属性map相关方法map的遍历 什么是Map? 存储键值对的对象。 能够记住键的原始插入顺序任何值&#xff08;对象或原始值&#xff09;都可以作为键或值。 特性 Map中的一个键只能出现一次&am…

【三维重建】多频外差相位展开(C++实现)

在结构光三维重建中&#xff0c;通过相移法求解出来的相位是包裹相位&#xff08;在 [&#xff0d;π/2,π/2] 间成周期性 &#xff09; 我们想要用相位找到相机与投影仪间的对应像素&#xff0c;就需要进行相位展开&#xff0c;确保每一行的相位值是唯一的。 多频外差是相位…

JVM虚拟机(已整理,已废弃)

# JVM组成 ## 简述程序计数器 线程私有&#xff0c;内部保存class字节码的行号。用于记录正在执行的字节码指令的地址。 线程私有-每个线程都有自己的程序计数器PC&#xff0c;用于记录当前线程执行哪个行号 ## 简述堆 ## 简述虚拟机栈 ## 简述堆栈区别 ## 方法内局部变量是…

SRC挖掘漏洞XSS

Markdown是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;John Gruber&#xff09;。它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成有效的 XHTML&#xff08;或者HTML&#xff09;文档。这种语言吸收了很多在电子邮件中已有的纯文本标记的…

Ubuntu宝塔面板本地部署轻论坛系统HadSky并远程访问

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…

5.C转python

新始: 13.列表可被改变(数据),元组不可被改变(数据),二者皆与C中的数组的大致相同 14.创建列表方法: 1.一个[ ]就是一个空的列表 2.使用list函数来创建列表 如: 15.可以在[ ]内部指定列表的初始值,打印方法: 如: 16.在python中,在同一个列表中,可以放不同类型的变量(也可…

Vector Quantized Diffusion Model for Text-to-Image Synthesis

Vector Quantized Diffusion Model for Text-to-Image Synthesis Shuyang Gu, University of Science and Technology of China, Microsoft, CVPR2022, Cited: 340, Code, Paper 1. 前言 我们提出了用于文本到图像生成的矢量量化扩散(Vector Quantized Diffusion Model&…

银河麒麟服务器部署Prometheus+Grafana

#年薪百万# 一、环境准备 操作系统&#xff1a;Operating System: Kylin Linux Advanced Server V10 (Sword) (X86-64) prometheus&#xff1a;prometheus-2.48.0.linux-amd64 grafana&#xff1a;grafana-enterprise-10.2.2.linux-amd64 node_exporter&#xff1a;node_expor…

uni-app 微信小程序之自定义中间圆形tabbar

文章目录 1. 自定义tabbar效果2. pages新建tabbar页面3. tabbar 页面结构4. tabbar 页面完整代码 1. 自定义tabbar效果 2. pages新建tabbar页面 首先在 pages.json 文件中&#xff0c;新建一个 tabbar 页面 "pages": [ //pages数组中第一项表示应用启动页&#xff…

hive sql子单元查找组合单元信息

1. 背景 店铺卖东西&#xff0c;会将一部分子商品&#xff08;单个商品&#xff0c;sku 粒度&#xff09;打包到一起&#xff0c;变成一个组合商品去售卖。 用户买东西&#xff0c;可能会买多个组合商品。 数仓这边拿到的数据&#xff0c;全是已经拆分到子商品的订单商品数据…

Ubuntu宝塔面板本地部署Emlog个人博客网站并远程访问【内网穿透】

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

DDoS高防IP到底是什么?

DDoS高防IP是提供一个带防御的IP&#xff0c;主要是针对网络中的DDoS攻击进行保护&#xff0c;是针对互联网服务器遭受大流量的DDoS攻击后&#xff0c;导致服务不可用的情况下&#xff0c;用户可以通过配置高防IP&#xff0c;将攻击流量引流到高防IP上&#xff0c;从而确保源站…