chassis::loc::LocEKF
可配置历史缓冲容量的 ESKF 定位系统实现类。 继承 IChassisLoc 接口,与底盘系统统一对接 封装 ESKF 算法,提供轮速 + 陀螺仪 + 外部位姿观测的融合能力 自动同步 ESKF 状态到 IChassisLoc 的 posture 和 velocity 历史状态缓冲容量可在工程接入时按回放需求和 RAM 预算做权衡 特性: update() updateLidar() 本类默认和使用的是同一时间基准 如果外部观测来自另一套时钟,必须先由接入工程完成对时或时间映射 本驱动库不负责上下位机对时 时间基准边界: StateBufferCapacity 保存多少个历史状态点,用于晚到观测回放 InputBufferCapacity 保存多少个尚未推进进 EKF 的输入样本,默认 4
继承关系
- 基类
IChassisLoc公开
构造与析构
1LocEKF
chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::LocEKF (motion::IChassisMotion &motion, const Config &cfg, sensors::gyro::HWT101CT &gyro, const uint32_t delta_ticks=1)
motion 作为里程计输入来源的 Motion cfg 滤波配置 gyro 提供 yaw / wz 观测的陀螺仪 delta_ticks update() 两次调用之间预计相隔多少个 HAL tick 若初始状态依赖首次外部观测,推荐先让 Motion 独立运行,待拿到第一帧雷达位姿和 第一帧陀螺仪数据,并准备好 cfg.x_init 等初始条件后,再构造本对象。
Localization/EKF/LocEKF.hpp:418成员函数
15dt
float chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::dt () const
约定 HAL tick 为 1ms,因此这里直接换算成秒。
Localization/EKF/LocEKF.hpp:252isGyroEnabled
bool chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::isGyroEnabled () const
上游未提供说明。
Localization/EKF/LocEKF.hpp:396isLidarEnabled
bool chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::isLidarEnabled () const
上游未提供说明。
Localization/EKF/LocEKF.hpp:397next_idx
uint32_t chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::next_idx () const
只有两个缓冲区,因此这里直接在 0 / 1 之间切换。
Localization/EKF/LocEKF.hpp:457postureInWorld
Posture chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::postureInWorld () const override
双缓冲读取,避免读到 update 中间态。
Localization/EKF/LocEKF.hpp:437resetState
void chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::resetState (const Config &cfg)
用新的初始状态和协方差重置 EKF,并丢弃旧的回放历史。
Localization/EKF/LocEKF.hpp:400setGyroEnabled
void chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::setGyroEnabled (const bool enabled)
上游未提供说明。
Localization/EKF/LocEKF.hpp:394setLidarEnabled
void chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::setLidarEnabled (const bool enabled)
上游未提供说明。
Localization/EKF/LocEKF.hpp:395update
void chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::update ()
按固定 dt 采样底盘速度和陀螺仪,并推进一次滤波状态。 dt 由构造参数 delta_ticks 决定,默认假设 tick 时间基准为 1ms。
Localization/EKF/LocEKF.hpp:318updateEKF
void chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::updateEKF ()
消费输入缓冲并推进 EKF,然后同步对外可读状态。
Localization/EKF/LocEKF.hpp:266updateInput
void chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::updateInput ()
把当前轮速和陀螺仪采样压入输入缓冲。
Localization/EKF/LocEKF.hpp:255updateLidar
void chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::updateLidar (const Posture &pos, const uint32_t ticks)
注入一帧外部位姿观测。 pos 外部观测的世界系位姿,单位语义与 Posture 一致 ticks update() 该观测对应的时间戳,必须与内部采样使用的时间基准一致; 若观测来自另一套时钟,需先由接入工程换算到统一时基后再传入 StateBufferCapacity 如果观测晚到但仍在历史缓冲区范围内,当前实现会回溯状态并重放后续输入。 可回放窗口长度由模板参数决定。
Localization/EKF/LocEKF.hpp:339updateLoc
void chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::updateLoc ()
根据当前 EKF 状态刷新对外暴露的 posture / velocity 缓冲。
Localization/EKF/LocEKF.hpp:287velocityInBody
Velocity chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::velocityInBody () const override
双缓冲读取,避免读到 update 中间态。
Localization/EKF/LocEKF.hpp:427velocityInWorld
Velocity chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::velocityInWorld () const override
双缓冲读取,避免读到 update 中间态。
Localization/EKF/LocEKF.hpp:432成员变量
14dticks_
uint32_t chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::dticks_
相邻 update 之间的 tick 间隔
Localization/EKF/LocEKF.hpp:247gyro_
sensors::gyro::HWT101CT& chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::gyro_
提供 yaw / wz 观测的陀螺仪
Localization/EKF/LocEKF.hpp:52gyro_enabled_
bool chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::gyro_enabled_
上游未提供说明。
Localization/EKF/LocEKF.hpp:223idx_
std::atomic<size_t> chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::idx_
当前对外可见缓冲区下标
Localization/EKF/LocEKF.hpp:454in_body
Velocity chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::in_body
上游未提供说明。
Localization/EKF/LocEKF.hpp:450in_world
Posture chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::in_world
上游未提供说明。
Localization/EKF/LocEKF.hpp:445in_world
Velocity chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::in_world
上游未提供说明。
Localization/EKF/LocEKF.hpp:451input_buffer_
Deque<Input, InputBufferCapacity> chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::input_buffer_
尚未推进进 EKF 的输入样本队列
Localization/EKF/LocEKF.hpp:245lidar_enabled_
bool chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::lidar_enabled_
上游未提供说明。
Localization/EKF/LocEKF.hpp:224lock_
AtomicFlagLock chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::lock_
雷达回放时用于阻止并发 updateEKF()
Localization/EKF/LocEKF.hpp:249pos_ekf_
PositionEKF chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::pos_ekf_
真正执行滤波计算的内部对象
Localization/EKF/LocEKF.hpp:221posture_
struct chassis::loc::LocEKF::@145332172176301216031344167226201262207172340035 chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::posture_[2] [2]
上游未提供说明。
Localization/EKF/LocEKF.hpp:446state_buffer_
Deque<StatePoint, StateBufferCapacity> chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::state_buffer_
历史状态,用于处理晚到观测回放
Localization/EKF/LocEKF.hpp:244velocity_
struct chassis::loc::LocEKF::@173032060166225015142253032031131170225127244036 chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::velocity_[2] [2]
上游未提供说明。
Localization/EKF/LocEKF.hpp:452嵌套类型
4Config
using chassis::loc::LocEKF< StateBufferCapacity, InputBufferCapacity >::Config = typename PositionEKF::Config
上游未提供说明。
Localization/EKF/LocEKF.hpp:311上游未提供说明。
Localization/EKF/LocEKF.hpp:227内部位置 EKF。 [x, y, yaw, yaw_offset] 状态向量是, 其中 yaw_offset 用来吸收陀螺仪与外部绝对观测之间可能存在的偏差。
Localization/EKF/LocEKF.hpp:61上游未提供说明。
Localization/EKF/LocEKF.hpp:235