5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 3838|回复: 10
打印 上一主题 下一主题

Kalman滤波器设定调参

[复制链接]
跳转到指定楼层
楼主
发表于 2018-3-31 22:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 飞鸟翌 于 2018-3-31 22:14 编辑

由于kalman滤波器引起的争议和风波,已经把Betaflight推上了风口浪尖。

今天我不打算过多涉及这些争议,仅仅只讨论滤波器设定本身。

警告:以下调参内容,使用的都是未经长时间优化的固件,使用本文以下所述固件和调参方法,你要把自己当做一个测试人员,飞机可能随时会抽风,暴走,炸机,引起人身伤害事件。使用以下方法时,即代表你充分明确理解以上风险,并自己承担由此引起的所有后果。

警告:并没有透彻理解PID调参,D set值,PT1滤波,动态滤波调试方法的初学者,或者中级玩家,请使用默认参数和正式版固件,本文中的内容不适合初学者。相信我,默认参数已经足够优秀,等你累计了足够多的飞行经验,才能判断出如何来调试飞机,在这之前,请安心使用默认参数FPV的精髓在于飞,不在于电脑前敲代码。

提示:优秀的飞手,是飞行技术和硬件的完美结合,飞行技术的提高,不仅仅是硬件或者软件算法的优化,更是大量飞行时间的积累,使用新的算法可以一定程度上解决你的问题,但是说用了新的算法对于飞行的技术一定有很大提高,这个不一定。

提示:以下内容是通过多家YouTube上主播的评测,Betaflight wiki的issue讨论,RCgroup的讨论贴,聊天软件上的问答,讨论,整合而来。本人能力有限,时间也不是太充裕。只是希望尽快将这些信息发布出来以保持和老外进度的同步。对这个kalman滤波的理解并不是十分透彻,请各位在留言里面多多指教。


以下是阅读本文之前你需要具备的基本知识点,也可以看做是很多背景知识介绍,扫盲。每一条都可以扩展出很多内容,会在后续公众号推文中展开,这里不做具体解释。

1:Betaflight3.3.0RC1~3到正式版,集成的是BiquadRC+FIR2滤波器,开发者表示其效果和kalman滤波器一样,“1+2=3,数学上是完全一样的”。

2:Betaflight3.3.0正式版的BiquadRC+FIR2滤波器,需要使用CLi命令激活和设定,如果没有使用CLi命令行打开这个滤波器,飞行性能和之前的3.2.X版本一致没有变化。

3:在早期的betaflight3.3.0 测试版中,序列编号为#521之前的固件版本集成了Kalman滤波器,之后的版本kalman的代码还在固件内,但是入口被关闭了。(也就是你无法启用Kalman滤波器)

4:RS2K(最早给BF加入kalman算法的人)在RCgroup上的博客发表的BF3.3.0测试版固件,默认开启Kalman滤波器,其中的kalman滤波器代码,是RS2K写的,他在Slack里面说过,和Raceflightone使用的是一样的东西。

5:Ctzsnooze(BF开发者,就是他写了BiquadRC+FIR2滤波器的代码),强烈建议mikeller在CLi中保留kalman和BiquadRC+FIR2的入口,这样使用者可以自己使用CLi命令切换这两种滤波器,这样可以比较两种滤波器的效果。但是mikeller表示现在已经是发布RC版和正式版的窗口期了,不能做大的源代码变动,拒绝了这个提议。

6:RS2K和HelioRC的一伙人,一起搞了Butterflight(黄油固件),这个版本的固件和调参软件是Betaflight的Fork版本,也就是说完全拷贝Betaflight的内容之上修改而来,所以本质上和Betaflight是一样的东西。

7:helioRC出品了一款飞控,号称使用了陀螺仪硬件滤波,完美支持黄油固件。

8:Butterflight 3.4.2 (黄油固件)同时集成了Kalman滤波器和BiquadRC+FIR2滤波器,默认开启Kalman滤波器,可以通过CLi命令行来切换这两种滤波器。

9:kalman矩阵方程里面最重要的就是Q值(过程噪声协方差)和R值(测量噪声协方差)这两个值的确定,目前是用等效于Stage2的低通频率的方法,通过查表的方式来换算出基础的Q值,(R值固定不变),再通过少许调节Q值的方法来调试kalman滤波器。

10:kalman算法可以在8k采样率陀螺仪上完美工作,但是发挥最大性能,是在32k采样率之下。

11:betaflight是在cleanflight的基础上fork出来的版本,butterflight是在betaflight之上fork出来的版本,这些软件代码都遵循GPL3.0开源协议(通用性公开许可证),就是你无法通过商业用途赚钱,都必须公开源代码。同样,只要你使用了GPL3.0开源协议的代码,哪怕就是一行,那你的软件就等同于继承了GPL3.0协议,也必须完全公开。这个大家百度一下GPL3.0就出来了。


========开始吧========
本文中的案例都是使用butterflight来演示,实际你使用RS2k发布的那一版,也可以使用以下参数。

使用kalman滤波器的第一个难度在于确定Q值

黄油固件的首页,提供了一套参数

放大来看,熟悉命令的可以知道,这里面其实就三条命令有用,来依次解释一下。

set dterm_lowpass_type = PT1
设定D-term的软件低通滤波器为PT1

这个就等效于,把这里改成PT1

feature AIRMODE  打开airmode
feature ANTI           打开反重力
feature DYNAMIC   打开动态滤波

等效于,上面三个滑块全开的效果。

set gyro_stage2_filter_type = FAST_KALMAN  
设定2阶滤波器为快速kalman

set gyro_filter_q = 400  
设定kalman矩阵Q值为400

set gyro_filter_r = 88
设定kalman矩阵R值为88

BiquadRC+FIR2和kalman都是陀螺仪软件低通滤波器,所以现在最简单的办法,是用BQRC的设定值,来等效算出kalman的方程Q值。

这个默认值,就是BQRC的设定低通切断频率,90Hz。或者是你在命令行里面设定的gyro_stage2_lowpass_hz = XX 这个频率值。通过这个切断值,来换算kalman的Q值。

这里有两种方法,第一是查表。
首先在第一行里面找到你的陀螺仪采样率,例如32K,往下找到90Hz附近的数值,看起来最接近的就是84~97Hz,然后往右边找,对应的Q值大约是7。

同理,可以找出在90Hz切断频率条件下,16K采样率对应的Q=28,8K采样率对应的Q=100,

4K陀螺仪采样率,对应的Q=400。

总结一下,在切断频率是默认值90Hz的情况下,换算而出对应的kalmanQ值是
32K采样率 Q=7
16K采样率 Q=28
8K采样率   Q=100
4K采样率   Q=400

针对32K的陀螺仪,不管Q是多少,R全部固定在88,即可。

接下来,针对32K采样率的陀螺仪,就可以在命令行里面输入
set gyro_filter_q = 8
set gyro_filter_r = 88
save

来设定好kalman的Q值和R值。

第二种方法,上网
进入 https://quadmeup.com/bf_kalman_calculator/ 这个网页

好吧,接下来就是一个数字游戏,我们填入陀螺仪采样率32000,填入R值=88,然后就是凑数了,多少的Q对应多少的切断频率。

额,顺路来看看默认值……

额,对于32k来说,感觉是不是高了一些……按照5寸机通常是260Hz左右的噪声值来说,711Hz的切断频率,这第一个低通滤波完全就木有发挥作用好伐……

32K陀螺仪,设定到Q=400的表现,就是在新机状态会没有问题(新机没有震动),但是一旦有一点炸坏了,那好,抖到炸机。
但是同一架飞机,之前使用BiquadRC+FIR2滤波器设定到90Hz毫无问题的。

改成4K的陀螺仪,数值就正常了。

RS2K对于kalman的调参建议,针对32K的陀螺仪,固定R=88不变,然后Q依次从小往上调,如果噪声很大的飞机,那Q要低一些,如果飞机噪声很低,那么可以将Q调高一些,避免过度滤波。也可以经常使用这两个表格,来确定目前滤波的程度,毕竟看Hz比看Q值要容易理解的多。

需要注意的是,Q越高,其等效的切断频率就越高,这个通过查表就可以看出来,所以抬高Q,就相当于提高了切断频率的值,降低Q,就相当于降低了切断频率的值。

切断频率90Hz是默认值,如果你的飞机很“安静”,那么可以适当抬高切断频率(抬高Q),如果你的飞机噪声很大,那么可以适当降低切断频率(降低Q)。

这个也是Ctzsnooze(BF开发者)说的,其实BQRC更好调整和容易理解一些,虽说这两个参数在“数学上是完全等效的”。

在CLi中输入,get gyro 就可以查看的相关命令,这里可以看到,黄油固件保留了kalman,BiquadRC+FIR2这两个滤波器。


如果你要用回BF3.3.0里的BQRC滤波器,那么输入
set gyro_stage2_filter_type = BIQUAD_RC_FIR2

别忘记设定stage2的切断频率
set gyro_stage2_lowpass_hz =90

别忘记保存
save

然后再打开Cli确认一下命令数值是不是都正确,这就切换回BQRC滤波器了,这就可以自己尝试两个滤波器的区别了。

上图是我的测试平台:
自制玩玩的机架
飞控:matek F722 STD
电调:iPeak 35A 四合一 BLheli_32
电机:DYS 2207 2300kv

参数设定:
陀螺仪32k/Looptime 16K
Multishot PWM强制同步到32k
开动态滤波,开PT1
kalmanQ=10
kalmanR=88
moron_threshold = 200
PID为默认

以上参数仅在我的平台上测试成功,飞了30电左右,油门到底有轻微抖动,之后由于电机烧了,暂时没法继续做测试了。


其余动态滤波的开启,32K陀螺仪的开启和冷启动bug解决,以及PT1 D-term的开启,这些都是常规操作了,或者可以参考之前的公众号历史消息,就不再赘述了。

=========小工具=========
安装Kalman Lua 由于在OSD里面没有继承这个调节选项,所以似乎用遥控器脚本来调参更方便一些,当然不是说非得用这个,用电脑调参也是一样的。上图里面的数值显示有点bug,不过不影响使用。具体如何安装kalman Lua,这里就不再展开了。

kalman Lua传送门:https://github.com/papayou66/betaflight-tx-lua-scripts/releases


有看不明白的地方,或者有需要更正的地方(因为kalman新出来,相关的内容还在更新中,可能会有很多需要更正的地方),大家可以在下方留言给我反馈。

特别注意飞行安全!祝大家玩的开心!


文件链接:
RS2K在RCgroup上发布的kalman固件
https://www.dropbox.com/sh/ijtkl9bfu4pgq8z/AAACQugd9iSqkkPLDT1owgY-a?dl=0

kalman Q和R值与BQRC的切断频率换算表
https://quadmeup.com/bf_kalman_calculator/

kalman滤波器 Lua脚本下载链接
https://github.com/papayou66/betaflight-tx-lua-scripts/releases

解决OpenTX使用脚本出现内存溢出的讨论贴(已解决)
https://github.com/opentx/opentx/pull/5579

HelioRC的网站
https://www.heliorc.com/

Butterflight 主页
http://butterflight.co/

Butterflight 固件下载地址
https://github.com/butterflight/butterflight/releases

Butterflight 调参软件下载地址
https://github.com/butterflight/butterflight-configurator/releases


部分需要的文件:
已放入公众号云盘,需要的同学可前去下载。





欢迎继续阅读楼主其他信息

沙发
发表于 2018-4-1 00:36 | 只看该作者
好贴子,收藏学习!!!
3
发表于 2018-4-1 01:21 | 只看该作者
好复杂,
来自安卓客户端来自安卓客户端
4
发表于 2018-4-1 08:51 | 只看该作者
学习了!!!
5
发表于 2018-4-1 09:07 ——“来自手机” | 只看该作者
好帖必定
6
发表于 2018-4-1 13:02 | 只看该作者
一直有追樓主的貼,實用,無私
来自苹果客户端来自苹果客户端
7
发表于 2018-4-1 17:06 | 只看该作者
这个才是好帖,学习了!
8
发表于 2018-4-1 18:57 | 只看该作者
9
发表于 2018-4-1 22:57 | 只看该作者
技术贴要支持。
10
发表于 2019-1-17 22:02 | 只看该作者
好贴帮顶    记号
11
发表于 2019-1-18 13:05 | 只看该作者
从头看到尾,似乎好像明白了,但好像没啥用,一个Q值一个R值,反正也不需要改。但是,好贴要顶。
来自苹果客户端来自苹果客户端
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

快速回复 返回顶部 返回列表