ubuntu18.04速腾聚创雷达采集XYZIRT点云格式转换Velodyne雷达XYZIRT点云格式

         在利用lio-sam代码运行自己的数据包时,若自己的雷达是速腾雷达,一定会遇到一个问题:那就是采集到的数据不可以直接用,因为速腾的点云数据与Velodyne有一定的不同。然后对于lio-sam,它对激光雷达的数据格式有要求,考虑到与IMU时间同步问题,源码中会检查激光雷达的ring通道和时间戳是否符合要求。即x, y, z, intensity, ring, timestamp格式。下面是自己在转换点云格式遇到的种种问题的总结,希望能帮助到大家。

环境:ubuntu18.04,速腾RS-16

一、雷达驱动下载

对于rslidar_sdk的下载与连通速腾雷达的教程,可以看这篇文章。

Ubuntu测试使用速腾RS-Lidar-16_冈部伦太郎.的博客-CSDN博客

当速腾雷达驱动安装成功后,在确认一些东西,就可以开始解决点云数据转换的问题了。

①进入你下载好的rslidar_sdk功能包里,打开CMakeLists,查看set(POINT_TYPE XYZIRT)与set(COMPILE_METHOD CATKIN)后面的格式是否已经改成XYZIRT 和 CATKIN了

② 将rslidar_sdk工程目录下的package_ros1.xml文件重命名为package.xml。若有了就不需要做这步

ok,现在可以开始做点云数据转换了。

二、安装rs_to_velodyne转化节点

进入安装速腾雷达驱动的功能包的src目录中,输入

git clone https://github.com/HViktorTsoi/rs_to_velodyne.git

这里注意一下,如果之前你一直跟着我推荐的链接步骤做的话,那么你现在就是需要在 ~/lidar/src目录下输出这个指令,或者是你自己命名的工作空间中。比如这次我是在RS_SDK文件夹下安装的驱动,则我现在就在~/RS_SDK/src下输入指令。如图。

 如果这边位置放错之后可能会显示找不到功能包XXX的launch文件!

ok,克隆完毕编译一下。

cd ..
catkin_make

 然后进入rs_to_velodyne文件夹下创建launch文件夹。

cd src/rs_to_velodyne
mkdir launch

进入launch文件夹中创建文件,名字任意。

cd launch
gedit rs2velodyne.launch

在launch中输入下列内容保存退出

<launch>
  <node pkg="rs_to_velodyne" name="rs_to_velodyne" type="rs_to_velodyne"  args="XYZIRT XYZIRT"   output="screen">
  </node>
</launch>

注意args参数,采集XYZIRT格式的点输入XYZIRT,采集XYZI格式的点输入XYZI,lio-sam要求XYZIRT,所以这里输入XYZIRT。

现在就可以运行launch文件测试一下了。

source ~/RS_SDK/devel/setup.bash
roslaunch rs_to_velodyne rs2velodyne.launch

若显示如下,说明velodyne点云转换驱动已经安装完成!记得查看一下话题!

新开窗口输入

rostopic list

 

能看到/velodyne_points就说明成功了。

 三、转化节点与雷达驱动同时启动设置

cd ~/RS_SDK/src/rslidar_sdk/launch
gedit start.launch

加入这段话

 <!--- rs_to_velodyne -->
  <include file="$(find rs_to_velodyne)/launch/rs2velodyne.launch" />

改后的launch文件为:

<launch>
  <node pkg="rslidar_sdk" name="rslidar_sdk_node" type="rslidar_sdk_node" output="screen">
    <param name="config_path" value=""/>
  </node>
 <!--- rs_to_velodyne -->
<include file="$(find rs_to_velodyne)/launch/rs2velodyne.launch" />
  <!-- rviz -->
  <node pkg="rviz" name="rviz" type="rviz" args="-d $(find rslidar_sdk)/rviz/rviz.rviz" />
</launch>

添加完毕后,从新source一下并启动

source ~/RS_SDK/devel/setup.bash

roslaunch rslidar_sdk start.launch

若成功显示没有报错,则完成数据转化,利用rostopic list 查看一下话题。

则转换完毕。

不过有可能会报如下错误,且看不到/vlodyne_points话题!如图!

 

出现这个警告的原因,大概率是因为rs_to_velodyne功能包中定义的点云数据结构中的intensity出现了不一致的原因。

进入~/RS_SDK/src/rs_to_velodyne/src目录下,找到rs_to_velodyne.cpp文件,打开查看。

 他这个地方是通过一个宏定义进行定义的,我们再进入这个宏定义看看是怎么定义的

看到这里,答案已经很明确了,就是因为这里使用的intensityfloat类型的,导致了两种数据格式不匹配,所以才出现了我们一开始报的那个``warming` 

解决方法就是把rslidar的点云格式中的uint8_t intensity;使用PCL_ADD_INTENSITY;替换即可

还有一个要注意的点,在定义数据类型的时候, 强度参数也要是浮点类型,不然依然会报错!

 完成后重新编译一下,再次运行launch文件即可

cd ~/RS_SDK
catkin_make
source devel/setup.bash
roslaunch rslidar_sdk start.launch

发现错误已解决,并有相对应的话题与点云图显示!

 

 

参考博客:

1、Ubuntu18 安装ROS节点解决----速腾聚创雷达点云格式转换为Velodyne雷达点云格式 --SLAM不学无术小问题_^oprater^的博客-CSDN博客

2、RS雷达转Velodyne雷达数据Failed to find match for field ‘intensity‘_rs_to_velodyne_linzs.online的博客-CSDN博客

  • 10
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个简单的代码示例,用于实时将镭神C16输出的点云格式转换Velodyne点云数据格式: ```c++ #include <ros/ros.h> #include <sensor_msgs/PointCloud2.h> #include <pcl_conversions/pcl_conversions.h> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/point_cloud.h> ros::Publisher pub; void cloud_cb (const sensor_msgs::PointCloud2ConstPtr& input_cloud_msg) { // 将ROS点云消息转换为PCL点云格式 pcl::PointCloud<pcl::PointXYZI>::Ptr input_cloud (new pcl::PointCloud<pcl::PointXYZI>); pcl::fromROSMsg (*input_cloud_msg, *input_cloud); // 创建Velodyne点云数据格式点云 pcl::PointCloud<pcl::PointXYZI>::Ptr output_cloud (new pcl::PointCloud<pcl::PointXYZI>); // 将镭神C16点云数据格式转换Velodyne点云数据格式 for (size_t i = 0; i < input_cloud->points.size (); ++i) { pcl::PointXYZI point; point.x = input_cloud->points[i].x; point.y = input_cloud->points[i].y; point.z = input_cloud->points[i].z; point.intensity = input_cloud->points[i].intensity; point.ring = 0; // 需要计算或者赋值激光线束编号 point.timestamp = 0; // 需要计算或者赋值时间戳 output_cloud->points.push_back (point); } // 将转换后的Velodyne点云数据格式发布为ROS点云消息 sensor_msgs::PointCloud2 output_cloud_msg; pcl::toROSMsg (*output_cloud, output_cloud_msg); output_cloud_msg.header = input_cloud_msg->header; pub.publish (output_cloud_msg); } int main (int argc, char** argv) { // 初始化ROS节点 ros::init (argc, argv, "c16_to_velodyne"); // 创建ROS节点句柄 ros::NodeHandle nh; // 创建ROS订阅器,用于接收镭神C16输出的点云数据 ros::Subscriber sub = nh.subscribe<sensor_msgs::PointCloud2> ("/c16_point_cloud", 1, cloud_cb); // 创建ROS发布器,用于发布转换后的Velodyne点云数据 pub = nh.advertise<sensor_msgs::PointCloud2> ("/velodyne_points", 1); // 循环等待ROS事件 ros::spin (); return (0); } ``` 在上述代码中,首先通过使用`ros::Subscriber`订阅器订阅镭神C16输出的点云数据。然后,在回调函数`cloud_cb`中,将ROS点云消息转换为PCL点云格式,并使用循环遍历镭神C16点云数据格式的每一个点,将其转换为Velodyne点云数据格式,并添加所需的属性,如激光线束编号和时间戳。最后,使用`ros::Publisher`发布器将转换后的Velodyne点云数据格式发布为ROS点云消息。需要注意的是,上述示例代码仅供参考,具体的实现可能需要根据实际情况进行调整和修改。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值