# 模拟

模拟器允许 PX4 飞行代码在模拟世界中控制计算机模型飞行器。您可以与该飞行器进行交互,就像与真实飞行器交互一样,使用 QGroundControl或无线电控制器/游戏板。

TIP

模拟是一种快速、简单,而且最重要的方法、 安全的 在尝试在真实世界中飞行之前,它是测试 PX4 代码变化的一种方法。当您还没有飞行器进行实验时,这也是开始使用 PX4 飞行的好方法。

PX4 同时支持 循环软件(SITL) 模拟,飞行算法池在计算机(同一台计算机或同一网络上的另一台计算机)上运行,并且 循环硬件(HITL) 使用真实飞行控制器板上的模拟固件进行模拟。

下一节将介绍可用模拟器的信息以及如何设置模拟器。其他章节提供了有关模拟器如何工作的一般信息,不需要 使用 模拟器。

# 支持的模拟器

下列模拟器可与 PX4 配合使用,进行 HITL 和/或 SITL 模拟。

模拟器 说明
仿真场景Gazebo

强烈推荐使用该模拟器。

功能强大的三轴模拟环境,特别适合测试物体回避和计算机视觉。它还可用于 多载具模拟 并通常与 ROS这是一套用于自动控制载具的工具。

支持的载具: 四 (光圈独奏, Hex (Typhoon H480)、 通用四三角洲 VTOL, 尾随者、飞机、UGV无人车、潜水艇

FlightGear

一种模拟器,可提供逼真的物理和视觉模拟。特别是,它可以模拟多种天气状况,包括雷暴、雪、雨和冰雹,还可以模拟热气流和不同类型的大气流动。 多车模拟 还支持

支持的载具: 飞机、自动扶梯、漫游车

JSBSim

提供先进飞行动力学模型的模拟器。可用于根据风洞数据建立逼真的飞行动力学模型。

支持的载具: 平面、四边形、六边形

jMAVSim 一款简单的多旋翼模拟器,可让您飞行 直升机 型载具在模拟世界中穿梭。

它易于设置,可用于测试载具是否能够起飞、飞行、着陆,以及对各种故障条件(如 GPS 故障)做出适当响应。它还可用于 多载具模拟.

支持的载具: 四边形

空中模拟

一个跨平台模拟器,提供物理和视觉上逼真的模拟。该模拟器耗费大量资源,需要比其他模拟器更强大的计算机。

支持的载具: 光圈(多旋翼机型和 X 配置中 PX4 四旋翼机的配置)。

硬件仿真 (SIH)

HITL 的替代方案,可直接在硬件自动驾驶仪上进行硬实时模拟。

支持的载具: 四边形

有关如何设置和使用模拟器的说明,请参阅上文链接的主题。


本专题的其余部分是对模拟基础架构如何工作的一般性描述。不要求 使用 模拟器。

所有模拟器都使用模拟器 MAVLink API 与 PX4 通信。该应用程序接口定义了一组 MAVLink 消息,用于从模拟世界向 PX4 提供传感器数据,并从将应用于模拟飞行器的飞行代码返回电机和致动器数值。下图显示了消息流程。

模拟器 MAVLink API

备注

PX4 的 SITL 版本使用 simulator_mavlink.cpp (打开新窗口) 来处理这些信息,而 HIL 模式下的硬件构建则使用 mavlink_receiver.cpp (打开新窗口).来自模拟器的传感器数据被写入 PX4 uORB 主题。所有电机/执行器均被封锁,但内部软件完全正常运行。

这些信息描述如下(具体细节见链接)。

留言 方向 说明
mav_mode:mav_mode_flag_hil_enabled (打开新窗口) NA 使用模拟时的模式标志。所有电机/执行器均被封锁,但内部软件可完全运行。
控制 (打开新窗口) PX4 转模拟信号 PX4 控制输出(连接电机、执行器)。
HIL_SENSOR (打开新窗口) 模拟至 PX4 在 NED 车身框架内以 SI 单位模拟的 IMU 读数。
HIL_GPS (打开新窗口) 模拟至 PX4 模拟的 GPS RAW 传感器值。
hil_optical_flow (打开新窗口) 模拟至 PX4 来自流量传感器(如 PX4FLOW 或光学鼠标传感器)的模拟光流
hil_state_quaternion (打开新窗口) 模拟至 PX4 包含载具的实际位置、姿态、速度等。可将其记录下来,并与 PX4 的估计值进行比较,以便进行分析和调试(例如,检查估计值在噪声(模拟)传感器输入情况下的工作情况)。
hil_rc_inputs_raw (打开新窗口) 模拟至 PX4 接收到的 RC 信道的 RAW 值。

默认情况下,PX4 使用常用的 UDP 端口与地面控制站进行 MAVLink 通信(例如 QGroundControl)、机外 API(如 MAVSDK、MAVROS)和模拟器 API(如 Gazebo)。这些端口包括

  • PX4 的远程 UDP 端口 14550 用于与地面控制站通信。地面控制站应监听该端口的连接。 QGroundControl 默认情况下监听该端口。
  • PX4 的远程 UDP 端口 14540 用于与板外 API 通信。机外 API 应监听此端口上的连接。

    备注

    多载具模拟为每个实例使用一个单独的远程端口,从 1454014549 (附加实例均使用端口 14549).

  • 模拟器的本地 TCP 端口 4560 用于与 PX4 通信。PX4 监听该端口,模拟器应通过向该端口广播数据来启动通信。

备注

GCS 和机外 API 的端口在配置文件中设置,而模拟器广播端口则硬编码在模拟 MAVLink 模块中。

# SITL 模拟环境

下图显示了任何支持的模拟器的典型 SITL 模拟环境。

PX4 SITL 概览

系统的不同部分通过 UDP 连接,可以在同一台计算机上运行,也可以在同一网络的另一台计算机上运行。

  • PX4 使用模拟专用模块连接模拟器的本地 TCP 端口 4560。然后,模拟器使用 模拟器 MAVLink API 如上所述。SITL 上的 PX4 和模拟器可以在同一台计算机上运行,也可以在同一网络的不同计算机上运行。

    备注

    模拟器还可以使用 微型 RTPS 桥接器 (PX4-FastRTPS 网桥)直接与 PX4 相互作用(即通过 对外关系与合作部门的主题 而不是 MAVLink)。这种方法 可以 用过 仿真场景Gazebo多车模拟.

  • PX4 使用普通 MAVLink 模块连接地面站和外部开发人员应用程序接口(如 MAVSDK 或 ROS)。
    • 地面站监听 PX4 的远程 UDP 端口: 14550
    • 外部开发人员应用程序接口会监听 PX4 的远程 UDP 端口: 14540.对于多载具模拟,PX4 会按顺序为每个实例分配一个单独的远程端口。 1454014549 (附加实例均使用端口 14549).
  • PX4 定义了一系列 当地 UDP 端口 (14580,18570),有时与在容器或虚拟机中运行的 PX4 联网时会用到。不建议在一般情况下使用,将来可能会更改。
  • 串行连接可用于连接 操纵杆/游戏板 硬件通过 QGroundControl.

如果使用正常的构建系统 SITL 生产 配置目标(见下一节),则 SITL 和模拟器将在同一台计算机上启动,并自动配置上述端口。您可以在构建配置和初始化文件中配置额外的 MAVLink UDP 连接并修改模拟环境。

# 启动/构建 SITL 仿真

通过构建系统,可以非常容易地在 SITL 上构建和启动 PX4,启动模拟器,并将它们连接起来。语法(简化)如下

使 px4_sitl 模拟器[_载具模型]

其中 模拟器仿真场景Gazebo, jmavsim 或其他模拟器,而 vehicle-model 是该模拟器支持的特定载具类型 (jMAVSim 只支持多旋翼飞行器,而 仿真场景Gazebo 支持多种不同类型)。

以下是一些示例,每个模拟器的单个页面中还有更多示例:

# 用飞机启动仿真场景Gazebo
生产 px4_sitl 仿真场景Gazebo_飞机
# 使用虹膜和光流启动 Gazebo
生产 px4_sitl gazebo_iris_opt_flow
# 使用光圈(默认载具模型)启动 JMavSim
生产 px4_sitl jmavsim
# 在没有模拟器的情况下启动 PX4(即使用自己的自定义模拟器)
生产 px4_sitl none_iris

可通过环境变量对模拟进行进一步配置:

  • PX4_ESTIMATOR:该变量用于配置使用哪种估计器。可能的选项有 ekf2 (默认)、 lpe (已弃用)。可以通过 export PX4_ESTIMATOR=lpe 然后再运行模拟。

这里描述的语法已经简化,您还可以通过 生产 - 例如,设置您希望连接到集成开发环境或调试器。更多信息,请参阅 构建代码 > PX4 制作构建目标.

# 运行模拟比实时更快

使用 jMAVSim 或 Gazebo 时,SITL 的运行速度可快于或慢于实时速度。

速度因子通过环境变量 px4_sim_speed_factor.例如,以 2 倍于实时速度运行 jMAVSim 仿真:

PX4_SIM_SPEED_FACTOR=2 make px4_sitl jmavsim

半实时运行:

PX4_SIM_SPEED_FACTOR=0.5 make px4_sitl jmavsim

您可以将该因子应用于当前会话中的所有 SITL 运行,方法是 出口:

export PX4_SIM_SPEED_FACTOR=2 make px4_sitl jmavsim

备注

在某些情况下,IO 或 CPU 会限制机器可能达到的速度,因此速度会自动减慢。功能强大的台式机通常能以大约 6-10 倍的速度运行模拟,而笔记本电脑的运行速度大约为 3-4 倍。

备注

为避免 PX4 检测到数据链路超时,请增加参数 "PX4 "的值。 COM_DL_LOSS_T 与模拟速率成正比。例如,如果 COM_DL_LOSS_T 实时时为 10,模拟速率增加 10 倍后为 100。

# 锁步模拟

PX4 SITL 和模拟器(jMAVSim 或 Gazebo)已设置为在以下环境中运行 步调一致.这意味着 PX4 和模拟器会互相等待传感器和执行器信息,而不是以各自的速度运行。

备注

Lockstep 可以 比实时更快或更慢地运行模拟还可以暂停播放,以便逐步浏览代码。

锁定步进的步骤顺序为

  1. 模拟发送传感器信息 HIL_SENSOR (打开新窗口) 包括时间戳 时间 来更新 PX4 的传感器状态和时间。
  2. PX4 接收到该信息后进行一次状态估计、控制等迭代,并最终发送一条执行器信息 控制 (打开新窗口).
  3. 模拟等待,直到收到执行器/电机信息,然后模拟物理过程并计算下一个传感器信息,再次发送给 PX4。

系统开始时会有一个自由运行期,在这段时间内,模拟器会发送包括时间在内的传感器信息,并运行 PX4,直到它完成初始化并响应执行器信息。

# 禁用锁步模拟

例如,如果 SITL 要与不支持该功能的模拟器一起使用,则可以禁用锁步模拟。在这种情况下,模拟器和 PX4 将使用主机系统时间,而不会相互等待。

要在 PX4 中禁用锁步功能,请使用 set(ENABLE_LOCKSTEP_SCHEDULER no)SITL 电路板配置 (打开新窗口).

要在 Gazebo 中禁用锁步功能,请编辑 模型 SDF 文件 (打开新窗口) 并设置 <enable_lockstep>false</enable_lockstep>; (或为 Iris 编辑 xacro 文件 (打开新窗口).

要禁用 jMAVSim 中的锁步功能,请移除 -ljmavsim_run.sh (打开新窗口)或确保在启动 java 二进制程序时不使用 -锁步 旗子

# 启动脚本

脚本用于控制使用哪些参数设置或启动哪些模块。它们位于 ROMFS/px4fmu_common/init.d-posix (打开新窗口) 目录下的 rcS 文件是主要入口。参见 系统启动 了解更多信息。

# 模拟故障保险和传感器/硬件故障

模拟故障保险 解释了如何触发 GPS 故障和电池耗尽等安全故障。

# HITL 模拟环境

通过硬件在环 (HITL) 仿真,可在真实硬件上运行正常的 PX4 固件。有关 HITL 仿真环境的文档,请参阅:HITL: HITL 模拟.

# 操纵杆/游戏板集成

QGroundControl 台式机版本可连接 USB 操纵杆/游戏手柄,并通过 MAVLink 向 PX4 发送移动指令和按键。这对 SITL 和 HITL 模拟都有效,可让您直接控制模拟飞行器。如果您没有操纵杆,也可以使用 QGroundControl 的屏幕虚拟拇指杆来控制飞行器。

有关设置信息,请参阅 QGroundControl 用户指南:

# 相机模拟

PX4 支持从以下设备中捕捉静态图像和视频 仿真场景Gazebo 模拟环境。可以按照以下说明启用/设置该功能 仿真场景Gazebo > 视频流.

模拟摄像机是一个 gazebo 插件,它实现了 MAVLink 摄像机协议 (打开新窗口).PX4 可通过以下方式与该相机连接/集成 一模一样 就像使用任何其他 MAVLink 摄像机一样:

  1. TRIG_INTERFACE 必须设置为 3 配置相机触发器驱动程序,以便与 MAVLink 相机配合使用

    TIP

    在这种模式下,驱动程序只需发送 摄像机触发器 (打开新窗口) 信息。更多信息,请参阅 照相机.

  2. PX4 必须在 GCS 和(模拟器)MAVLink 摄像机之间转发所有摄像机命令。您可以通过启动 MAVLink-f 标志,为新连接指定 UDP 端口。

    mavlink start -u 14558 -o 14530 -r 4000 -f -m camera
    

    备注

    转发的信息不仅仅是摄像机的 MAVLink 信息,但摄像机会忽略那些它认为无关的信息。

其他模拟器也可以采用同样的方法来实现摄像头支持。

# 在远程服务器上运行模拟

可以在一台计算机上运行模拟器,并从同一网络(或具有适当路由的其他网络)上的另一台计算机访问模拟器。例如,如果要测试在真实配套计算机硬件上运行的无人机应用程序与模拟飞行器的对比情况,这可能会很有用。

由于 PX4 默认不将数据包路由到外部接口(以避免网络垃圾和不同模拟之间的相互干扰),因此开箱即无法使用。相反,它会在内部将流量路由到本地主机("localhost")。

在外部接口上提供 UDP 数据包有以下几种方法。

mavlink-router (打开新窗口) 可用于将数据包从本地主机路由到外部接口。

要在一台计算机上运行的 SITL(通过 UDP 端口 14550 向 localhost 发送 MAVLink 流量)和另一台计算机上运行的 QGC(例如地址为 10.73.41.30) 你可以

  • 开始 mavlink-router 使用以下命令:
    mavlink-routerd -e 10.73.41.30:14550 127.0.0.1:14550
    
  • 使用 mavlink-router conf 文件。
    [UdpEndpoint QGC] 模式 = 正常 地址 = 10.73.41.30 端口 = 14550 [UdpEndpoint SIM] 模式 = 窃听 地址 = 127.0.0.1 端口 = 14550
    

备注

更多信息 mavlink-router 可以找到 这里 (打开新窗口).

# 启用 UDP 广播

mavlink 模块 前往 本地主机 默认情况下是这样,但您可以使用它的 -p 选项。然后,网络上的任何远程计算机都可以通过监听相应的端口(例如,14550 端口为 QGroundControl).

备注

当网络上只有一个模拟运行时,UDP 广播提供了一种建立连接的简单方法。如果网络上有多个模拟在运行,请不要使用这种方法(您可以使用 发布到特定地址).

这应在适当的配置文件中完成,其中 启动 被调用。例如 /ROMFS/px4fmu_common/init.d-posix/rcS (打开新窗口).

# 启用流媒体至特定地址

mavlink 模块 前往 本地主机 默认情况下,您可以使用它的 -t 选项。然后,指定的远程计算机就可以通过监听相应的端口(例如,14550 用于 QGroundControl).

这应该在各种配置文件中完成,其中 启动 被调用。例如 /ROMFS/px4fmu_common/init.d-posix/rcS (打开新窗口).

# SSH 隧道技术

SSH 隧道是一种灵活的选择,因为模拟计算机和使用它的系统不必在同一个网络上。

备注

同样,您也可以使用 VPN 为外部接口(同一网络或其他网络)提供隧道。

创建隧道的一种方法是使用 SSH 隧道选项。隧道本身可以通过运行以下命令创建 本地主机其中 远程.本地 是远程计算机的名称:

ssh -C -fR 14551:localhost:14551 remote.local

UDP 数据包需要转换为 TCP 数据包,以便通过 SSH 路由。数据包 网猫 (打开新窗口) 实用程序可在隧道两端使用--首先将数据包从 UDP 转换为 TCP,然后在另一端再转换回 UDP。

TIP

在执行 网猫.

QGroundControl 在计算机上,可以通过运行以下命令来实现 UDP 数据包转换:

mkfifo /tmp/tcp2udp netcat -lvp 14551 < /tmp/tcp2udp | netcat -u localhost 14550 > /tmp/tcp2udp

在 SSH 通道的模拟器一侧,命令为

mkfifo /tmp/udp2tcp netcat -lvup 14550 < /tmp/udp2tcp | netcat localhost 14551 > /tmp/udp2tcp

端口号 14550 对连接 QGroundControl 或其他 GCS 有效,但对其他端点(如开发人员 API 等)应进行调整。

理论上,隧道可以无限期运行,但 网猫 如果出现问题,可能需要重新启动连接。

QGC_remote_connect.bash (打开新窗口) 脚本可在 QGC 计算机上运行,以自动设置/运行上述说明。模拟必须已经在远程服务器上运行,而且您必须能够通过 SSH 进入该服务器。