解析sensor_msgs::PointCloud2 ROS点云数据

2 篇文章 0 订阅
1 篇文章 1 订阅

一、消息结构

sensor_msgs::PointCloud2是一类点云数据结构,消息定义如下

$ rosmsg info sensor_msgs/PointCloud2
std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
uint32 height
uint32 width
sensor_msgs/PointField[] fields
  uint8 INT8=1
  uint8 UINT8=2
  uint8 INT16=3
  uint8 UINT16=4
  uint8 INT32=5
  uint8 UINT32=6
  uint8 FLOAT32=7
  uint8 FLOAT64=8
  string name
  uint32 offset
  uint8 datatype
  uint32 count
bool is_bigendian
uint32 point_step
uint32 row_step
uint8[] data
bool is_dense

一个仿真的点云消息长这样

$ rostopic echo /airsim_node/Drone0/lidar/LidarSensor1
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是序列化后的数据,直接看不到物理意义。写了两种解析sensor_msgs::PointCloud2 数据的程序。

二、Python

#!/usr/bin/env python2
# coding:utf-8

import rospy
from sensor_msgs.msg import PointCloud2
from sensor_msgs import point_cloud2

def callback_pointcloud(data):
    assert isinstance(data, PointCloud2)
    gen = point_cloud2.read_points(data)
    print type(gen)
    for p in gen:
        print p 

def listener():
    rospy.init_node('pylistener', anonymous=True)
    #Subscriber函数第一个参数是topic的名称,第二个参数是接受的数据类型 第三个参数是回调函数的名称
    rospy.Subscriber('/airsim_node/Drone0/lidar/LidarSensor1', PointCloud2, callback_pointcloud)
    rospy.spin()

if __name__ == '__main__':
    listener()

解析上面数据输出如下

<type 'generator'>
(1.5258788153005298e-06, 1.220703097715159e-06, 5.185408592224121)
(9.155273232863692e-07, 1.220703097715159e-06, 5.185408592224121)
(9.155273232863692e-07, 1.220703097715159e-06, 5.185408592224121)

三、C++

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

double pointCloud2ToZ(const sensor_msgs::PointCloud2 &msg)
{
	sensor_msgs::PointCloud out_pointcloud;
	sensor_msgs::convertPointCloud2ToPointCloud(msg, out_pointcloud);
	for (int i=0; i<out_pointcloud.points.size(); i++) {
		cout << out_pointcloud.points[i].x << ", " << out_pointcloud.points[i].y << ", " << out_pointcloud.points[i].z << endl;
	}
	cout << "------" << endl;
	return out_pointcloud.points[0].z;
}

 

  • 35
    点赞
  • 176
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
### 回答1: sensor_msgs::PointCloud2 是 ROS (Robot Operating System) 中用于表示三维点云数据的消息类型。它包含了点云中点的位置、颜色和其他信息。使用这个类型可以在 ROS 的话题中传输点云数据。 ### 回答2: sensor_msgs::pointcloud2是ROS中的一种消息类型,它用于表示三维空间中的点云数据点云数据是由若干个点组成的集合,每个点拥有x、y、z三个坐标值。这些点可以代表物体的表面形态、环境的深度信息等,因此,在机器人感知中被广泛应用。 sensor_msgs::pointcloud2消息类型中包含了多个字段,包括header、height、width、fields、is_bigendian、point_step、row_step、data等。其中,header包含了消息头信息,可以用于标识消息的来源、时间戳等;height和width用于描述点云数据的矩阵形态,即点云数据是由一个二维的点阵组成,其中height表示点阵的高,即点云数据的行数,而width表示点阵的宽,即点云数据的列数;fields定义了每个点包含的数据类型和名称,如坐标值x、y、z以及颜色值rgb等;is_bigendian表示系统的字节序,即是Little Endian还是Big Endian;point_step表示一个点所占用的内存大小,即每个点包含的字节数;row_step表示点阵中一行所占的内存大小,即每一行所包含的字节数;最后,data则包含了所有的点云数据。 在ROS中,点云数据是通过sensor_msgs::pointcloud2类型的消息进行传输和解析的,因此,对于机器人感知中的点云数据的处理和分析,我们需要了解sensor_msgs::pointcloud2消息类型的结构和字段含义,才能更好地进行程序开发。 ### 回答3: sensor_msgs::pointcloud2是ROS(Robot Operating System)中一个消息类型,用于传输3D点云数据点云数据可以包含激光雷达、RGB-D相机、ToF相机等传感器获取的三维场景信息。该消息类型包含了点云数据的表示方式、坐标系、数据类型等信息,通过ROS消息机制实现了点云数据的发布和订阅。 点云数据是大量三维坐标点的集合,每个点可以包含不同的属性信息,如颜色、法向量、强度等。sensor_msgs::pointcloud2消息中的数据类型定义了各个属性的数据类型和对应的偏移量。常见的属性包括xyz坐标、rgb颜色等。 sensor_msgs::pointcloud2消息中的header字段可以包含坐标系信息,可以指定点云数据在哪个坐标系下表示。消息中也包含了点云数据的时间戳信息,可以用于数据同步等应用场景。 sensor_msgs::pointcloud2是ROS中常用的消息类型之一,它为传输大量三维点数据提供了方便的机制。通过使用该消息类型,可以方便地实现点云数据的传输和处理,如点云滤波、配准、分割等操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值