仿真
在仿真机中,模拟器允许 PX4 飞行代码来控制计算机建模工具。你可以像与真实飞行器交互一样,使用 QGroundControl、机载外 API 或无线电控制器/游戏手柄与该虚拟飞行器进行交互。
TIP
仿真提供了一种快速、便捷且最重要的是 安全 的方式,可在将 PX4 代码应用于实际飞行之前对其更改进行测试。对于尚未拥有实际飞行器进行实验的用户来说,这也是开始使用 PX4 飞行的好方法。
PX4 支持 软件在环(SITL) 仿真和 硬件在环(HITL) 仿真。在 SITL 仿真中,飞行栈在计算机(可以是同一台计算机,也可以是同一网络中的另一台计算机)上运行;而 HITL 仿真则是在真实的飞行控制器板上使用仿真固件。
下一节将提供可用模拟器的相关信息以及如何进行设置。其他部分将提供关于模拟器工作原理的一般信息,使用模拟器时并不一定需要了解这些内容。
支持的仿真器
PX4 核心开发团队支持以下几种模拟器:
仿真器 | 描述 |
---|---|
Gazebo | 强烈推荐使用此模拟器。 Gazebo 取代了 Gazebo Classic,具有更先进的渲染、物理和传感器模型。从 Ubuntu Linux 22.04 开始,它是唯一可用的 Gazebo 版本。 这是一个强大的 3D 仿真环境,特别适合测试避障和计算机视觉功能。它还可用于 多工具仿真,并且通常与 ROS(一种用于自动控制的工具集)一起使用。 支持的飞行器: 四旋翼、标准垂直起降飞行器、固定翼飞机 |
Gazebo Classic | 强烈推荐使用此模拟器。 这是一个强大的 3D 仿真环境,特别适合测试避障和计算机视觉功能。它还可用于 多飞行器仿真,并且通常与 ROS(一种用于自动控制的工具集)一起使用。 支持的飞行器: 四旋翼(Iris)、六旋翼(Typhoon H480)、通用标准垂直起降飞行器(QuadPlane)、尾坐式飞行器、固定翼飞机、无人车、潜艇 |
此外,还有一些 社区支持的模拟器。
所有模拟器都使用 Simulator MAVLink API 与 PX4 进行通信,但使用模拟器时并不一定需要了解该 API。
仿真器 MAVLink API
除了 Gazebo 之外,所有模拟器都使用 Simulator MAVLink API 与 PX4 进行通信。该 API 定义了一组 MAVLink 消息,用于将模拟世界中的传感器数据提供给 PX4,并将飞行代码计算得到的电机和执行器值返回给模拟飞行器。下图展示了消息的流向:
INFO
PX4 的 SITL 版本使用 SimulatorMavlink.cpp 来处理这些消息,而处于 HIL 模式的硬件版本则使用 mavlink_receiver.cpp。在使用模拟时,所有电机/执行器都被卡停,但内部软件可以完全正常运行。
以下是这些消息的详细描述(具体细节请参考链接):
消息 | 方向 | 描述 |
---|---|---|
MAV_MODE:MAV_MODE_FLAG_HIL_ENABLED | 不可用 | 使用模拟时的模式标志。所有电机/执行器都被卡停,但内部软件可以完全正常运行。 |
HIL_ACTUATOR_CONTROLS | PX4 至 Sim | PX4 控制输出 (电机、执行器)。 |
HIL_SENSOR | Sim 至 PX4 | 在 NED 体框架中以 SI 单位模拟 IMU 读数。 |
HIL_GPS | Sim 至 PX4 | 模拟的 GPS RAW 传感器值。 |
HIL_OPTICAL_FLOW | Sim 至 PX4 | 来自流量传感器的模拟光流 (例如 PX4FLOW 或光学鼠标传感器)。 |
HIL_STATE_QUATERNION | Sim 至 PX4 | 包含实际的“仿真”无人机位置、姿态、速度等。这可以记录并与 px4 的分析和调试估计进行比较 (例如,检查估计器在噪声 (仿真) 传感器输入中的工作情况)。 |
HIL_RC_INPUTS_RAW | Sim 至 PX4 | 收到 RC 通道的 RAW 值。 |
PX4 直接使用 Gazebo API 与 Gazebo 进行交互,不需要使用 MAVLink。
默认 PX4 MAVLink UDP 端口
默认情况下,PX4 使用常用的 UDP 端口与地面控制站(如 QGroundControl)、机载外 API(如 MAVSDK、MAVROS)和模拟器 API(如 Gazebo)进行 MAVLink 通信。这些端口如下:
- PX4 的远程 UDP 端口 14550 用于与地面控制站通信。期望外接 APIs 监听此端口上的连接。QGroundControl 默认监听此端口。
- PX4 的远程 UDP 端口 14540 用于与机载外 API 通信。期望 GCS 将侦听此端口上的连接。
INFO
多飞行器仿真为每个实例使用单独的远程端口,从
14540
到14549
依次分配(额外的实例都使用端口14549
)。 - 模拟器的本地 TCP 端口 4560 用于与 PX4 通信。PX4 侦听此端口,仿真器应通过向该端口广播数据来启动通信。
INFO
地面控制站、机载外 API 和模拟器的端口由启动脚本指定。更多信息请参阅 系统启动。
SITL 仿真环境
下图展示了使用 MAVLink 的任何受支持模拟器(即除 Gazebo 之外的所有模拟器)的典型 SITL 仿真环境:
系统的不同部分通过 UDP 连接,可以在同一台计算机上运行,也可以在同一网络中的不同计算机上运行。
- PX4 使用特定于仿真的模块连接到模拟器的本地 TCP 端口 4560。然后,模拟器使用上述 Simulator MAVLink API 与 PX4 交换信息。SITL 和模拟器上的 PX4 可以在同一台计算机上运行,也可以在同一网络上的不同计算机上运行。
INFO
模拟器还可以使用 uxrce - dds 桥 (XRCE - DDS) 直接与 PX4 交互(即通过 UORB 主题 而不是 MAVLink)。Gazebo Classic 在 多飞行器仿真 中 可能 会使用这种方法。
- PX4 使用正常的 MAVLink 模块连接到地面站和外部开发人员 API(如 MAVSDK 或 ROS):
- 地面站监听 PX4 的远程 UDP 端口:
14550
- 外部开发人员 API 监听 PX4 的远程 UDP 端口:
14540
。对于多飞行器仿真,PX4 从14540
到14549
为每个实例依次分配一个单独的远程端口(额外的实例都使用端口14549
)。
- 地面站监听 PX4 的远程 UDP 端口:
- PX4 定义了一些 本地 UDP 端口(
14580
、18570
),这些端口有时在与在容器或虚拟机中运行的 PX4 进行网络连接时使用。不建议“一般”使用这些端口,并且它们可能会在未来发生变化。 - 可以使用串行连接通过 QGroundControl 连接 操纵杆/游戏手柄 硬件。
如果使用正常的构建系统 SITL make
配置目标(见下一节),则 SITL 和模拟器将在同一台计算机上启动,并且上述端口将自动配置。你可以在构建配置和初始化文件中配置额外的 MAVLink UDP 连接,并以其他方式修改仿真环境。
启动/构建 SITL 模拟
构建系统使得在 SITL 上构建和启动 PX4、启动模拟器并将它们连接起来变得非常容易。语法(简化后)如下:
make px4_sitl simulator[_vehicle-model]
其中,simulator
可以是 gz
(用于 Gazebo)、gazebo-classic
、jmavsim
或其他模拟器,vehicle-model
是该模拟器支持的特定飞行器类型(截至编写本文时,Gazebo 和 jMAVSim 仅支持多旋翼飞行器,而 Gazebo Classic 支持多种不同类型)。
以下是一些示例,每个模拟器的单独页面中还有更多示例:
# 使用 x500 多旋翼飞行器启动 Gazebo
make px4_sitl gz_x500
# 使用固定翼飞机启动 Gazebo Classic
make px4_sitl gazebo-classic_plane
# 使用 iris 多旋翼飞行器和光流传感器启动 Gazebo Classic
make px4_sitl gazebo-classic_iris_opt_flow
# 使用 iris 多旋翼飞行器(默认飞行器模型)启动 JMavSim
make px4_sitl jmavsim
# 启动 PX4 但不使用模拟器(即使用自己的“自定义”模拟器)
make px4_sitl none_iris
可以通过环境变量进一步配置仿真:
PX4_ESTIMATOR
:该变量用于配置使用的估计器。可能的选项有:ekf2
(默认)、lpe
(已弃用)。可以在运行仿真之前通过export PX4_ESTIMATOR=lpe
进行设置。
这里描述的语法是简化的,通过 make 还有许多其他选项可以配置,例如设置连接到 IDE 或调试器。更多信息请参阅:构建代码 > PX4 Make 构建目标。
以比实际时间更快的流速运行仿真
使用 jMAVSim 或 Gazebo Classic 时,SITL 可以比实时更快或更慢地运行。
速度因子通过环境变量 PX4_SIM_SPEED_FACTOR
设置。例如,要以两倍实时速度运行 jMAVSim 仿真,可以使用以下命令:
PX4_SIM_SPEED_FACTOR=2 make px4_sitl jmavsim
要以半实时速度运行:
PX4_SIM_SPEED_FACTOR=0.5 make px4_sitl jmavsim
可以使用 EXPORT
在当前会话的所有 SITL 运行中应用该因子:
export PX4_SIM_SPEED_FACTOR=2
make px4_sitl jmavsim
INFO
在某些情况下,IO 或 CPU 会限制你的机器能够达到的速度,此时仿真会“自动”减慢。功能强大的桌面机器通常可以以大约 6 - 10 倍的速度运行仿真,而笔记本电脑可以达到大约 3 - 4 倍的速度。
INFO
为避免 PX4 检测到数据链路超时,应根据仿真速率成比例地增加参数 COM_DL_LOSS_T 的值。例如,如果 COM_DL_LOSS_T
在实时情况下为 10,在 10 倍仿真速率下应增加到 100。
Lockstep Simulation
PX4 SITL 和模拟器(jMAVSim 或 Gazebo Classic)已设置为以 锁步 模式运行。这意味着 PX4 和模拟器会相互等待传感器和执行器消息,而不是以各自的速度运行。
INFO
锁步模式使得可以 比实时更快或更慢地运行仿真,并且还可以暂停仿真以便逐行调试代码。
锁步模式的步骤序列如下:
- 仿真器发送一个传感器消息 HIL_SENSOR,其中包含一个时间戳
time_usec
,以更新 PX4 的传感器状态和时间。 - PX4 接收该消息并进行一次状态估计、控制等操作,最终发送一个执行器消息 HIL_ACTUATOR_CONTROLS。
- 仿真器等待直到收到执行器/电机消息,然后模拟物理过程并计算下一个要发送给 PX4 的传感器消息。
系统开始时有一个“自由运行”阶段,在此期间仿真器发送包含时间的传感器消息,从而使 PX4 运行,直到它初始化并响应一个执行器消息。
Disable Lockstep Simulation
如果要将 SITL 与不支持此功能的模拟器一起使用,可以禁用锁步仿真。在这种情况下,模拟器和 PX4 使用主机系统时间,并且不会相互等待。
要在 PX4 中禁用锁步,请运行 make px4_sitl_default boardconfig
并设置位于工具链下的 BOARD_NOLOCKSTEP
“强制禁用锁步”符号。
要在 Gazebo 中禁用锁步,请编辑 模型 SDF 文件 并设置 <enable_lockstep>false</enable_lockstep>
。
要在 jMAVSim 中禁用锁步,请删除 sitl_run.sh 中的 -l
,或者确保以其他方式在启动 Java 二进制文件时不使用 -lockstep
标志。
启动脚本
脚本用于控制使用哪些参数设置或启动哪些模块。它们位于 ROMFS/px4fmu_common/init.d-posix 目录中,rcS
文件是主要入口点。更多信息请参阅 系统启动。
Simulating Failsafes and Sensor/Hardware Failure
模拟故障保护 解释了如何触发诸如 GPS 故障和电池耗尽等安全故障保护机制。
HITL 仿真环境
硬件在环仿真(HITL)模式下,标准的 PX4 固件在真实的硬件上运行。HITL 仿真环境的详细信息记录在:HITL 仿真。
操纵杆/手柄集成
QGroundControl 的桌面版本可以连接到 USB 操纵杆/游戏手柄,并通过 MAVLink 将其