CARLA是一个开源的自动驾驶模拟器。它是从头开始构建的,用作模块化和灵活的API,以解决自动驾驶问题中涉及的一系列任务。 CARLA的主要目标之一是帮助自动驾驶研发民主化,它是一种易于用户使用和定制的工具。为此,模拟器必须满足一般驾驶问题(例如学习驾驶策略,训练感知算法等)内不同用例的要求。 CARLA基于Unreal Engine来运行模拟,并使用OpenDRIVE标准(今天为1.4)定义道路和城市环境。通过使用Python和C ++处理的API授予对模拟的控制权,该API随项目的发展而不断增长。
为了简化开发,培训和验证驾驶系统的过程,CARLA演变成由社区围绕主要平台构建的项目生态系统。在这种情况下,重要的是要了解有关CARLA如何工作的一些知识,以便充分理解其功能。
CARLA仿真器由可扩展的客户端-服务器体系结构组成。
服务器负责与仿真本身相关的所有事情:传感器渲染,物理计算,世界状态及其参与者的更新等等。 由于它旨在获得逼真的结果,因此最合适的方法是使用专用GPU运行服务器,尤其是在处理机器学习时。
客户端由一些客户端模块组成,这些客户端模块控制场景中演员的逻辑并设置世界条件。 这可以通过利用CARLA API(Python或C ++)来实现,CARLA API是在服务器和客户端之间进行中介的层,该层不断地发展以提供新的功能。
交通流管理:除了用于学习的系统外,还内置了一个控制车辆的系统。它作为CARLA提供的指挥者,以逼真的行为再现城市般的环境。
传感器:车辆依靠它们来发布周围环境的信息。在CARLA中,它们是附着在车辆上的一种特殊的行为体,它们接收到的数据可以被检索和存储,以简化这一过程。目前该项目支持不同类型的传感器,从摄像头到雷达、激光雷达等等。
记录器:此功能用于为世界上的每个演员一步步重演模拟。它允许访问世界上任何地方的时间线中的任何时刻,是一个很好的追踪工具。
ROS bridge和Autoware实施方法:作为一个普遍化的问题,CARLA项目结和致力于将模拟器整合到其他学习环境中。
开放性资产:CARLA为城市环境的不同地图提供便利,并对天气条件进行控制,同时提供一个蓝图库,其中有大量的行为者可供使用。然而,这些元素可以定制,并且可以按照简单的准则生成新的元素。
场景运行器:为了简化车辆的学习过程,CARLA提供了一系列描述不同情况的路线,供大家迭代。这些也为CARLA挑战赛奠定了基础,开放给大家测试自己的解决方案,并进入排行榜。
CARLA的快速上手指南请参考官方文档https://carla.readthedocs.io/en/latest/getting_started/
模拟器就是一个小镇的环境,有道路,建筑,街道,交通灯等等。不过目前是没有行人和车辆的。需要运行 python 脚本代码。
python spawn_npc.py -n 80
也可以运行这个脚本添加天气变量(天黑,下雨,刮风等)
python dynamic_weather.py
当然也可以体验一下手动驾驶汽车的感觉,仅需要运行这个脚本就可以了。
python manual_control.py
如上图所示,可以像玩游戏一样手动操作窗口中汽车前进、后退、转弯和刹车等动作,同时环境的及时反馈也可以收集到。可以感应到周围车辆的大小,交通灯信号,是否有撞击等等。
当然你也可以用快捷键 P 让汽车处于自动驾驶状态。不过需要注意的是,此时汽车的自动驾驶并不是通过机器学习得到的模型,而是通过对模拟器中设置的汽车行驶交通规则实现的。
注意如果在运行脚本的时候出现导入 carla 失败的错误,请检测python版本。在PythonAPI\carla\dist 目录中可以看到相应的python 版本的.egg 文件。笔者使用的是0.9.5 版本 carla 其中 Windows 10 需要使用 python 3.7. Linux 需要使用 python 3.5.
为了便于进后机器学习的需要,本文我们快速在模拟器中创建一辆汽车,并让他直线行驶,通过摄像头将感知到的图片显示出来。之后我们便可用摄像头收集到的图像信息以及汽车在环境中的反馈训练(强化学习)模型,完成自动驾驶的任务。详细指南请参考官方 Python API 指南。
# 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]
初始化汽车,在模拟器世界中,随机出现一辆汽车
spawn_point = random.choice(world.get_map().get_spawn_points())
vehicle = world.spawn_actor(bp,spawn_point)
控制汽车,当然你可以用自动驾驶模式"vehicle.set_autopilot(True)"让汽车根据模拟器制定的规则行驶,不过我们在这里让汽车直行
vehicle.apply_control(carla.VehicleControl(throttle=1.0,steer=0.0)) # car go straight
actor_list.append(vehicle)
设置摄像头
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)
获取摄像头图片,这里通过 .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 脚本获取汽车直线前进,摄像头所“看到” 的画面。汽车直行然后撞在了隧道的墙壁上。