CARLA是一个开源的自动驾驶模拟器。它是从零开始构建的,作为一个模块化和灵活的API来解决一系列涉及到自动驾驶问题的任务。carla的主要目标之一是帮助实现自主驾驶研发的灵活化,作为一种用户可以方便地访问和定制的工具。为此,模拟器必须满足一般驾驶问题中不同用例的要求(例如学习驾驶策略、训练感知算法等)。CARLA以Unreal Engine为基础来运行模拟,并使用OpenDRIVE标准(1.4与今天一样)来定义道路和城市设置。模拟的控制权是通过Python和C语言处理的API授予的,该API随着项目的发展而不断增长。(这里有疑问:C语言的api是指ROS briage吗?)
为了使驱动系统的开发、培训和验证过程更加顺利,CARLA逐渐发展成为一个项目生态系统,由社区围绕主平台构建。在这种情况下,重要的是要了解卡拉是如何工作的,以便充分理解它的能力。
CARLA模拟器由可扩展的客户机-服务器体系结构组成。
服务器负责与模拟本身相关的一切:传感器渲染、物理计算、世界状态及其参与者的更新等等。由于它的目标是获得实际的结果,最好的方法是使用专用的GPU运行服务器,尤其是在处理机器学习时。
客户机侧的控制场景由客户机和控制场景的逻辑组成。这是通过利用carlaapi(在Python或C中)来实现的,carla api是一个在服务器和客户机之间进行中介的层,它不断发展以提供新的功能。
总结了模拟器的基本结构。不过,了解卡拉远不止这些,因为许多不同的特性和元素共存于其中。下面列出了其中一些,以了解卡拉的能力。
安装过程略,请查看官网。这里简单写一下。
pip install --user pygame numpy
添加carla 源。
sudo apt-get update
sudo apt-get install carla-simulator
cd /opt/carla-simulator
下载地图,因为默认地图少,所以需要另外下载导入。
> cd ~/carla
> ./ImportAssets.sh
然后就可以启动了。
# Linux: > ./CarlaUE4.sh
说是应该出现观众视野的俯视图,但是我的是鼠标轻微动一动就晃了地图。不知道怎么回事。
下面是启动carla时候有用的命令
-carla-rpc-port=N
监听客户端端口N-carla-streaming-port=N
指定端口N给传感器数据流用 。0代表任意不使用的端口。-quality-level={Low,Epic}
因为有时候有提交bug,所以需要下载更新patch编译。
https://carla.readthedocs.io/en/latest/build_linux/
If UE has already been built, install the patch and make the build again.
UE4需要编译;
./Setup.sh && ./GenerateProjectFiles.sh && make
carla也需要编译;
carla编译时候,需要更新素材再编译。
./Update.sh
设置环境变量
export UE4_ROOT=~/UnrealEngine_4.24
Make sure to run make launch
to prepare the server and make PythonAPI
for the client. Alternatively make LibCarla
will prepare the CARLA library to be imported anywhere.
make launch 编译服务端模拟器,启动UE. Press Play to start the spectator view and close the editor window to exit. Camera can be moved with WASD
keys and rotated by clicking the scene while moving the mouse around.
make PythonAPI 编译客户端api, necessary to grant control over the simulation. It is only needed the first time. Remember to run it again when updating CARLA. Scripts will be able to run after this command is executed. The following example will spawn some life into the town.
make help |
Prints all available commands. |
make launch |
Launches CARLA server in Editor window. |
make PythonAPI |
Builds the CARLA client. |
make package |
Builds CARLA and creates a packaged version for distribution. |
make clean |
Deletes all the binaries and temporals generated by the build system. |
make rebuild |
make clean and make launch both in one command. |
安装过程中最具挑战性的部分是编译所有依赖项和模块,以便与a)服务器端的Unreal引擎和b)客户端中的Python兼容。
目标是能够从一个单独的Python进程调用Unreal引擎的函数。
下面这个图很好的表现了python C++ carla之间的联系。很重要。
这样主要讲 pythonapi LibCarla CarlaUE4 and Carla plugin 编译的。
略。
Docker CE NVIDIA-Docker2 这两个安装过程略。
docker pull carlasim/carla:0.8.2
carla是有docker镜像的。拉下来即可。
docker run -p 2000-2002:2000-2002 --runtime=nvidia --gpus all carlasim/carla:0.8.4
这样就启动了。
本页介绍CARLA的主要功能和模块。不同主题的详细说明可以在相应的页面上找到。
为了了解API中不同的类和方法,请看一下Python API参考. 再说,那个代码配方引用包含一些常见的代码块,在第一步中特别有用。
重要的
客户是用户运行以请求模拟中的信息或更改的模块。客户端使用IP和特定端口运行。它通过终端与服务器通信。可以有多个客户机同时运行。高级多客户机管理需要对CARLA和同步 .
世界表示模拟的对象。它作为一个抽象层,包含了产生演员、改变天气、获得当前世界状态等的主要方法。每个模拟只有一个世界。当地图被改变时,它将被销毁并替换成一个新的。
演员是在模拟中扮演角色的任何东西。
蓝图已经生成生成演员所必需的演员布局。基本上,模型带有动画和一组属性。其中一些属性可以由用户自定义,其他属性则不能蓝图库包含所有可用的蓝图以及相关信息。
地图主要是代表模拟世界的物体,城镇。有八张地图。它们都使用opendrive1.4标准来描述道路。
道路、车道和交叉口由Python API从客户端访问。它们与航路点类为车辆提供导航路径。
交通标志和交通信号灯可作为卡拉,地标对象,这些对象包含有关其OpenDRIVE定义的信息。此外,模拟器在运行时使用OpenDRIVE文件上的信息自动生成站点、产量和红绿灯对象。这些有边界框放置在道路上。一旦进入边界框,车辆就会意识到它们。
传感器等待某个事件发生,然后从模拟中收集数据。它们需要一个定义如何管理数据的函数。根据具体情况,传感器检索不同类型的传感器数据 .
传感器是连接到母车上的一个参与者。它跟踪周围的车辆,收集周围环境的信息。可用的传感器由其在蓝图库 .
CARLA提供了一系列功能,这些功能超出了模拟器介绍的范围。这里列出了一些最引人注目的。但是,我们强烈建议您阅读全文第一步部分,然后开始执行高级步骤。
客户和世界是卡拉的两个基本要素,是操作模拟及其参与者所必需的抽象。
本教程从定义这些元素的基础和创建到描述它们的可能性。如果在阅读过程中出现任何疑问或问题卡拉论坛有没有办法解决这些问题。
客户机是卡拉体系结构的主要元素之一。它们连接到服务器、检索信息和命令更改。这是通过脚本完成的。客户端识别自己,并连接到世界,然后使用模拟进行操作。
除此之外,客户机还可以访问高级CARLA模块、特性和应用命令批处理。本节只讨论命令批处理。这些对于基本的事情是有用的,比如产生大量的演员。其余的特性更复杂,它们将在高级步骤 .
看看卡拉,客户在PythonAPI参考中学习关于类的特定方法和变量。
需要两件事。这个IP地址地址识别,以及两个TCP端口与服务器通信。第三个可选参数设置工作线程的数量。默认设置为“全部”( zero
).这个代码配方演示如何在运行脚本时将这些参数解析为参数。
client = carla.Client('本地主机' , two thousand )
默认情况下,CARLA使用本地主机IP和端口2000进行连接,但可以随意更改。第二个端口总是n 1号
,2001年
创建客户机后,将其超时. 这限制了所有的网络操作,这样就不会永远阻塞客户端。如果连接失败,将返回一个错误。
client.set_超时( ten )#秒
可以连接多个客户端,因为一次运行多个脚本是很常见的。使用具有高级CARLA功能的多客户机方案(如traffic manager),必然会使通信更加复杂。
注意
客户端和服务器具有不同的libcarla
模块。如果版本不同,可能会出现问题。可以使用获取客户端版本()
和获取服务器版本()
方法
客户机可以相当容易地连接和检索当前世界。
world = client.get_world()The client can also get a list of available maps to change the current one. This will destroy the current world和create a new one.```pyprint(client.get_available_maps())...world = client.load_world('汤01' )#reload_world()使用相同的映射创建世界的新实例。
每个世界对象都有身份证件
或者插曲。每次客户要求加载世界()
或重新加载世界()
前一个被摧毁了。一个新的一集是从零开始的。虚幻引擎在此过程中未重新启动。
命令是一些最常见的CARLA方法的改编,可以批量应用。例如命令集自动驾驶仪相当于车辆。设置自动驾驶仪(),启用车辆的自动驾驶仪。但是,使用这些方法Client.apply_批处理或Client.apply\u batch\u sync(),可以在单个仿真步骤中应用命令列表。这对于通常应用于数百个元素的方法非常有用。
下面的示例使用批处理一次销毁所有车辆的列表。
client.apply_批处理([carla.command.DestroyActor(x)对于十在里面车辆清单])
中列出了所有可用的命令最新章节PythonAPI参考。
client对象的主要用途是获取或更改世界,并应用命令。但是,它还提供了对一些附加功能的访问。
模拟的主要规则。它的实例应该由客户端检索。它不包含世界本身的模型,这是地图班级。相反,大多数信息和常规设置都可以从这个类访问。
一些最重要的方法是吸气剂,精确地检索这些元素的信息或实例。看看卡拉。世界去了解更多
世界上有不同的方法与参与者相关,允许不同的功能。
产卵将在中解释第二。演员和蓝图. 它需要对blueprint库、属性等有一定的了解。
天气不是一个单独的类,而是一组可以从世界上访问的参数。参数化包括太阳方向、云量、风、雾等。helper类Carla.用于定义自定义天气
weather = carla.WeatherParameters( cloudiness= eighty, precipitation= thirty, sun_altitude_angle= seventy)world.set_weather(weather)打印(world.get_weather())
有一些天气预设可以直接应用于世界。这些列在Carla.并作为枚举访问
World.Set U Weather(Carla.Wetcloudysunset)
天气的变化不会影响物理学。它们只是摄像机传感器能捕捉到的视觉效果。
Night mode starts when sun_altitude_angle < 0,被认为是日落。这是灯光变得特别相关的时候。
#获取灯光管理器和灯光lmanager = world.get_light_manager()mylights = lmanager.get_all_lights()#自定义特定灯光light01 = mylights[ zero]light01。打开灯()light01。设置亮度( one hundred)state01 = carla.LightState( two hundred,瑞德,卡拉。莱特集团。大楼,是的)light01。设置灯状态(state01)#一组自定义灯光my_lights = lmanager.get_light_group(carla.LightGroup.Building)lmanager.turn_on(my_lights)lmanager.set_color(my_lights,carla.Color( two hundred and fifty-five , zero , zero))经理。设置亮度(我的灯,列出亮度)
使用这些方法可以随时检索和更新车辆的灯光卡拉。车。去轻丘州和carla.Vehicle.set_light_状态. 它们使用二进制操作来自定义灯光设置。
#打开位置灯current_lights = carla.VehicleLightState.NONEcurrent_lights |= carla.VehicleLightState.Positionvehicle.set_light_state(current_lights)
世界对象具有carla.DebugHelper对象作为公共属性。模拟过程中可以绘制不同的形状。这些是用来跟踪事件发生的。下面的示例将在演员的位置和旋转位置绘制一个红色框。
debug = world.debugdebug.draw_box(carla.BoundingBox(actor_snapshot.get_transform().location,carla.Vector3D( zero point five , zero point five , two)),actor_snapshot.get_transform().rotation, zero point zero five,卡拉。颜色( two hundred and fifty-five , zero , zero , zero ), zero )
此示例在代码配方为世界快照中的每个演员绘制方框。
在模拟的每一帧中包含一个参与者。一种带有时间参考的静止世界图像。信息来自同一个模拟步骤,即使是在异步模式下。
#在当前帧检索世界的快照。world_snapshot = world.get_snapshot()
A卡拉世界快照包含卡拉。时间戳还有一份清单carla.ActorSnapshot. 可以使用身份证件
一个演员。快照将列出身份证件
在里面出现的演员
timestamp = world_snapshot.timestamp#获取时间参考对于演员镜头在里面世界快照:#获取参与者和快照信息actual_actor = world.get_actor(actor_snapshot.id) actor_snapshot.get_transform() actor_snapshot.get_velocity() actor_snapshot.get_angular_velocity() actor_snapshot.get_acceleration() actor_snapshot = world_snapshot.find(actual_actor.id)#得到演员的快照
世界上有一些先进的模拟配置。它们决定了渲染条件、模拟时间点以及客户端和服务器之间的同步性。它们可以从helper类访问carla.WorldSettings .
目前,默认的CARLA以最佳的图形质量、可变的时间步长和异步方式运行。要进一步深入了解这个问题,请看高级步骤第节。关于同步与时间步长,和渲染选项可能是个很好的起点
在讨论了世界和它的参与者之后,现在是时候把一切都安排好,理解地图,以及参与者如何驾驭它。
地图包括城镇的三维模型及其道路定义。每一张地图都基于一个OpenDRIVE文件,该文件描述了完整注释的道路布局。这条路OpenDRIVE标准1.4定义道路、车道、交叉口等非常重要。它决定了API的可能性和所做决策背后的推理。
pythonapi提供了一个高级查询系统来导航这些道路。它在不断发展,以提供更广泛的工具集。
要改变地图,世界也必须改变. 一切都将重新启动并从头开始创建,除了不真实的编辑器本身。有两种方法可以做到这一点。
重新加载世界()
使用相同的地图创建世界的新实例。加载世界()
更改当前地图并创建新世界。world = client.load_world('汤01')
客户端可以获得可用映射的列表。每张地图都有名称
与当前加载城市的名称匹配的属性,例如。汤01.
打印(client.get_available_maps())
OpenDRIVE文件中定义的交通标志被转换为CARLA,作为可以从API查询的地标对象。为了便于操作,对其进行了一些补充。
我的航路点。找到地标(200,是的)
由定义的车道类型OpenDRIVE标准1.4转换为中的API卡拉·拉内蒂作为一系列枚举值
车道周围的车道标线可以通过卡拉·拉内马尔. 它们由一系列变量定义。
航路点使用这些来确认交通许可。
#获取航路点所在的车道类型。lane_type = waypoint.lane_type#找到左边的车道标记类型。left_lanemarking_type = waypoint.left_lane_marking.type()#获取此航路点的可用车道更改。lane_change = waypoint.lane_change
A卡拉路口表示OpenDRIVE连接。该类提供了一个边界框来声明,而车道或车辆在其内部。
此类中最显著的方法是返回交叉口内每条车道的一对航路点。每对位于连接边界的起点和终点。
waypoints_junc = my_junction.get_waypoints()
A卡拉。航路点是三维定向点。它们准备在世界和openDRIVE定义的道路之间进行调解。
每个航路点包含卡拉。转变. 这说明了它在地图上的位置以及包含它的车道的方向。变量道路编号
,截面图id
,车道编号
和s
将此转换转换转换为OpenDRIVE道路。这些结合在一起,创造了身份证件
航路点
注意
由于粒度原因,航路点比同一条路内2cm共享相同的身份证件
.
航路点还包含有关车道控制住它。特别是它的左右两侧车道标线,以及一个布尔值来确定它是否在连接内。
#访问车道信息的航路点示例inside_junction = waypoint.is_junction()width = waypoint.lane_widthright_lm_color = waypoint.right_lane_marking.color
航路点有一组方法来连接其他点并创建道路流。所有这些方法都遵循交通规则来确定车辆可以去的地方。
下一个(d)
创建大致距离的航路点列表d
在车道的方向. 该列表包含每个可能偏差的一个航路点。上一个(d)
创建一个大致距离的航路点-航路点列表d
在车道的相反方向. 该列表包含每个可能偏差的一个航路点。下一个直到车道尽头(d)
和上一次直到车道开始(d)
返回一个距离的航路点列表d
分开。列表分别从当前航路点到其车道的终点和起点。右转车道()
和离开车道()
返回相邻车道上的等效航路点(如有)。可通过找到右/左车道上的下一个航路点并移动到该航路点来进行变道机动。#禁用物理,在这个例子中,车辆被传送。vehicle.set_模拟_物理(假)虽然是的:#在前方2米处找到下一个航路点。waypoint = random.choice(waypoint.next(2))#传送车辆车辆.集合变换(航路点.变换)
地图的实例由世界提供。这将有助于创建路线,使车辆在城市中漫游并到达目标目的地。
map = world.get_map()
spawn_points = world.get_map().get_spawn_points()
道路编号
,车道编号
和s
在OpenDRIVE中。#行驶车道或人行道中心上最近的航路点。waypoint01 = map.get_waypoint(vehicle.get_location(),project_to_road=是的, lane_type=(carla.LaneType.Driving | carla.LaneType.Sidewalk))#最近的航路点,但指定了OpenDRIVE参数。waypoint02 = map.get_waypoint_xodr(road_id,lane_id,s)
waypoint_list = map.generate_waypoints(2)
waypoint_tuple_list = map.get_topology()
my_geolocation = map.transform_to_geolocation(vehicle.transform)
info_map = map.to_opendrive()
到目前为止,有七种不同的地图可用。每一个都有其独特的功能,并有不同的用途。下面是对它们的简要总结。
注意
用户可以自定义地图甚至是创建新地图用于卡拉
城镇 | 摘要 |
---|---|
汤01 | 一个有所有“丁字路口”的基本城镇布局。 |
城镇02 | 类似汤01,但更小 |
汤03 | 最复杂的城镇,有5车道交叉口、环形交叉口、凹凸不平、隧道等等。基本上是一场混战。 |
汤04 | 有一条高速公路和一个小镇的无限环路。 |
汤05 | 有交叉路口和一座桥的方形网格城镇。每个方向都有多条车道。用于执行车道更改。 |
汤06 | 有许多高速公路入口和出口的长公路。它还有一个密歇根左. |
汤07 | 一个乡村环境,道路狭窄,几乎没有红绿灯和谷仓。 |
城镇10 | 具有不同环境的城市环境,如大街或长廊,以及更真实的纹理。 |