网上主流有两种解决方案:PCL:“Failed to find match for field ‘intensity‘. ” 解决方案_孙 悟 空的博客-CSDN博客
但这两种办法都不能解决我这个问题,经过几天的研究发现还有另外一种原因可能会造成这种错误,特别是在使用自定义点云类型的时候。
我在录制bag包的时候,定义的点云消息格式是:
struct PointXYZITM
{
PCL_ADD_POINT4D
uint8_t intensity;
uint8_t ring;
float time;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW // make sure our new allocators are aligned
} EIGEN_ALIGN16;
POINT_CLOUD_REGISTER_POINT_STRUCT(lslidar_rawdata::PointXYZITM,
(float, x, x)(float, y, y)(float, z, z)(uint8_t, intensity, intensity)(uint8_t,ring, ring)(float, time, time))
我在接收处理该点云时定义的点云消息格式是:
struct VelodynePointXYZIRT
{
PCL_ADD_POINT4D
PCL_ADD_INTENSITY;
uint16_t ring;
float time;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
} EIGEN_ALIGN16;
POINT_CLOUD_REGISTER_POINT_STRUCT (VelodynePointXYZIRT,
(float, x, x) (float, y, y) (float, z, z) (float, intensity, intensity)
(uint16_t, ring, ring) (float, time, time)
)
在这两个点云消息类型中,ring和intensity变量的消息类型不一样,其中intensity的不一致就会导致Failed to find match for field "intensity"。特别是在用开源代码跑自己的数据集时需要注意点云消息的数据格式问题。