ARTICLE DETAIL

资讯详情

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

ArduPilot IMU 滤波测试工具(FilterTestTool)使用指南:基于原始 IMU 日志的滤波参数模拟与调优

ArduPilot IMU 滤波测试工具(FilterTestTool)使用指南:基于原始 IMU 日志的滤波参数模拟与调优 ArduPilot IMU 滤波测试工具FilterTestTool使用指南基于原始 IMU 日志的滤波参数模拟与调优【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot导读本文介绍 ArduPilot 仓库中 Tools/FilterTestTool 这一轻量级桌面工具。它通过离线回放.bin数据日志中的原始 IMURAW_IMU数据在 PC 上模拟陀螺仪/加速度计的低通滤波LPF与陷波滤波Notch效果帮助飞手和调参工程师在不刷机、不改参数、不冒险试飞的前提下预览不同滤波参数组合对振动抑制的影响。读完本文你将掌握该工具的安装依赖、三种命令行启动方式、关键参数位RAW_IMU 日志位的开启方法以及工具底层如何用 Python 复刻 ArduPilot 固件的 Biquad 滤波器并理解为何官方反复强调“最终仍须以机载 FFT 为准”。一、工具定位与适用场景该工具位于 Tools/FilterTestTool/Readme.md仓库内共 4 个文件run_filter_test.py命令行入口负责解析参数、读取日志、解析固件参数FilterTest.py核心交互界面完成滤波仿真、FFT 频谱分析与滑块调参BiquadFilter.pyBiquad 数字滤波器实现LPF / PEAK 陷波Readme.md官方使用说明。其核心工作流程为从日志中抽取ACC与GYR消息见 libraries/AP_InertialSensor/LogStructure.h 中log_ACC、log_GYR的结构定义字段包括TimeUS、IIMU 实例号、SampleUS与三轴数据随后在本地按用户拖动的滑块参数对原始时间序列滤波并同步展示滤波前后的时域波形与 STFT 频谱。工具明确限定了使用前提原文档三句话必须逐字保留Warning: always check the onboard FFT to setup filters, this tool only simulates the effects of filtering.This is a tool to simulate IMU filtering on a raw IMU log. This requires activating the RAW_IMU bit on the LOG_BITMASK parameter. Currently only supports the primary IMU and does not use batch sampling.即① 该工具只是滤波效果的仿真② 必须先在LOG_BITMASK参数中开启 RAW_IMU 日志位③ 当前仅支持主 IMUprimary IMU不采用批采样batch sampling数据。二、环境准备与日志采集要求2.1 Python 依赖工具是 Python 3 脚本需要以下第三方库pymavlink日志读取from pymavlink import mavutilnumpy数值计算scipySTFT 频谱分析from scipy import signalmatplotlib绘图与交互滑块tkinter文件选择对话框Linux 下可能需要python3-tk包。注意 run_filter_test.py 顶部做了 Python 2/3 兼容处理Python 3 下从tkinter、tkinter.filedialog导入Python 2 下回退到Tkinter、tkFileDialog实际开发以 Python 3 为准。2.2 日志侧要求开启 RAW_IMU 日志位原文档强调This requires activating the RAW_IMU bit on the LOG_BITMASK parameter。在 run_filter_test.py 中RAW_IMU 日志位被定义为RAW_IMU_LOG_BIT 2 ** 19 # 即 LOG_BITMASK 第 19 位对应到地面站Mission Planner 等中LOG_BITMASK的 “RAW_IMU” 选项。采集日志时勾选该项数据日志中才会以接近传感器采样率的频率记录原始ACC/GYR消息而非经滤波后的低频IMU消息这是后续高分辨率频谱分析的数据基础。工具在解析日志时还会对LOG_BITMASK做校验if LOG_BITMASK in params: log_bitmask int(params[LOG_BITMASK]) if not log_bitmask RAW_IMU_LOG_BIT: print(\nWARNING: LOG_BITMASK was not set to enable RAW_IMU logging, please enable it to have best resolution)若未开启会打印 WARNING提示“为获得最佳分辨率请开启 RAW_IMU 日志”。2.3 建议使用滤波前日志工具还会检查INS_LOG_BAT_OPT参数。该参数的第 1 位POST_FILTER_LOGGING_BIT 2 ** 1控制是否记录滤波后的 IMU 数据。源码中的提示如下if log_bat_opt POST_FILTER_LOGGING_BIT: print(\nINS_LOG_BAT_OPT was set to {} which enables post filter logging, use pre filter logging to not sum multiple filter passes..format(log_bat_opt)) print((set INS_LOG_BAT_OPT {}).format(set_bit(log_bat_opt, 1, 0)))原因很直观如果日志记录的是已经过固件滤波的数据那么本工具再叠加一次仿真滤波等于对同一段信号做了两次滤波频谱与波形都会失真。因此官方建议使用滤波前pre-filter日志即不要启用INS_LOG_BAT_OPT的后滤波日志位。三、启动方式与命令行参数3.1 最简启动GUI 选文件原文档给出第一种运行方式python run_filter_test.py进入 Tools/FilterTestTool 目录后执行。此时脚本不携带文件参数会弹出 tkinter 文件选择对话框title 为 Select log file默认过滤.BIN .bin .log文件选中日志后自动开始加载。对应源码逻辑if not log_file: root Tk() root.withdraw() root.focus_force() log_file askopenfilename(titleSelect log file, filetypes((log files, .BIN .bin .log), (all files, *.*)))若未选择任何文件None 或空字符串脚本打印No log file to open后退出。3.2 命令行直接指定日志python run_filter_test.py logfile.bin第一个位置参数file即日志路径可跳过对话框直接加载。3.3 截取日志片段日志可能很长工具支持按秒截取区间。原文档示例python run_filter_test.py logfile.bin -b 60 -e 120即只分析日志第 60120 秒之间的数据。参数定义见 argparse 部分parser.add_argument(file, nargs?, defaultNone, helpbin log file containing raw IMU logs) parser.add_argument(--begin-time, -b, typeint, default0, helpstart from second) parser.add_argument(--end-time, -e, typeint, default-1, helpend to second) parser.add_argument(--instance, typeint, default0, helpIMU instance)除原文档提及的-b/-e外还有一个--instance参数默认 0用于指定分析第几号 IMU。注意原文档已说明“当前仅支持主 IMU”因此通常保持默认值 0 即可。源码中通过m.I args.instance过滤ACC/GYR消息的实例号字段对应 LogStructure.h 中log_ACC/log_GYR的I字段。命令参数汇总参数短选项类型默认值含义file-strNone.bin日志文件路径缺省时弹窗选择--begin-time-bint0分析起始时间秒--end-time-eint-1分析结束时间秒-1 表示到日志末尾--instance-int0IMU 实例号四、日志解析与参数预置逻辑4.1 消息抽取与采样率统计脚本通过mavutil.mavlink_connection(log_file)打开日志循环匹配PARM、GYR、ACC三类消息PARM记录工具关心的固件参数见下ACC/GYR按实例号过滤后把TimeUS微秒时间戳除以 1e6 转为秒与三轴数据分别存入数组。随后统计消息数与时长计算实际采样频率msg_freq msg_count / msg_total_time print(msg_name frequency {:.2f} hz.format(msg_freq))若ACC_t或GYR_t为空则打印No RAW IMU logs to analyze并退出。4.2 自动读取当前固件滤波参数工具会在日志中查找以下固件参数用于给初始滑块赋值PARAMS_TO_CHECKPARAMS_TO_CHECK [ INS_LOG_BAT_OPT, INS_GYRO_FILTER, INS_ACCEL_FILTER, INS_HNTC2_ENABLE, INS_HNTC2_FREQ, INS_HNTC2_BW, INS_HNTC2_ATT, INS_NOTCA_ENABLE, INS_NOTCA_FREQ, INS_NOTCA_BW, INS_NOTCA_ATT, LOG_BITMASK ]这些参数对应 ArduPilot IMU 滤波体系INS_GYRO_FILTER/INS_ACCEL_FILTER陀螺仪 / 加速度计的低通截止频率Hz源码默认值均为 80 HzDEFAULT_ACC_FILTER 80 # hz DEFAULT_GYR_FILTER 80 # hzINS_HNTC2_*陀螺仪gyro第二陷波滤波器Harmonic Notch / 二次陷波的使能、中心频率、带宽、衰减默认FREQ145 Hz、ATT30 dB、BW100 HzINS_NOTCA_*加速度计accel陷波滤波器Notch on Accelerometer的使能、中心频率、带宽、衰减默认FREQ150 Hz、ATT30 dB、BW100 HzINS_LOG_BAT_OPTIMU 批处理日志选项其第 1 位控制是否记录滤波后数据LOG_BITMASK总日志位掩码用于校验 RAW_IMU 位。加载时若INS_HNTC2_ENABLE/INS_NOTCA_ENABLE为 0未启用对应陷波的衰减初值会被置 0相当于关闭陷波效果若固件不支持加速度计陷波日志中缺失INS_NOTCA_*脚本会打印提示并置ACCEL_NOTCH_FILTER False即滤波链中不再加入加速度计陷波器else: print(The firmware that produced this log does not support notch filter on accelerometer) ACCEL_NOTCH_FILTER False五、滤波模型与仿真原理5.1 滤波链结构FilterTest类在初始化时按“低通 陷波”的级联结构组织滤波器FilterTest.pyself.filters[acc] [ BiquadFilter(acc_lpf_cutoff, acc_freq) ] if accel_notch: self.filters[acc].append( BiquadFilter(acc_notch_freq, acc_freq, BiquadFilterType.PEAK, acc_notch_att, acc_notch_band), ) self.filters[gyr] [ BiquadFilter(gyr_lpf_cutoff, gyr_freq), BiquadFilter(gyr_notch_freq, gyr_freq, BiquadFilterType.PEAK, gyr_notch_att, gyr_notch_band) ]即加速度计链路为LPF → (可选)Notch陀螺仪链路为LPF → Notch另有second_notch参数可追加二次谐波陷波频率为一次陷波的 2 倍。滤波时对每个采样点依次级联应用for filt in filters: x_f filt.apply(x_f)5.2 Biquad 滤波器实现BiquadFilter.py 完整实现了三类数字滤波器BiquadFilterTypeLPF0、PEAK1、NOTCH2采用直接 I 型结构output (self.b0 * sample self.b1 * self._delayed_sample1 self.b2 * self._delayed_sample2 - self.a1 * self._delayed_output1 - self.a2 * self._delayed_output2)LPF低通Q 取1/sqrt(2)即 Butterworth 临界阻尼系数由标准双线性变换公式得出PEAK峰值/陷波衰减量 A 由10**(-attenuation_db/40)决定带宽通过倍频程octaves换算为 Q 值代码注释特别说明这样处理可避免带宽接近 2 倍中心频率时的除零问题NOTCH标准陷波器系数alpha sin(omega) * sinh(log(2)/2 * bw * omega * sin(omega))。所有系数计算后统一除以a0归一化apply()前若中心频率 0则直通不滤波。freq_response()方法用于绘制滤波器的频率响应曲线其频率轴分辨率基于采样率get_sample_freq()。5.3 可视化与交互FilterTest.init_plot()创建 2×3 的 matplotlib 窗口尺寸 14×9左上加速度计原始 vs 滤波后的三轴时域曲线半透明为原始、实线为滤波后中上加速度计 FFT 频谱STFT 平均幅度谱窗函数 HannFFT_N 512左下陀螺仪时域曲线中下陀螺仪 FFT 频谱右列滤波器频率响应形状与滑块控制区每个滤波器有freq中心/截止频率0500 Hz、陷波额外有att衰减0100 dB与band带宽0300 Hz三个滑块。滑块采用非线性映射valinitnp.sqrt(max * value)回调中val int(val**2 / max)以便精细调节小数值拖动滑块后经FILTER_DEBOUNCE 10 ms防抖定时器延迟重新计算滤波结果并刷新时域与 FFT 曲线实现“所见即所得”的实时对比。六、把仿真结果落地为固件参数关闭绘图窗口后工具会根据最后一次滑块设置打印对应的固件参数print_filter_param_info格式如To have the last filter settings in the graphs set the following parameters: INS_ACCEL_FILTER, cutoff INS_NOTCA_ENABLE, 1 INS_NOTCA_FREQ, freq INS_NOTCA_BW, bandwidth INS_NOTCA_ATT, attenuation ...映射规则源码中filt_type BiquadFilterType.PEAK即陷波否则为 LPF仿真链路对应固件参数加速度计 LPF 截止频率INS_ACCEL_FILTER加速度计陷波使能/频率/带宽/衰减INS_NOTCA_ENABLE、INS_NOTCA_FREQ、INS_NOTCA_BW、INS_NOTCA_ATT陀螺仪 LPF 截止频率INS_GYRO_FILTER陀螺仪陷波使能/频率/带宽/衰减INS_HNTC2_ENABLE、INS_HNTC2_FREQ、INS_HNTC2_BW、INS_HNTC2_ATT即先在 PC 上通过滑块找到能有效压平 FFT 中振动尖峰的最优组合再把这组数值填写到上述参数。需要注意的是若链路中滤波器数量超过固件实际支持个数源码中len(self.filters[acc]) 2 or len(self.filters[gyr]) 2工具会提示 “Testing too many filters unsupported from firmware, cannot calculate parameters to set them”此时无法直接换算成参数应减少滤波器数量。七、常见问题与使用提醒7.1 为什么必须以上机 FFT 为准这是原文档与源码结尾一致的、最重要的警告--------- | WARNING | --------- Always check the onboard FFT to setup filters, this tool only simulate effects of filtering.仿真无法完整复现真实固件的所有行为如采样时序抖动、批采样、多 IMU 融合、电机/螺旋桨不同转速下的时变振动因此最终的滤波参数必须以机载 FFT如FFT/FTN日志或INS_FFT_*系列机载 FFT 功能实测为准。该工具适合快速缩小参数搜索范围、对比不同方案而不是替代真机验证。原文档亦提到更多讨论可参考 ArduPilot 官方论坛的 “IMU Filter Tool” 主题帖。7.2 常见问题速查没有弹出文件对话框缺少 tkinter 支持Linux 下安装python3-tk报错 No RAW IMU logs to analyze日志中没有ACC/GYR消息检查LOG_BITMASK是否开启 RAW_IMU第 19 位位并确认选择的是包含原始 IMU 数据的.bin日志频谱异常/滤波效果被叠加检查INS_LOG_BAT_OPT是否启用了后滤波日志位工具会提示将其第 1 位清零只支持主 IMU--instance默认为 0多 IMU 平台注意当前版本限制无法换算参数滤波器数量超出固件支持范围请缩减滤波器链再调参。八、总结Tools/FilterTestTool 是 ArduPilot IMU 滤波调参工作流中的一款高效辅助工具它把“原始 IMU 日志”变成可交互的滤波仿真实验台让你在不接触真机的情况下直观看到 LPF 截止频率、陷波中心频率/带宽/衰减对时域与频谱的影响并直接输出可写回固件的参数建议。使用时要始终牢记三个边界——必须开启 RAW_IMU 日志位、尽量使用滤波前日志、最终以机载 FFT 校验。将仿真结论与 AP_InertialSensor 的日志结构ACC/GYR消息见 LogStructure.h结合理解即可建立从“日志采集 → 离线仿真 → 参数落地 → 真机验证”的完整调参闭环。【免费下载链接】ardupilotArduPlane, ArduCopter, ArduRover, ArduSub source项目地址: https://gitcode.com/GitHub_Trending/ar/ardupilot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表