@[TOC](强化学习系列文章(二十二):AirSim自动驾驶仿真平台及其Python API分析)
AirSim自动驾驶仿真平台及其Python API分析
最近在做强化学习与自动驾驶的结合,于是接触到AirSim——微软开发的自动驾驶仿真平台,个人觉得做得非常不错,是我目前见过的最棒的自动驾驶仿真环境。原因如下:
- AirSim是一个持续更新的开源项目,现在还在开发迭代中,所以功能在不断完善,出了Bug也有人去维护,相比之下TORCS虽然也很不错,但是最近3年没有看到TORCS的更新了,一方面对现在的操作系统的适配可能不是很好,我配置了许久都没有成功,另一方面学术界工业界用的逐渐少了。
- AirSim的社区做的还不错,中文互联网上也有最近几年新出的经验贴。这也需要我们每位技术人无私而不懈的努力,感谢前辈。
- AirSim的接口写的不错,能以很低的成本封装成Gym接口,代码也很好看懂,而且提供预编译的可执行程序,对于我这种目前只需要在现成环境上测试强化学习算法的人来说,成本是最低的了。面向自动驾驶全场景的仿真平台还有很多,Apollo做的就不错,但是太大太复杂,学起来成本高,所以对我而言暂时不太合适。
我会用几篇文章的篇幅介绍如何使用预编译好的可执行AirSim仿真环境编写Gym风格交互接口,以及如何训练强化学习智能体。
本次首先介绍AirSim环境。
准备预编译环境
配置Unreal Engine4和AirSim需要费一些功夫,而验证强化学习算法的有效性其实不需要这些,因此我会优先选择预编译好的仿真环境。
首先在
https://github.com/microsoft/AirSim/releases上下载对应平台的预编译文件。如下所示,显示v1.3.1版本的Windows平台的环境文件,共提供了Blocks、Landscape Mountains、Coastline、City、Soccer_Field、Zhangjiajie六个场景的环境,将其下载解压到指定位置,运行相应可执行文件即可。
Windows系统的可执行文件就是一级路径下的exe文件,Linux系统则在./Neighborhood/AirSimNH/Binaries/Linux/AirSimNH
。
每次运行会被告知选择载具,yes是一辆SUV,no是四旋翼无人机。进入程序,按F1
呼出快捷键指南,按0
打开所有传感器画面,包括景深图像、目标分割图像、传统镜头图像,按退格键重启环境。
准备AirSim
下载AirSim源文件
git clone https://github.com/Microsoft/AirSim.git
cd AirSim
./setup.sh // 配置依赖
./build.sh //编译airsim库
安装Python-AirSim
pip install msgpack-rpc-python
pip install airsim
安装airsim
时,需要安装opencv-contrib-python
,可能需要很长时间的编译,也可能遇到如下的错误:
fatal error: boostdesc_bgm.i: No such file or directory
No module named skbuild
Could not build wheels for opencv-python which use PEP 517 and cannot be installed directly
Solution:
pip install scikit-build
pip install opencv-contrib-python==3.4.2.16
测试Python API
cd /home/xxx/AirSim/PythonClient
# 运行AirSimNH,也就是Neighborhood环境里的可执行文件
python hello_car.py
# 切回NH环境,可以看到汽车在Python文件的控制下运动
hello_car.py分析
import setup_path
import airsim
import cv2
import numpy as np
import os
import time
import tempfile
# 连接到AirSim模拟器,需要事先打开模拟程序
client = airsim.CarClient()
client.confirmConnection()
client.enableApiControl(True)
print("API Control enabled: %s" % client.isApiControlEnabled())
car_controls = airsim.CarControls()
# 在/tmp/airsim_car/路径下保存运行截图
tmp_dir = os.path.join(tempfile.gettempdir(), "airsim_car")
print ("Saving images to %s" % tmp_dir)
try