openpilot 定位系统实时确定车辆的位置、姿态和运动参数。它融合来自多个传感器的数据,以维持对车辆状态的准确估计。此信息对于规划和控制功能至关重要,为安全自动驾驶奠定了基础。
本页面重点介绍定位系统的核心组件和操作。有关使用此数据的规划和控制系统的信息,请参阅 规划与控制。
定位系统采用基于卡尔曼滤波的方法来融合来自各种传感器的数据,估计车辆状态,并将该信息提供给系统的其他组件。核心组件是 locationd 守护进程,它处理传感器输入并生成连续更新的状态估计。
来源: selfdrive/locationd/locationd.py1-202
LocationEstimator 类是定位系统的核心。它管理卡尔曼滤波器并处理传入的传感器数据,以维护最新的车辆状态估计。
主要职责
来源: selfdrive/locationd/locationd.py51-202
PoseKalman 类实现了用于状态估计的扩展卡尔曼滤波器。它维护以下状态变量:
| 状态变量 | 描述 | Slice |
|---|---|---|
| NED_ORIENTATION | 航向角、俯仰角、滚转角(弧度) | 0:3 |
| DEVICE_VELOCITY | NED 坐标系下的速度(米/秒) | 3:6 |
| ANGULAR_VELOCITY | 角速度(航向角、俯仰角、滚转角速率)(弧度/秒) | 6:9 |
| GYRO_BIAS | 陀螺仪偏差(弧度/秒) | 9:12 |
| ACCELERATION | 设备坐标系下的加速度(米/秒²) | 12:15 |
| ACCEL_BIAS | 加速度计偏差(米/秒²) | 15:18 |
滤波器使用反映初始状态不确定性的默认值和协方差进行初始化。
来源: selfdrive/locationd/models/pose_kf.py20-28 selfdrive/locationd/models/pose_kf.py33-45
来源: selfdrive/locationd/locationd.py97-202 selfdrive/locationd/locationd.py240-253
定位系统处理来自多个传感器的数据
ACCEL_SANITY_CHECK (100 m/s²) 则拒绝输入来源: selfdrive/locationd/locationd.py98-117
ROTATION_SANITY_CHECK (10 rad/s) 则拒绝输入来源: selfdrive/locationd/locationd.py119-143
ROTATION_SANITY_CHECK 则拒绝旋转输入TRANS_SANITY_CHECK (200 m/s) 则拒绝位移输入来源: selfdrive/locationd/locationd.py157-198
carState 的车速用于加权 posenet 估计来源: selfdrive/locationd/locationd.py145-146
liveCalibration 的相机到设备旋转矩阵来源: selfdrive/locationd/locationd.py148-156
定位系统实现了鲁棒的验证以维持滤波器稳定性
系统实现了多种验证机制
时间验证:
MAX_SENSOR_TIME_DIFF (0.1s) 的输入合理性检查:
ACCEL_SANITY_CHECK (100 m/s²)ROTATION_SANITY_CHECK (10 rad/s)ROTATION_SANITY_CHECK,位移 < TRANS_SANITY_CHECK交叉验证:
输入无效计数器:
inputsOK 标志设置为 false滤波器稳定性:
来源: selfdrive/locationd/locationd.py69-96 selfdrive/locationd/locationd.py241-253 selfdrive/locationd/locationd.py267-319
定位系统生成一个包含以下内容的 livePose 消息
每个组件包括
此外,该消息还包含状态标志
inputsOK:传感器输入是否有效和可靠posenetOK:基于视觉的里程计是否可靠sensorsOK:所有必需的传感器是否正常运行此输出由规划和控制系统用于做出驾驶决策。
来源: selfdrive/locationd/locationd.py204-238
定位系统包含全面的测试场景以确保鲁棒性
| 场景 | 描述 | 预期结果 |
|---|---|---|
| 基础 | 正常运行 | 准确的状态估计 |
| 陀螺仪关闭 | 无陀螺仪数据 | 零角速度估计,sensorsOK=False |
| 陀螺仪尖峰 | 单次无效陀螺仪读数 | 忽略读数,状态不受影响 |
| 持续的陀螺仪尖峰 | 多次无效陀螺仪读数 | inputsOK=False 直到恢复 |
| 加速度计关闭 | 无加速度计数据 | 零估计,sensorsOK=False |
| 加速度计尖峰 | 单次无效加速度计读数 | 忽略读数,状态不受影响 |
| 时间戳尖峰 | 带有无效时间戳的传感器 | 忽略读数,状态不受影响 |
这些测试验证了系统可以在不影响状态估计的情况下处理传感器故障和无效数据。
来源: selfdrive/locationd/test/test_locationd_scenarios.py9-190
定位系统与其他 openpilot 组件集成
该系统以高频率运行以确保及时更新,并使用消息传递基础设施与其他组件通信。
来源: selfdrive/locationd/locationd.py256-332
定位系统设计得既鲁棒又高效
实时进程配置:
高效的传感器套接字管理:
轻量级处理:
这些优化确保定位系统能够提供准确、及时的状态估计,以实现安全的自动驾驶。