如何将 (ROS) "geometry_msgs/Point"转换为 sensor_msgs/PointCloud2?



我是一名学习激光雷达算法的学生。我有一个订阅sensor_msgs/PointCloud2的激光雷达代码。我现在正在接收geometry_msgs/Point数据。我想把geometry_msgs/Point变成sensor_msgs/PointCloud2。我想应用我写的代码。请告诉我c++中的sensor_msgs::PointCloud2类型函数!!还有widthheight,等等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,然后使用方法fromPCLmoveFromPCL从pcl_conversions

转换

最新更新