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_step
和 fields
中的 offset
来判断每个部分的字节数。每个字段的字节数可以通过相邻字段的 offset
差值来确定,具体步骤如下:
x
字段的offset
是 0,y
的offset
是 4,因此x
的字节数是 4(y
的offset
减去x
的offset
,即4 - 0 = 4
)。y
字段的字节数同样是 4(z
的offset
是 8,因此8 - 4 = 4
)。z
字段也是 4 个字节(intensity
的offset
是 12,因此12 - 8 = 4
)。intensity
的字节数也是 4(tag
的offset
是 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
参考: