ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ESKF误差状态滤波原理:从数学建模到车载IMU-GNSS融合实战

ESKF误差状态滤波原理:从数学建模到车载IMU-GNSS融合实战 1. 为什么ESKF不是“另一个卡尔曼滤波器”而是惯性导航系统里真正扛压的底层骨架你翻过不少IMUGNSS融合的论文或代码库大概率见过这几个缩写EKF、UKF、CKF还有这个——ESKF。很多人第一反应是“哦又是卡尔曼家族的新成员”然后顺手把ESKF当成EKF的“升级版”直接套用结果在实车测试中发现姿态角抖动突增、位置漂移加速、甚至滤波器发散重启。我2018年在做一款地下车库AGV定位模块时就栽在这上面用标准EKF跑通了仿真一上真实车辆3分钟内yaw角误差就冲到±8度GNSS更新间隔稍一拉长轨迹直接飘出车道线。后来花两周时间重推整个状态方程才意识到问题根本不在参数调优而在于状态定义本身错了——我们拿去滤波的不是姿态、速度、位置这些“物理量”而是它们的误差。ESKF的“误差状态”Error-State四个字不是修饰词是数学建模的起点更是工程落地的生死线。这和传统EKF有本质区别。EKF对原始状态向量比如四元数q、速度v、位置p做非线性传播再用雅可比矩阵线性化而ESKF只对误差量δq、δv、δp建模主状态q̂、v̂、p̂走确定性传播误差状态走线性/准线性传播。这意味着第一四元数单位模约束天然保留在主状态中不会因线性化引入模长漂移第二误差协方差P的维度大幅降低比如姿态误差只需3维小角度而非4维四元数第三过程噪声Q的物理意义更清晰——它不再代表“姿态本身有多乱”而是代表“姿态误差以多快速度增长”。这种分离让ESKF在长时间运行、强机动、GNSS拒止场景下稳定性远超EKF。你看到的“ESKF收敛更快”本质是它的数学结构天然规避了EKF最脆弱的两个环节非线性传播失真和协方差膨胀失控。所以当热搜词里反复出现“imu静止初始化得到的测量方差和eskf中的过程噪声中q之间关系”这不是参数调优技巧问题而是建模逻辑问题。静止初始化给出的是传感器零偏估计的置信度它应该映射到ESKF误差状态的初始协方差P₀中而过程噪声Q描述的是零偏随时间漂移的速率它和P₀完全独立却常被工程师错误地设成同一组数值。后面我会用一个真实车载数据片段展示当Q被误设为P₀的1/10时零偏估计收敛时间从12秒延长到47秒且稳态抖动增大3倍。这不是调参能解决的这是模型没对齐物理现实。关键词里没有给出具体参数但热搜词暴露了真实痛点lidar-imu标定、相机-imu联合标定、GNSS天线相位中心偏移、Android GNSS HAL模块输出延迟……所有这些最终都归结到同一个底层问题——如何让不同传感器的误差源在统一的状态空间里被正确建模、可观测、可分离。ESKF的数学模型就是这个统一框架的骨架。它不解决标定本身但它决定了标定参数该以什么形式、什么维度、什么耦合关系进入滤波器。理解这个模型你才能看懂为什么IMU预积分残差要设计成特定形式为什么GNSS伪距观测必须补偿天线相位中心偏移为什么相机-imu外参标定结果不能直接塞进状态向量而必须作为观测量参与更新。这层认知是把“能跑通demo”和“能量产部署”彻底分开的分水岭。2. ESKF状态向量的构造逻辑为什么δq用旋转向量而不用四元数误差ESKF的状态向量设计是它区别于其他滤波器的第一个分水岭。我们先看一个典型配置以车载导航为例x [δφ, δv, δp, δb_g, δb_a, δT_g, δT_a]^T其中δφ ∈ ℝ³姿态误差旋转向量单位radδv ∈ ℝ³速度误差m/sδp ∈ ℝ³位置误差mδb_g ∈ ℝ³陀螺仪零偏误差rad/sδb_a ∈ ℝ³加速度计零偏误差m/s²δT_g ∈ ℝ³陀螺仪温度系数误差rad/(s·℃)δT_a ∈ ℝ³加速度计温度系数误差m/(s²·℃)总维度21。注意这里没有四元数q、没有欧拉角、没有直接的速度v和位置p。主状态q̂, v̂, p̂, b̂_g, b̂_a, T̂_g, T̂_a由运动学方程确定性传播误差状态x则描述它们偏离真实值的程度。2.1 姿态误差δφ为何必须用旋转向量这是ESKF最常被误解的点。很多初学者会想“既然主状态用四元数q̂那误差状态自然该用δq q_true ⊗ q̂⁻¹这样最直接。”但这就违背了ESKF的核心前提——误差状态必须是小量且其传播方程必须是线性或准线性的。四元数误差δq是一个单位四元数它本身有4个分量但只有3个自由度单位模约束。若强行将其作为状态变量其协方差矩阵P将无法保持正定因为δq的4维空间存在隐式约束且δq的传播涉及四元数乘法是非线性操作。而旋转向量δφ ∈ ℝ³是δq的李代数表示满足q_true ≈ q̂ ⊗ exp(δφ/2)其中exp(·)是四元数指数映射。当|δφ| 0.1 rad约5.7度时该近似误差小于0.1%且δφ的传播方程可严格线性化。推导关键一步从IMU运动学出发真实角速度ω_true ω_meas - b_g_true主状态q̂的微分方程为dq̂/dt 1/2 * q̂ ⊗ [0, ω̂]^T其中ω̂ ω_meas - b̂_g。定义δq q_true ⊗ q̂⁻¹则对其求导并利用四元数微分性质可得d(δq)/dt 1/2 * δq ⊗ [0, ω_true - ω̂]^T≈ 1/2 * δq ⊗ [0, -δb_g]^T 忽略高阶小量再将δq映射到李代数空间δφ 2·Im(δq)经线性化后得到d(δφ)/dt -δb_g C(ω̂)δφ其中C(ω̂)是ω̂的反对称矩阵。这就是δφ的标准传播方程——一个线性微分方程完美适配卡尔曼滤波框架。提示实际代码中δφ的更新绝不能用“q_true q̂ ⊗ exp(δφ/2)”再反算δq。必须始终在δφ空间进行预测和更新主状态q̂仅通过q̂ ← q̂ ⊗ exp(δφ/2)进行修正。我见过太多项目在这里出错工程师在debug时打印δq发现它不收敛其实是把δφ当成了δq在用。2.2 零偏误差δb_g与温度系数δT_g的耦合设计热搜词里提到“imu静止初始化得到的测量方差”这直接关联到δb_g和δT_g的初始协方差设置。静止初始化时IMU静置数分钟计算陀螺仪输出均值作为b̂_g初值其标准差σ_b_g即为δb_g的初始标准差。但温度系数δT_g呢它无法通过静止数据直接估计。常见错误是设为零或极小值导致滤波器认为温度影响可忽略实车升温后零偏漂移完全不可控。正确做法是建立温度-零偏耦合模型。假设陀螺仪零偏真实值为b_g_true b̂_g δb_g T·δT_g其中T是当前温度℃已知。那么δb_g和δT_g在状态向量中必须同时存在且独立它们的协方差P中对应块需反映先验相关性。例如若历史数据显示温度每变化1℃零偏变化约0.001 rad/s且该斜率估计标准差为0.0002 rad/(s·℃)则P中δb_g与δT_g的交叉项应设为0.001×0.00022e-7。更关键的是过程噪声Q的设计。δb_g的漂移主要来自随机游走Random WalkQ_bb通常设为diag([σ_rw²·Δt, ...])而δT_g的漂移更接近白噪声White NoiseQ_TT设为diag([σ_wn²·Δt, ...])。若将二者混为一谈滤波器会错误分配可观测性——GNSS位置观测对δb_g敏感但对δT_g几乎不可观必须靠温度变化过程提供激励。我在某物流车项目中将δT_g的Q_TT设得过大导致滤波器过度信任温度模型忽视了实际零偏漂移结果高温环境下位置误差累积速度翻倍。2.3 为什么位置误差δp不包含GNSS天线相位中心偏移热搜词“gnss天线”直指一个硬伤几乎所有GNSS模块的天线相位中心Antenna Phase Center, APC都不在IMU坐标系原点存在固定偏移向量d_apc。若直接将δp定义为IMU原点的位置误差那么GNSS观测方程h(x) p_true d_apc 就会引入非线性因为d_apc在GNSS坐标系需旋转到本地坐标系。ESKF的处理方式是将d_apc作为已知常量在观测模型中显式补偿而非放入状态向量。正确观测模型为z_gnss R(q̂)·d_apc p̂ δp v_gnss其中R(q̂)是q̂对应的旋转矩阵。这里δp仍是IMU原点的位置误差d_apc是已知标定值。若错误地将d_apc的误差δd_apc放入状态向量维度暴增6维3维平移3维旋转且δd_apc几乎无法被GNSS单点定位观测会导致可观测性矩阵秩亏滤波器发散。实践中d_apc通过精密标定获得如使用全站仪或高精度RTK其残余误差1cm远小于GNSS单点定位误差3~5m故可忽略。注意当使用RTK或PPP等高精度GNSS时d_apc残余误差成为主要误差源之一此时需升级模型——将δd_apc作为慢变状态加入但其过程噪声Q_dd必须极小如1e-9 m²/s且需配合多基站观测或运动约束才能可观测。这已是ESKF的进阶应用不在基础模型范畴。3. 系统动态模型推导从IMU原始数据到误差状态微分方程ESKF的威力一半在状态设计另一半在动态模型F矩阵的精确推导。这个过程不是套公式而是对物理世界的逐层拆解。我们以IMU数据驱动的预测步为核心展示如何从加速度计/陀螺仪原始读数一步步导出误差状态x的线性化微分方程 dx/dt Fx Gw。3.1 主状态传播确定性运动学方程设IMU坐标系为b系导航坐标系为n系东北天ENU。主状态包括q̂b系到n系的旋转四元数v̂n系下速度向量p̂n系下位置向量b̂_g, b̂_a陀螺仪、加速度计零偏估计T̂_g, T̂_a温度系数估计IMU原始测量为ω_meas ω_true b_g_true n_ga_meas R(q_true)·f_true b_a_true n_a其中f_true是比力specific forcen_g/n_a是白噪声。主状态传播方程连续时间四元数 dq̂/dt 1/2 * q̂ ⊗ [0, ω̂]^T速度 dv̂/dt R(q̂)·a_meas - R(q̂)·b̂_a - [0,0,g]^T C_coriolis·v̂g为重力C_coriolis为科氏加速度矩阵常被忽略位置 dp̂/dt v̂零偏 db̂_g/dt 0, db̂_a/dt 0 零偏慢变预测步视为恒定温度系数 dT̂_g/dt 0, dT̂_a/dt 0注意这里a_meas是原始读数b̂_a是当前估计R(q̂)用于将比力投影到n系。这是确定性传播无噪声项。3.2 误差状态线性化核心推导链定义误差状态x [δφ, δv, δp, δb_g, δb_a, δT_g, δT_a]^T。目标是求dx/dt。步骤1姿态误差δφ的微分方程如前所述q_true q̂ ⊗ exp(δφ/2)代入真实四元数微分方程dq_true/dt 1/2 * q_true ⊗ [0, ω_true]^T同时dq̂/dt 1/2 * q̂ ⊗ [0, ω̂]^T利用δq q_true ⊗ q̂⁻¹的微分性质并线性化得到d(δφ)/dt -δb_g (ω̂×)δφ - T̂_g·δT (δT_g)·T其中(ω̂×)是ω̂的反对称矩阵T是当前温度。最后一项是温度系数误差对零偏的影响δT是温度测量误差通常作为已知输入。此即F矩阵中δφ行的来源。步骤2速度误差δv的微分方程真实速度微分 dv_true/dt R(q_true)·f_true - [0,0,g]^T主状态v̂微分 dv̂/dt R(q̂)·a_meas - R(q̂)·b̂_a - [0,0,g]^T令δv v_true - v̂求导d(δv)/dt d(v_true)/dt - d(v̂)/dt R(q_true)·f_true - R(q̂)·a_meas R(q̂)·b̂_a将R(q_true) R(q̂)·R(δφ) ≈ R(q̂)·(I [δφ×])f_true R(q_true)⁻¹·(a_meas - b_a_true - n_a) ≈ R(q̂)⁻¹·(a_meas - b̂_a - δb_a - T·δT_a)代入并忽略二阶小量整理得d(δv)/dt -[ω̂×]·δv R(q̂)·δb_a R(q̂)·T·δT_a其中-[ω̂×]·δv是科氏项线性化结果R(q̂)·δb_a是零偏误差引起的加速度投影误差。步骤3位置误差δp的微分方程dp_true/dt v_true, dp̂/dt v̂ ⇒ d(δp)/dt δv这是最简洁的一行说明位置误差变化率等于速度误差。步骤4零偏与温度系数误差的微分方程δb_g_true b_g_true - b̂_g对时间求导d(δb_g)/dt db_g_true/dt - db̂_g/dtdb̂_g/dt 0预测步db_g_true/dt是真实零偏漂移建模为随机游走db_g_true/dt w_g其中w_g ~ N(0, Q_bb)。故d(δb_g)/dt w_g同理d(δb_a)/dt w_a, d(δT_g)/dt w_Tg, d(δT_a)/dt w_Ta3.3 完整F矩阵构建与物理意义解读将上述微分方程组合得到连续时间状态转移矩阵F21×21F [ A_φφ 0 0 A_φbg 0 A_φTg 0 ] [ A_vφ A_vv 0 A_vbg A_vba A_vTg A_vTa ] [ 0 I_3×3 0 0 0 0 0 ] [ 0 0 0 0 0 0 0 ] [ 0 0 0 0 0 0 0 ] [ 0 0 0 0 0 0 0 ] [ 0 0 0 0 0 0 0 ]其中A_φφ (ω̂×)陀螺仪测量角速度引起的姿态误差耦合A_φbg -I_3×3零偏误差直接导致姿态误差增长A_vφ -[ω̂×]角速度引起的科氏加速度误差A_vbg 0陀螺仪零偏不直接影响加速度但通过姿态间接影响A_vba R(q̂)加速度计零偏误差在导航系的投影A_vTg 0, A_vTa R(q̂)·T温度系数误差通过影响零偏间接作用于加速度关键洞察F矩阵中大量零块并非疏忽而是物理隔离的体现。例如δb_g不直接出现在d(δv)/dt中因为陀螺仪零偏只影响姿态姿态误差再通过R(q̂)影响加速度投影——这个路径已在A_vφ和A_vba中体现。若错误地在A_vbg填-I滤波器会认为陀螺仪零偏能直接“推”动车辆导致严重发散。我曾调试一个无人机项目F矩阵中A_vbg被误设为非零结果悬停时速度估计持续漂移关闭该行后立即稳定。离散化时采用零阶保持ZOHΦ exp(F·Δt) ≈ I F·Δt当Δt足够小如10ms。G矩阵则由过程噪声w [w_g, w_a, w_Tg, w_Ta]^T 的映射关系决定其列对应F中各噪声驱动项。4. 观测模型构建GNSS、IMU预积分与多传感器耦合的数学表达ESKF的观测模型h(x) Hx v决定了哪些误差能被“看见”。GNSS提供位置/速度观测IMU预积分提供相对运动约束相机/LiDAR提供位姿观测——它们不是简单叠加而是在统一误差状态空间中形成互补的可观测性。热搜词“imu预积分”、“相机和imu的联合标定”、“lidar imu标定”都指向这一层。4.1 GNSS观测单点定位与天线偏移补偿GNSS接收机输出伪距ρ_i和载波相位φ_i经解算得ECEF坐标(X,Y,Z)或ENU坐标(p_gnss)。标准单点定位误差约3~5m主要来源电离层/对流层延迟、多径、卫星几何精度因子GDOP。其观测方程为z_gnss p_true v_gnss其中p_true p̂ δp R(q̂)·d_apcd_apc为天线相位中心到IMU原点的偏移向量已知故z_gnss p̂ R(q̂)·d_apc δp v_gnss线性化后H_gnss矩阵中δp对应块为I_3×3其余状态对应块为0。这是最直接的位置观测。但GNSS也输出速度v_gnss多普勒测速其观测方程z_vgnss v_true v_vgnss v̂ δv v_vgnssH_vgnss中δv对应块为I_3×3。实操陷阱Android GNSS HAL模块热搜词提及输出的v_gnss常含较大延迟50~200ms和抖动。若直接使用会导致H矩阵与实际观测不同步滤波器性能骤降。正确做法是① 对v_gnss做低通滤波截止频率0.5Hz② 用IMU角速度估计旋转延迟补偿v_gnss方向③ 在ESKF中将v_gnss观测与最近IMU时刻对齐而非GNSS输出时刻。我在某安卓车机项目中未做延迟补偿GNSS速度更新导致yaw角估计周期性震荡补偿后消失。4.2 IMU预积分观测构建相对运动约束GNSS更新率低1~10HzIMU高频100~1000Hz预积分Preintegration是连接二者的桥梁。其核心思想将IMU在时间区间[t_k, t_{k1}]内的测量积分成从时刻k到k1的相对运动增量ΔR, Δv, Δp该增量仅依赖于IMU测量和零偏估计与全局状态无关。预积分量定义ΔR_{k,k1} ∏_{ik}^{k1-1} (I - [ω̂_i - b̂_g]×·Δt)Δv_{k,k1} Σ Δt·R_{k,i}·(a_i - b̂_a)Δp_{k,k1} Σ Δt·v_{k,i}真实值与预积分值的关系R_true_{k,k1} R̂_{k,k1} ⊗ exp(δφ_{k,k1})v_true_{k1} v̂_{k1} δv_{k1}p_true_{k1} p̂_{k1} δp_{k1}其中δφ_{k,k1}、δv_{k1}、δp_{k1}是预积分误差可表示为当前误差状态x的线性函数δφ_{k,k1} J_r^g · δb_g J_r^a · δb_a ...δv_{k1} J_v^g · δb_g J_v^a · δb_a ...δp_{k1} J_p^g · δb_g J_p^a · δb_a ...J_r^g等是预积分雅可比矩阵由预积分过程数值计算得到。因此预积分观测方程为z_preint [vec(ΔR_{k,k1}), Δv_{k,k1}, Δp_{k,k1}]^T h_preint(x) v_preint线性化后H_preint矩阵的结构由雅可比J决定它将δb_g、δb_a等零偏误差与预积分残差直接关联——这正是“imu预积分”能校准零偏的数学基础。经验技巧预积分雅可比J的计算极易出错。开源库如OKVIS、VINS-Mono采用数值微分但易受步长影响更稳健的是解析雅可比需对预积分递推公式逐项求导。我推荐在首次集成时用数值微分验证解析雅可比对δb_g加1e-6扰动观察ΔR变化量是否等于J_r^g·1e-6。不匹配则说明推导有误。4.3 相机与LiDAR观测外参标定参数的嵌入方式热搜词“相机和imu的联合标定怎么做”、“lidar imu标定”触及ESKF的扩展边界。相机/LiDAR不直接观测IMU状态而是观测环境特征点通过几何约束反推位姿。其标定参数外参T_ci是相机坐标系c到IMU坐标系i的变换矩阵。若将T_ci作为未知状态加入x维度爆炸且不可观。正确做法是将T_ci视为已知标定参数在观测模型中显式使用。例如相机观测一个3D路标点P_w其在相机系坐标为P_c T_ci·T_ib·T_bn·P_w其中T_ib是IMU到相机的外参已知T_bn由q̂决定。观测残差为z_cam π(P_c) - u_obs其中π是相机投影模型。线性化后H_cam矩阵中δφ对应块为∂π/∂P_c · ∂P_c/∂q̂即包含了T_ci的影响。T_ci的标定误差会表现为系统性残差可通过批量优化如g2o离线标定而非在线滤波。关键提醒联合标定online calibration仅在特定场景必要如机械臂末端执行器上的相机其T_ci会随关节运动变化。此时需将T_ci的部分参数如沿某一轴的平移加入状态向量但过程噪声Q必须极小且需运动激励如绕该轴旋转才能可观测。对于车载平台T_ci标定一次即可ESKF专注校准IMU内部参数。5. 过程噪声Q与观测噪声R的物理标定从传感器手册到实车数据的完整链条ESKF性能的70%取决于Q和R的设置。热搜词“imu静止初始化得到的测量方差和eskf中的过程噪声中q之间关系”直指核心误区Q和R不是调参而是传感器物理特性的数学映射。它们必须从传感器手册、静止实验、运动实验三层标定而来。5.1 Q矩阵描述误差增长的物理速率Q E[ww^T]其中w是过程噪声向量。对δb_gw_g是随机游走其功率谱密度PSD为S_bg。手册中通常给出“角随机游走ARW”系数N_g单位°/√h需转换为SI单位N_g (rad/s^0.5) N_g (°/√h) × π/(180) × 1/√3600则Q_bb diag([N_g², N_g², N_g²])·Δt对δT_gw_Tg是白噪声手册给出“温度系数噪声”S_Tg单位rad/(s·℃)则Q_TT diag([S_Tg², S_Tg², S_Tg²])·Δt实操验证静止初始化时记录IMU输出10分钟计算ω_x的方差σ²_ω。理论Q_bb·Δt应≈σ²_ω·Δt。若偏差20%说明手册参数不准需用实测σ²_ω反推N_g。我在某工业IMU上发现手册N_g为0.15°/√h实测为0.22°/√h用手册值导致零偏收敛过慢。5.2 R矩阵描述观测不确定性的统计特性R E[vv^T]v是观测噪声。GNSS位置R_gnss由C/N0载噪比和PDOP位置精度衰减因子决定R_gnss diag([σ_h², σ_h², σ_v²])其中水平精度σ_h 0.5 0.005·PDOP 0.01·(40-C/N0)垂直精度σ_v 1.5·σ_h经验公式。Android HAL模块常输出C/N0和PDOP可实时计算R。IMU预积分R_preint更复杂。其噪声主要来自IMU白噪声和零偏不确定性传播。理论R_preint J·Q·J^T R_imu其中J是预积分雅可比R_imu是IMU原始噪声。但更可靠的是实测将车辆静止采集100段1秒预积分计算ΔR、Δv、Δp的协方差即为R_preint。黄金法则R必须随观测质量动态调整。GNSS信号弱时C/N035R_gnss应增大3~5倍IMU振动大时加速度方差0.5 m²/s⁴R_preint应增大。固定R是多数项目性能不佳的根源。我开发的自适应R策略R_gnss R_gnss_base × max(1, (45-C/N0)/10)上线后城市峡谷定位成功率从68%提升至92%。5.3 初始协方差P₀静止初始化的数学本质静止初始化不是“设个初值”而是最大似然估计。IMU静置时ω_meas ≈ b_g_truea_meas ≈ g_true b_a_true。计算ω_meas均值得b̂_g其标准差σ_b_g即为δb_g的初始标准差。同理a_meas均值减去当地重力g得b̂_a标准差σ_b_a为δb_a初值。姿态初值q̂由a_meas和ω_meas静止时ω≈0解算q̂ align(g_measured, [0,0,1])。其不确定性由a_meas噪声决定δφ初值协方差P_φφ (σ_a/g)²·I_3其中σ_a是加速度计噪声标准差。致命错误将P₀设为对角阵但忽略状态间相关性。例如静止时重力向量g_measured R(q_true)·[0,0,1]^Tq_true的误差δφ与g_measured误差δg线性相关δg ≈ [δφ×]·g。因此P₀中δφ与δb_a存在强相关项。若设为零滤波器初期会低估姿态不确定性导致GNSS更新时过度修正。正确做法用静止数据批量拟合得到完整的P₀。6. 工程实现避坑指南从MATLAB仿真到C嵌入式部署的12个血泪教训ESKF数学模型优美但落地时每个环节都可能成为性能瓶颈。结合我经手的17个车载/无人机/机器人项目总结出12个高频致命坑按发生阶段排序6.1 仿真阶段雅可比矩阵的手动推导陷阱在MATLAB中推导F/H矩阵时工程师常犯两个错误①符号混淆用q̂表示主状态四元数但在推导δq时误用q̂代替q_true导致线性化项缺失。正确做法所有推导中明确区分q_true、q̂、δq。②忽略高阶小量在d(δv)/dt推导中保留[δφ×]·R(q̂)·a_meas项该二阶项在|δφ|0.01rad时可忽略但若保留会导致F矩阵非线性。必须明确截断条件。血泪教训某无人配送车项目F矩阵中多保留了一项[δφ×]·R(q̂)·b̂_a仿真时一切正常上车后因δφ增大该项引发数值不稳定滤波器在转弯时发散。解决方案在推导后用数值微分验证F矩阵——对x加小扰动检查F·x是否≈(x_new - x_old)/Δt。6.2 代码实现四元数运算的数值稳定性C中使用Eigen::Quaterniond时必须每步后执行归一化q̂.normalize(); // 否则累积误差导致模长偏离1但normalize()是开方运算耗时。更高效的是q̂.coeffs() * 1.0 / q̂.squaredNorm(); // 避免sqrt对δφ到四元数的映射exp(δφ/2)当|δφ|很小时用泰勒展开exp(δφ/2) ≈ [1, δφ_x/2, δφ
返回列表