强化学习:自动驾驶——Carla 模拟器简介

in cn-stem •  5 years ago 

自动驾驶是机器学习的一个重要的应用领域,作为普通学习者,我们是否可以运用自己学到的机器学习方法训练自动驾驶模型,完成自动驾驶的任务呢?是否需要一辆真实的汽车和真实的马路环境呢?

对于普通学习者来说,我们当然没有必要去驾驶真实的汽车。使用模拟器可以大大降低自动驾驶研究的门槛,这篇文章我们就简单地介绍一下 Carla 这个开源的用于自动驾驶研究的开源模拟器。

1. CARLA 简介

Carla 是一个开源的模拟器,可以模拟真实的交通环境,行人行为,汽车传感器信号等等。如下图所示,模拟器使用C++ 和虚幻 (Unreal) 引擎构成,使用者可以通过 Python API 使用 Python 脚本代码对模拟器的环境进行操作和控制。

CARLA Modules

image from carla with MIT license

2. CARLA 简单上手

CARLA的快速上手指南请参考官方文档, 本文仅做简单介绍和总结

  1. CARLA 目前仅支持 Linux 和 Windows,需要去下载相应的版本。在本文写作的时间,Windows 仅支持到 0.9.5 版本,Linux 支持到0.9.6。
  2. 需要 安装 numpy 和 pygame.
  3. 下载解压文件夹之后,Windows 环境下直接运行 “CarlaUE4.exe” 文件,linux 环境下 终端命令: “./CarlaUE4.sh” 即可打开模拟器。

模拟器就是一个小镇的环境,有道路,建筑,街道,交通灯等等。不过目前是没有行人和车辆的。需要运行 python 脚本代码。

终端 cd 到 \PythonAPI\examples 目录,里面有不少python 脚本实例,首先我们运行 spawn_npc.py 可以在模拟器中增加 80 俩汽车。

python spawn_npc.py -n 80

也可以运行这个脚本添加天气变量(天黑,下雨,刮风等)

python dynamic_weather.py

当然也可以体验一下手动驾驶汽车的感觉,仅需要运行这个脚本就可以了。

python manual_control.py

manual_control.py

image from carla with MIT license

如上图所示,可以像玩游戏一样手动操作窗口中汽车前进、后退、转弯和刹车等动作,同时环境的及时反馈也可以收集到。可以感应到周围车辆的大小,交通灯信号,是否有撞击等等。

当然你也可以用快捷键 P 让汽车处于自动驾驶状态。不过需要注意的是,此时汽车的自动驾驶并不是通过机器学习得到的模型,而是通过对模拟器中设置的汽车行驶交通规则实现的。

注意如果在运行脚本的时候出现导入 carla 失败的错误,请检测python版本。在PythonAPI\carla\dist 目录中可以看到相应的python 版本的.egg 文件。笔者使用的是0.9.5 版本 carla 其中 Windows 10 需要使用 python 3.7. Linux 需要使用 python 3.5.

3. Python 控制汽车快速上手

为了便于进后机器学习的需要,本文我们快速在模拟器中创建一辆汽车,并让他直线行驶,通过摄像头将感知到的图片显示出来。之后我们便可用摄像头收集到的图像信息以及汽车在环境中的反馈训练(强化学习)模型,完成自动驾驶的任务。详细指南请参考官方 Python API 指南。

  1. 初始化环境。创建 Client 连接模拟器的服务器,并通过 "blueprint" 创建一个汽车blueprint。
    # set up the environment
    client = carla.Client("localhost", 2000)
    client.set_timeout(2.0)
    world = client.get_world()
    blueprint_library = world.get_blueprint_library()
    bp = blueprint_library.filter("model3")[0]
  1. 初始化汽车,在模拟器世界中,随机出现一辆汽车
    spawn_point = random.choice(world.get_map().get_spawn_points())
    vehicle = world.spawn_actor(bp,spawn_point)
  1. 控制汽车,当然你可以用自动驾驶模式"vehicle.set_autopilot(True)"让汽车根据模拟器制定的规则行驶,不过我们在这里让汽车直行
    vehicle.apply_control(carla.VehicleControl(throttle=1.0,steer=0.0)) # car go straight
    actor_list.append(vehicle)
  1. 设置摄像头
    cam_bp = blueprint_library.find("sensor.camera.rgb")
    cam_bp.set_attribute("image_size_x", "{}".format(IM_WIDTH))
    cam_bp.set_attribute("image_size_y", "{}".format(IM_HEIGHT))
    cam_bp.set_attribute("fov","110") #"fov" feel of view
    spawn_point = carla.Transform(carla.Location(x=2.5,z=0.7)) #locate the camera
    sensor = world.spawn_actor(cam_bp, spawn_point, attach_to = vehicle)
    actor_list.append(sensor)
  1. 获取摄像头图片,这里通过 .listen 的 lambda 函数传回数据。当然不要忘了设计一个延时。

    sensor.listen(lambda data: process_img(data))
    
    time.sleep(25)
    

    其中通过 process_img() 方法传回摄像头图像

    def process_img(image):
        i = np.array(image.raw_data)
        # print(i.shape)
        i2 = i.reshape((IM_HEIGHT,IM_WIDTH,4)) #4 changels "rgba"
        i3 = i2[:,:,:3] # 3 changels "rgb"
    
        cv2.imshow("",i3)
        cv2.waitKey(1)
        return i3/255.0
    

    这里需要注意的是,摄像头得到的图片有4个通道 “rgba”,需要将第四个通道去掉,并用opencv 的 cv2.imshow() 将摄像头捕捉到的图片 归一化之后回传回来。

最后,我们运行一下这个python 脚本获取汽车直线前进,摄像头所“看到” 的画面。汽车直行然后撞在了隧道的墙壁上。

drive_and_crash.gif

gif animation created by @hongtao

4. 总结

本文简单介绍了 Carla 这个开源自动驾驶的环境,并简单上手并实现了创建汽车,控制汽车直线运动,同时将汽车上摄像头捕捉的图像信号传回。后面我们将使用这些图像信号和环境的其他反馈,通过强化学习的方式训练模型,实现自动驾驶。

参考资料

[1] Reinforcement Learning: An Introduction (2nd Edition)

[2] David Silver's Reinforcement Learning Course (UCL, 2015)

[3] Github repo: Reinforcement Learning


相关文章

用 Keras 搭建 Double DQN 模型

深度强化学习——Policy Gradient 玩转 CartPole 游戏

强化学习——MC(蒙特卡洛)玩21点扑克游戏

强化学习实战——动态规划(DP)求最优MDP

强化学习——强化学习的算法分类

强化学习——重拾强化学习的核心概念

AI学习笔记——Sarsa算法

AI学习笔记——Q Learning

AI学习笔记——动态规划(Dynamic Programming)解决MDP(1)

AI学习笔记——动态规划(Dynamic Programming)解决MDP(2)

AI学习笔记——MDP(Markov Decision Processes马可夫决策过程)简介

AI学习笔记——求解最优MDP


同步到我的简书
https://www.jianshu.com/u/bd506afc6fc1

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  


This post has been voted on by the SteemSTEM curation team and voting trail. It is elligible for support from @curie.

If you appreciate the work we are doing, then consider supporting our witness stem.witness. Additional witness support to the curie witness would be appreciated as well.

For additional information please join us on the SteemSTEM discord and to get to know the rest of the community!

Please consider setting @steemstem as a beneficiary to your post to get a stronger support.

Please consider using the steemstem.io app to get a stronger support.