代码结构#

AirLib#

大部分代码位于 AirLib 中。这是一个独立的库,您可以使用任何 C++11 编译器编译它。

AirLib 包含以下组件

  1. 物理引擎: 这是一个仅包含头文件的物理引擎。它旨在快速且可扩展,以实现不同的载具。
  2. 传感器模型: 这是气压计、IMU、GPS 和磁力计的仅包含头文件的模型。
  3. 载具模型: 这是载具配置和模型的仅包含头文件的模型。目前我们已经实现了多旋翼飞行器模型和 PX4 四旋翼飞行器在 X 型配置下的配置。MultiRotorParams.hpp 中定义了几种不同的多旋翼飞行器模型,其中也包括六旋翼飞行器。
  4. API 相关文件: AirLib 的这一部分为我们的 API 提供了抽象基类,并为特定载具平台(如 MavLink)提供了具体实现。它还包含 RPC 客户端和服务器的类。

除了这些,所有常用的实用程序都定义在 common/ 子文件夹中。这里一个重要的文件是 AirSimSettings.hpp,如果要在 settings.json 中添加任何新字段,则应修改此文件。

AirSim 支持用于多旋翼飞行器的不同固件,例如它自己的 SimpleFlight、PX4 和 ArduPilot,与每个固件通信的文件都放置在 multirotor/firmwares 中各自的子文件夹中。

载具特定的 API 定义在 api/ 子文件夹中,以及所需的结构体。AirLib/src/ 包含 .cpp 文件,其中实现了 .hpp 文件中定义的各种方法。例如,MultirotorApiBase.cpp 包含多旋翼飞行器 API 的基本实现,如果需要,也可以在特定的固件文件中重写。

Unreal/Plugins/AirSim#

这是项目唯一依赖于虚幻引擎的部分。我们将其隔离,以便我们也可以为其他平台实现模拟器,就像为 Unity 所做的那样。虚幻引擎代码利用其基于 UObject 的类,包括蓝图。Source/ 文件夹包含 C++ 文件,而 Content/ 文件夹包含蓝图和资产。下面介绍一些主要组件

  1. SimMode_ 类:SimMode 类有助于实现许多不同的模式,例如纯计算机视觉模式,其中没有载具或特定载具的模拟(目前是汽车和多旋翼飞行器)。载具类位于 Vehicles/
  2. PawnSimApi:这是所有载具棋子可视化的基类。每个载具都有自己的子 (Multirotor|Car|ComputerVision)Pawn 类。
  3. UnrealSensors:包含距离和激光雷达传感器的实现。
  4. WorldSimApi:实现了大多数环境和与载具无关的 API

除了这些,PIPCamera 包含摄像机初始化,而 UnrealImageCaptureRenderRequest 包含图像渲染代码。AirBlueprintLib 包含许多用于与 UE4 引擎交互的实用程序和包装方法。

MavLinkCom#

这是我们团队成员 Chris Lovett 开发的库,它提供 C++ 类来与 MavLink 设备通信。这个库是独立的,可以在任何项目中使用。有关更多信息,请参阅 MavLinkCom

示例程序#

我们创建了一些示例程序来演示如何使用 API。请参阅 HelloDrone 和 DroneShell。DroneShell 演示了如何使用 UDP 连接到模拟器。模拟器正在运行一个服务器(类似于 DroneServer)。

Python客户端#

PythonClient 包含 Python API 包装文件和演示其用法的示例程序。

贡献#

请参阅 贡献指南

虚幻引擎框架#

下图说明了虚幻游戏引擎如何加载和调用 AirSim

AirSimConstruction