全系统回放
基于 ORB 消息,可以对系统的任意部分进行记录和回放。
回放对于根据真实数据测试不同参数值的影响、比较不同的估计器等情况非常有用。
系统必备组件
第一步是确定需要回放的一个或多个模块。然后,找出这些模块的所有输入,即订阅的 ORB 主题。对于全系统回放,这些输入包括所有硬件输入:传感器、遥控(RC)输入、MAVLink 命令和文件系统。
所有确定的主题都需要以全速率进行记录(参见 日志记录)。对于 ekf2
,默认记录的主题集已经满足这一要求。
重要的是,所有要回放的主题只能包含一个绝对时间戳,即自动生成的 timestamp
字段。如果存在更多时间戳,它们必须相对于主时间戳。例如,可参考 SensorCombined.msg。原因如下所述。
用法
- 首先,选择要回放的文件并构建目标(在 PX4 - Autopilot 目录内执行):
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 发布者规则。该文件定义了允许发布特定消息的模块。其格式如下:
restrict_topics: <主题1>, <主题2>, ..., <主题N>
module: <模块>
ignore_others: <true/false>
这意味着给定的主题列表只能由 <模块>
(即命令名称)发布。其他模块对这些主题的发布将被静默忽略。如果 ignore_others
为 true
,则 <模块>
对其他主题的发布也将被忽略。
对于回放,我们只希望 replay
模块能够发布之前确定的主题列表。因此,对于回放 ekf2
,规则文件应如下所示:
restrict_topics: sensor_combined, vehicle_gps_position, vehicle_land_detected
module: replay
ignore_others: true
这样,在回放时就不需要禁用通常发布这些主题的模块。
(可选) 设置参数覆盖(参见 下面的说明)。
(可选) 将
dataman
任务文件从 SD 卡复制到构建目录。只有在需要回放任务时才需要这样做。启动回放:
make px4_sitl_default jmavsim
这将自动打开日志文件,应用参数并开始回放。完成后,它将报告结果并退出。新生成的日志文件可以在 rootfs/fs/microsd/log
中找到,该目录按日期组织成子目录。回放后的日志文件名将带有 _replayed
后缀。
请注意,上述命令也会显示模拟器,但根据回放的内容,它可能无法显示实际发生的情况。仍然可以通过 QGroundControl(QGC)进行连接,例如在回放过程中查看姿态的变化。
- 最后,取消设置环境变量,以便再次使用正常的构建目标:
unset replay
覆盖原始日志中的参数
默认情况下,在回放过程中会应用原始日志文件中的所有参数。如果在记录过程中某个参数发生了变化,在回放时它将在正确的时间点进行相应更改。
在回放过程中,可以通过两种方式覆盖参数:固定 和 动态。当参数被覆盖时,日志中相应的参数更改在回放过程中将不会被应用。
- 固定参数覆盖 将从回放开始就覆盖参数。它们在文件
build/px4_sitl_default_replay/rootfs/replay_params.txt
中定义,每行的格式应为<参数名称> <值>
。例如:
EKF2_RNG_NOISE 0.1
- 动态参数覆盖 将在指定的时间更新参数值。这些参数仍将初始化为日志或固定覆盖中设置的值。参数更新事件应在
build/px4_sitl_default_replay/rootfs/replay_params_dynamic.txt
中定义,每行的格式为<参数名称> <值> <时间戳>
。时间戳是从日志开始的秒数。例如:
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 发布者规则,操作步骤如下:
在 EKF2 模式下,回放将自动创建上述的 ORB 发布者规则。
要进行 EKF2 回放:
记录原始日志。可以选择将
SDLOG_MODE
设置为1
以从启动时开始记录。除了设置
replay
环境变量外,还需将replay_mode
设置为ekf2
:
export replay_mode=ekf2
export replay=<日志文件的绝对路径.ulg>
- 使用
none
目标运行回放:
make px4_sitl none
- 完成后,取消设置
replay
和replay_mode
:
unset replay; unset replay_mode
为回放调整 EKF2 特定参数
首先安装 pyulog
:
pip install --user pyulog
将原始日志的参数提取到 replay_params.txt
:
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 目标进行编译。
时间处理:时间处理仍然是一个 待解决的问题,需要进行实现。