【Windows 10】AirSim基础配置 (v1.3.1 + Visual Studio 2019 + UE 4.24)

【Windows 10】AirSim基础配置 (v1.3.1 + UE 4.24

  • 1.引言
  • 2.虚幻引擎
  • 3.配置AirSim
  • 4.代码控制无人机

1.引言

  AirSim是一个主要有微软公司团队开发的一个仿真框架,主要针对无人机和无人车进行仿真,特别是对于深度强化学习来说,是一个很好的仿真环境。在之前的博客中,曾对上一版本的AirSim在Windows 10中的配置进行了介绍,也有该版本在Ubuntu 18.04中的配置,大家可以参考本专栏的其他文章,本文主要对Windows 10中AirSim的配置进行介绍, 其版本为1.3.1, 虚幻引擎版本为4.24。

2.虚幻引擎

  AirSim中采用的仿真环境为虚幻引擎,版本为4.24,如果在Ubuntu 18.04中,我们也可以通过ROS(Robot Operating System, 机器人操作系统)来使用Gazebo来进行仿真,这里我们就不赘述了。
1 下载Epic Game Launcher
  我们可以前往虚幻引擎官网进行下载,可能会需要注册账号等,下载地址:

https://www.unrealengine.com/zh-CN/download/ue_non_games

2 打开虚幻引擎,点击库,在这里可以下载各种版本的虚幻引擎版本,这里我们选择的是4.24.3,由于虚幻引擎较大,可能需要下载较长时间。

【Windows 10】AirSim基础配置 (v1.3.1 + Visual Studio 2019 + UE 4.24)_第1张图片

3.配置AirSim

1.安装Visual Studio 2019,并确保安装Desktop Development with C++Windows 10 SDK 10.0.18362
2. 启动Developer Command Prompt for VS 2019,将路径修改到自己期望存放AirSim的位置,然后执行下面命令来cloneAirSim到本地:

git clone https://github.com/Microsoft/AirSim.git

可能会遇到问题:

C:\>git clone https://github.com/Microsoft/AirSim.git
'git' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

这时,我们可以使用Visual Studio的安装器,将Git相关的组件安装上,之后就可以使用命令行来clone了。
【Windows 10】AirSim基础配置 (v1.3.1 + Visual Studio 2019 + UE 4.24)_第2张图片
3.修改路径,并进行编译

cd AirSim
build.cmd

此时会生成虚幻引擎的插件位置在 Unreal\Plugins,可以放在自己使用的虚幻引擎项目中。
4.准备虚幻引擎的仿真场景

您可以自己创建虚幻引擎中的项目来进行仿真,也可以使用AirSim内置的仿真场景,这里们使用AirSim内置的仿真场景Blocks进行测试,如果您希望构建自己独特的仿真环境,也可以参考我的其他博客。

启动Developer Command Prompt for VS 2019,执行(路径根据自己存放AirSim的位置进行更改)

cd C:\AirSim\Unreal\Environments\Blocks
update_from_git.bat

在资源管理器中打开该文件夹,双击Blocks.sln,使用Visual Studio 2019打开。
设置Blocks为启动项目,编译设置DebugGame_EditorWin64,按F5开始运行。
当编译完成后,即可看到

点击播放(Play)即可看到一架无人机出现在仿真环境中:

4.代码控制无人机

重新启动虚幻引擎
启动Developer Command Prompt for VS 2019,打开Blocks仿真环境,点击Play运行,
而后,执行AirSim\PythonClient\multirotor路径下的hello_drone.py文件,我用的是conda的命令行,如下:

cd C:\AirSim\PythonClient\multirotor
python hello_drone.py

代码执行效果如下图:
【Windows 10】AirSim基础配置 (v1.3.1 + Visual Studio 2019 + UE 4.24)_第3张图片
AirSim提供的hello_drone.py脚本的代码为:

import setup_path 
import airsim

import numpy as np
import os
import tempfile
import pprint
import cv2

# connect to the AirSim simulator
client = airsim.MultirotorClient()
client.confirmConnection()
client.enableApiControl(True)
client.armDisarm(True)

state = client.getMultirotorState()
s = pprint.pformat(state)
print("state: %s" % s)

imu_data = client.getImuData()
s = pprint.pformat(imu_data)
print("imu_data: %s" % s)

barometer_data = client.getBarometerData()
s = pprint.pformat(barometer_data)
print("barometer_data: %s" % s)

magnetometer_data = client.getMagnetometerData()
s = pprint.pformat(magnetometer_data)
print("magnetometer_data: %s" % s)

gps_data = client.getGpsData()
s = pprint.pformat(gps_data)
print("gps_data: %s" % s)

airsim.wait_key('Press any key to takeoff')
client.takeoffAsync().join()

state = client.getMultirotorState()
print("state: %s" % pprint.pformat(state))

airsim.wait_key('Press any key to move vehicle to (-10, 10, -10) at 5 m/s')
client.moveToPositionAsync(-10, 10, -10, 5).join()

client.hoverAsync().join()

state = client.getMultirotorState()
print("state: %s" % pprint.pformat(state))

airsim.wait_key('Press any key to take images')
# get camera images from the car
responses = client.simGetImages([
    airsim.ImageRequest("0", airsim.ImageType.DepthVis),  #depth visualization image
    airsim.ImageRequest("1", airsim.ImageType.DepthPerspective, True), #depth in perspective projection
    airsim.ImageRequest("1", airsim.ImageType.Scene), #scene vision image in png format
    airsim.ImageRequest("1", airsim.ImageType.Scene, False, False)])  #scene vision image in uncompressed RGBA array
print('Retrieved images: %d' % len(responses))

tmp_dir = os.path.join(tempfile.gettempdir(), "airsim_drone")
print ("Saving images to %s" % tmp_dir)
try:
    os.makedirs(tmp_dir)
except OSError:
    if not os.path.isdir(tmp_dir):
        raise

for idx, response in enumerate(responses):

    filename = os.path.join(tmp_dir, str(idx))

    if response.pixels_as_float:
        print("Type %d, size %d" % (response.image_type, len(response.image_data_float)))
        airsim.write_pfm(os.path.normpath(filename + '.pfm'), airsim.get_pfm_array(response))
    elif response.compress: #png format
        print("Type %d, size %d" % (response.image_type, len(response.image_data_uint8)))
        airsim.write_file(os.path.normpath(filename + '.png'), response.image_data_uint8)
    else: #uncompressed array
        print("Type %d, size %d" % (response.image_type, len(response.image_data_uint8)))
        img1d = np.fromstring(response.image_data_uint8, dtype=np.uint8) # get numpy array
        img_rgb = img1d.reshape(response.height, response.width, 3) # reshape array to 4 channel image array H X W X 3
        cv2.imwrite(os.path.normpath(filename + '.png'), img_rgb) # write to png

airsim.wait_key('Press any key to reset to original state')

client.armDisarm(False)
client.reset()

# that's enough fun for now. let's quit cleanly
client.enableApiControl(False)

至此,已基本完成在Windows 10上的AirSim配置,恭喜你!


以下是广告部分,本人不对内容及真实性负责,如果感兴趣的话,大家可以自行查看

深度学习与PyTorch实战

你可能感兴趣的:(AirSim)