
目录
[1. 什么是互补滤波](#1. 什么是互补滤波)
[2. 解决的核心痛点](#2. 解决的核心痛点)
[3. 典型工业落地场景](#3. 典型工业落地场景)
[1. 传感器特性拆解](#1. 传感器特性拆解)
[2. 高低频分离机制](#2. 高低频分离机制)
[3. 权重融合机制](#3. 权重融合机制)
[1. 封装设计](#1. 封装设计)
[2. 接口设计](#2. 接口设计)
[3. 鲁棒约束](#3. 鲁棒约束)
[4. 线程安全](#4. 线程安全)
前言:
在陀螺仪、加速度计、倾角传感器姿态采集场景中:陀螺仪动态响应快、无滞后,但存在积分漂移 ;加速度计静态稳态精准、无漂移,但动态抖动、滞后严重 。 单一传感器、单一滤波永远无法同时解决「动态跟随」和「稳态不飘」。 互补滤波通过频域分工融合 ,高频信任陀螺仪、低频信任加速度计,软硬结合、取长补短,是嵌入式姿态解算最简单、最稳定、零漂移的工业级融合算法。
一、互补滤波核心本质与应用场景
1. 什么是互补滤波
互补滤波核心思想:高低频互补,各司其职
- 高频动态变化:依靠陀螺仪数据(响应快、跟随准)
- 低频稳态静置:依靠加速度计数据(无漂移、稳态稳)
公式逻辑: 融合值 = 高频陀螺仪动态分量 + 低频加速度计稳态分量
两种传感器优缺点完全互补,融合后:无漂移、无滞后、无抖动。
核心特性
- 彻底消除陀螺仪积分温漂
- 保留超高动态响应速度
- 稳态数据极度平稳、无偏移
- 运算量极小,远超卡尔曼
- 参数好调、工程零翻车
2. 解决的核心痛点
- 解决纯陀螺仪积分长时间漂移、角度跑偏问题。
- 解决纯加速度计动态晃动、数据抖动、滞后严重问题。
- 解决卡尔曼调参复杂、低端 MCU 算力不足问题。
- 解决姿态数据动态跟不上、稳态稳不住的两难问题。
3. 典型工业落地场景
- 平衡车、倒立摆姿态解算
- 无人机、飞行器倾角采集
- 智能穿戴运动姿态检测 工
- 业设备倾角传感器防抖校准
- 机器人关节角度动态采集
二、核心实现原理
1. 传感器特性拆解
- 陀螺仪:适合快速变化,短期精准、长期漂移
- 加速度计:适合静态角度,长期稳定、动态噪声大
2. 高低频分离机制
- 对陀螺仪做低通剔除高频抖动,保留动态趋势
- 对加速度计做高通剔除低频漂移,锁定稳态基准
3. 权重融合机制
通过融合系数划分频率阈值,动态分配两路数据权重, 高速运动信任陀螺,静止稳态信任加速度计。
三、工业级设计规范
1. 封装设计
纯结构体多实例封装,支持多路姿态传感器独立融合。
全程静态内存、无 malloc、无浮点依赖(定点整形)。
状态变量全程托管,重启不错乱。
2. 接口设计
| 接口 | 功能说明 |
|---|---|
| filter_comp_init | 初始化互补滤波参数与初始角度 |
| filter_comp_calc | 输入陀螺角速度 + 加速度角度,输出融合姿态 |
| filter_comp_set_k | 动态修改融合系数,适配动静场景 |
3. 鲁棒约束
参数边界强制限幅,防止融合失效。 空指针拦截、非法参数保护。 初始角度校准,杜绝开机角度跳变。
4. 线程安全
实例独立无全局变量,单任务绝对安全。 多线程场景外部加锁即可。
四、完整可复用源码
filter_comp.h
#ifndef FILTER_COMP_H
#define FILTER_COMP_H
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
// 定点放大位数,替代浮点运算
#define COMP_SHIFT 8
#define COMP_SCALE (1 << COMP_SHIFT)
typedef struct
{
int32_t angle; // 最终融合角度
int32_t k; // 融合系数 0~256
} filter_comp_t;
/**
* @brief 互补滤波初始化
* @param filter 滤波句柄
* @param init_angle 初始角度
* @param comp_k 融合系数(0~256)
*/
void filter_comp_init(filter_comp_t *filter, int32_t init_angle, uint16_t comp_k);
/**
* @brief 姿态互补融合计算
* @param filter 滤波句柄
* @param gyro_val 陀螺仪角速度
* @param acc_angle 加速度计解算角度
* @param dt 采样周期ms
* @return 融合后稳定角度
*/
int32_t filter_comp_calc(filter_comp_t *filter, int32_t gyro_val, int32_t acc_angle, uint16_t dt);
/**
* @brief 动态设置融合系数
* @param filter 滤波句柄
* @param comp_k 融合系数
*/
void filter_comp_set_k(filter_comp_t *filter, uint16_t comp_k);
#ifdef __cplusplus
}
#endif
#endif
filter_comp.c
#include "filter_comp.h"
void filter_comp_init(filter_comp_t *filter, int32_t init_angle, uint16_t comp_k)
{
if(filter == NULL)
return;
// 限幅保护
if(comp_k > COMP_SCALE)
comp_k = COMP_SCALE;
filter->angle = init_angle;
filter->k = comp_k;
}
int32_t filter_comp_calc(filter_comp_t *filter, int32_t gyro_val, int32_t acc_angle, uint16_t dt)
{
if(filter == NULL)
return 0;
// 1. 陀螺仪积分,得到动态角度
int32_t gyro_angle = filter->angle + (gyro_val * dt) / 1000;
// 2. 互补融合:k陀螺 + (1-k)加速度
int32_t gyro_part = (int64_t)gyro_angle * filter->k;
int32_t acc_part = (int64_t)acc_angle * (COMP_SCALE - filter->k);
filter->angle = (gyro_part + acc_part) >> COMP_SHIFT;
return filter->angle;
}
void filter_comp_set_k(filter_comp_t *filter, uint16_t comp_k)
{
if(filter == NULL)
return;
if(comp_k > COMP_SCALE)
comp_k = COMP_SCALE;
filter->k = comp_k;
}
五、实战演示
#include <stdio.h>
#include "filter_comp.h"
int main(void)
{
filter_comp_t filter;
// 初始角度0度,融合系数200:偏重陀螺仪动态
filter_comp_init(&filter, 0, 200);
// 模拟采样数据:陀螺角速度、加速度计角度、采样周期10ms
int32_t gyro_buf[] = {5,6,4,7,5,3,6,5,4,5};
int32_t acc_buf[] = {1,2,1,5,2,2,1,3,2,2};
uint16_t dt = 10;
for(int i = 0; i < 10; i++)
{
int32_t res = filter_comp_calc(&filter, gyro_buf[i], acc_buf[i], dt);
printf("融合角度:%d 度\r\n", res);
}
return 0;
}
六、进阶优化方向
-
动态自适应互补系数 运动剧烈加大陀螺权重,静置加大加速度权重,动静全自动适配。
-
限幅预降噪 输入前增加尖峰剔除,避免异常传感器数据污染融合角度。
-
温度漂移补偿 增加温度参数校准,抵消陀螺仪温漂误差。
-
多级数据融合 拓展六轴、九轴传感器融合,适配高精度姿态设备。
七、面试考点与易错坑点
面试问答
Q1:互补滤波的核心原理是什么?
答:利用传感器特性互补,高频动态采信陀螺仪、低频稳态采信加速度计,融合后既保留动态响应,又消除积分漂移。
Q2:互补滤波和卡尔曼滤波对比?
答:互补滤波:运算极简、调参简单、稳定性高,适合绝大多数民用姿态场景; 卡尔曼滤波:精度更高、自适应更强、运算量大、调参复杂,适合高端高精度设备。
Q3:融合系数 K 大小对结果有什么影响?
答:K 越大:权重偏向陀螺仪,响应更快、但轻微漂移; K 越小:权重偏向加速度计、稳态更稳、动态轻微滞后。
Q4:为什么陀螺仪需要积分、加速度计不需要积分?
答:陀螺仪输出角速度,需要积分得到角度;加速度计直接计算倾角,无积分误差。
Q5:互补滤波的优缺点?
答:优点:零漂移、响应快、代码极简、资源占用极低、工程极稳; 缺点:极度剧烈运动场景精度弱于卡尔曼。
Q6:工程上互补滤波适用场景?
答:平衡车、倾角检测、简易姿态解算、低端 MCU 姿态采集,是性价比最高的融合方案。
常见坑点
- 融合系数设置极端,导致漂移严重或响应过慢。
- 采样周期 dt 不精准,导致积分角度累计偏差。
- 未做初始角度校准,开机角度偏移。
- 多姿态传感器共用同一个滤波句柄,数据错乱。
- 直接使用浮点运算,低端 MCU 卡顿、精度丢失。
总结
互补滤波是嵌入式姿态解算工程最优算法 ,用极低算力实现动态响应 + 稳态无漂移双需求,完美解决单一传感器缺陷。相比卡尔曼更简单、更稳定、更容易落地,是平衡车、倾角设备、简易无人机项目的首选融合方案。至此,嵌入式全套八大经典滤波算法全部完结,覆盖 100% 传感器降噪、姿态融合、动态控制场景,形成完整工业滤波技术栈。
创作不易,如果对你有帮助,欢迎点赞、收藏、转发。