拓冰建站拓冰建站
首页 / 资讯中心 / 正文

GPS/INS组合导航滤波:从卡尔曼原理到松紧组合工程实现

简介这是一个基于MATLAB的GPS/INS组合导航滤波实现压缩包面向导航技术、自动驾驶、无人机控制及航空航天领域的初学者与研究人员用于解决单一GPS易受遮挡干扰、单靠INS存在累积漂移的问题。压缩包共1个文件为INSGPS.m源码文件整体仅3KB代码精简便于快速理解组合导航核心流程。该程序通常涵盖状态定义、预测更新、观测更新、增益计算与状态更新等滤波步骤并通过卡尔曼滤波融合GPS绝对位置与INS惯性测量数据最终输出更稳定、连续的定位结果。已有248人学习浏览适合希望掌握组合导航滤波算法实际编程实现的读者。通过研读和调试INSGPS.m可以直观学习GPS/INS组合的建模方法理解测量噪声与状态协方差的设置方式并在此基础上扩展为UKF或粒子滤波等改进算法。1. GPS/INS 组合导航不是选不选的问题而是怎么组合的问题拿到INSGPS.rar这个压缩包名字第一反应是里面装着一套已经跑通的 GPS/INS 组合导航工程。但真正做过惯导的人都知道压缩包能不能解压不重要重要的是解压之后你打算让松组合还是紧组合替你干活。GPS 和 INS 单独拿出来都有硬伤GPS 输出频率低、在城市峡谷和树荫下会掉星甚至完全失锁INS 短时精度极高但陀螺零偏和加速度计零偏会在纯惯导积分 1 分钟后把位置误差推到几十米。组合导航滤波解决的不是选一个更好的传感器而是用滤波器把两套系统的互补特性拧成一股绳——GPS 用长时间稳定性去抑制惯导发散惯导用高频输出去填补 GPS 的更新间隙同时反过来用惯导的短时高精度去平滑 GPS 的跳变。这篇文章按工程落地的顺序拆开讲从 15 维状态量的卡尔曼滤波方程开始到松组合和紧组合的工程选型再到 IMU 零偏补偿、杆臂校正和量测噪声协方差整定最后给出一套完整的数据融合验证流程。适合手里有 IMU 和 GPS 模块、准备自己做组合导航滤波的嵌入式工程师和导航算法工程师。2. 组合导航滤波的理论基础状态方程与量测方程的物理对应2.1 惯导误差传播方程——为什么状态向量恰好是 15 维GPS/INS 组合导航滤波的核心是卡尔曼滤波而卡尔曼滤波的起点是惯性导航系统的误差传播模型。纯惯导解算的导航参数包括位置经纬度或 ECEF 坐标、速度和姿态这三个量的误差在时间轴上的传播不是独立的姿态误差角通过重力矢量和比力矢量的投影影响速度误差速度误差积分得到位置误差。更深一层陀螺和加速度计的零偏误差本身也在缓慢变化它们不直接出现在导航输出里但会通过积分持续污染姿态和速度。因此标准松组合的状态向量取 15 维X [δp(3), δv(3), φ(3), ε(3), ∇(3)]ᵀδp位置误差纬度、经度、高度δv速度误差东、北、天方向φ姿态失准角平台失准角即数学平台的姿态误差ε陀螺三轴零偏常值 一阶马尔可夫∇加速度计三轴零偏这 15 个状态量的动态方程写出来是经典的 9 阶惯导误差方程加上 6 阶传感器误差方程。工程上不会直接手推这个矩阵而是用通用形式离散化import numpy as np from scipy.linalg import expm # 15维状态转移矩阵构造简化示意实际F矩阵来自惯导误差方程线性化 # 位置/速度/姿态/陀螺零偏/加计零偏 F np.zeros((15, 15)) # 姿态误差对速度误差的耦合- [fn×] # fn 是导航系下的比力向量 fn np.array([0.0, 0.0, 9.8]) # 静止时近似 F[3:6, 6:9] -np.array([[0, -fn[2], fn[1]], [fn[2], 0, -fn[0]], [-fn[1], fn[0], 0]]) # 速度误差对位置误差的耦合 F[0:3, 3:6] np.eye(3) # 姿态失准角自传播地球自转和导航系旋转耦合项此处略 # 陀螺零偏对姿态误差的耦合 F[6:9, 9:12] -np.eye(3) # 加计零偏对速度误差的耦合 F[3:6, 12:15] np.eye(3) dt 0.1 # IMU 更新周期 100Hz Phi expm(F * dt) # 状态转移矩阵状态转移矩阵Phi的物理含义是当前时刻的状态误差在dt时间后如何演化。比如加计零偏那一项之所以乘到速度误差上是因为加速度计零偏是直接叠加在比力测量上的而比力积分就是速度。陀螺零偏则先改变姿态失准角姿态失准角再通过比力投影改变速度误差所以它出现在姿态误差的驱动项里。实际工程中 F 矩阵还有两项容易漏一项是地球自转角速度在导航系下的投影ωie另一项是载体运动引起的导航系旋转ωen。静止或低速场景这两项影响很小可以忽略但车载高速场景下ωen的纬度和东向速度耦合项会让位置误差发散得更快必须在 F 矩阵里体现。2.2 卡尔曼滤波的时间更新与量测更新——不要搞混那五个公式卡尔曼滤波五个公式在组合导航里的用法和教科书有些不同。时间更新用的是 IMU 解算结果X_pred Phi X_last P_pred Phi P_last Phi.T QP是状态协方差矩阵15×15Q是过程噪声协方差反映 IMU 零偏随机游走和角速度随机游走的强度量测更新用的是 GPS 输出K P_pred H.T inv(H P_pred H.T R) X_est X_pred K (Z - H X_pred) P_est (I - K H) P_predH是量测矩阵松组合下是 6×15 的稀疏矩阵只从 15 维状态里挑出位置和速度误差Z是量测残差即 GPS 观测值减去惯导预测值R是量测噪声协方差GPS 的位置和速度噪声方差组合导航里最容易犯错的地方是把Q和R当成调参玩具。实际上这两个矩阵和传感器数据是对应的Q里的陀螺零偏随机游走系数可以从 Allan 方差分析得到R里的位置方差可以从 GPS 的 HDOP/VDOP 值和 PDOP 值估算。如果 Allan 方差的量化结果没做上来就盲目调Q和R得到的滤波结果可能看起来平滑但那多半是把量测权重压没了实际导航误差反而更大。提示量测更新频率远低于时间更新。IMU 100Hz 做时间更新GPS 10Hz 做量测更新中间的 90 个周期只有状态预测没有量测修正这也是惯导在 GPS 间歇失锁时依然能维持输出的原因。2.3 松组合和紧组合的滤波器结构差异松组合和紧组合的区别不在卡尔曼滤波本身而在量测输入是什么。松组合直接把 GPS 解算出来的位置和速度当量测值H 矩阵是 6×15结构最简单状态估计维度小计算量低。紧组合则用 GPS 的伪距和伪距率作为量测H 矩阵需要同时对惯导状态和 GPS 接收机时钟误差求偏导量测维度从 6 升到 2NN 为可见卫星数状态向量里还要加两个钟差状态。工程选型上有个很实际的经验如果你用的是消费级 GPS 模块Ublox NEO-M8N、ATGM336H 这类输出的是 NMEA 协议或者 UBX 协议里已经解算好的 PVT 结果那么做松组合就够了。原因是这类模块内部已经做了载波平滑和 RTK 差分输出的位置精度在 1 到 2 米左右你再拿伪距做紧组合接收机钟差和电离层延时误差会让滤波器设计复杂度上升一个量级但精度提升可能不到 20%。但如果你用的是 OEM 板卡如 NovAtel、Trimble能直接输出原始伪距和载波相位或者你要在遮挡环境下保证系统不断输出——GPS 在楼宇间可能只剩 4 颗星单点定位都困难这时候紧组合是值得的。紧组合用伪距残差做量测即使可见星只有 2 颗滤波器依然能约束惯导发散。# 紧组合量测矩阵 H 的构造示意伪距量测 # 卫星位置已知接收机位置来自惯导预测 # 伪距残差 实测伪距 - 几何距离 - 钟差 - 大气延时 def build_H_ranges(sat_positions, rec_pos, clock_states_idx): n_sats sat_positions.shape[0] H np.zeros((n_sats, 17)) # 15维惯导 接收机钟差 钟漂 for i in range(n_sats): # 视线方向向量 los (rec_pos - sat_positions[i]) / np.linalg.norm(rec_pos - sat_positions[i]) H[i, 0:3] los # 位置误差对伪距的偏导 H[i, 15] 1.0 # 钟差状态 # 伪距率对应的速度误差和钟漂项同理 return H松组合的代码实现简单到可以在单片机上跑紧组合一般在 ARM Cortex-A 平台或 PC 上处理。标题里INSGPS.rar如果压缩包不大几十 KB 到几百 KB大概率是松组合的 MATLAB 脚本或 C 源码工程先把松组合跑通再决定要不要升级到紧组合是性价比最高的路径。3. 工程落地组合导航滤波器的完整实现与参数整定3.1 时间基准对齐——滤波器跑飞的第一原因GPS 和 IMU 是两个独立时钟域的设备。GPS 的 PPS脉冲秒信号是纳秒级的时间基准而 IMU 是自由运行的内部时钟每次采样之间的间隔会有微小的漂移。如果把两个设备的原始数据直接喂给卡尔曼滤波器GPS 量测的时间戳和 IMU 预测的时间戳之间可能有 5 到 20 毫秒的偏差。这个偏差在静止场景下不致命但在急转弯或者高动态场景下位置误差会被放大到几米甚至几十米——因为载体在 20 毫秒内可能已经移动了几十厘米到几米。常见的做法是用 PPS 秒脉冲做硬件同步GPS 在整秒时刻拉高 PPS 引脚MCU 捕获这个上升沿并记录当前的 IMU 采样计数这样每个 GPS 量测的时间戳都能映射到最近的 IMU 采样序号上。没有硬件同步条件的系统退而求其次用软件插值// IMU采样序号对齐到GPS时间戳 // gps_tow: GPS 本周秒 // imu_timestamps: 循环缓冲区中的 IMU 采样时间 // imu_buf: IMU 数据环形队列 // 找到 gps_tow 前后最近的两个 IMU 采样做线性插值 int find_imu_index_for_gps(uint32_t gps_tow, uint32_t *imu_timestamps, int buf_len) { for (int i buf_len - 1; i 1; i--) { if (imu_timestamps[i] gps_tow imu_timestamps[i1] gps_tow) { return i; // 返回前一个采样点序号 } } return -1; // 未找到说明时间戳越界 }找到索引后GPS 量测对应的惯导预测值可以线性插值到两个 IMU 采样之间。软件插值的精度通常能到 2 到 3 毫秒比完全没有时间对齐好得多但在高动态场景下还是推荐用硬件 PPS 中断。3.2 杆臂效应补偿——IMU 和 GPS 天线不在同一个点车载组合导航里 IMU 通常装在车辆质心附近GPS 天线装在车顶。这两个位置之间的距离叫杆臂Lever Arm。杆臂直接导致一个问题GPS 测到的是天线点的位置和速度惯导解算的是 IMU 中心的位置和速度两者之间存在一个由角速度引起的速度差异转弯时这个差异尤其明显。一个典型的场景车辆以 20m/s 的速度做半径 50m 的转弯角速度约为 0.4rad/s。如果 GPS 天线在 IMU 前方 1 米沿车体 X 方向那么天线点相对 IMU 的速度差是 0.4m/s。这个量直接进量测残差滤波器会把它当成误差进行修正结果就是姿态估计被污染系统在每一个转弯时都会出现一次小的姿态跳变。补偿公式为_v_gps _v_imu _omega_nb_b × _l_b_omega_nb_b是载体相对导航系的角速度在载体系下的投影即 IMU 测量的角速度经零偏修正后_l_b是杆臂在载体系下的三个分量// 杆臂补偿将 IMU 速度转换到 GPS 天线点的速度 // imu_vel_n: 导航系下 IMU 速度3维 // C_b_n: 载体系到导航系的姿态矩阵 // omg_imu_b: IMU 测量的角速度载体系 // lever_arm_b: 杆臂向量从 IMU 中心指向 GPS 天线载体系 void compensate_lever_arm(double imu_vel_n[3], double C_b_n[3][3], double omg_imu_b[3], double lever_arm_b[3], double gps_vel_n[3]) { double omega_b_cross_l[3]; // 计算角速度叉乘杆臂 omega_b_cross_l[0] omg_imu_b[1] * lever_arm_b[2] - omg_imu_b[2] * lever_arm_b[1]; omega_b_cross_l[1] omg_imu_b[2] * lever_arm_b[0] - omg_imu_b[0] * lever_arm_b[2]; omega_b_cross_l[2] omg_imu_b[0] * lever_arm_b[1] - omg_imu_b[1] * lever_arm_b[0]; // 转换到导航系并叠加 for (int i 0; i 3; i) { gps_vel_n[i] imu_vel_n[i]; for (int j 0; j 3; j) { gps_vel_n[i] C_b_n[i][j] * omega_b_cross_l[j]; } } }杆臂补偿在量测更新前做补偿后的 GPS 速度作为量测值 Z。杆臂的测量误差如果超过 10 厘米补偿效果反而变差所以安装时要尽量测量准确不能靠估算。3.3 量测噪声协方差 R 的自适应策略——固定 R 值的坑固定 R 值是组合导航最容易踩的坑。GPS 的定位精度不是恒定的开阔环境下 HDOP 可能是 0.8城市峡谷里 HDOP 可能到 3 以上定位误差从 1 米涨到 5 米。如果 R 一直是固定的小值滤波器会盲目信任 GPS就会出现位置输出跟着 GPS 跳变的现象如果 R 设得过大滤波结果变得过度平滑GPS 失效后的收敛速度又太慢。工程上常用的是 R 自适应衰减策略核心思想是用 GPS 量测残差的实际统计值去在线调整 R。残差序列的方差反映的是真实量测噪声和滤波器预测误差之和如果残差突然增大说明 GPS 可能被多路径干扰或者滤波器发散此时应该增大 R 降低 GPS 权重。# 新息序列自适应R值简化实现 # innovation: 量测残差序列长度为 window_size # R_base: 标称量测噪声方差 # innovation 窗口方差 3倍标称值时R 放大 class AdaptiveR: def __init__(self, R_base, window_size50): self.R_base R_base self.window [] self.window_size window_size def update(self, innovation): self.window.append(innovation ** 2) if len(self.window) self.window_size: self.window.pop(0) # 估计创新序列方差量测噪声 滤波器不确定性用IMU预测协方差加权 sigma2_innov np.mean(self.window) sigma2_pred self.R_base * 1.5 # 简化预测协方差用R_base的1.5倍近似 sigma2_meas max(sigma2_innov - sigma2_pred, self.R_base * 0.1) return sigma2_meas这个策略的效果是GPS 信号好时R 趋近于标称值滤波器正常融合GPS 信号差时残差变大R 自动放大滤波器转为信任惯导。注意自适应 R 的窗口长度不能太长——车载场景下 GPS 多路径效应的持续时间为几百毫秒到几秒窗口取 50 个量测点比较合适。4. 仿真验证与数据回放在跑实车之前先让数据说话4.1 用 MATLAB 或 Python 做轨迹发生器在实际跑车之前用轨迹发生器产生 IMU 和 GPS 数据是验证滤波器的标准做法。轨迹发生器的逻辑是先定义一条参考轨迹位置、速度、姿态随时间变化然后按 IMU 的采样频率计算理想比力和角速度叠加 IMU 零偏和白噪声得到模拟 IMU 数据再按 GPS 更新频率在参考轨迹上叠加高斯白噪声得到模拟 GPS 数据。这样滤波器的状态估计可以和真实轨迹做对比评估误差。# 简化的轨迹发生器核心 def generate_trajectory(duration, imu_freq, gps_freq): # 定义一个匀速直线 转弯的运动模型 t_imu np.arange(0, duration, 1/imu_freq) t_gps np.arange(0, duration, 1/gps_freq) # 参考轨迹x方向速度20m/s20秒后开始90度转弯 # 此处仅给出位置和速度的一维示意 v np.zeros(len(t_imu)) for i, t in enumerate(t_imu): if t 20: v_x 20.0 v_y 0 elif t 30: # 转弯过程角速度 9 deg/s持续10秒 theta (t - 20) * np.deg2rad(9) v_x 20 * np.cos(theta) v_y 20 * np.sin(theta) # else: 转完继续直行 # 模拟 IMU 输出理想比力 零偏 高斯白噪声 gyro_bias np.array([0.01, 0.01, 0.01]) * np.pi / 180 # 0.01 deg/s 零偏 accel_bias np.array([0.001, 0.001, 0.001]) * 9.8 # 1 mg 零偏 gyro_noise np.random.normal(0, 0.005, (len(t_imu), 3)) # 角度随机游走 accel_noise np.random.normal(0, 0.002, (len(t_imu), 3)) # 速度随机游走 # 模拟 GPS 输出参考位置/速度 高斯噪声 pos_noise_std 1.5 # 位置噪声1.5米 vel_noise_std 0.05 # 速度噪声0.05m/s return imu_data, gps_data, ref_traj轨迹发生器里 IMU 噪声参数一定要用 Allan 方差实测值不能用文档里的典型值顶替。MEMS 惯导的零偏和随机游走随温度变化很大仿真时至少要覆盖常温、高温两种情况看看滤波器在传感器特性漂移后的鲁棒性。4.2 松组合滤波器的 MATLAB 实现骨架松组合滤波器的核心循环不超过 30 行代码。关键在于三个部分的组织IMU 机械编排姿态更新、速度更新、位置更新、卡尔曼时间更新、GPS 量测更新。% 松组合滤波器主循环MATLAB 示意 % imu_data: [t, gx, gy, gz, ax, ay, az] % gps_data: [t, lat, lon, alt, vn, ve, vd] % 状态向量15维初始化为0 X zeros(15, 1); % 初始协方差 P diag([10^2, 10^2, 10^2, % 位置误差 10m 0.1^2, 0.1^2, 0.1^2, % 速度误差 0.1m/s 0.5^2, 0.5^2, 0.5^2, % 姿态误差 0.5 deg 0.02^2, 0.02^2, 0.02^2, % 陀螺零偏 0.02 deg/s 0.01^2, 0.01^2, 0.01^2]); % 加计零偏 0.01 m/s^2 for k 2:length(imu_data) % 1. 惯导机械编排等效旋转矢量 龙格库塔 % 简化示意姿态、速度、位置递推 % [Cbn, vn, pn] ins_mechanization(Cbn, vn, pn, gyro, accel, dt); % 2. 卡尔曼时间更新 Phi compute_Phi(F, dt); % 状态转移矩阵 X Phi * X; P Phi * P * Phi Q; % 3. 检查GPS是否有新量测 if gps_data(t) imu_data(k, 1) % 量测残差GPS位置速度 - 惯导位置速度需扣除杆臂 Z gps_measurement - H * X; % 量测更新 K P * H / (H * P * H R); X X K * Z; P (eye(15) - K * H) * P; end end这个循环跑完之后X里装的就是每一时刻的导航误差估计用X去修正惯导输出即可。注意 MATLAB 代码里量测更新用了inv的替代写法H * P * H R除法运算实际应使用 Cholesky 分解或 UD 分解来避免求逆的数值稳定性问题。4.3 环路闭合反馈校正与输出校正两种模式滤波器算出来的误差估计怎么用有两种模式。反馈校正Closed-loop把误差估计直接补偿到惯导解算的结果上同时把状态向量清零输出校正Open-loop只修正最终输出的导航参数惯导解算内部继续按原值积分。反馈校正在工程上更常用原因很实际如果不把估计出的陀螺零偏反馈给姿态解算纯惯导积分会在 GPS 失锁时把误差快速放大反馈校正让惯导始终运行在误差已修正的轨道上即使 GPS 掉线几分钟惯导的漂移速度也远低于无反馈情况。// 反馈校正后状态清零 // X: 15维误差状态 // nav: 当前导航解算结果位置、速度、姿态 void feedback_correction(double X[15], nav_state_t *nav) { // 位置修正 nav-lat - X[0] / RM; // RM为子午圈曲率半径 nav-lon - X[1] / (RN * cos(nav-lat)); // RN为卯酉圈曲率半径 nav-alt - X[2]; // 速度修正 nav-vn[0] - X[3]; nav-vn[1] - X[4]; nav-vn[2] - X[5]; // 姿态修正用失准角构造小角度旋转矩阵 // phi X[6:9]C_n_n I [phi×] // Cbn C_n_n * Cbn // 零偏修正累加到 IMU 原始测量值上 imu_bias_gyro[0] X[9]; imu_bias_gyro[1] X[10]; imu_bias_gyro[2] X[11]; imu_bias_accel[0] X[12]; imu_bias_accel[1] X[13]; imu_bias_accel[2] X[14]; // 清零状态 memset(X, 0, 15 * sizeof(double)); // 协方差P不清零保留不确定性信息 }反馈校正要注意的是协方差矩阵 P 不能清零因为 P 表示当前估计的不确定性清零会导致滤波器下一次量测更新的增益计算失真表现为收敛过快或振荡。5. 常说组合导航滤波那滤波器之外的三个坑你知道吗5.1 GPS 时间戳的整秒对齐问题GPS 模块输出的 NMEA 语句$GPRMC、$GNGGA每一帧前面没有精确时间戳数据到达 MCU 的 UART 时已经是接收机处理完的内部时间滞后量在几十到几百毫秒之间。很多消费级 GPS 模块支持 UBX 协议的TIMESTAMP字段或 PPS 输出用这些信息才能把 GPS 量测准确对齐到 IMU 时间轴上。// UBX 协议在串口 ISR 中捕获 PPS 上升沿记录当前 IMU 帧计数 // 然后在组合导航主循环中根据帧计数差值做时间对齐 volatile uint32_t gps_pps_imu_frame 0; uint32_t current_imu_frame get_imu_frame_count(); // GPS 量测有效时间 PPS 时刻 量测相对 PPS 的延迟接收机固件给出 double gps_meas_time gps_pps_time ublox_measurement_latency; // 找到最近的 IMU 帧 int imu_idx (int)round((gps_meas_time - start_time) * IMU_FREQ);没有 PPS 的系统至少要把 GPS 量测时间戳减去固定的串口传输延迟波特率 115200 时一条 GGA 语句约 80 字节耗时约 7ms和接收机处理延迟不同固件差异较大需要实测。5.2 滤波器发散后怎么救——协方差保护和卡方检验滤波器发散是组合导航最怕的事。表现形式是 P 矩阵不断膨胀或者状态估计出现不合理的跳变。工程上常用的保护手段有两个两个都要用。第一是协方差上限保护每个状态对应的 P 对角线不能超过物理上限比如位置误差的方差超过 100 米时强制截断防止下一次量测更新时 K 矩阵的病态放大。第二是卡方检验量测残差的马氏距离超过阈值时跳过本次量测更新。// 卡方检验判断 GPS 量测是否可信 // innovation: 量测残差向量(6维) // S: 新息协方差矩阵 H*P*H R double mahalanobis_dist sqrt(innovation.transpose() * S.inverse() * innovation); double chi2_threshold 14.44; // 6自由度95%置信限 if (mahalanobis_dist chi2_threshold) { // GPS量测异常多路径/跳变跳过量测更新 // 此时量测计数器加1超过连续N次则考虑切到纯惯导模式 }卡方检验的阈值不能拍脑袋定自由度等于量测向量的维数松组合是 6查卡方分布表取 95% 分位点。工程经验是阈值取 14 到 20 之间比较稳太松了起不到拒跳作用太紧了正常量测也被拒导致滤波器长期得不到量测修正退化成纯惯导。5.3 载体动态变化与 Q 矩阵的关系车载导航有一类特殊场景车辆静止但发动机怠速车身有持续的震动。这时候 IMU 的加速度计输出噪声可能会被放大很多设计者会看到滤波器的位置误差反而变大。原因是震动被当成了真实运动Q 矩阵没有同步放大滤波器对新信息的信任度偏小导致惯性积分误差累积。解决办法是增加零速检测ZUPT逻辑当车辆静止时把速度量测的零值作为额外的虚拟量测注入滤波器。ZUPT 的判定条件通常有三个同时满足加速度计的方差低于阈值震动小、陀螺仪的方差低于阈值角速度小、GPS 速度低于 0.1m/s。ZUPT 激活后速度量测噪声 R 设为极小值相当于把速度误差直接钉在零附近大幅抑制位置和姿态的漂移。零速检测在车载频繁启停的工况下效果极为明显静止 10 秒后的位置漂移能从 2 米降到 0.3 米以内。说到最后的验证环节一个值得养成的习惯是保存滤波前后的原始数据用 Plot 工具对比 GPS 原始轨迹、纯惯导轨迹和组合导航输出轨迹。如果组合轨迹在直线段比 GPS 还平滑、在转弯处比纯惯导更跟手说明滤波器的权重分配基本合理如果组合轨迹在某些区段出现 S 型弯曲优先怀疑杆臂补偿方向和滤波器协方差初值是否有误而不是去调 Q 和 R——大概率是某个固定参数在特定动态下匹配错了从运动方程重新推一遍比盲目调参高效得多。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门