量子计算9 发表于 2022-6-21 09:10

airsim详细教程(四)

1. AirSim APIs 简介

AirSim封装了一些API接口,使用这些API接口,可以用程序跟仿真进行交互。例如可以使用API来获取图片、无人机状态、控制无人机/车辆的运动等。
AirSim的 API非常丰富,有很多可以调用的功能,可以将这些功能分成以下几类:

[*]图像类API :获取各种类型的图像、控制云台等;
[*]控制仿真运行 :可以控制仿真暂停或继续;
[*]碰撞API :获取碰撞信息,包括碰撞次数、位置、表面信息、渗透深度等;
[*]环境时间API :主要是控制太阳在天空中的位置;
[*]环境天气API :控制环境中的天气:下雨、雪、灰尘、雾气、道路湿滑程度等;
[*]环境风API :控制环境中的风速和风向等;
[*]雷达API :添加和控制环境中的雷达传感器;
[*]无人机或车辆的API :控制运动、获取状态等,
AirSim的 API有python和C++两种使用方式,可以根据自己的习惯任意选择,本文都统一使用python语言来讲解。
本文的主要内容是如何控制无人机的起飞和降落,同时包括了:如何跟airsim通信、如何获取无人机控制权、如何解锁和上锁无人机。
2. python环境的搭建

win10系统下 python 环境的搭建包括安装和配置编辑器和解释器,编辑器是用来写python代码的,解释器是用来编译运行python程序的。
本文的python环境配置,不需要手动添加环境变量。
如果你对python比较熟悉,可以跳过下面两个过程,直接看2.4 python环境搭建总结。

2.1 解释器Anaconda环境的安装与配置

非常推荐使用Anaconda对python环境进行管理,Anaconda中可以创建很多不同的虚拟环境,每个环境之间不会相互干涉,而且可以对每个环境进行个性化的配置,比如针对AirSim可以创建一个环境,在这个环境中只安装AirSim仿真需要使用的第三方包和通用库,而不会对其他的环境造成影响。
首先下载安装Anaconda,打开官网,点击左上角Product中,选择Individual Edition,然后点击Download,选择与自己计算机对应的版本,我的是windows版64-Bit Graphical Installer (466 MB)。



下载好之后,双击打开安装包,按照提示一步一步安装即可。安装成功后,就可以针对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库和包。





下面就是在这个环境中安装AirSim需要用到的第三方包和一些常用的库。
numpy是一个矩阵运算库,对于矩阵向量等运算非常方便使用,基本上做估计控制等算法都需要用到。以numpy为例,介绍一下安装过程。将库的选择选为all(右边左上角),在右上角的搜索框中搜索numpy,在下面的众多库中找到numpy,并在其前面的小框中打上勾,最后点击下面的Apply即可。



其他的常用库,我们后面遇到了再安装。
下面安装airsim需要用到的第三方库。很多第三方库在这里是搜索不到的,可以使用pip工具来安装。
点击环境名右面的绿色小三角,选择Open Terminal,就可以打开命令行了。



在命令行中输入:
pip install msgpack-rpc-python
pip install airsim如下图所示,做AirSim仿真需要的两个包就安装成功了。如果显示没有pip工具,则需要先安装pip。


2.2 编辑器pycharm的安装与配置

Pycharm 是一款非常好用的python编辑器,具有代码高亮、自动补全、纠错等非常实用方便的功能,界面也很美观。Pycharm 有教育版,如果使用edu结尾的邮箱注册账号就可以免费使用,这是广大学生的一个非常重大的福利。
首先到官网下载软件安装包。社区版是免费的,教育版对于用结尾是edu的邮箱注册的用户是免费的,专业版是收费的。推荐使用教育版,但是社区版的功能也是完全够用的。下载好之后,双击打开安装包开始安装,根据提示一步一步安装即可。打开pycharm之后,会有选择主题的提示,建议选择暗色,能保护眼睛。
打开pycharm,点击 Create New Project, 先选择新建工程的路径,然后选择解释器为上一节创建的Anaconda环境,但是注意这里第一次选择的时候是没有这个环境选项的。比如我这里应该选择 Python 3.7 (airsim)解释器,但是下拉框中并没有这个环境选项,所以需要添加进来,让Pycharm知道有Anaconda 这个环境。



点击右下角的三个点,打开添加python解释器窗口。


首先选择 Conda Environment;
然后在Interpreter中选择上一节创建好的Anaconda环境。注意这里下拉框中应该还是没有可选路径的,需要手动添加(点击后面的三个点),我这里的路径是:C:\Users\[用户名]\.conda\envs\airsim\python.exe(默认安装后的路径);


最后勾选上Make available to all projects。如果没有勾选的话,在其他工程中是看不到这个环境的,还是得添加一遍;如果勾选上了,则其他工程就可以直接选择这个环境了。
全部选择完之后如下图所示,点击create即可创建好工程。


2.4 python环境搭建总结

对python环境搭建做个总结,只要满足这些条件,就可以使用python api来做AirSim仿真。

[*]安装msgpack-rpc-python和airsim两个库,安装指令为:
pip install msgpack-rpc-python
pip install airsim
3. 控制无人机起飞和降落

3.1 代码和运行

在新建的python工程中新建一个python File,将下面的代码复制进去:
"""
test python environment
"""
import airsim

# connect to the AirSim simulator
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"
}然后打开之前安装好的LandscapeMountains环境目录下的LandscapeMountains.sln文件;Visual Studio中,选择编译模式为 Debug Game Editor和win64,确保LandscapeMountains为启动项目。



然后点击 本地Windows调试器,这时会打开 Unreal Editor;在 Unreal Editor 中点击 播放(Play) 按钮,仿真就会运行。

http://pic3.zhimg.com/v2-0587e25ed2cc13eee130233de2e8536_r.jpg

我这里无人机的初始位置设置的是空中,所以刚一点击 播放按钮时,无人机会向下落,最后触地,同时机翼也在一直旋转。因为有两个物体的碰撞,所以画面中给出了一个碰撞警告。
注意,在LandscapeMountains这个环境中,水面就是一个物体,它跟石头、树木等有相同的物理特性,所以无人机不会落到水中,而是在水面,就像在平地上着陆一样。所以在这个环境中的仿真,就可以把水面当做平地来看待。
最后在Pycharm中运行刚刚写好的程序。在右上角选择自己的程序,然后点击运行。


这时,仿真中的四旋翼会先起飞到一定高度,然后降落,视频如下:


3.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(),则最后的表现是无人机还没有起飞就降落了,无人机是不会起飞的。

3.3 python与AirSim的通信机制

AirSim API 使用的是 TCP/IP 中的 msgpack-rpc 协议,这是一种网络通信协议,所以如果设置正确,其实可以用两台不同的电脑来做仿真,一台跑 AirSim 和 Unreal,另一台跑 python程序。
当 AirSim 开始仿真的时候,会打开 41451 端口,并监听这个端口的需求。python 程序使用 msgpack serialization 格式向这个端口发送 RPC 包,就可以与AirSim进行通信了。
如果你的计算机的41451 端口已经被其他程序使用了,那么可以通过 settings 文件改变AirSim使用的端口号。关于 Settings 文件,我们在后面的文章中详细讲解。
使用这种网络通信协议的方式,可以将 AirSim 和 python程序隔离,互不干扰。所以不需要修改 AirSim 的任何源代码,就可以满足非常多的仿真需求;而且即使python程序中断了,AirSim 的仿真也可以继续进行。

franciscochonge 发表于 2022-6-21 09:19

周末定时打卡[赞同][赞同]

rustum 发表于 2022-6-21 09:23

感谢感谢,有啥问题可以提问哇

ainatipen 发表于 2022-6-21 09:24

哈哈,按照教程做暂时还没有问题,等到课程结束,有更多时间来学习,可能就有问题来袭了。

mypro334 发表于 2022-6-21 09:34

多提问题,或者想要的功能,我在后面的文章详细讲

unityloverz 发表于 2022-6-21 09:41

您好,刚接触这个,我想看测一个深度预测网络预测深度的准确性这个功能,或者视差、光流网络。另外问下您airsim的github首页里demo图的城市道路场景在什么地方下载呢?

unityloverz 发表于 2022-6-21 09:45

您好,不好意思我还没有做过训练神经网络相关的功能,预计在两个月内会做一个视觉目标检测的神经网络训练,但是估计写出文章总结来还要几个月的时间。airsim官网的城市道路场景我在 Unreal Market里面没有找到,估计是我找的不仔细

xiaozongpeng 发表于 2022-6-21 09:48

嗯嗯,还是谢谢

johnsoncodehk 发表于 2022-6-21 09:55

我最近在尝试利用外部的飞行数据,在Airsim中进行动画演示。学习了一段时间后,发现调用API函数可以实现四旋翼的运动,指定速度、角度都可以,但是这个好像只是对飞行器下达了控制指令。而我不想要动力学模型,只希望飞行器能够按照我提供的飞行数据进行动画演示。不知道该在什么地方改

jquave 发表于 2022-6-21 09:58

实际上我的飞行数据是固定翼的,我只想用airsim做个动画演示而已,不要内置的模型和控制器。后面会尝试对模型的贴图进行修改,改成固定翼的。现在就想用自带的HelloDrone拍个电影,剧本我从外部输入
页: [1] 2 3
查看完整版本: airsim详细教程(四)