我是一名学习激光雷达算法的学生。我有一个订阅sensor_msgs/PointCloud2
的激光雷达代码。我现在正在接收geometry_msgs/Point
数据。我想把geometry_msgs/Point
变成sensor_msgs/PointCloud2
。我想应用我写的代码。请告诉我c++中的sensor_msgs::PointCloud2
类型函数!!还有width
和height
,等等sensor_msgs/PointCloud2
。我如何转换它?我很好奇,因为geometry_msgs/Point
没有它们。
如果它是sensor_msgs/LaserScan
,我已经转换了它,但我不确定geometry_msgs/Point
。
最简单的方法是创建一个pcl PointCloud2结构体,用geometry_msgs/Point数据填充它,并相应地调整宽度。如果您有一个类型为geometry_msgs/Point
的向量points
,您可以执行以下操作:
pcl::PointCloud<pcl::PointXYZ>::Ptr tmp(new pcl::PointCloud<pcl::PointXYZ>);
tmp->width = 0;
tmp->height = 1;
tmp->is_dense = false;
tmp->points.resize(tmp->width * tmp->height);
tmp->header.frame_id = _your_frame;
for (int i = 0; i < points.size(); i++)
{
pcl::PointXYZ pt;
pt.x = points.at(i).x;
pt.y = points.at(i).y;
pt.z = points.at(i).z;
tmp->points.push_back(pt);
tmp->width++;
}
现在您可以使用已知的方法将这个PCL Pointcloud转换为Pointcloud2。
我认为最简单的方法是创建一个sensor_msgs::PointCloud
,其中包含geometry_msgs::Point32
的矢量。
然后将您的点数添加到此msg中,并从point_cloud_conversion.hpp中调用convertPointCloudToPointCloud2
方法
static inline bool convertPointCloudToPointCloud2(
const sensor_msgs::msg::PointCloud & input,
sensor_msgs::msg::PointCloud2 & output)
获取sensor_msgs::PointCloud2
或者您可以尝试创建一个pcl::PointCloud2
,然后使用方法fromPCL
或moveFromPCL
从pcl_conversions