# 全系统重播

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

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

# 先决条件

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

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

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

# 使用方法

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

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

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

  • build/px4_sitl_default_replay/tmp/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
    

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

  • 可选:在文件中设置参数重写 build/px4_sitl_default_replay/tmp/rootfs/replay_params.txt.该文件应包含 <param_name> <value>;就像

    ekf2_gb_noise 0.001
    

    默认情况下,日志文件中的所有参数都会被应用。如果某个参数在录制过程中发生了变化,那么在重放过程中也会适时进行更改。日志文件中的参数 replay_params.txt 将覆盖该值,日志文件中的更改将不会被应用。

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

  • 开始重播:

    生产 px4_sitl_default jmavsim
    

    这将自动打开日志文件,应用参数并开始重放。重放完成后,将进行报告并退出进程。然后就可以对新生成的日志文件进行分析了。 _重放 附加到其文件名中。

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

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

    未设置 重放
    

# 重要说明

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

# EKF2 重放

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

备注

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

它将自动创建 ORB 发布者规则,工作原理如下:

  • 可选择设置 SDLOG_MODE 设为 1 则从启动时开始记录日志
  • 记录日志
  • 重放
export replay_mode=ekf2 export replay=<abs_path_to_log.ulg> make px4_sitl none

您可以在出现类似输出后停止运行:

INFO [replay] 重放完成(已发布 9917 条信息,2.136 秒)

参数也可以调整。可以用以下方法从日志中提取参数(安装 pyulog 时使用 sudo pip install pyulog 第一):

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

然后根据需要编辑文件中的参数,并用以下命令重新启动重放程序 make px4_sitl none.这将创建一个新的日志文件。

生成日志的位置会打印出来,并附带如下信息:

INFO [logger] 已打开日志文件:rootfs/fs/microsd/log/2017-03-01/13_30_51_replayed.ulg

完成后,使用 取消设置重放;取消设置重放模式 退出重放模式。

# 幕后花絮

重放分为 3 个部分:

  • 重放模块
  • ORB 发布者规则
  • 时间处理

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

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

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