解析sensor_msgs::PointCloud2 ROS点云数据

1.一个仿真的点云数据
header: 
  seq: 2116
  stamp: 
    secs: 1586919439
    nsecs: 448866652
  frame_id: "LidarSensor1"
height: 1
width: 3
fields: 
  - 
    name: "x"
    offset: 0
    datatype: 7
    count: 1
  - 
    name: "y"
    offset: 4
    datatype: 7
    count: 1
  - 
    name: "z"
    offset: 8
    datatype: 7
    count: 1
is_bigendian: False
point_step: 12
row_step: 36
data: [143, 194, 117, 53, 10, 215, 163, 53, 222, 238, 165, 64, 143, 194, 117, 53, 10, 215, 163, 53, 222, 238, 165, 64, 143, 194, 117, 53, 10, 215, 163, 53, 222, 238, 165, 64]
is_dense: True

PointCloud2的data是序列化后的数据,直接看不到物理意义,可以转到PointCloud处理

#include <sensor_msgs/PointCloud2.h>
#include <sensor_msgs/PointCloud.h>
#include <sensor_msgs/point_cloud_conversion.h>

sensor_msgs::PointCloud clouddata;
sensor_msgs::convertPointCloud2ToPointCloud(msg, clouddata);
sensor_msgs::PointCloud cloud;
cloud.header.stamp = ros::Time::now();
cloud.header.frame_id = "PERCEPTION2020"; //帧id
cloud.points.resize(clouddata.points.size());
cloud.channels.resize(1);             //设置增加通道数
cloud.channels[0].name = "intensity"; //增加反射强度信道,并设置其大小,使与点云数量相匹配
cloud.channels[0].values.resize(clouddata.points.size());

for (int i = 0; i < clouddata.points.size(); i++)
{
    cloud.points[i].x = clouddata.points[i].x;
    cloud.points[i].y = clouddata.points[i].y;
    cloud.points[i].z = clouddata.points[i].z;
    cloud.channels[0].values[i] = clouddata.channels[0].values[i];    //设置反射强度
}
pub->publish(cloud);

也可以直接用pcl转

pcl::PointCloud<pcl::PointXYZ> cloud;
pcl::fromROSMsg(msg, cloud);
posted @ 2022-06-21 14:08  penuel  阅读(3563)  评论(0编辑  收藏  举报