ros系列—解决“Failed to find match for field intensity”问题

运行系统:Ubuntu18.04

运行环境:python2.7.17

ROS初学者

问题重述:将kitti数据集中的点云bin文件转为bag包文件后参考方法,ros节点处理bag包中的点云数据,运行时出现“Failed to find match for field 'intensity'.”问题。

       上左图中点云颜色并没有根据点云强度(intensity)变化,右图为运行节点时出现“Failed to find match for field 'intensity'.”问题。


问题分析:该问题出现一般为采用含有强度字段的点云类型(如:PointXYZI)加载了没有强度信息的点云。而从kitti数据集中下载的点云数据结构为(x,y,z,i)是含有强度信息的,那么上述问题可能是bin文件转bag文件时点云强度(intensity)信息丢失导致?


问题解决:


(1)使用其他不含强度字段的点云类型(如:PointXYZ

void PclTestCore::point_cb(const sensor_msgs::PointCloud2ConstPtr & in_cloud_ptr){
    pcl::PointCloud<pcl::PointXYZI>::Ptr current_pc_ptr(new pcl::PointCloud<pcl::PointXYZI>);
    pcl::PointCloud<pcl::PointXYZI>::Ptr filtered_pc_ptr(new pcl::PointCloud<pcl::PointXYZI>);
}

修改前节点代码

void PclTestCore::point_cb(const sensor_msgs::PointCloud2ConstPtr & in_cloud_ptr){
    pcl::PointCloud<pcl::PointXYZ>::Ptr current_pc_ptr(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr filtered_pc_ptr(new pcl::PointCloud<pcl::PointXYZ>);
}

修改后节点代码

上述方法相当于丢弃了强度信息,虽然能够避免报错,但显然不是我想要的。


(2)修改kitti2bag文件

1)在终端中输入whereis kitti2bag找到该文件的路径。

ryy@ryy-VivoBook-S14-X411UF:~$ whereis kitti2bag
kitti2bag: /usr/local/bin/kitti2bag

2)用vim打开该文件,找到如下字段(197行),将'i'改为'intensity'(此处有的初始就为intensity,我的问题可能就出在这吧),由于是只读文件,直接:wq退出会报错,可用:w !sudo tee %,输入密码退出。

再次打开该文件,确保修改成功。


 3)按照参考方法重新转换bag文件。

注:pip install pykitti 依然提示没有pykitti这个包,问题在于此处的pip是另一版本的python的包管理工具,ros默认的python环境为Linux自带的python2.7.,也就是说你没将pykitti没有安装到ros的环境中,不妨在终端输入python2,再import pykitti,若提示找不到相关模块,即证明你将pykitti安装到了其他版本的python环境中。

ryy@ryy-VivoBook-S14-X411UF:~$ python2
Python 2.7.17 (default, Feb 27 2021, 15:10:58) 
[GCC 7.5.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pykitti

或者在终端中输入pip -V,即可查看当前pip对应的python版本 。

ryy@ryy-VivoBook-S14-X411UF:~$ pip -V
pip 10.0.1 from /home/ryy/anaconda3/lib/python3.7/site-packages/pip (python 3.7)

输入pip2 -V, 若pip2对应的python版本为2.7,则pip2 install pykitti 即可。

ryy@ryy-VivoBook-S14-X411UF:~$ pip2 -V
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)

 4)重新编译运行,问题解决!!


 #################希望对遇到同样问题的小伙伴些许帮助!!#########################

当你在运行lego_loam时,出现类似于“Failed to find match for field 'intensity'”这样的错误,通常是因为你的点云数据中缺少了某些字段,例如intensity字段。 解决这个问题的方法,一般有以下几个步骤: 1. 确认你的点云数据中是否包含intensity字段。不同的激光雷达厂商提供的点云数据格式可能不同,需要查看你使用激光雷达的数据格式说明来确认是否包含intensity字段。 2. 如果你的点云数据中确实缺少intensity字段,可以使用ROS工具包中的PointCloud2节点来添加缺失的字段。例如,以下命令可以添加一个名为intensity的字段,并将其值设置为0: ``` rosrun pcl_ros pointcloud_to_pointcloud2 input_cloud:=<input_cloud_topic> output_cloud:=<output_cloud_topic> fields:=x,y,z,intensity:=0 ``` 其中,input_cloud_topic是原始点云数据的话题,output_cloud_topic是添加了intensity字段后输出的点云数据的话题。 3. 如果你的点云数据中包含intensity字段,但仍然出现“Failed to find match for field 'intensity'”这样的错误,可能是因为你没有正确设置ROS参数。lego_loam使用了一些ROS参数来控制点云的处理,例如`/laser_cloud_surround_num`和`/use_cloud_ring`等参数。确保这些参数已正确设置。 如果以上步骤都无法解决问题,可以尝试检查你的代码或配置文件是否存在其他问题,并查看ROS终端的输出,以便更好地理解错误发生的原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值