引言
首先运行小车录制各话题,命令如下。
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...
分析**:** 这是一个四元数。x 和 y 为 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.covariance 和 twist.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 的加速度计数据。
-
x和y方向的加速度表明小车正在经历一些力(可能在加速或转弯)。 -
最重要的值是**
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 轴数据(含重力) |