4. 数据采集与日志分析:用ULog/DataFlash日志,通过PlotJuggler/FlightPlot做数据可视化
做飞控优化,说白了就是跟数据打交道。你调了一堆参数,飞起来感觉不错,但到底好不好,得看日志。我个人习惯是,每次仿真跑完,第一件事不是看飞机姿态,而是去翻日志文件。数据不会骗人,但前提是你得会看。
这一章,我们就来聊聊怎么采集日志、怎么分析,以及怎么用工具把数据变成能看懂的可视化图表。
4.1 日志文件:ULog vs DataFlash
PX4和ArduPilot用的日志格式不一样。PX4用的是ULog,ArduPilot用的是DataFlash(也就是.bin或.log文件)。虽然格式不同,但核心思路是一样的——记录传感器数据、控制输出、状态估计等关键信息。
| 特性 | ULog (PX4) | DataFlash (ArduPilot) |
|---|---|---|
| 文件扩展名 | .ulg | .bin / .log |
| 数据结构 | 嵌套消息,支持多话题 | 扁平化,按FMT格式定义 |
| 工具支持 | PlotJuggler、FlightPlot、pyulog | Mission Planner、MAVExplorer、PlotJuggler |
| 典型大小 | 较小(压缩存储) | 较大(未压缩) |
嗯,这里要注意:如果你用的是SITL仿真,日志默认会保存在你启动仿真时的目录下。PX4的日志在sitl/rootfs/fs/microsd/log/,ArduPilot的日志在sitl/ArduCopter/logs/。别找错了地方。
4.2 日志采集:SITL下的配置要点
仿真环境下,日志采集的配置跟真机差不多,但有几个坑我得提醒你。
所以,我建议你在启动仿真前,先检查一下日志配置:
- PX4:通过
SDLOG_MODE参数控制日志模式,SDLOG_RATE控制采样率。一般设成1(always on),采样率设成250或更高。 - ArduPilot:通过
LOG_BACKEND_TYPE选择日志后端,LOG_RATE控制采样率。我习惯设成10(10Hz),但关键数据如IMU会以更高频率记录。
# PX4 日志参数示例
param set SDLOG_MODE 1
param set SDLOG_RATE 250
# ArduPilot 日志参数示例
param set LOG_BACKEND_TYPE 1
param set LOG_RATE 10
另外,仿真时间长了日志文件会很大。我一般每次仿真跑完就立刻把日志拷出来,免得被覆盖。
4.3 数据可视化:PlotJuggler实战
PlotJuggler是我最常用的工具,没有之一。它支持ULog和DataFlash,而且可以实时拖拽、缩放、做数学运算。说白了,它就是飞控数据分析的瑞士军刀。
4.3.1 加载日志
打开PlotJuggler,点击Load Data,选择你的日志文件。如果是ULog,它会自动解析出所有话题;如果是DataFlash,它会列出所有FMT定义的消息。
我个人习惯先看几个关键信号:
- 姿态角:roll、pitch、yaw,看有没有震荡或超调。
- 角速度:gyro.x、gyro.y、gyro.z,看噪声水平。
- 控制输出:actuator_outputs或motor,看有没有饱和。
- 位置/速度:local_position或ekf_vel,看跟踪效果。
4.3.2 创建图表
把信号拖到右侧绘图区,PlotJuggler会自动生成曲线。你可以:
- 缩放:鼠标滚轮缩放,按住左键拖拽平移。
- 叠加:把多个信号拖到同一个坐标轴,对比它们的变化。
- 运算:用
Create Timeseries做加减乘除,比如计算跟踪误差。
4.3.3 导出数据
PlotJuggler支持导出CSV,方便你用Python或Excel做进一步分析。我一般会把关键数据段截取出来,导出后做频谱分析。
# 导出CSV示例(在PlotJuggler中操作)
1. 选中要导出的信号
2. 右键 -> Export -> Export to CSV
3. 选择时间范围(可选)
4. 保存文件
4.4 数据可视化:FlightPlot(PX4专用)
如果你用的是PX4,FlightPlot也是个不错的选择。它专门为ULog设计,界面更简洁,但功能不如PlotJuggler强大。
FlightPlot的优势在于:
- 自动布局:它会根据日志内容自动生成一组常用图表。
- 3D轨迹:可以显示飞行轨迹的三维视图。
- 快速浏览:适合快速检查飞行质量。
不过说实话,我只有在需要快速看轨迹的时候才用FlightPlot。做深度分析,我还是回到PlotJuggler。
4.5 核心分析流程:从数据到结论
数据可视化不是目的,目的是找到问题。我总结了一个分析流程,你照着做基本不会漏:
- 看整体:先看姿态和位置曲线,有没有明显异常?比如剧烈震荡、漂移、跳变。
- 看细节:放大到异常区域,看角速度、加速度、控制输出。是传感器噪声?还是控制器震荡?
- 做对比:把期望值和实际值叠在一起,看跟踪误差。误差大?调PID。
- 做频谱:对IMU数据做FFT,看有没有特定频率的振动。如果有,可能是结构共振或滤波器没调好。
- 看日志事件:检查有没有报错或警告,比如EKF failed、motor timeout等。
4.6 知识体系图:日志分析的核心逻辑
下面这张图,是我自己总结的日志分析知识体系。你把它记在心里,分析的时候就不会乱。
4.7 常见问题与避坑指南
最后,分享几个我实际项目中遇到的问题,你遇到了可以少走弯路。