各传感器消息解析

引言

首先运行小车录制各话题,命令如下。

html 复制代码
rosbag record /odom /imu0 /zed/zed_node/odom /tf /tf_static /zed/joint_states

然后播放录制的数据集,并打开三个终端每个终端显示一种话题的数据,例如/odom话题:rostopic echo /odom,最后确保小车是在运动过程中,在播放数据集的终端使用ctrl+c终止,以此保证各话题框中最后一个数据是同一时刻的。

注意:odom坐标系原点是小车初始位置,xyz轴与初始时刻小车坐标轴一致(X朝前,Y朝左,Z朝上)。小车运动后,odom坐标系是不变的,还是初始那样。

一、小车(SCOUT MINI)odom消息

1.1 odom话题输出

html 复制代码
header: 
  seq: 2009
  stamp: 
    secs: 1762308920
    nsecs: 601439837
  frame_id: "odom"
child_frame_id: "base_link"
pose: 
  pose: 
    position: 
      x: 8.79559652725601
      y: 5.761703668933156
      z: 0.0
    orientation: 
      x: 0.0
      y: 0.0
      z: 0.14224702064662556
      w: 0.9898311902123303
  covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
twist: 
  twist: 
    linear: 
      x: 0.7829999923706055
      y: 0.0
      z: 0.0
    angular: 
      x: 0.0
      y: 0.0
      z: -0.019999999552965164
  covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

1.2解析

1.2.1坐标系 (Coordinate Frames)

html 复制代码
  frame_id: "odom"
child_frame_id: "base_link"
  • header.frame_id: "odom": 这条消息中的所有数据都是相对于 "odom" 坐标系来描述的。odom 坐标系通常是一个固定的、在小车启动时建立的参考系。

  • child_frame_id: "base_link": 这条消息描述的是小车 "base_link" 坐标系的状态。base_link 通常是小车的主体或几何中心。

一句话总结**:** 这条消息告诉你,"base_link" (小车) 相对于 "odom" (起点) 的位置、姿态和速度。

1.2.2位姿 (Pose)

html 复制代码
pose: 
  pose: 
    position: 
      x: 8.79559652725601
      y: 5.761703668933156
      z: 0.0
    orientation: 
      x: 0.0
      y: 0.0
      z: 0.14224702064662556
      w: 0.9898311902123303

这部分描述了小车在哪里以及它朝向哪里。

位置 (pose.pose.position)
  • x: 8.795... (约 8.80 米)

  • y: 5.761... (约 5.76 米)

  • z: 0.0

分析**:** 假设 odom 坐标系的原点(0,0,0)是小车启动的位置,那么小车现在位于:

  • odom 坐标系的 X 轴正方向(通常是"前方")8.795 米处。

  • odom 坐标系的 Y 轴正方向(通常是"左侧")5.761 米处。

  • Z 轴为 0,表示它在地面上(2D平面运动)。

姿态/朝向 (pose.pose.orientation)
  • x: 0.0

  • y: 0.0

  • z: 0.1422...

  • w: 0.9898...

分析**:** 这是一个四元数。xy 为 0 表示没有侧倾 (Roll) 或俯仰 (Pitch)。

  • 我们可以计算出航向角 (Yaw): 0.285弧度,或 16.3度。

  • 位姿总结**:** 在这个时刻,小车位于 (8.80, 5.76) 米处,车头逆时针旋转了 16.3 度。

1.2.3 速度 (Twist)

html 复制代码
twist: 
  twist: 
    linear: 
      x: 0.7829999923706055
      y: 0.0
      z: 0.0
    angular: 
      x: 0.0
      y: 0.0
      z: -0.019999999552965164

这部分描述了小车在它自己的 base_link 坐标系下的瞬时速度。

线速度 (twist.twist.linear)
  • x: 0.782... (约 0.78 米/秒)

  • y: 0.0

  • z: 0.0

分析**:** 小车正沿着它自己的车头方向(x轴)以 0.78 米/秒 的速度前进。

角速度 (twist.twist.angular)
  • x: 0.0

  • y: 0.0

  • z: -0.019... (约 -0.02 弧度/秒)

分析:

  • z 值为负,表示小车正在进行顺时针旋转。

  • 速度约为0.02 rad/s(或 1.15 度/s)。

  • 速度总结**:** 小车正在以 0.78 m/s 的速度前进,同时轻微地向右(顺时针)转弯。

1.2.3. 协方差 (Covariance)

html 复制代码
covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

pose.covariancetwist.covariance 两个数组全部是 0。

严重性:高

分析**:** 协方差矩阵(Covariance Matrix)是用来量化这个 odom 估计的不确定性的。它告诉下游的节点(比如 EKF 传感器融合包 robot_localization)这个数据有多"可信"。

  • 全零的协方差 意味着发布器(比如你的轮式里程计节点)在说:"我对我提供的这个位姿和速度估计100% 确定,它没有任何误差。"

  • 后果: 如果将这个 odom 话题输入到 EKF (卡尔曼滤波器) 中进行融合,EKF 会过度信任这个数据。它会忽略掉其他传感器(如 IMU、GPS)提供的信息,因为这个 odom 声称自己是"完美"的。这会导致传感器融合失败,定位效果很差。

1.3EKF配置

html 复制代码
odom0_config: [ true,  true,  false,
               false, false, true,
               true,  false,  false,
               false, false, true,
               false, false, false ]
索引 变量 Odom (消息1) 数据 推荐配置 理由
--- 位姿 (Pose) --- --- ---
[0] X (position.x) true 使用 Odom 提供的 X 位置
[1] Y (position.y) true 使用 Odom 提供的 Y 位置
[2] Z 有 (position.z = 0.0) false 忽略 Z 位置 (这是 2D 里程计)
[3] Roll 有 (orientation.x = 0.0) false 忽略 侧倾角 (这是 2D 里程计)
[4] Pitch 有 (orientation.y = 0.0) false 忽略 俯仰角 (这是 2D 里程计)
[5] Yaw (orientation.z/w) true 使用 Odom 提供的航向角 (Yaw)
--- 速度 (Twist) --- --- ---
[6] vX (linear.x) true 使用 Odom 提供的 X 方向线速度
[7] vY (linear.y = 0.0) false 无数据
[8] vZ 有 (linear.z = 0.0) false 忽略 Z 方向线速度 (2D)
[9] vRoll 有 (angular.x = 0.0) false 忽略 侧倾角速度 (2D)
[10] vPitch 有 (angular.y = 0.0) false 忽略 俯仰角速度 (2D)
[11] vYaw (angular.z) true 使用 Odom 提供的航向角速度
--- 加速度 (Accel) --- --- ---
[12] aX false Odom 消息不提供加速度
[13] aY false Odom 消息不提供加速度
[14] aZ false Odom 消息不提供加速度

二、相机odom消息

2.1 odom话题输出

html 复制代码
header: 
  seq: 428
  stamp: 
    secs: 1762308920
    nsecs: 487175056
  frame_id: "odom"
child_frame_id: "base_link"
pose: 
  pose: 
    position: 
      x: 5.016847153120111
      y: 4.207569687557924
      z: -1.0157415131385998
    orientation: 
      x: -0.01018975286123593
      y: 0.002493075346248386
      z: 0.01616943826430058
      w: 0.9998142341346117
  covariance: [0.11749507486820221, -0.2004225254058838, 0.03531743213534355, 0.002486446173861623, 0.005310199689120054, 0.02087368816137314, -0.20042254030704498, 0.7367874383926392, 0.03164353221654892, -0.019106686115264893, -0.006228937301784754, -0.06818965822458267, 0.03531743958592415, 0.03164353966712952, 1.0334343910217285, -0.07088865339756012, 0.06911927461624146, 0.0022324395831674337, 0.002486445941030979, -0.019106686115264893, -0.07088865339756012, 0.008550062775611877, -0.002641193801537156, 0.0010835618013516068, 0.005310199223458767, -0.006228937767446041, 0.06911927461624146, -0.002641193801537156, 0.005965002346783876, 0.0007397423032671213, 0.020873690024018288, -0.06818965822458267, 0.0022324398159980774, 0.0010835620341822505, 0.0007397423032671213, 0.006499050185084343]
twist: 
  twist: 
    linear: 
      x: 0.0
      y: 0.0
      z: 0.0
    angular: 
      x: 0.0
      y: 0.0
      z: 0.0
  covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

2.2解析

2.2.1坐标系 (Coordinate Frames)

html 复制代码
  frame_id: "odom"
child_frame_id: "base_link"
  • header.frame_id: "odom"

  • child_frame_id: "base_link"

含义**:** 和上一个消息一样,它也在描述 base_link 相对于 odom 坐标系的状态。

2.2.2位姿 (Pose)

html 复制代码
pose: 
  pose: 
    position: 
      x: 5.016847153120111
      y: 4.207569687557924
      z: -1.0157415131385998
    orientation: 
      x: -0.01018975286123593
      y: 0.002493075346248386
      z: 0.01616943826430058
      w: 0.9998142341346117
  • x: 5.016... (约 5.02 米)

  • y: 4.207... (约 4.21 米)

  • z: -1.015... (约 -1.02 米)

分析**:**

  • 相机的算法认为,小车当前位于其 odom 起点坐标系的 (5.02, 4.21) 米 位置。

  • 关键点**z: -1.02**:算法检测到小车在 Z 轴(高度)上发生了显著变化,它现在位于起点下方 1.02 米处。但小车是在平地移动的,所以Z轴的位置严重偏差。

姿态/朝向 (pose.pose.orientation)
  • x: -0.010...

  • y: 0.002...

  • z: 0.016...

  • w: 0.999...

分析**:**

  • 这是一个 3D 旋转。x, y, z 的值都非常小,w 非常接近 1,这表示总旋转角度很小。

  • 位姿总结**:** 相机认为,在这一刻,小车位于 (5.02, 4.21, -1.02) 米处,并且车身几乎是水平的、车头几乎朝向正前方(航向角仅 1.8 度)。但同样小车是水平运动的所以姿态的xy正常应该为0

2.2.3 速度 (Twist)

  • linear (x, y, z): 全部为 0.0

  • angular (x, y, z): 全部为 0.0

**分析:**通过播放完数据集,观察到相机的Twist每一时刻都为0。说明相机的SDK不输出线速度与角速度

2.2.4 协方差 (Covariance) -

复制代码
covariance: [0.11749507486820221, -0.2004225254058838, 0.03531743213534355, 0.002486446173861623, 0.005310199689120054, 0.02087368816137314, -0.20042254030704498, 0.7367874383926392, 0.03164353221654892, -0.019106686115264893, -0.006228937301784754, -0.06818965822458267, 0.03531743958592415, 0.03164353966712952, 1.0334343910217285, -0.07088865339756012, 0.06911927461624146, 0.0022324395831674337, 0.002486445941030979, -0.019106686115264893, -0.07088865339756012, 0.008550062775611877, -0.002641193801537156, 0.0010835618013516068, 0.005310199223458767, -0.006228937767446041, 0.06911927461624146, -0.002641193801537156, 0.005965002346783876, 0.0007397423032671213, 0.020873690024018288, -0.06818965822458267, 0.0022324398159980774, 0.0010835620341822505, 0.0007397423032671213, 0.006499050185084343]
pose.covariance (位姿协方差)
  • [0.117..., -0.200..., ...]

分析:

  • 这个协方差矩阵被正确填充了(非零)。

  • 它量化了 VO 对其 6-DoF 位姿估计的不确定性。

  • 例如,对角线上的值(方差):

    • X 方差: [0] = 0.117

    • Y 方差: [7] = 0.736

    • Z 方差: [14] = 1.033

  • 这表明 VIO 对 Z 轴位置的确定性最低(方差最大),这在 VIO 中很常见。

  • 这对 EKF 至关重要**。** EKF 现在知道这个数据是有噪声的,会适当地对其进行加权。

twist.covariance (速度协方差)
  • [0.0, 0.0, ..., 0.0]

没有速度,所以算法也没填充协方差。

2.3EKF配置

html 复制代码
odom1_config: [ true,  true,  false,
               false,  false,  true,
               false, false, false,
               false, false, false,
               false, false, false ]
索引 变量 相机 Odom (消息2) 数据 推荐配置 理由
--- 位姿 (Pose) --- --- ---
[0] X (position.x) true 使用 相机提供的 X 位置
[1] Y (position.y) true 使用 相机提供的 Y 位置
[2] Z (position.z) false 严重不准
[3] Roll (orientation) false 不准
[4] Pitch (orientation) false 不准
[5] Yaw (orientation) true 使用 相机 提供的航向角
--- 速度 (Twist) --- --- ---
[6] vX 有 (linear.x = 0.0) false 忽略 相机 提供的线速度 (见[注1])
[7] vY 有 (linear.y = 0.0) false 忽略 相机 提供的线速度
[8] vZ 有 (linear.z = 0.0) false 忽略 相机 提供的线速度
[9] vRoll 有 (angular.x = 0.0) false 忽略 相机 提供的角速度
[10] vPitch 有 (angular.y = 0.0) false 忽略 相机 提供的角速度
[11] vYaw 有 (angular.z = 0.0) false 忽略 相机 提供的角速度
--- 加速度 (Accel) --- --- ---
[12] aX false Odom 消息不提供加速度
[13] aY false Odom 消息不提供加速度
[14] aZ false Odom 消息不提供加速度

三、IMU数据

3.1IMU话题输出

html 复制代码
header: 
  seq: 3773
  stamp: 
    secs: 1762308920
    nsecs: 623831886
  frame_id: "IMU_link"
orientation: 
  x: 0.0
  y: 0.0
  z: 0.0
  w: 0.0
orientation_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
angular_velocity: 
  x: 0.011978159749852044
  y: 0.044596897393054384
  z: 0.054694953566073096
angular_velocity_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
linear_acceleration: 
  x: 0.5974995712
  y: 0.22690626769999997
  z: -9.14537778385
linear_acceleration_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]

3.2解析

3.2.1 坐标系 (Frame)

html 复制代码
frame_id: "IMU_link"
  • frame_id: "IMU_link": 这很标准。它表示此消息中的所有数据(角速度、线加速度)都是在 IMU 传感器自身的坐标系 (IMU_link) 中测量的。

3.2.2 姿态 (orientation)

html 复制代码
orientation: 
  x: 0.0
  y: 0.0
  z: 0.0
  w: 0.0
  • x: 0.0, y: 0.0, z: 0.0, w: 0.0

  • 分析:(严重问题/信息)

    • 一个四元数 (0, 0, 0, 0) 是无效的(一个"零"旋转的有效四元数是 (0, 0, 0, 1.0))。

    • 这意味着 IMU 不提供绝对的姿态估计。这在很多 IMU 中很常见(它们只提供原始数据)。

    • 对 EKF 的影响**:** 绝对不能在 EKF 配置中融合 orientation 数据。

3.2.3角速度 (angular_velocity)

html 复制代码
angular_velocity: 
  x: 0.011978159749852044
  y: 0.044596897393054384
  z: 0.054694953566073096
angular_velocity_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  • x: 0.011... rad/s (Roll 速率)

  • y: 0.044... rad/s (Pitch 速率)

  • z: 0.054... rad/s (Yaw 速率)

  • 分析

    • 这是 IMU 的陀螺仪数据。

    • 它报告小车正在轻微地绕所有三个轴旋转。这个数据对于 EKF 融合至关重要,尤其是 z 值(航向角速率)。

    • 协方差为0

3.2.4线加速度 (linear_acceleration)

html 复制代码
linear_acceleration: 
  x: 0.5974995712
  y: 0.22690626769999997
  z: -9.14537778385
linear_acceleration_covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
  • x: 0.597... m/s²

  • y: 0.226... m/s²

  • z: -9.145... m/s²

  • 分析:

    • 这是 IMU 的加速度计数据。

    • xy 方向的加速度表明小车正在经历一些力(可能在加速或转弯)。

    • 最重要的值是**z: -9.14**。这是重力加速度。EKF 将使用这个值来确定哪个方向是"下",从而正确估计侧倾角 (Roll) 和俯仰角 (Pitch)。

3.3EKF配置

复制代码
imu0_config: [ false, false, false,
               false, false, false,
               false, false, false,
               true,  true,  true,
               true,  true,  true ]
索引 变量 IMU 数据 推荐配置 理由
--- 位姿 (Pose) --- --- ---
[0] X false IMU 不提供位置
[1 Y false IMU 不提供位置
[2] Z false IMU 不提供位置
[3] Roll 无效 (0,0,0,0) false IMU 姿态数据无效
[4] Pitch 无效 (0,0,0,0) false IMU 姿态数据无效
[5] Yaw 无效 (0,0,0,0) false IMU 姿态数据无效
--- 速度 (Twist) --- --- ---
[6] vX false IMU 不提供线速度
[7] vY false IMU 不提供线速度
[8] vZ false IMU 不提供线速度
[9] vRoll (ang_vel.x) true 使用 陀螺仪 X 轴数据
[10] vPitch (ang_vel.y) true 使用 陀螺仪 Y 轴数据
[11] vYaw (ang_vel.z) true 使用 陀螺仪 Z 轴数据
--- 加速度 (Accel) --- --- ---
[12] aX (lin_accel.x) true 使用 加速度计 X 轴数据
[13] aY (lin_accel.y) true 使用 加速度计 Y 轴数据
[14] aZ (lin_accel.z) true 使用 加速度计 Z 轴数据(含重力)
相关推荐
逐风&者4 小时前
CentsOS 7 “Could not resolve host: mirrorlist.centos.org; 未知的错误”问题解决
linux·运维·centos
超越自己5 小时前
远程连接银河麒麟服务器-xrdp方式
linux·运维·服务器·远程桌面·银河麒麟
sakoba5 小时前
Linux上kafka部署和使用
linux·运维·kafka
小武~5 小时前
嵌入式Linux安全启动全解析:从原理到实战
linux·网络·安全
刘一说5 小时前
CentOS Stream 网络故障排查:静态IP丢失、无法访问的完整解决方案
linux·tcp/ip·centos
硬核子牙5 小时前
gdb调试多线程底层实现原理
linux
用户6135411460165 小时前
OceanBase all-in-one 4.2.0.0 安装教程(CentOS 7/EL7 一键部署详细步骤)
linux
橘子135 小时前
Linux网络(二)——socket编程
linux·网络
lxmyzzs6 小时前
在使用 `resolvconf` 的 Ubuntu 系统上持久化 DNS 设置
linux·运维·ubuntu