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下的配置要点

仿真环境下,日志采集的配置跟真机差不多,但有几个坑我得提醒你。

我曾经踩过的坑: 仿真跑了一整天,结果发现日志没开。默认情况下,SITL的日志是开启的,但采样率可能不够。比如你想分析高频振动,结果IMU数据只记录了50Hz,那基本什么都看不出来。

所以,我建议你在启动仿真前,先检查一下日志配置:

  • 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做加减乘除,比如计算跟踪误差。
小技巧: 想看PID控制器的效果?把期望值(比如roll_setpoint)和实际值(roll)拖到一起,误差一目了然。我曾经用这个方法发现一个飞控的roll通道增益设低了,导致转弯时总是滞后。

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 核心分析流程:从数据到结论

数据可视化不是目的,目的是找到问题。我总结了一个分析流程,你照着做基本不会漏:

  1. 看整体:先看姿态和位置曲线,有没有明显异常?比如剧烈震荡、漂移、跳变。
  2. 看细节:放大到异常区域,看角速度、加速度、控制输出。是传感器噪声?还是控制器震荡?
  3. 做对比:把期望值和实际值叠在一起,看跟踪误差。误差大?调PID。
  4. 做频谱:对IMU数据做FFT,看有没有特定频率的振动。如果有,可能是结构共振或滤波器没调好。
  5. 看日志事件:检查有没有报错或警告,比如EKF failed、motor timeout等。
核心原则: 不要只看一个信号。把相关信号放在一起看,才能找到因果关系。比如,roll震荡了,同时看gyro.x和actuator_outputs,就能判断是传感器问题还是控制问题。

4.6 知识体系图:日志分析的核心逻辑

下面这张图,是我自己总结的日志分析知识体系。你把它记在心里,分析的时候就不会乱。

日志分析核心逻辑 日志分析核心逻辑 数据采集 数据可视化 问题分析 优化结论 迭代优化 分析维度 • 姿态跟踪误差 • 角速度噪声 • 控制输出饱和 推荐工具 • PlotJuggler • FlightPlot • pyulog / MAVExplorer 从数据采集到优化结论,形成闭环迭代

4.7 常见问题与避坑指南

最后,分享几个我实际项目中遇到的问题,你遇到了可以少走弯路。

我曾经遇到过: 日志文件损坏,打不开。原因是仿真过程中磁盘空间满了,日志写入不完整。从那以后,我每次仿真前都会检查磁盘剩余空间,至少留2GB。
另一个坑: 时间戳不同步。ULog和DataFlash的时间戳都是微秒级,但如果你同时记录多个话题,它们的时间基准可能不一样。分析前先检查时间轴是否对齐,否则曲线对不上。