问题描述
我试图理解下面的代码,这是针对在点云中保存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
来自here
在结构中包含intensity
仍然很奇怪。 (如果有正当的理由,我将保留这个问题)
解决方法
PCL_ADD_POINT4D
是在line 144 of the same file中定义的宏。以大写字母表示的事实已经为我们提供了线索。
除了编译器特定的原因外,我看不出intensity
需要处于匿名结构的原因。
第1部分: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宏,可帮助优化点操作,因为它们通常应用于在这些情况下定义的类型的向量(在我们的情况下为点向量/云)。
到源文件的链接为here
第2部分:结构以容纳一个变量
我认为这比其他任何事情都更令人赏心悦目的设计模式,我已经习惯了,因为我的眼睛更加熟悉出色的PCL library。
在struct中,成员按顺序存储在相邻的内存位置中,而在并集中,所有成员都从同一位置开始,并且确实具有重叠的性质(想象一下,将不同大小(长度)的字符串组合成一个长字符串[struct] vs挂起从一个点(联合)开始,使用不同长度的绳(或绳),在联合情况下,整个物件的长度将是最长的绳的长度。
我们可以利用这些功能为我们的新类型提供一个简洁的外观,而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
实例化为例如point1
我们可以通过point1.data[0]
或point1.x
访问它的成员,也可以使用.data
将点作为一个整体传递给喜欢这种方式的函数。
那么这与原始问题有什么关系?
我认为这是因为该点类型结构定义在PCL源中非常规则地出现,并且在声明强度时使用相同的蓝图只是为了使人眼部方便。