我试图理解下面的代码,它是针对一种在pointcloud中保存XYZ和Intensity值的结构,该字段PCL_ADD_POINT4D
看起来像一个独立的语句,没有任何已知类型,这是什么意思?这是解决内容的一种方法吗?
struct EIGEN_ALIGN16 _PointXYZI
{
PCL_ADD_POINT4D; // This adds the members x,y,z which can also be accessed using the point (which is float[4])
union
{
struct
{
float intensity;
};
float data_c[4];
};
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
这是从http://docs.ros.org/hydro/api/pcl/html/point__types_8hpp_source.html#l00382
什么是PCL_ADD_POINT4D?是否有任何明显的原因为何intensity
需要包含在结构中。干杯。
编辑:
正如@Beta指出的PCL_ADD_POINT4D
来自这里
拥有intensity
结构体仍然很奇怪。(如果有正当的理由,我将保留这个问题)
PCL_ADD_POINT4D
引用宏PCL_ADD_POINT4D
指以下几行
#define PCL_ADD_POINT4D \
union EIGEN_ALIGN16 { \
float data[4]; \
struct { \
float x; \
float y; \
float z; \
}; \
}; \
这EIGEN_ALIGN16
是一个SSE宏,可帮助优化点操作,因为它们通常应用于在这些上下文中定义的类型的向量(在我们的情况下为点向量/云)。
链接到源文件在这里
我认为这比其他任何事情都更令人赏心悦目的设计模式,我已经习惯了,因为我的眼睛更加熟悉了优秀的PCL库。
在struct中,成员按顺序存储在相邻的内存位置中,而在并集中,所有成员都从同一位置开始,并且确实具有重叠的性质(想象一下,将不同大小(长度)的字符串组合成一个长字符串[struct]而不是悬挂不同长度的字符串(或绳索)从一个点[联合]开始,在联合情况下,整个物件的长度将是最长的弦线的长度。
我们可以利用这些功能为我们的新类型提供一个简洁的外观,这正是PCL的作者所做的。
struct point_xyz{
union{
float x;
float y;
float z;
float padding; // redundant with data[4] already taking care of it
};
float data[4];
};
如果我们实例化一个point_xyz
as,例如point1
我们可以访问它的成员,point1.data[0]
或者point1.x
也可以将整个点传递.data
给以这种方式使用它的函数。
那么这与原始问题有什么关系呢?
我认为这是因为该点类型结构定义在PCL源中非常规则地出现,并且在声明强度时使用相同的蓝图只是为了在眼睛上很容易。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句