# 全系统重播
基于 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 重放而对全系统重放进行的特殊化。
它将自动创建 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 目标进行编译。
时间处理 仍然是一个 开放点需要实施。