Skip to content

全系统回放

基于 ORB 消息,可以对系统的任意部分进行记录和回放。

回放对于根据真实数据测试不同参数值的影响、比较不同的估计器等情况非常有用。

系统必备组件

第一步是确定需要回放的一个或多个模块。然后,找出这些模块的所有输入,即订阅的 ORB 主题。对于全系统回放,这些输入包括所有硬件输入:传感器、遥控(RC)输入、MAVLink 命令和文件系统。

所有确定的主题都需要以全速率进行记录(参见 日志记录)。对于 ekf2,默认记录的主题集已经满足这一要求。

重要的是,所有要回放的主题只能包含一个绝对时间戳,即自动生成的 timestamp 字段。如果存在更多时间戳,它们必须相对于主时间戳。例如,可参考 SensorCombined.msg。原因如下所述。

用法

  • 首先,选择要回放的文件并构建目标(在 PX4 - Autopilot 目录内执行):
sh
export replay=<日志文件的绝对路径.ulg>
make px4_sitl_default

这将在单独的构建目录 build/px4_sitl_default_replay 中生成构建/编译输出(这样参数就不会与正常构建产生冲突)。由于构建系统通过 replay 环境变量知道处于回放模式,因此可以选择任何 POSIX SITL 构建目标进行回放。

  • 在文件 build/px4_sitl_default_replay/rootfs/orb_publisher.rules 中添加 ORB 发布者规则。该文件定义了允许发布特定消息的模块。其格式如下:
sh
restrict_topics: <主题1>, <主题2>, ..., <主题N>
module: <>
ignore_others: <true/false>

这意味着给定的主题列表只能由 <模块>(即命令名称)发布。其他模块对这些主题的发布将被静默忽略。如果 ignore_otherstrue,则 <模块> 对其他主题的发布也将被忽略。

对于回放,我们只希望 replay 模块能够发布之前确定的主题列表。因此,对于回放 ekf2,规则文件应如下所示:

sh
restrict_topics: sensor_combined, vehicle_gps_position, vehicle_land_detected
module: replay
ignore_others: true

这样,在回放时就不需要禁用通常发布这些主题的模块。

  • (可选) 设置参数覆盖(参见 下面的说明)。

  • (可选)dataman 任务文件从 SD 卡复制到构建目录。只有在需要回放任务时才需要这样做。

  • 启动回放:

sh
make px4_sitl_default jmavsim

这将自动打开日志文件,应用参数并开始回放。完成后,它将报告结果并退出。新生成的日志文件可以在 rootfs/fs/microsd/log 中找到,该目录按日期组织成子目录。回放后的日志文件名将带有 _replayed 后缀。

请注意,上述命令也会显示模拟器,但根据回放的内容,它可能无法显示实际发生的情况。仍然可以通过 QGroundControl(QGC)进行连接,例如在回放过程中查看姿态的变化。

  • 最后,取消设置环境变量,以便再次使用正常的构建目标:
sh
unset replay

覆盖原始日志中的参数

默认情况下,在回放过程中会应用原始日志文件中的所有参数。如果在记录过程中某个参数发生了变化,在回放时它将在正确的时间点进行相应更改。

在回放过程中,可以通过两种方式覆盖参数:固定动态。当参数被覆盖时,日志中相应的参数更改在回放过程中将不会被应用。

  • 固定参数覆盖 将从回放开始就覆盖参数。它们在文件 build/px4_sitl_default_replay/rootfs/replay_params.txt 中定义,每行的格式应为 <参数名称> <值>。例如:
sh
EKF2_RNG_NOISE 0.1
  • 动态参数覆盖 将在指定的时间更新参数值。这些参数仍将初始化为日志或固定覆盖中设置的值。参数更新事件应在 build/px4_sitl_default_replay/rootfs/replay_params_dynamic.txt 中定义,每行的格式为 <参数名称> <值> <时间戳>。时间戳是从日志开始的秒数。例如:
sh
EKF2_RNG_NOISE 0.15 23.4
EKF2_RNG_NOISE 0.05 56.7
EKF2_RNG_DELAY 4.5 30.0

重要提示

  • 在回放过程中,将报告日志文件中的所有退出情况。这些情况会对回放产生负面影响,因此在记录时应注意避免数据丢失。
  • 目前只能以“实时”方式进行回放,即与记录速度相同。这项工作计划在未来进行扩展。
  • 时间戳为 0 的消息将被视为无效消息,不会被回放。

EKF2 回放

这是全系统回放的一种特殊情况,用于快速进行 EKF2 回放。它将自动创建 ORB 发布者规则,操作步骤如下:

INFO

不支持对具有 多个 EKF 实例 的飞行日志进行记录和回放。要启用 EKF 回放的记录功能,必须将参数设置为启用 单个 EKF 实例

在 EKF2 模式下,回放将自动创建上述的 ORB 发布者规则。

要进行 EKF2 回放:

  • 记录原始日志。可以选择将 SDLOG_MODE 设置为 1 以从启动时开始记录。

  • 除了设置 replay 环境变量外,还需将 replay_mode 设置为 ekf2

sh
export replay_mode=ekf2
export replay=<日志文件的绝对路径.ulg>
  • 使用 none 目标运行回放:
sh
make px4_sitl none
  • 完成后,取消设置 replayreplay_mode
sh
unset replay; unset replay_mode

为回放调整 EKF2 特定参数

首先安装 pyulog

sh
pip install --user pyulog

将原始日志的参数提取到 replay_params.txt

sh
ulog_params -i "$replay" -d ' ' | grep -e '^EKF2' > build/px4_sitl_default_replay/rootfs/replay_params.txt

根据需要调整这些参数,并在必要时在 replay_params_dynamic.txt 中添加动态参数覆盖。

后台

回放分为 3 个组件:

  • 回放模块:回放模块读取日志并以与记录时相同的速度发布消息。会为每条消息的时间戳添加一个常量偏移量,以匹配当前系统时间(这就是为什么所有其他时间戳都需要是相对的原因)。命令 replay tryapplyparams 会在加载所有其他模块之前执行,它会应用日志中的参数和用户设置的参数。然后,最后执行的命令 replay trystart 会再次应用参数并开始实际的回放。如果环境变量 replay 未设置,这两个命令都不会执行。

  • ORB 发布者规则:如上文所述,ORB 发布者规则允许选择系统的哪些部分进行回放。它们仅针对 POSIX SITL 目标进行编译。

  • 时间处理:时间处理仍然是一个 待解决的问题,需要进行实现。