KITTI数据集中sensor_msgs消息类型介绍

PointCloud数据:sensor_msgs/PointCloud2

        话题 /kitti/velo/pointcloud 中获取

# 描述一个N维点云数据结构(通常用于表示三维点云数据),可能包含额外的信息,比如法线、强度等。
# 点云数据以二进制块的形式存储,其布局通过 "fields" 数组的内容进行描述。

# 点云数据可以组织为2d(类似图像)或1d(无序)。组织为2d图像的点云可以深度相机传感器(如双目相机或ToF)产生。

# 包含传感器数据采集的时间戳和坐标系 ID(适用于3d点)。
Header header

# 点云的二维结构。如果点云是无序的(1D),则高度为 1,宽度表示点云的长度。
uint32 height
uint32 width

# 描述点云数据中的各个通道及其在二进制数据块中的布局。
# 每个 PointField 可能描述诸如 X、Y、Z 坐标或颜色、法线等信息。
PointField[] fields

bool    is_bigendian # 表示数据是否为大端字节顺序。如果为 True,则数据按大端格式存储。
uint32  point_step   # 每个点的长度(以字节为单位)。它表示一个点在二进制数据中的字节大小。
uint32  row_step     # 每一行的长度(同上)。对于二维有序点云,这表示一行(即一排点)的字节数。
uint8[] data         # 实际的点云数据,大小为 row_step * height

# 如果所有点都是有效的(即没有无效点,如 NaN 值),则该值为 True。如果存在无效点,则为 False。
bool is_dense       
rostopic echo /kitti/velo/pointcloud | grep -v data

PointCloud数据:sensor_msgs/PointField

         sensor_msgs/PointCloud2中包含的 

# 这段信息描述了 PointCloud2 消息格式中每个点条目的描述结构
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      # 字段的名称。可能是 "x"、"y"、"z"、"i" 等,表示点云数据中各个字段的含义。
uint32 offset    # 从点结构体的起始位置到该字段的偏移量(以字节为单位)。这个偏移量指示了字段在点数据中的起始位置。
uint8  datatype  # 字段的数据类型,使用上述的枚举值
uint32 count     # 字段中元素的数量。例如,如果一个字段表示颜色,count 可能是 3,表示红色、绿色和蓝色三个分量。

         一个字节(Byte)由 8 位(Bit)组成

         PointCloud2 消息的 data字段 包含编码为字节流的点列表,其中每个点都是一个 struct 。单个 PointCloud2 消息中的点的格式由 fields 定义,它是 sensor_msgs/PointField 对象的列表。为了将数据转回单个点,必须对其进行反序列化。 PointCloud 库定义了执行此操作的方法(在 Python 中,可以使用pc2.read_points 。)在本质上,这些方法使用内存重解释将字节流转换为一组点(例如Python的struct.unpack()或c++中的重解释类型转换)。
        字节流表示的优点是它是一种非常灵活的紧凑的数据传输方式,允许对点使用任意结构。缺点是如果不进行反序列化,消息是不可读的。        

        可以通过 point_stepfields 中的 offset 来判断每个部分的字节数。每个字段的字节数可以通过相邻字段的 offset 差值来确定,具体步骤如下:

  1. x 字段的 offset 是 0,yoffset 是 4,因此 x 的字节数是 4(yoffset 减去 xoffset,即 4 - 0 = 4)。
  2. y 字段的字节数同样是 4(zoffset 是 8,因此 8 - 4 = 4)。
  3. z 字段也是 4 个字节(intensityoffset 是 12,因此 12 - 8 = 4)。
  4. intensity 的字节数也是 4(tagoffset 是 16,因此 16 - 12 = 4)。

因此,每个字段的字节数如下:

  • x: 4 字节
  • y: 4 字节
  • z: 4 字节
  • intensity: 4 字节

总的字节数为 16,与 point_step 一致。


IMU数据:sensor_msgs/Imu

        话题 /kitti/oxts/imu 中获取

# 这是一条保存来自 IMU(惯性测量单元)数据的消息

# 加速度应以 m/s^2(而不是 g)为单位,角速度应以 rad/sec 为单位

# 如果已知测量的协方差,则应填写(如果您只知道每次测量的方差,则只需将其放在对角线上)。
# 全零的协方差矩阵将被解释为“协方差未知”,并且要使用数据,必须假设协方差或从其他来源获取协方差

# 如果您对其中一个数据元素没有估计值(例如,您的 IMU 不会产生方向估计值),请将相关协方差矩阵的元素 0 设置为 -1。
# 如果您正在使用此消息,请检查每个协方差矩阵的第一个元素中的值是否为 -1,并忽略相关估计值。

Header header

geometry_msgs/Quaternion orientation # 姿态
float64[9] orientation_covariance    # Row major about x, y, z axes

geometry_msgs/Vector3 angular_velocity # 角速度
float64[9] angular_velocity_covariance # Row major about x, y, z axes

geometry_msgs/Vector3 linear_acceleration # 线加速度
float64[9] linear_acceleration_covariance # Row major x, y z 

        orientation是由 linear_acceleration和 angular_velocity计算而得,但并不是所有IMU设备都直接提供 orientation;如果没有提供,将 orientation各项置为0, orientation_covariance各项置为-1;

        这里协方差表示各个数据的误差,一般由器件厂商给出。

  
GPS数据:sensor_msgs/NavSatFix 

        话题 /kitti/oxts/gps/fix 中获取

# 适用于任何全球导航卫星系统的导航卫星定位

# 使用WGS 84坐标系

# header.stamp指定此测量的ROS时间(可以使用sensor_msgs/TimeReference消息报告相应的卫星时间)。
# header.frame_id是卫星接收器报告的坐标系,通常是GPS天线的位置。这是相对于车辆的欧几里德坐标系,而不是参考椭球坐标系。
Header header

# 卫星定位状态信息
NavSatStatus status

# 纬度[度]。赤道以北为正;负数是南。
float64 latitude

# 经度[度]。正值是本初子午线以东;负数是西。
float64 longitude

# 海拔高度[米]。正值高于 WGS 84 椭球体(如果没有可用的海拔高度,则为 NaN)。
float64 altitude

# 位置协方差[m ^ 2]: 相对于切线平面的位置协方差。 组件是East,North和Up(ENU)即东北天,按行优先顺序排列。
# 注意:此坐标系在极点处表现出奇异性。
float64[9] position_covariance

# 3 - 如果已知修正的协方差,请完全填写。
# 2 - 如果GPS接收器提供了每次测量的方差,请将其沿对角线放置。
# 1 - 如果只有“精度稀释”可用,请据此估计近似协方差。
uint8 COVARIANCE_TYPE_UNKNOWN=0 			# 未知类型。表示协方差的具体类型未知,可能是由于某些原因无法确定
uint8 COVARIANCE_TYPE_APPROXIMATED=1		# 协方差未知。表示协方差矩阵中的元素值未知,即不提供具体的协方差信息
uint8 COVARIANCE_TYPE_DIAGONAL_KNOWN=2      # 对角协方差已知。表示协方差矩阵是对角矩阵,对角线上的元素已知,而非对角线上的元素未知。这种情况下,只有位置坐标之间的不确定性(方差)已知,协方差矩阵的其他元素未提供
uint8 COVARIANCE_TYPE_KNOWN=3				# 完全协方差已知。表示协方差矩阵的所有元素都已知,包括位置坐标之间的不确定性和它们之间的协方差。这种情况下,提供了协方差矩阵的所有元素


# position_covariance 中协方差的类型
uint8 position_covariance_type

GPS数据:sensor_msgs/NavSatStatus 

        sensor_msgs/NavSatFix 中包含的 

# 任何全球导航卫星系统的导航卫星定位状态

# 是否输出增强的定位 取决于 定位类型 和最后一次收到差分校正的时间。 
# 当状态 >= STATUS_FIX 时,此定位才有效。
int8 STATUS_NO_FIX =  -1        # 无法获取位置,即设备未能成功定位
int8 STATUS_FIX =      0        # 普通定位,即未使用任何增强技术的定位
int8 STATUS_SBAS_FIX = 1        # 基于卫星增强的定位,即使用了卫星增强系统(SBAS,Satellite-Based Augmentation System)来改进定位精度。
int8 STATUS_GBAS_FIX = 2        # 基于地面增强的定位,即使用了地面增强系统(GBAS,Ground-Based Augmentation System)来改进定位精度

int8 status

# 定义接收机使用了哪种全球导航卫星系统信号
uint16 SERVICE_GPS =     1      # GPS导航系统
uint16 SERVICE_GLONASS = 2      # GLONASS导航系统
uint16 SERVICE_COMPASS = 4      # includes BeiDou.
uint16 SERVICE_GALILEO = 8      # 伽利略导航系统

uint16 service

GPS数据:geometry_msgs/TwistStamped

        话题 /kitti/oxts/gps/vel 中获取

# 带有参考坐标系和时间戳的速度
Header header
Twist twist
# 空间中的速度,分为直线速度和角速度。
Vector3  linear
Vector3  angular

Image数据:sensor_msgs/Image(彩色)

        话题 /kitti/camera_color_left/image_raw 中获取,可使用

rostopic echo /kitti/camera_color_left/image_raw | grep -v data

        命令查看除了 data 字段之外的所有信息。其中grep -v data 用于过滤掉包含 data 字段的行,只显示其他字段。

# 此消息包含未压缩的图像
#(0,0)位于图像的左上角
#

Header header        # header 时间戳 应为图像获取时间
                     # header frame_id 应为相机的光学坐标系
                     # 坐标系原点应为相机的光学中心
                     # +x 轴应指向图像的右侧
                     # +y 轴应指向图像的下方
                     # +z 轴应指向图像平面的内部
                     # 如果此处的frame_id和与图像关联的CameraInfo消息的frame_id冲突,
                     # 则行为未定义

uint32 height         # 图像高度,即行数
uint32 width          # 图像宽度,即列数

#编码的合法值位于src/image_encodings.cpp文件中
#如果要标准化新的字符串格式,请连接ros-users@lists.sourceforge.net并发送一封建议新编码的电子邮件。

string encoding       # 像素编码方式——通道含义、顺序、大小。编码方式取自                 
                      # include/sensor_msgs/image_encodings.h 中的字符串列表
                      # 常见的编码格式包括 "rgb8"、"bgr8"、"mono8" 等

uint8 is_bigendian    # 图像数据是否采用大端字节顺序?(1 表示大端,0 表示小端)
uint32 step           # 每一行图像数据所占用的字节数,即完整行的字节数
uint8[] data          # 实际的矩阵数据,大小为 (step * 行数)

 Image数据:sensor_msgs/CameraInfo(彩色)

        话题 /kitti/camera_color_left/camera_info 中获取

# 这段信息定义了相机的元信息,通常通过 ROS 话题 camera_info 发布,并且可能伴随最多五个图像话题。
# 主要图像话题:
#     image_raw:来自相机驱动程序的原始数据,可能是 Bayer 格式编码。
#     image:单色、失真的图像。
#     image_color:彩色、失真的图像。
#     image_rect:单色、矫正后的图像。
#     image_rect_color:彩色、矫正后的图像。

# image_pipeline 包含如 image_proc 和 stereo_image_proc 这样的包,
# 用于从 image_raw 和 camera_info 生成上述处理后的图像话题。
# 相机参数的详细解释可以参考 http://www.ros.org/wiki/image_pipeline/CameraInfo

# image_geometry 包提供了便捷接口,推荐在使用这些元信息时,尤其是将 3D 点投影到图像坐标时使用。

# 注意:如果相机没有经过校准,矩阵 D、K、R 和 P 应保持全零状态。
# 特别是当 K[0] == 0.0 时,可以假定相机未校准。

#######################################################################
#                     Image acquisition info                          #
#######################################################################

Header header        # header 时间戳 应为图像获取时间
                     # header frame_id 应为相机的光学坐标系
                     # 坐标系原点应为相机的光学中心
                     # +x 轴应指向图像的右侧
                     # +y 轴应指向图像的下方
                     # +z 轴应指向图像平面的内部
        
            
#######################################################################
#                      Calibration Parameters                         #
#######################################################################
# 这些在相机校准期间是固定的。在重新校准摄像头之前,它们的值在所有消息中都是相同的 
# 请注意,自校准系统可能会经常"重新校准"                                    
#                                                                     
# 内部参数可用于将原始(失真)图像扭曲为:                                  
#     1.无失真的图像(需要D和K)                                        
#     2.校正后的图像(需要D、K、R)                                      
# 投影矩阵P将3D点投影到校正图像中                                        
#######################################################################

# 校准相机的图像尺寸。通常,这将是以像素为单位的完整相机分辨率。
uint32 height
uint32 width

# 使用的失真模型。支持的模型列表在sensor_msgs/distortion_models.h中。
# 对于大多数相机,“plumb_bob”(径向和切向失真模型)就足够了。
string distortion_model

# 失真参数。对于 "plumb_bob" 模型,有5个参数:k1, k2, t1, t2, k3。
float64[] D

# 相机内参矩阵,描述了焦距 (fx, fy) 和主点 (cx, cy)
#     [fx  0 cx]
# K = [ 0 fy cy]
#     [ 0  0  1]
# 将相机坐标系中的三维点投影到二维像素
float64[9]  K

# 校正矩阵(仅限双目相机)
# 一个旋转矩阵,将相机坐标系与理想的立体图像平面对齐,使两个立体图像中的极线平行。
float64[9]  R

# 投影/相机矩阵
#     [fx'  0  cx' Tx]
# P = [ 0  fy' cy' Ty]
#     [ 0   0   1   0]
# 对于单目相机,Tx = Ty = 0,矩阵的前三列通常与 K 相同。
# 对于双目相机,Tx 表示两个相机之间的基线距离。
float64[12] P

#######################################################################
#                      Operational Parameters                         #
#######################################################################
# 这些参数定义了相机驱动器实际捕获的图像区域。
# 虽然它们会影响输出图像的几何形状,但可以在不重新校准相机的情况下自由更改
#######################################################################

# Binning在这里是指将矩形像素邻域组合成更大的“超级像素”的任何相机设置。
# 它将输出图像的分辨率降低到(width/Binning_x)x(height/Binning_y)。
# 默认值binning_x=binning_y=0被认为与binning__x=binning_y=1相同(没有子采样)。
uint32 binning_x
uint32 binning_y


# 感兴趣区域(全相机分辨率的子窗口),以全分辨率(未绑定)图像坐标给出。
# 无论合并设置如何,特定的ROI总是表示相机传感器上的相同像素窗口。
# roi的默认设置(所有值均为0)被视为与全分辨率相同(roi.width=宽度,roi.eight=高度)。
RegionOfInterest roi

 

Image数据:sensor_msgs/Image(灰度)

        话题 /kitti/camera_gray_left/image_raw 中获取,和彩色图像的不同点在于encoding和step,其中step为彩色图像的1/3。

tf数据:tf2_msgs/TFMessage

        话题 /tf_static (6个)和 /tf[1个,即T_world_(base_link)] 中获取

geometry_msgs/TransformStamped[] transforms

tf数据: geometry_msgs/TransformStamped

# 这表示从坐标系header.frame_id到坐标系child_frame_id的变换,即T_frame_child

Header header
string child_frame_id
Transform transform

参考:

        sensor_msgs/NavSatFix 消息类型说明-CSDN博客 

        sensor_msgs/PointCloud2雷达数据信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值