# 全系统重播
可以根据 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 重放而对全系统重放进行的特殊化。
在 EKF2 模式下,重放将自动创建上述 ORB 发布者规则。
执行 EKF2 重放:
记录原始日志。可选择设置
SDLOG_MODE
至1
以从启动时记录日志。除了
重放
环境变量,设置重放模式
至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 目标进行编译。
时间处理 仍然是一个 开放点需要实施。