# 无人机自动驾驶软件系列 E02 : 通过无人机机载摄像头构建建筑物 3D 模型

我们建议开发者使用镜像来安装 GAAS，这样可以节省很多的时间和精力：

{% content-ref url="../handy-tools/gaas-v0.7-release-jing-xiang-x86" %}
[gaas-v0.7-release-jing-xiang-x86](https://gaas.gitbook.io/guide/handy-tools/gaas-v0.7-release-jing-xiang-x86)
{% endcontent-ref %}

我们建议开发者使用镜像来安装 GAAS，这样可以节省很多的时间和精力：上一讲里我们介绍了如何通过 MAVROS 以及 OFFBOARD 模式在 Gazebo 模拟器中控制无人机飞行。本讲中，我们会讲解如何通过上一课中用到的 API 以及本课提供的建模网站(完全免费) 来实现这一任务。

{% hint style="info" %}
本教程在虚拟机环境下（VMWare，VirtualBox等）无法完成。
{% endhint %}

实现这一任务包括一下5个步骤：

1. 启动 Gazebo 模拟器；
2. 起飞无人机并开始录制一个 rosbag;
3. 控制无人机围绕建筑物绕圆周飞行一圈；
4. 停止 rosbag 录制并使用提供的脚本提取图片；
5. 使用提供的网站构建模型（构建模型所需环境配置过于复杂，之后的教程会详细讲解）。

前两步比较直接也很简单，对于第三步和第四步，我们会提供一个 python 脚本来辅助你来完成，但是实现并不是最好的。对于第五步，我们会在最后一部分讲解如何使用提供的网站来实现模型构建。

如果你想控制实机飞行并且构造一个实际环境的 3D 模型:

1. 使用遥控器控制无人机起飞 或者通过提供的 Python API 控制无人机起飞（因安全问题，暂时不推荐）;
2. 开始录制 Rosbag;
3. 控制无人机围绕建筑物飞行;
4. 将无人机降落然后处理 Rosbag;
5. 将图片上传到提供的网站上建模。

接下来我们将从头开始讲解在 Gazebo 模拟器中构建模型，最终得到的结果如下图所示。

![Fig 1, 3D 模型](https://1955112758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYUhlGdK9Y1iLhupMFC%2F-LanjKPKxijJQE06xiFc%2F-LanoV1j60jxeWS0Y124%2Ft2-sfm-1.png?alt=media\&token=cf2d9204-fa44-45bf-90f8-dce95148bd86)

![](https://1955112758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYUhlGdK9Y1iLhupMFC%2F-LgaYGT7xNerBUpDSdtg%2F-LgaYY-BOQcIXA0TxxjC%2FWechatIMG16845.jpeg?alt=media\&token=2238e2ed-e58a-4eb0-be59-2bd7c6428806)

{% hint style="info" %}
运行 Gazebo 时，如果一切正常但出现以上报错信息，该报错信息并不会影响 Gazebo 运行，可以继续进行到下一步。

如果您知道如何解决以上报错，欢迎在 GAAS GitHub 页面提交 PR，帮助我们减少不必要的报错信息。
{% endhint %}

## 更新环境

开始前，记得更新 GAAS:

```
# 改变路径到 GAAS 所在路径，使用 git pull 更新 GAAS
cd (GAAS_PATH)
git pull origin master
```

接下来，将 Gazebo 仿真用到的文件拷贝到 PX4 文件所在目录中:

```
cp -r (GAAS_PATH)/simulator/launch/* ~/catkin_ws/src/Firmware/launch/
cp -r (GAAS_PATH)/simulator/models/* ~/catkin_ws/src/Firmware/Tools/sitl_gazebo/models/
cp -r (GAAS_PATH)/simulator/worlds/* ~/catkin_ws/src/Firmware/Tools/sitl_gazebo/worlds/
cp -r (GAAS_PATH)/simulator/posix-config/* ~/catkin_ws/src/Firmware/posix-configs/SITL/init/ekf2/
```

完成后，你可以继续到下一步.

## 启动仿真

如果你一步一步的做完了第一讲并且更新了本地环境，你可以直接执行下列命令来启动 Gazebo 仿真环境:

```
roslaunch px4 sfm.launch
```

上述命令会一同启动 MAVROS 以及 Gazebo 仿真，启动后，你会发现你的无人机以及一栋房子出现在模拟器环境中，这栋房子将会是你建模的目标。

![Fig 2, Gazebo 仿真环境](https://1955112758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYUhlGdK9Y1iLhupMFC%2F-LY_oOr_H9PKTgPAxFxP%2F-LY_oqb5hLsKLyHAlu87%2Ft1-3d-house.png?alt=media\&token=5904a8b8-26d3-455e-9828-6571fc669b3c)

{% hint style="info" %}
如果执行命令后Gazebo窗口不能正常开启且terminal中提示 "Getting models from ...",  你可以下载 <https://bitbucket.org/osrf/gazebo_models/get/e6d645674e8a.zip> 并将解压后的文件分别复制到 /home/your-user-name/.gazebo/models

&#x20;(如果没有 models 文件夹需要手动新建)。

如下图所示，解压后的模型文件必须直接拷贝到指定位置，并不是以一个大文件夹的形式拷贝到该目录下。

如果上面这个链接无法下载的话（有用户反馈 18.04 无法下载），可以通过这里下载：<https://drive.google.com/open?id=1dvkt3PKjUs4pXdo-5N3IMo11tk9ODVfJ>

```
```

{% endhint %}

![](https://1955112758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYUhlGdK9Y1iLhupMFC%2F-LgbDW9tvl9CdnpcJA7h%2F-LgbDfAHeYceGel6YnSn%2FScreen%20Shot%202019-06-05%20at%206.36.36%20PM.png?alt=media\&token=aa226d50-19a0-4f9a-b87c-5a7aa5bc3e71)

在你进行下一步之前，记得通过如下命令检查 MAVROS 的连接情况:

```
# 确保 "connected" 为 "True"
rostopic echo /mavros/state
```

当你启动仿真后，IMU，气压计，摄像头图像信息以及 GPS 等传感器信息会通过 MAVROS 发布出来; 你可以通过如下命令来查看可用的 ROS 主题:

```
rostopic list
```

通过 MAVROS 发布出来的主题包括:

```
/gi/simulation/left/image_raw
/gi/simulation/right/image_raw
/mavros/imu/diff_pressure
/mavros/imu/mag
...
```

而我们用来构建 3D 模型的主题只是左(或者右)摄像头信息:

```
/gi/simulation/left/image_raw
```

你可以通过 Rviz 来查看发布出来的摄像头图片:

```
rviz
```

在 Terminal 中输入 rviz 后你可以看到一个如下的窗口:

![Fig 2, RVIZ](https://1955112758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYUhlGdK9Y1iLhupMFC%2F-L_D0Yt89ezIuUVfaW9s%2F-L_D3IECtka4b_rsbbLb%2Ft2-f1-rviz.png?alt=media\&token=ef506690-2b1f-493d-b940-c3f5c60f0bb8)

在窗口左下角，选择 “Add”->“by topic”->”/gi/simulation/left/image\_raw“， 之后你可以看到当前的左目摄像头信息。我们接下来会在 Gazebo 环境中构建前方建筑物的 3D 模型。

![Fig 3, 选择图像topic](https://1955112758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYUhlGdK9Y1iLhupMFC%2F-LawvWzztMcoDNKRI-Hr%2F-LawvcLsU7GdaugvT2E2%2Ft2-rviz-1.png?alt=media\&token=3419900e-3439-4efa-9eb3-1937d26be5fe)

![Fig 4, rviz窗口中的图像展示](https://1955112758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYUhlGdK9Y1iLhupMFC%2F-LawvWzztMcoDNKRI-Hr%2F-Laww1B99cOznxjvzsug%2Ft2-rviz-2.png?alt=media\&token=1ade77b2-f353-4db2-aec2-c919076e872a)

## 录制一个 Rosbag

若要生成一个 3D 模型，我们需要围绕建筑物或者环境的一组图片，而这些图片需要是从建筑物不同角度拍摄的连续图片（连续图片间需要有关于建筑物的共视区) 。Rosbag 类似于一个盒子，可以将ROS/MAVROS 发布出来的消息保存在内, 所以 Rosbag 非常适合保存摄像机发布出来的图像信息。

因为我们将使用左目摄像头，我们只需要订阅并存储左目摄像头的信息:

```
rosbag record /gi/simulation/left/image_raw -O sfm.bag
```

接下来，起飞无人机:

```
python  (GAAS_PATH)/demo/tutorial_2/2_Struction_from_Motion/px4_mavros_run.py
```

无人机会起飞到 3 米高左右。接下来我们可以控制无人机围绕建筑物飞行，同时我们需要注意在控制无人机飞行的过程中，我们需要保持无人机的头部，也就是摄像头正前指向建筑物,  为此我们提供了一个脚本控制无人机围绕圆形飞行:

```
python (GAAS_PATH)/demo/tutorial_2/fly_circle.py
```

无人机将会围绕建筑物飞行一圈，最终它将会降落在起飞点的地面上。

在录制 bag 过程中，若要构建一个比较好的模型，我们需要时刻注意一下几点:

1. **围绕建筑物拍摄的连续图片需要有一定视野上的重叠;**
2. **避免幅度较大的 Yaw 运动;**
3. **尽量将建筑物的表面都拍摄下来。**

无人机降落后，停止 Rosbag 的录制，你会得到一个名为 “sfm.bag” 的 Rosbag， 接下来，我们将把 Rosbag 处理成一系列图片。

## 处理 Rosbag

为了构建 3D 模型，我们需要将 rosbag 中的图片信息提取出来，你可以使用 tutorial\_2 提供的 python 脚本来实现这个功能。

```
python bag2image.py --bag (PATH-TO-YOUR-BAG) --output_path (IMAGE-OUTPUT-FOLDER) --image_topic /gi/simulation/left/image_raw
```

完成上一步后，你会将所有的图片从 rosbag 提取出来并且存储到本地文件夹内。

{% hint style="info" %}
请控制上传图片的数量；小场景建模的图片通常不超过 100 张（你可能需要进行图片筛选）。确保每张图片有 “重叠”，并尽量覆盖物体全部。
{% endhint %}

## 构造模型

3D 建模的环境配置比较复杂，为此我们提供了一个网站来帮助建模。通过网站即可构建模型，你所需要做的只是将图片上传到如下网站：

```
aviation.giai.tech
```

![Fig 5, 3D 建模网站首页](https://1955112758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYUhlGdK9Y1iLhupMFC%2F-LanjKPKxijJQE06xiFc%2F-LanuG7gw_uz7FRBszDH%2Ft2-web-1.png?alt=media\&token=aa304ef0-d4d0-4580-8fda-0756094d1c14)

点击 “构建自己的模型” 后，点击  “Add FIles”  选择物体的图片（不支持批量上传），之后点击提交。

下图是真实世界的一个使用案例，通过 76 张图片构建出来的的3D模型。

![Fig6, 吉林大学南岭校区，飞手控制无人机飞行并采集76张图片后的建模结果](https://1955112758-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LYUhlGdK9Y1iLhupMFC%2F-LanjKPKxijJQE06xiFc%2F-LanpuhDf3UxT0q4F930%2Ft2-examples-1.png?alt=media\&token=6d553a2c-0e2a-4866-a16f-eb9d8f6a49fc)

将图片上传到网站后，因为计算能力限制，您需要等待一段时候后建模才可以完成。建模完成后，你会收到一封邮件，根据邮件提示即可得到模型。
