ROS中的里程计与IMU的消息类型解读

ROS中的里程计的数据类型

在 ROS中,里程计(Odometry)通常使用消息类型 nav_msgs/Odometry 来表示,它包含了机器人在某一时刻的位姿(Pose)和速度(Twist)信息,以及对应的置信度(协方差)。下面按照消息的结构逐字段解释其含义。


消息定义(摘自 nav_msgs/Odometry

Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist

1. Header header

  • header.seq(uint32):消息序号(ROS 内部自动维护,一般用于调试排序)。
  • header.stamp(time):时间戳,表示此里程计数据对应的系统时间。
    • 通常由发布节点填入当前采样时刻,例如 ros::Time::now()
    • 在多传感器融合或可视化时,很关键,用于对齐不同传感器数据。
  • header.frame_id(string):坐标系 ID,表示里程计中“位姿”数据所对应的参考坐标系(父坐标系)。
    • 例如常见的 /odomodommap 等,用于 TF 树中进行帧变换。
    • frame_id = "odom" 时,意味着 pose.pose(见下文)表示机器人相对于“里程计坐标系(odom)”的位姿。

2. string child_frame_id

  • 表示里程计“子坐标系”的名称,通常对应于机器人本体坐标系(例如 base_linkbase_footprint)。
  • 也就是说,如果:
    • header.frame_id = "odom"
    • child_frame_id = "base_link"
      pose.pose 表示从 odom 坐标系到 base_link 坐标系的变换(即机器人在里程计坐标系中的位姿)。
  • TF 树中,系统会自动发布一条 TF 变换:
    transform: header.frame_id → child_frame_id
    children: …
    
    以供下游节点(如导航、可视化)使用。

3. geometry_msgs/PoseWithCovariance pose

PoseWithCovariance 包含两部分:pose + covariance

Pose    pose
float64[36] covariance
3.1 Pose pose

geometry_msgs/Pose 又分为:

Point    position
Quaternion orientation
  • position (Point)

    • position.x (float64):机器人在 header.frame_id 坐标系下的 X 轴坐标(单位:米)。
    • position.y (float64):在该坐标系下的 Y 轴坐标(单位:米)。
    • position.z (float64):在该坐标系下的 Z 轴坐标(单位:米)。
      • 对于地面移动机器人,一般 z = 0,或很小;如果是飞行器,Z 会表示高度。
  • orientation (Quaternion)

    • orientation.x (float64)
    • orientation.y (float64)
    • orientation.z (float64)
    • orientation.w (float64)
      这四个值以四元数形式(x, y, z, w)表示机器人在 header.frame_id 下的朝向(姿态)。
    • 四元数满足归一化条件:
      x 2 + y 2 + z 2 + w 2 = 1 x^2 + y^2 + z^2 + w^2 = 1 x2+y2+z2+w2=1
    • 对于平面机器人,常常只有绕 Z 轴的旋转会非零,具体可通过:
      tf::Quaternion q;
      q.setRPY(0, 0, yaw);
      
      构造四元数。
3.2 float64[36] covariance
  • 这是一个长度为 36 的一维数组,表示 6×6 的协方差矩阵,按**行主序(row-major order)**存储。
  • 矩阵的意义:它对应于位姿向量 [x, y, z, roll, pitch, yaw] 中每个分量的不确定度和各分量之间的相关性。
    • 举例,covariance[0] 对应 (x, x) 方差,covariance[1] 对应 (x, y) 协方差,…,covariance[6] 对应 (y, x) 协方差,… 以此类推。
  • 常见应用:
    • 在滤波器(如 EKF、UKF)中用作观测更新的观测协方差。
    • 如果某些维度未测量或不确定,可将对应方差设置为一个较大数(如 1e6),表示“高不确定度”。
  • 对于二维移动机器人,一般只关心 (x, y, yaw);实际值在下标对应的位置,其余维度(z、roll、pitch)常被置为 0 或一个很大的数。
  • 索引示例(行主序):
    cov[0]  = var(x)
    cov[1]  = cov(x,y)
    cov[2]  = cov(x,z)
    cov[3]  = cov(x,roll)
    cov[4]  = cov(x,pitch)
    cov[5]  = cov(x,yaw)
    
    cov[6]  = cov(y,x)
    cov[7]  = var(y)
    cov[8]  = cov(y,z)
    …
    cov[35] = var(yaw)
    

4. geometry_msgs/TwistWithCovariance twist

PoseWithCovariance 类似,分为 twist + covariance

Twist   twist
float64[36] covariance
4.1 Twist twist

geometry_msgs/Twist 包含线速度和角速度:

Vector3 linear
Vector3 angular
  • linear (Vector3)
    • linear.x (float64):机器人在其自身坐标系(通常为 child_frame_id,对应 base_link)下沿 X 轴的线速度,单位 m/s。
    • linear.y (float64):沿 Y 轴的线速度(较少用到;对于差速轮机器人,一般为 0)。
    • linear.z (float64):沿 Z 轴的线速度(通常为 0,除非在三维空间中移动)。
  • angular (Vector3)
    • angular.x (float64):绕 X 轴的角速度,单位 rad/s(对于平面机器人,一般为 0)。
    • angular.y (float64):绕 Y 轴的角速度,一般为 0。
    • angular.z (float64):绕 Z 轴的角速度(常用于平面机器人表示偏航角速度,正值表示逆时针旋转)。

注意:这里的速度都是在 child_frame_id(机器人自身坐标系)下的速度分量,而不是在 header.frame_id(里程计坐标系)下测量的速度。如果需要在全局坐标系下的速度,需要自己根据当前朝向将其转换。

4.2 float64[36] covariance
  • 同样是一个长度为 36 的一维数组,表示与速度相关的 6×6 协方差矩阵,对应速度向量 [vx, vy, vz, ωx, ωy, ωz]。
    • covariance[0] 对应 (vx, vx) 方差,covariance[1] 对应 (vx, vy) 协方差,… ,covariance[35] 对应 (ωz, ωz) 方差。
  • 主要用于滤波器中的速度测量不确定度描述或下游算法的置信度评估。
  • 对于常见差速轮移动机器人,只有 vx(沿 x 轴的速度)和 ωz(绕 z 轴的角速度)是真正有意义的,其他维度会被置为 0 或较大数。

5. 举例说明

假设某时刻发布一条 nav_msgs/Odometry 消息,其中各字段可能类似于:

header:
  seq: 1234
  stamp: 
    secs: 1622785087
    nsecs: 250000000
  frame_id: "odom"

child_frame_id: "base_link"

pose:
  pose:
    position:
      x: 1.234
      y: 0.567
      z: 0.0
    orientation:
      x: 0.0
      y: 0.0
      z: 0.382683
      w: 0.923880   # 对应 yaw ≈ 45° 的四元数

  covariance: [0.01, 0, 0, 0, 0, 0,
               0, 0.01, 0, 0, 0, 0,
               0, 0, 0.001, 0, 0, 0,
               0, 0, 0, 0.1, 0, 0,
               0, 0, 0, 0, 0.1, 0,
               0, 0, 0, 0, 0, 0.05]

twist:
  twist:
    linear:
      x: 0.5
      y: 0.0
      z: 0.0
    angular:
      x: 0.0
      y: 0.0
      z: 0.785398   # 约 45°/s 的角速度

  covariance: [0.02, 0, 0, 0, 0, 0,
               0, 0.02, 0, 0, 0, 0,
               0, 0, 0.002, 0, 0, 0,
               0, 0, 0, 0.05, 0, 0,
               0, 0, 0, 0, 0.05, 0,
               0, 0, 0, 0, 0, 0.03]
  • 这里表示:
    • 机器人在里程计坐标系(odom)下的位姿为 (x=1.234 m, y=0.567 m, yaw≈45°)。
    • 位姿测量的标准差:x 与 y 的方差是 0.01 m²(即 σ≈0.1 m),yaw 的方差是 0.05 (rad²,约 σ≈0.22 rad)。
    • 线速度 vx = 0.5 m/s、角速度 ωz = 0.785 rad/s,对应测量协方差表明:vx 的方差是 0.02 (m²/s²,σ≈0.14 m/s),ωz 的方差是 0.03 (rad²/s²,σ≈0.17 rad/s)。

6. 小结

  • Header:时间戳、消息序号、父坐标系(如 odom)。
  • child_frame_id:子坐标系(一般为机器人本体坐标系,如 base_link)。
  • pose.pose:描述机器人在父坐标系中的位置(position)和朝向(orientation,四元数)。
  • pose.covariance:6×6 位姿协方差矩阵,表示对 [x, y, z, roll, pitch, yaw] 6 个分量的不确定度。
  • twist.twist:描述机器人在自身坐标系下的线速度(linear)和角速度(angular)。
  • twist.covariance:6×6 速度协方差矩阵,表示对 [vx, vy, vz, ωx, ωy, ωz] 6 个分量的不确定度。

ROS中的IMU数据类型

消息定义(摘自 sensor_msgs/Imu

Header header
geometry_msgs/Quaternion orientation
float64[9]         orientation_covariance
geometry_msgs/Vector3 angular_velocity
float64[9]         angular_velocity_covariance
geometry_msgs/Vector3 linear_acceleration
float64[9]         linear_acceleration_covariance

1. Header header

  • header.seq(uint32):消息序号,由发布节点或 ROS 系统自动维护,一般用于调试或排序。
  • header.stamp(time):时间戳,表示当前 IMU 数据采集或发布的时间。
    • 对于多传感器系统,准确的时间戳非常重要,用于后续的数据对齐和融合。
    • 通常由发布节点在回调或定时器中填充,如 ros::Time::now()
  • header.frame_id(string):坐标系 ID,表示 IMU 数据所对应的传感器固定坐标系(通常写作 imu_linkbase_imu 等)。
    • 在 TF 树中,其他节点会将该 frame_id 视为 IMU 座标系,相对于其他参考帧(如 base_linkodommap 等)进行变换。
    • 如果你想把 IMU 值转换到机器人底盘中心坐标系,需要提前在 TF 中定义好 IMU 与机器人本体坐标系之间的静态变换。

2. geometry_msgs/Quaternion orientation

  • 四元数表示 IMU 给出的“姿态估计”或磁力计融合后的朝向信息(绕 X、Y、Z 轴的旋转)。
  • 四元数包含四个分量:
    • orientation.x(float64)
    • orientation.y(float64)
    • orientation.z(float64)
    • orientation.w(float64)
  • 四元数需满足归一化条件:
    x 2 + y 2 + z 2 + w 2 = 1 x^2 + y^2 + z^2 + w^2 = 1 x2+y2+z2+w2=1
  • 在 ROS 中,如果 IMU 自带姿态解算(例如有内置滚转、俯仰、偏航滤波),就会直接发布这个字段。若 IMU 只是输出原始陀螺仪、加速度计、磁力计数据,通常会在后端融合后产生 orientation
  • 对于“纯陀螺加加速度融合”算法,初期可能没有可靠的磁力计数据,则 orientation 经常用 (0,0,0,0) 或者 NaN 来占位,表示“姿态未知”。

3. float64[9] orientation_covariance

  • 长度为 9 的一维数组,表示 3×3 的协方差矩阵,按**行主序(row-major)**存储,对应姿态向量 [roll, pitch, yaw](或者对四元数直接展开的等价形式)。
    • 矩阵形式:
      [ cov(roll,roll)    cov(roll,pitch)   cov(roll,yaw)   ]
      [ cov(pitch,roll)   cov(pitch,pitch)  cov(pitch,yaw)  ]
      [ cov(yaw,roll)     cov(yaw,pitch)    cov(yaw,yaw)    ]
      
    • 在一维数组中依次存放:
      orientation_covariance[0] = var(roll)
      orientation_covariance[1] = cov(roll, pitch)
      orientation_covariance[2] = cov(roll, yaw)
      orientation_covariance[3] = cov(pitch, roll)
      orientation_covariance[4] = var(pitch)
      orientation_covariance[5] = cov(pitch, yaw)
      orientation_covariance[6] = cov(yaw, roll)
      orientation_covariance[7] = cov(yaw, pitch)
      orientation_covariance[8] = var(yaw)
      
  • 用途:表征 IMU 厂商给出的姿态估计(融合后的四元数转为欧拉角)每个分量的不确定度。在滤波器(EKF、UKF)中,可据此作为观测协方差,或者在下游算法中作为置信度权重。
  • 特殊值
    • 如果 IMU 不输出姿态(只输出线加速度和角速度),则通常将 orientation_covariance 数组全部置为 -1 来指示“未提供”或“不可信”。
    • 有时也会在对角线放置一个较大的值(如 99999)来表示“该维度非常不可靠”。

4. geometry_msgs/Vector3 angular_velocity

表示 IMU 测得的角速度,通常是通过陀螺仪测量得到的,包含三个分量(单位:rad/s):

Vector3 angular_velocity
  float64 x   # 绕 IMU 本体坐标系 X 轴的角速度(rad/s)
  float64 y   # 绕 IMU 本体坐标系 Y 轴的角速度(rad/s)
  float64 z   # 绕 IMU 本体坐标系 Z 轴的角速度(rad/s)
  • 惯量陀螺仪原始输出:大多数 MEMS 陀螺仪在测量时都会给出三个轴向的转角速度;在 ROS 中直接发布到 angular_velocity
  • 旋转方向约定
    • 如果 IMU 本体坐标系与机器人中枢坐标系保持一致,那么绕 X、Y、Z 轴的正方向旋转遵循右手坐标系规则。
    • 比如绕 Z 轴的正转为逆时针(从上往下看)为正值;绕 X 轴的正转为从 Y 轴指向 Z 轴的方向。
  • 如果 IMU 内部做了滤波或校准(去偏、去温漂),则在此字段直接体现“滤波后的角速度”。

5. float64[9] angular_velocity_covariance

  • 长度为 9 的一维数组,对应 3×3 的协方差矩阵,针对角速度向量 [ωx, ωy, ωz]。
  • 存储顺序与上述姿态协方差类似:
    angular_velocity_covariance[0] = var(ωx)
    angular_velocity_covariance[1] = cov(ωx, ωy)
    angular_velocity_covariance[2] = cov(ωx, ωz)
    angular_velocity_covariance[3] = cov(ωy, ωx)
    angular_velocity_covariance[4] = var(ωy)
    angular_velocity_covariance[5] = cov(ωy, ωz)
    angular_velocity_covariance[6] = cov(ωz, ωx)
    angular_velocity_covariance[7] = cov(ωz, ωy)
    angular_velocity_covariance[8] = var(ωz)
    
  • 用途:表示 IMU 陀螺仪测量输出每个轴的不确定度,以及不同轴之间的相关性。
  • 常见做法
    • 如果厂商提供了每个轴的噪声方差,可以填入对应对角线位置,其余位置一般置为 0。
    • 如果完全不知道不确定度,可统一填一个“大值”(如 1e6)或者全部置为 -1 来告诉后续节点“不可信”或“不可用”。

6. geometry_msgs/Vector3 linear_acceleration

IMU 中的加速度计测量,包含三个分量(单位:m/s²):

Vector3 linear_acceleration
  float64 x   # IMU 本体坐标系 X 轴方向的线加速度(m/s²)
  float64 y   # IMU 本体坐标系 Y 轴方向的线加速度(m/s²)
  float64 z   # IMU 本体坐标系 Z 轴方向的线加速度(m/s²)
  • 一般情况下,加速度计测量的是加速度+重力的合成值。如果 IMU 自带重力补偿,会在发布时把重力分量剔除;否则 z 方向会有大约 9.8 m/s²。
  • 如果是裸传感器输出,需要在后端进行滤波(低通滤波、互补滤波等)以去除噪声并分离出重力分量。
  • 用于惯性导航时,后端会先去重力,再做积分计算位移。

7. float64[9] linear_acceleration_covariance

  • 长度为 9 的一维数组,对应 3×3 的协方差矩阵,用于描述加速度测量向量 [ax, ay, az] 的不确定度。
  • 存储顺序同上:
    linear_acceleration_covariance[0] = var(ax)
    linear_acceleration_covariance[1] = cov(ax, ay)
    linear_acceleration_covariance[2] = cov(ax, az)
    ...
    linear_acceleration_covariance[8] = var(az)
    
  • 用途:在融合算法中,用于加速度观测的噪声估计。
  • 如果厂家没给或不关心协方差,可以用 -1 填充或将对角线赋一个经验值(如 0.1),非对角线置 0。

8. 示例解释

下面给出一个示例 sensor_msgs/Imu 消息内容,并结合上述字段说明它的含义:

header:
  seq: 54321
  stamp:
    secs: 1622786000
    nsecs: 500000000
  frame_id: "imu_link"

orientation:
  x: 0.0
  y: 0.0
  z: 0.7071068
  w: 0.7071068    # 对应平面绕Z轴旋转45°的四元数

orientation_covariance: [0.02, 0,     0,
                         0,    0.02,  0,
                         0,    0,     0.05]
                         
angular_velocity:
  x: 0.01        # rad/s,沿IMU X轴微小旋转
  y: -0.005      # rad/s
  z: 0.1         # rad/s,绕Z轴平均旋转

angular_velocity_covariance: [0.001, 0,     0,
                              0,     0.001, 0,
                              0,     0,     0.002]

linear_acceleration:
  x: 0.02        # m/s²,传感器X轴方向加速度(已去重力后)
  y: -0.1        # m/s²
  z: 9.79        # m/s²,接近重力加速度(说明重力尚未完全剔除)

linear_acceleration_covariance: [0.05,  0,     0,
                                 0,     0.05,  0,
                                 0,     0,     0.1]
  • header.frame_id = “imu_link”
    说明该 IMU 以 imu_link 为本体坐标系,后续如果要将 IMU 数据转换到机器人底盘中心(如 base_link),需要在 TF 树中预先定义从 base_linkimu_link 的静态变换。
  • orientation 四元数 = (0, 0, 0.7071, 0.7071)
    表示 IMU 此时估计自身相对于父坐标系(通常是 IMU 安装时与其他传感器/参考系对齐的 frame)绕 Z 轴旋转 45°。
  • orientation_covariance
    • 对角线分别是 (0.02, 0.02, 0.05);表示 roll、pitch 的方差都为 0.02 (rad²),yaw 的方差为 0.05 (rad²)。
    • 非对角线为 0,意味着暂时假设不同维度间相互独立。
  • angular_velocity = (0.01, -0.005, 0.1)
    说明此时 IMU 检测到一个绕 Z 轴 0.1 rad/s 的旋转,并且绕 X 轴和 Y 轴分别有非常小的角速度分量。
  • angular_velocity_covariance
    • (0.001, 0.001, 0.002) 分别是 ωx、ωy、ωz 的方差(rad²/s²),表征陀螺仪测量噪声水平。
  • linear_acceleration = (0.02, -0.1, 9.79)
    • X 轴方向检测到 0.02 m/s² 的加速度,Y 轴 -0.1 m/s²,Z 轴接近重力(9.79 m/s²)。如果需要纯运动加速度,需要对 Z 轴数值去除约 9.81 m/s² 的分量。
  • linear_acceleration_covariance
    • (0.05, 0.05, 0.1) 分别是 ax、ay、az 的方差 (m²/s⁴),用于后端滤波时评估加速度可靠性。

9. 小结

  • Header:包含时间戳 header.stamp 和 IMU 所在坐标系 header.frame_id
  • orientation(四元数)+ orientation_covariance:融合后的姿态估计及其协方差(表示 Roll/Pitch/Yaw 三个角的不确定度)。若 IMU 不输出姿态,则在 orientation_covariance 中全部填 -1。
  • angular_velocity(Vector3)+ angular_velocity_covariance:陀螺仪测得的三个轴向角速度(单位 rad/s)及其 3×3 噪声协方差矩阵。
  • linear_acceleration(Vector3)+ linear_acceleration_covariance:加速度计测得的三个轴向加速度(单位 m/s²,包括/排除重力)及其 3×3 协方差矩阵。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值