# 全系统重播

可以根据 ORB 消息记录和重放系统的任意部分。

重放功能可用于根据真实数据测试不同参数值的效果,比较不同的估计值等。

# 先决条件

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

所有确定的主题都需要全速记录(见 伐木).对于 ekf2 默认的记录主题集已经是这种情况。

重要的是,所有重放主题只包含一个绝对时间戳,即自动生成的字段 时戳.如果有更多的时间戳,它们必须相对于主时间戳。示例请参见 SensorCombined.msg (打开新窗口).原因如下。

# 使用方法

  • 首先,选择要重放的文件并构建目标(从 PX4-Autopilot 目录中):

    出口 重放=<;absolute_path_too_log_file.ulg>;
    生产 px4_sitl_default
    

    这将在单独的构建目录中创建构建/make 输出结果 build/px4_sitl_default_replay (这样参数就不会干扰正常的编译)。可以选择任何 posix SITL 联编目标进行重放,因为联编系统通过 重放 环境变量,表明它处于重放模式。

  • 在文件中添加 ORB 发布者规则 build/px4_sitl_default_replay/rootfs/orb_publisher.rules.该文件定义了允许发布特定信息的模块。其格式如下

    restrict_topics: <topic1>, <topic2>, ..., <topicN> module: <module> ignore_others: <true/false>;
    

    这意味着给定的主题列表只能由以下人员发布 模块 (是命令名称)。从其他模块发布到这些主题的内容将被忽略。如果 忽略他人出版物,从 模块 将被忽略。

    对于重放,我们只需要 重放 模块,以便能够发布先前确定的主题列表。因此,为了重放 ekf2这样,规则文件应该是这样的

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

    这样,通常发布这些主题的模块就不需要为重播而禁用。

  • 可选 设置参数覆盖(见 以下说明).

  • 可选 复制一个 数据管理员 将任务文件从 SD 卡移至构建目录。只有在重放任务时才需要这样做。

  • 开始重播:

    生产 px4_sitl_default jmavsim
    

    这将自动打开日志文件,应用参数并开始重放。完成后,它会报告结果并退出。然后就可以对新生成的日志文件进行分析。可以在 rootfs/fs/microsd/log子目录中。重放的日志文件名将以 _重放 后缀。

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

  • 最后,取消设置环境变量,重新使用正常的构建目标:

    未设置 重放
    

# 覆盖原始日志中的参数

默认情况下,原始日志文件中的所有参数都会在重放过程中应用。如果某个参数在记录过程中发生变化,则会在重放过程中适时更改。

在重放过程中,可以通过两种方式覆盖参数: 固定的有活力.当参数被覆盖时,重放过程中不会应用日志中相应的参数更改。

  • 固定参数覆盖 将覆盖重放开始时的参数。它们在文件 build/px4_sitl_default_replay/rootfs/replay_params.txt其中每一行的格式应为 <param_name> <value>;.例如

    ekf2_rng_noise 0.1
    
  • 动态参数覆盖 将在指定时间更新参数值。这些参数仍将按照日志或固定重载中的值进行初始化。参数更新事件应在 build/px4_sitl_default_replay/rootfs/replay_params_dynamic.txt,其中每行的格式为 <param_name> <value> <timestamp>;.时间戳是日志开始时的时间(以秒为单位)。例如

    ekf2_rng_noise 0.15 23.4 ekf2_rng_noise 0.05 56.7 ekf2_rng_delay 4.5 30.0
    

# 重要说明

  • 在重放过程中,日志文件中的所有中断都会被报告。这会对重放产生负面影响,因此在录制过程中应注意避免掉线。
  • 目前只能进行 "实时 "重放:与录制时的速度一样快。计划在未来扩展这一功能。
  • 时间戳为 0 的报文将被视为无效,不会被重播。

# EKF2 重放

这是为快速 EKF2 重放而对全系统重放进行的特殊化。

备注

飞行日志的记录和重放,包括 多个 EKF 实例 不支持。要启用 EKF 重放记录,必须设置参数以启用 单个 EKF 实例.

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

执行 EKF2 重放:

  • 记录原始日志。可选择设置 SDLOG_MODE1 以从启动时记录日志。

  • 除了 重放 环境变量,设置 重放模式ekf2:

    出口 重放模式=ekf2
    出口 重放=<;absolute_path_too_log.ulg>;
    
  • 使用 目标:

    生产 px4_sitl 无
    
  • 完成后,取消设置 重放重放模式.

    未设置 重放; 未设置 重放模式
    

# 为重放调整 EKF2 特定参数

首次安装 pyulog:

核心 安装 --用户 pyulog

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

ulog_params -i ";重新播放"; -d ' ' | grep -e '^EKF2 >; build/px4_sitl_default_replay/rootfs/replay_params.txt

根据需要调整这些参数,并在 replay_params_dynamic.txt 如果有必要。

# 幕后花絮

重放分为 3 个部分:

  • 重放模块会对重放产生负面影响,因此在录制过程中应注意避免掉线。
  • 目前只能进行 "实时 "重放:与录制速度一样快。

重放模块会读取日志,并以与记录时相同的速度发布信息。每条信息的时间戳都会添加一个恒定偏移量,以与当前系统时间保持一致(这也是所有其他时间戳都需要相对时间戳的原因)。命令 重放尝试应用参数 会在加载所有其他模块之前执行,并应用日志中的参数和用户设置的参数。然后作为最后一条命令、 重放尝试启动 将再次应用参数并开始实际重放。如果环境变量 重放 未设置。

如上所述,ORB 发布者规则允许选择重放系统的哪个部分。这些规则只针对 posix SITL 目标进行编译。

时间处理 仍然是一个 开放点需要实施。