> For the complete documentation index, see [llms.txt](https://gaas.gitbook.io/guide/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gaas.gitbook.io/guide/case-study/zai-airsim-zhong-mo-ni-wu-ren-ji-dui-ke-ji-xun-jian.md).

# 在 AirSim 中模拟无人机对客机巡检

众所周知，航空飞行的安全极其重要，所以检修人员需要定期对客机进行检修。因为体积问题，人工操作很难看到飞机的上半部分，所以每次检修都会动用大量的人力物力去一点点看。从 17 年开始，空客就率先开始利用无人机对载人的客机进行检修，这样更加方便快速。无人机可以拍摄大量的客机照片，检修人员只要在电脑上就可以分析飞机的状态。

传统无人机也有自己的问题：一是无人机还是需要人去操作的，而人工操作无法保证安全性。毕竟手一抖无人机可能就撞到飞机了，很多无人机飞手是不愿意飞这个场景的。而客机对检修的要求又非常严格，每次最好都可以在同一个位置拍照。但人工操作无法保证这种精度。其次是传统无人机都极其依赖 GPS 做定位，而机库里是没有 GPS 的。所以无人机也很容易「炸机」。这两个问题导致了无人机巡检真飞机迟迟不能普及。

这就是为什么我们希望利用 GAAS 为有志于做自主飞行无人机的朋友提供无人机巡检真飞机的案例，让无人机在完全不需要 GPS 和飞手的操作下，进行飞机的巡检。

## 什么是 AirSim？

[AirSim](https://github.com/microsoft/AirSim) 是一个由微软开发的开源的仿真平台，基于 Unreal 引擎。相对于 Gazebo 来说，AirSim 的仿真环境更加真实。AirSim 支持基于PX4的 Hardware-In-The-Loop (HITL) 和 Software-In-The-Loop (SITL)。

> 像所有 Unreal 项目一样，AirSim 的项目也可以被打包出来，但是我不建议你在 Ubuntu 环境下这么做，因为在 Ubuntu 环境下 AirSim 使用 PX4 SITL 可能会出现崩溃的情况。我们也正在解决这个问题。
>
> 另外，Unreal 需要的硬盘空间很大（大约 69 GB），需要的硬件配置也很高，所以如果你不想在自己的电脑上安装一个如此巨大的软件，也可以使用 Gazebo ，可以省却很多适配的烦恼。

## 安装 Unreal 和 AirSim

Unreal 和 AirSim 都支持多个平台，你可以使用 [BashOnWindows](https://docs.microsoft.com/en-us/windows/wsl/install-win10)。但是由于 PX4 只支持 Linux 平台，为了方便使用 GAAS，我们还是使用 Linux 版 Unreal。&#x20;

1. 注册 [Epic Games](https://docs.unrealengine.com/en-US/Platforms/Linux/BeginnerLinuxDeveloper/SettingUpAnUnrealWorkflow/1/index.html) 账号，并关联自己的 GitHub 账号。
2. 编译 Unreal 4.22 ，可能会需要约 69 GB 的硬盘空间。

   ```bash
   git clone -b 4.22 https://github.com/EpicGames/UnrealEngine.git
   cd UnrealEngine
   ./Setup.sh
   ./GenerateProjectFiles.sh
   make
   ```

   > **注意**：AirSim 官方支持 Unreal 4.18，但是在本示例中所用到的 Unreal 布景只支持 Unreal 4.22 版本，而经过测试 AirSim 在 Unreal 4.22 版本下也可以使用，故我们选择了 Unreal 4.22 版本。
3. Clone 并编译 AirSim：

   ```bash
   git clone https://github.com/Microsoft/AirSim.git
   cd AirSim
   ./setup.sh
   ./build.sh
   ```
4. 在 Linux 下进入 Unreal 的目录，并运行 `UnrealEngine/Engine/Binaries/Linux/UE4Editor`。
5. 此时进入了选择项目的界面，在 AirSim 目录下的 `Unreal/Environments` 目录中，有一个名字叫 `Blocks` 预设的项目，但是在打开该项目之前请先把 `AirSim/Unreal/Enviroments/Plugins` 复制到 `AirSim/Unreal/Enviroments/Blocks` 中，然后在 Unreal 中打开项目。

   ![Blocks Project](https://s2.ax1x.com/2019/08/21/mUkyPP.png)

## How to launch PX4 SITL

在 AirSim 中模拟 PX4 控制无人机之前，我们应该首先安装并运行 PX4 SITL 仿真，通过此仿真，你可以使用 PX4 作为飞控来控制 AirSim 中的无人机。

1. 首先确保你已经成功安装了 PX4 的所需依赖。参考 [GAAS 的教程](https://gaas.gitbook.io/guide/)。
2. 获取 PX4 Firmware。**注意**：AirSim 需要 Firmware v1.8.2 版本。

   ```bash
   mkdir -p PX4
   cd PX4
   git clone https://github.com/PX4/Firmware.git
   cd Firmware
   git checkout v1.8.2
   ```
3. 编译并运行 SITL 模式：

   ```bash
   make posix_sitl_default  none_iris
   ```

   ![Start PX4 SITL](https://s2.ax1x.com/2019/08/21/mUF59K.png)

   > 你可以编辑 `(Firmware_Path)/posix-configs/SITL/init/ekf2/iris` 文件来设置飞机参数
4. 修改 [AirSim 设置](https://github.com/microsoft/AirSim/blob/master/docs/settings.md)，在 Linux 下，设置文件路径为 `~/Documents/AirSim/settings.json`。

   ```javascript
   {
    "SettingsVersion": 1.2,
    "SimMode": "Multirotor",
    "Vehicles": {
        "PX4": {
            "VehicleType": "PX4Multirotor",
            "UseSerial": false
        }
    }
   }
   ```
5. 在 Unreal 中点击 Play 按键，我们就打开了模拟器，你现在应该可以在地上看见一个无人机了。

&#x20;      <img src="/files/-LmsragSm7hh3cuH4gP_" alt="" data-size="original">&#x20;

> 按 `F1` 键可以查看快捷键，你也可以打开 FPS 显示随时查看 FPS。

6\. 下载 [QGroundControl](http://qgroundcontrol.com/)，并修改监听端口。

&#x20; ![Common Link](https://s2.ax1x.com/2019/08/21/mUAlQS.png) ![Common Link UDP](https://s2.ax1x.com/2019/08/21/mUA4yD.png)

7\. 这时便可以通过 QGC 来简单控制无人机了。

## 使用 GAAS 控制无人机

1. GAAS 通过 MAVROS 与 PX4 通信，所以如果想通过 GAAS 控制无人机，我们需要先启动 MAVROS 。安装 MAVROS 请参考 [GAAS 教程1](https://gaas.gitbook.io/guide/software-realization-build-your-own-autonomous-drone/wu-ren-ji-zi-dong-jia-shi-xi-lie-offboard-kong-zhi-yi-ji-gazebo-fang-zhen) 。推荐使用第二种方法安装 MAVROS。
2. PX4 通过 UDP 通信，所以我们需要修改以下 MAVROS 的 `fcu_url` 参数，首先新建一个 launch 文件。

   ```bash
   cd (MAVROS_PATH)/mavros/launch
   cp px4.launch px4_airsim.launch
   ```
3. 修改第 5 行 `<arg name="fcu_url" default="/dev/ttyACM0:57600" />` 的默认参数为`<arg name="fcu_url" default="udp://:14540@localhost:14557" />`。
4. 运行 MAVROS：

   ```bash
   roslaunch mavros px4_airsim.launch
   ```

这时我们使用 [GAAS教程一 ](https://gaas.gitbook.io/guide/software-realization-build-your-own-autonomous-drone/build-your-own-autonomous-drone-e01-offboard-control-and-gazebo-simulation)的 demo 便可以控制无人机。

```bash
cd (GAAS_PATH)/demo/tutorial_1/1_px4_mavros_offboard_controller
python px4_mavros_run.py
```

## 在 AirSim 中模拟无人机对客机的巡检

以往客机在机库中的巡检需要动用大量的人力物力，因为客机非常大，而且巡检要求非常严格，对于客机的各个部位都有拍摄需求。无人机可以帮助人们更方便的对客机进行巡检，但是巡检一般要在机库中进行，所以我们无法使用 GPS 传感器。

1. 首先，搭建机库布景，推荐从 Epic Games 上直接[购买资源](https://www.unrealengine.com/marketplace/zh-CN/item/09dd36e13fdf4b1592a4a09db2ec995c)（购买和下载必须在 Windows 上的 Epic Games 客户端进行）。然后对布景进行相应的修改，可以参考 [Unreal 的文档](https://docs.unrealengine.com/en-US/index.html)。由于版权问题，我们不能直接放出 Project 文件，如果你在搭建 Unreal Project 的时候遇到了问题，可以随时提 issue 或者在微信群里提问。 <img src="/files/-Lmssz2J05k7DPBrOZya" alt="" data-size="original">&#x20;

2. 关闭 GPS 。首先，先将 PX4 SITL iris 中的 `EKF2_AID_MASK` 参数改为 `vision position fusion`，对应值为 `8`。编辑 `(Firmware_Path)/posix-configs/SITL/init/ekf2/iris` 文件，将其中的 `EKF2_AID_MASK` 值改为 `8`，默认为 1 。                     <img src="/files/-LmsvUZwzY3-WcL2V7oi" alt="" data-size="original">&#x20;

3. 设置 AirSim 无人机参数，加入双目摄像头。我们在 GAAS 中提供了飞机的配置文件。

   ```python
   git pull origin master
   cp (GAAS_PATH)/simulator/AirSim/settings.json ~/Documents/AirSim/
   ```

   > 在这个配置文件中，GPS 的 `Enable` 选项已经被设置成 `false`，并且加入了双目摄像头。

4. 在完成前期的设置之后，开启 PX4 SITL 并且启动 MAVROS 之后，我们可以点击 Play 来运行模拟器了，但是当前由于没有 GPS 你是不能起飞的，接下来我们需要开启 SLAM 。

5. 我们在配置文件中设置了一组双目摄像头，基线为 12 cm 与 GAAS SLAM 默认设置相同，在运行 SLAM 之前，我们需要将模拟器中的摄像头发布到 ROS 中。首先安装 AirSim 的 Python 库，然后在 GAAS 的 `simulator/airsim` 目录中，运行 `drone_image_ros.py` 。

   `bash`

   `sudo pip install airSim                                                     cd (GAAS_PATH)/simulator/airsim python drone_image_ros.py`

6. 最后，参考 [GAAS 教程三](https://gaas.gitbook.io/guide/software-realization-build-your-own-autonomous-drone/build-your-own-autonomous-drone-part-3-using-slam-in-gps-denied-environment-for-position-estimation)，运行 SLAM 后，你就可以使用 AirSim 来模拟飞机的巡检了。

&#x20;    <img src="https://s2.ax1x.com/2019/08/21/mUEcng.png" alt="Airplane Fly" data-size="original">

> 注意：当你使用 SLAM 时，请进入 Unreal 的 `Edit >> Editor Preference` 中把 `Use Less CPU when in Background` 选项关闭。不然的话当 Unreal 处在后台运行的时候，会影响帧率。
