使用重放进行测试

导言

Replay 是一个程序,它能获取数据闪存日志文件,并通过任何分支的代码进行重放,从而使用该分支的代码而不是生成数据闪存日志时使用的代码来分析状态估计问题。

备注

用于创建日志的固件的日志结构与要用其测试的分支必须相同。

备注

要使用 Replay,必须使用以下命令生成日志 日志播放 设置为 1。最好还能有 日志_解除警报 也设为 1,以获取日志中最多的信息。

./_images/Replay_EKFVsINAV.png

建筑回放

在 Linux 或 Ubuntu 机器上,从 ArduPilot 软件源的根目录,使用要重放日志的分支:

./waf 配置 --板=坐标 --调试   //--调试  可选的  允许 使用 a 调试器、 如果 所愿  分析 问题 ./waf 重放

这将创建一个名为 build/sitl/tool/Replay.

使用重放

显示 Replay 帮助说明:

build/sitl/tool/Replay -h

通过 Replay 运行日志,生成绘图和 EKF 数据文件:

build/sitl/tool/Replay MyLogFile.BIN

这将在"./logs "文件夹下生成一个输出文件 xxx.BIN,该文件将是刚刚创建后编号最高的日志。

使用 MAVExplorer 绘制数据图表。原始和 Replay 生成的 EKF 信息都将包含在日志数据中。例如,IMU0 和 IMU1 的 EKF2- NKF2 报文项目可能的图表如下:"NKF2、NKF2[0] 和 NKF2[1]",重放生成的日志信息还将有 "NKF2[100] 和 NKF2][101]"图表组。

备注

如果使用 WSL,请不要通过外部 Windows WSL 路径引用日志文件,因为这样速度会非常慢。而是将日志从 Windows 文件系统直接复制到 WSL 环境中,然后在该环境中执行 Replay。

更改参数

在重放日志之前,可使用该选项更改模拟参数: -参数 NAME=VALUE (这将设置参数 姓名价值).可以编辑的参数是在 SITL 中运行 "param show <param-name> "命令时列出的参数。

例如,要将 EKF I 门值改为 1,000,请执行命令:

build/sitl/tools/Replay --参数 EK2_VEL_I_GATE=1000 log_1.bin

检查新代码是否对 EKF 没有影响

修改 EKF 代码时,在某些情况下,确认您的修改对 EKF 的估算没有影响是非常有用的。这可以通过以下步骤来完成:

  • 使用 "master"(主控),选择一辆车启动 SITL

  • 将这些参数以及一些传感器位置参数(即 GPS_POS_X,Y,Z)设置为非零值

停止 设置 日志_解除警报 1
停止 设置 日志播放 1
停止 设置 GPS_POS1_Y 0.1 参数 设置 SIM_GPS_POS1_Y 0.1
  • 驾驶飞行器进行短途飞行,包括快速向前飞行和转弯

  • 降落载具并下载车载日志(即 00000001.BIN)

  • 将原木移到安全的地方

mv logs/00000001.BIN test-00000001.BIN
  • 签出新分支并构建 Replay(见上文 "构建 Replay)

git 销售点 <new-branch>;
CD ardupilot ./waf 重放
  • 使用 Replay 处理机载日志(见上文 "使用 Replay")。

build/sitl/tools/Replay test-00000001.BIN
  • 将生成的日志文件转移到安全的地方。新日志包含原始日志的所有信息,以及新分支的 EKF 产生的信息

mv logs/00000001.BIN replay-00000001.BIN
  • 使用 check_replay.py 脚本检查是否有更改:

./Tools/Replay/check_replay.py replay-00000001.BIN
  • 如果没有任何变化,将显示如下信息

加工 登录 replay-00000001.BIN 已处理 30166/30166 留言 0 错误 通过

确保 EKF 的变化对其输出没有影响

通常情况下,对 EKF 的改动预计不会带来功能上的变化。重构、删除死代码、添加注释、重新排列参数、更改函数名等等。

如果您要做出这样的改变、 Tools/Replay/check_replay_branch.py 可确保当前分支不会更改 EKF 的输出,自动测试套件的 Replay 测试也会对其进行测试。

它:
  • 在主分支上生成可重放日志

  • 编译并运行 Replay 分支

  • 用途 Tools/Replay/check_replay.py 以确保 EKF 输出没有变化

例如

pbarker@bluebottle:~/rc/ardupilot(pr/move-gsf-logging-ekf2)$ ./Tools/Replay/check_replay_branch.py chdir (/home/pbarker/rc/ardupilot)
lckfile='/home/pbarker/rc/buildlogs/autotest.lck';
步骤=build.Copter
步骤=test.Copter.Replay 正在运行: ("git rev-parse HEAD";)  (/home/pbarker/rc/ardupilot)
>>>>; 跑步 STEP: build.Copter  星期二 12 月  1 13:26:32 2020
跑步 ("/bin/rm -f logs/*.BIN logs/LASTLOG.TXT";)  (.)
'构建'; 完蛋 顺利 (4m26.874s)
.. >>>>>; 通过 STEP: build.Copter  星期二 12 月  1 13:31:03 2020
>>>>; 跑步 STEP: test.Copter.Replay  星期二 12 月  1 13:31:03 2020
跑步 ("/bin/rm -f logs/*.BIN logs/LASTLOG.TXT";)  (.)
步骤=test.Copter.Replay . .AT-0298.3: 停止 SITL >>>>; 通过 STEP: test.Copter.Replay  星期二 12 月  1 13:36:01 2020
加工 登录 logs/00000004.BIN 已处理 66495/66495 留言 0 错误 pbarker@bluebottle:~/rc/ardupilot(pr/move-gsf-logging-ekf2)$