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保证不出错。