python---------airsim-----------ue4

使用python编写控制代码

使用airsim进行通信(ros)

ue4作为仿真环境

一,仿真环境下载

即ue4,ue4是强大的游戏引擎,可以建造逼真的模拟世界,并且有逼真的物理反馈。

首先下载epic启动器,在启动器内的虚幻引擎中,选择下载ue4.3

二,airsim配置

airsim最初是虚幻引擎的插件,也相当于一个用于无人机等控制的通信的强大的库。

下载好airsim源码后,编译生成的airsim/unreal/plugins用于和环境通信,获取环境中无人机的位置速度等。

现在实现了  无人机------->环境-------->airsim,即把无人机放在仿真环境中,仿真的数据给到了airsim。

三,python控制

现在使用python实现拿到airsim的数据,并且把控制指令发给airsim,airsim再控制仿真环境里的无人机飞行。即airsim-------->python代码-------->airsim-------->无人机

conda环境配置好后,简单的几行代码就与airsim建立起了通信

# 1,连接airsim
 client = airsim.MultirotorClient()
 client.confirmConnection()
 
 # 2,取得控制
 client.enableApiControl(True)
 client.armDisarm(True)
 
 # 3,起飞
 client.takeoffAsync().join()

client是客户端的意思,可以理解为建立了一个名为client的客户端对象,用于接收环境作为发布者的数据,airsim则是中间通信的桥梁。

client.moveToZAsync(-3, 1).join()               # 上升到3m高度
 client.moveToPositionAsync(5, 0, -3, 1).join()  # 飞到(5,0)点坐标

通过这两句可以感受到client如何作为发布者,发布数据给环境控制无人机飞行。当然还有速度等的控制指令,都十分简单易懂。而位置控制也就是这么单纯,给出你想要的位置或速度,一个函数就可以直接控制

接下来是图像部分,通过airsim获取图像

responses = client.simGetImages([
     # png format
     airsim.ImageRequest(0, airsim.ImageType.Scene, pixels_as_float=False, compress=True),
     # uncompressed RGB array bytes
     airsim.ImageRequest(0, airsim.ImageType.Scene, pixels_as_float=False, compress=False),
     # floating point uncompressed image
     airsim.ImageRequest(0, airsim.ImageType.DepthPlanar, pixels_as_float=True)])

同样的,client.simGetImages()直接返回数据给responses,并且除了rgb图还有深度图,视差图。获得的数据一般使用opencv进一步处理。

四,ros

(不包含如何通过ros发布airsim的消息)

相当于airsim-----ros-------python代码

我不是很明白为什么要再塞一个ros,明明可以直接通过airsim发布接收数据。(大概是因为实践的时候,实际的通信是靠ros进行,即真实的无人机飞控-------ros--------代码,这里airsim扮演了一下飞控?)

由于是偏向实践,ros没有那么简单的封装。需要先建立一个节点,自定义消息类型,发布消息,接收消息。并且由于底层是c++,环境配置也更繁琐。

节点相当于一个中间商,发布者和接收者连接到同一个中间商之后就可以正常通信了。自定义消息类型相当于自己封装了一种消息,这样发布者和接收者能直接用同一个msg / srv保证不出错。