一、AirSim概述
1.1什么是AirSim
AirSim是一款基于虚幻引擎构建的无人机、汽车等模拟器(我们现在还有一个实验性的Unity版本)。它是开源的,跨平台的,并支持使用流行的飞行控制器(如PX4和ArduPilot)进行软件在环仿真,并使用PX4进行硬件在环模拟,以进行物理和视觉上逼真的模拟。它是作为虚幻插件开发的,可以简单地放入任何虚幻环境中。
AirSim 是作为虚幻游戏引擎的插件而存在的,适配基于虚幻引擎搭建的环境。目前AirSim也有一个实验版本的插件适用于Unity引擎。得益于游戏引擎优秀的视觉渲染效果,AirSim 仿真平台在具备物理仿真的同时也具备了逼真的视觉仿真效果,这是其一大亮点,非常适用于进行基于深度学习等视觉AI仿真验证。AirSim提供了很多API接口,用于读取数据、控制车辆、控制天气等,AirSim的开发者希望这个平台能够帮助研究人员用于深度学习、计算机视觉、强化学习等人工智能相关的研究,适用于无人机、无人驾驶、机器人等领域的应用。
AirSim的官方网站是:AirSim官网文档,在其官方网站中有更详细的介绍和说明文档。
二、AirSim安装
2.1 软件版本环境
- AirSim版本:v1.8.1(截止2023年1月)
- 虚幻引擎版本:4.27.2(依旧还是UE4)
- Visual Studio版本:Visual Studio Community 2022
- Python版本:Python3.7
- Windows版本:Win10
2.2 安装Visual Studio集成开发环境
安装地址:VisualStudio2022安装地址
安装Visual Studio 2022确保在安装VS2022的时候选择C++和Windows10 SDK 10.0.19041的桌面开发,并在“单个组件”选项卡下选择最新的.NET Framework SDK。
为了保险起见,在这里我把最新的和官网要求的版本都下了。
因为这个是跟引擎有关的,我怕会引起问题,所以也一并下载了。(因为当时按照网上的另外一个教程:VS2019和UE4.26的时候一直编译不成功)
最新版的.NET Framework,因为需要用python做AirSim仿真,因此需要与AirSim建立通信。
2.3 安装UnrealEngine
官方地址:虚幻引擎安装地址
点开链接后,可以看到右上角有一个下载按钮(下载之前要先注册一个EpicGames的账号):
点击下载后,可以看见下载界面。
这里下载的是Epic Games启动程序的安装包。Epic Games启动程序是用来管理Epic旗下各个产品的启动器,里面包括了对Unreal Engine不同版本、虚幻商城、游戏库等的管理。
安装完程序打开后,如下图所示:
新版的AirSim要求的引擎需要>=4.27,但是我下载了UE5在验证block环境的时候就报错,生成不了sln,直接就进坑了。(5.0和5.1都是这样)所以我就下了4.27的引擎,结果蛮顺利的。
2.4 AirSim源码下载编译
AirSim源码目前仍在完善和丰富中,为了方便以后实时更新 AirSim 源码,建议使用 git 工具来下载。git工具可以在其官方网站中免费下载: git下载链接,选择下载 Windows 版本,下载完成后,双击安装,安装过程全部选择默认设置即可。
点开任务栏的放大镜,搜索Developer Command Prompt for VS 2022,如下图所示。
打开之后,切换到你期望下载AirSim的路径。然后输入
git clone https://github.com/Microsoft/AirSim.git
由于我已经安装过了,这里便不再演示下载。下载完成后,输入指令CD AirSim进入到AirSim的文件夹中,继续输入指令build.cmd。(编译的时间会有点久,耐心等待就就好。)
v1.8.1的AirSim编译完后会自动在“Airsim\Unreal\Environments\Blocks”文件夹中生成一个Block.sln的工程文件。(前面的版本需要CD 切换到Airsim\Unreal\Environments\Blocks目录下输入update_from_git.bat才会生成工程文件)。
PS:记得打开Epic Games,因为在编译最后会出现一个弹窗让你选择引擎版本的,这里我们选的是4.27。
如果没有出现弹窗并且没有出现Block.sln工程文件的,那么我们就手动Switch一下。
找到以下文件,右键点击Blocks.uproject ,点击下图红框中的命令
然后就会出现Blocks.sln工程文件了。
2.5 验证AirSim是否与Unreal引擎建立连接
双击Blocks.sln,打开如下图所示
选择DebugGame Editor和Win64,并且将Blocks设置为启动项目然后点击上方的本地Windows调试器按钮开始调试(F5)
block的环境非常简单,所以渲染也非常快。点击播放后如果出现了四旋翼,则证明了AirSim环境配置成功。
三、AirSim仿真
3.1 下载Unreal环境及环境配置
打开Epic Games,选中Samples往下拉,找到Virtual Studio环境。
在安装地址可以找到VirtualStudio.uproject,双击打开就会出现UE的编辑器。
为了能够使用Visual Studio 编译.sln文件,我们需要创建自己的类,因为Unreal要求至少有一个源文件。具体步骤是:点击左上角的文件,选择新建C++类,父类选择无,所以直接点击下一步;命名和路径都是默认就好了,直接点击创建类。这时Unreal会自动编译C++代码,然后会自动打开Visual Studio。到此VirtualStudio环境就下载安装好了。
3.2 在环境中添加AirSim插件
这一步我们把airsim作为一个插件,安装到环境中,然后环境就可以认识这个插件,并可以使用airsim。先把上一步打开的Unreal 编辑器和Visual Studio都关闭。找到上一篇文章中下载的AirSim文件夹,找到AirSim\Unreal\Plugins文件夹,并将其复制到VirtualStudio.uproject文件夹中。
然后双击打开VirtualStudio.uproject.uproject。会自动弹出如下窗口,点击是。
然后等待编译完成就好啦。
3.3 Python环境的搭建
win10系统下 python 环境的搭建包括安装和配置编辑器和解释器,编辑器是用来写python代码的,解释器是用来编译运行python程序的。
(本文的python环境配置,不需要手动添加环境变量。)
3.3.1 解释器Anaconda环境的安装和配置
非常推荐使用Anaconda对python环境进行管理,Anaconda中可以创建很多不同的虚拟环境,每个环境之间不会相互干涉,而且可以对每个环境进行个性化的配置,比如针对AirSim可以创建一个环境,在这个环境中只安装AirSim仿真需要使用的第三方包和通用库,而不会对其他的环境造成影响。
首先下载安装Anaconda,打开官网.
下载好之后,双击打开安装包,按照提示一步一步安装即可。安装成功后,就可以针对AirSim专门配置一个虚拟环境。安装完成后,可以看到开始菜单中多了几个应用:
- Anaconda Navigator :图形用户界面,用于管理python环境。
- Anaconda PowerShell Prompt:命令行工具。
- Jupyter notebook:基于web的交互式计算环境,可以编辑markdown,用于展示数据分析的过程。
- qtconsole :一个可执行 IPython 的仿终端图形界面程序。
- spyder :一个使用Python语言、跨平台的、科学运算集成开发环境。
我们仅使用 Anaconda Navigator 和 Anaconda PowerShell Prompt 这两个应用即可。
打开Anaconda Navigator,点击左侧的Environments,这时中间已经有了一个基础环境base(root)。我们新建一个环境,专门用来做AirSim仿真。点击中间下面的Create,这时会跳出来一个窗口,输入一个自己喜欢的命名(我这里是airsim),选择Python版本为3.7,然后点击Create。创建好之后,环境中会包含一些基本的python库和包。
numpy是一个矩阵运算库,对于矩阵向量等运算非常方便使用,基本上做估计控制等算法都需要用到。以numpy为例,介绍一下安装过程。将库的选择选为all(右边左上角),在右上角的搜索框中搜索numpy,在下面的众多库中找到numpy,并在其前面的小框中打上勾,最后点击下面的Apply即可。
下面安装airsim需要用到的第三方库。很多第三方库在这里是搜索不到的,可以使用pip工具来安装。
点击环境名右面的绿色小三角,选择Open Terminal,就可以打开命令行了。
// 在命令行输入
pip install msgpack-rpc-python
pip install airsim
等待安装完成即可。
3.3.2 编辑器pycharm的安装与配置
Pycharm 是一款非常好用的python编辑器,具有代码高亮、自动补全、纠错等非常实用方便的功能,界面也很美观。Pycharm 有教育版,如果使用edu结尾的邮箱注册账号就可以免费使用,这是广大学生的一个非常重大的福利。
首先到官网下载软件安装包。社区版是免费的,教育版对于用结尾是edu的邮箱注册的用户是免费的,专业版是收费的。推荐使用教育版,但是社区版的功能也是完全够用的。下载好之后,双击打开安装包开始安装,根据提示一步一步安装即可。打开pycharm之后,会有选择主题的提示,建议选择暗色,能保护眼睛。
打开pycharm,点击 Create New Project, 先选择新建工程的路径,然后选择解释器为上一节创建的Anaconda环境,但是注意这里第一次选择的时候是没有这个环境选项的。比如我这里应该选择 Python 3.7 (airsim)解释器,但是下拉框中并没有这个环境选项,所以需要添加进来,让Pycharm知道有Anaconda 这个环境。
添加完成后就可以看到如下显示:
四、仿真控制无人机起飞降落
4.1 流程演示
在新建的python工程中新建一个python file
"""
test python environment
"""
import airsim
# connect to the AirSim simulation
client = airsim.MultirotorClient()
client.confirmConnection()
# get control
client.enableApiControl(True)
# unlock
client.armDisarm(True)
# Async methods returns Future.Call join() to wait for task to complete.
client.takeoffAsync().join()
client.landAsync().join()
# lock
client.armDisarm(False)
# release control
client.enableApiControl(False)
下面就是运行程序的步骤。需要先将AirSim运行起来,然后再运行python程序。
首先将C:\Users[用户名]\Documents\AirSim路径下的settings.json文件中的仿真模式改为多旋翼。
{
"SettingsVersion": 1.2,
"SimMode": "Multirotor"
}
然后打开之前安装好的VirtualStudio环境目录下的VirtualStudio.sln文件;Visual Studio中,选择编译模式为 Debug Game Editor和win64,确保VirtualStudio为启动项目。然后点击 本地Windows调试器,这时会打开 Unreal Editor;在 Unreal Editor 中点击 播放(Play) 按钮,仿真就会运行。
启动完成后,修改UE的游戏模式为AirSimGameMode,然后点击工具栏的运行。
这时候就会出现一架小的无人机。
最后在Pycharm中运行刚刚写好的程序。在右上角选择自己的程序,然后点击运行。
就可以看到仿真中的四旋翼会先飞到一定高度,然后降落。
AirSim仿真模拟
4.2 代码讲解
import airsim
使用 python 做AirSim仿真,必须导入 airsim 包。
client = airsim.MultirotorClient()
与 AirSim 建立连接,并且返回句柄(client),后面的每次操作需要使用这个句柄。python 与 AirSim 的通信机制在下一节中讲解。
如果是汽车仿真,代码是:
client = airsim.CarClient();
client.confirmConnection()
检查通信是否建立成功,并且会在命令行中打印连接情况,这样你就可以潘丹程序是否和AirSim连接正常,如果连接正常会在命令行中打印如下:
Connected!
Client Ver:1 (Min Req: 1), Server Ver:1 (Min Req: 1)
client.enableApiControl(True) # get control
client.enableApiControl(False) # release control
因为安全问题, API 控制默认是不开启的,遥控器有全部的控制权限。所以必须要在程序中使用这个函数来获取控制权。遥控器的操作会抢夺 API 的控制权,同时让 API 获取的控制权失效。使用 isApiControlEnabled 可以检查 API 是否具有控制权。
可能会有人问为什么最后结束的时候要释放控制权,反正都是仿真,结束仿真就好了。但是实际上 AirSim 的开发人员希望在仿真中的代码可以直接移到现实中使用,所以对于现实中的安全问题,还是开发了获取控制权和释放控制权、解锁和上锁等一系列安全操作。
client.armDisarm(True) # 解锁
client.armDisarm(False) # 上锁
使用这个函数可以让无人机的旋翼启动和停止旋转。
client.takeoffAsync().join() # 起飞
client.landAsync().join() # 降落
这两个函数可以让无人机起飞和降落。
很多无人机或者汽车控制的函数都有 Async 作为后缀,这些函数在执行的时候会立即返回,这样的话,虽然任务还没有执行完,但是程序可以继续执行下去,而不用等待这个函数的任务在仿真中有没有执行完。
如果你想让程序在这里等待任务执行完,则只需要在后面加上.join()。本例子就是让程序在这里等待无人机起飞任务完成,然后再执行降落任务。
新的任务会打断上一个没有执行完的任务,所以如果takeoff函数没有加 .join(),则最后的表现是无人机还没有起飞就降落了,无人机是不会起飞的。
4.3 python与AirSim的通信机制
AirSim API 使用的是 TCP/IP 中的 msgpack-rpc 协议,这是一种网络通信协议,所以如果设置正确,其实可以用两台不同的电脑来做仿真,一台跑 AirSim 和 Unreal,另一台跑 python程序。
当 AirSim 开始仿真的时候,会打开 41451 端口,并监听这个端口的需求。python 程序使用 msgpack serialization 格式向这个端口发送 RPC 包,就可以与AirSim进行通信了。
如果你的计算机的41451 端口已经被其他程序使用了,那么可以通过 settings 文件改变AirSim使用的端口号。
使用这种网络通信协议的方式,可以将 AirSim 和 python程序隔离,互不干扰。所以不需要修改 AirSim 的任何源代码,就可以满足非常多的仿真需求;而且即使python程序中断了,AirSim 的仿真也可以继续进行。