一、启动Carla
cd ./<你的安装目录>
./CarlaUE4.sh
我们需要通过开放端口利用Python API来连接Carla客户端来操作Carla。
import carla
import random
# 连接到客户端并检索世界对象
client = carla.Client('localhost', 2000)
world = client.get_world()
客户机对象用于维护客户机到服务器的连接,并具有许多用于应用命令和加载或导出数据的功能。我们可以使用客户端对象加载替代映射或重新加载当前映射(重置到初始状态)。
端口可以选择为任何可用的端口,默认设置为2000,您也可以使用计算机的IP地址选择与localhost不同的主机。通过这种方式,CARLA服务器可以在联网的机器上运行,而python客户端可以在个人计算机上运行。这对于区分用于运行CARLA模拟器和用于神经网络训练的GPU特别有用,这两种GPU对图形硬件的要求都很高。
二、加载地图
在CARLA API中,世界对象提供了对模拟的所有元素的访问,包括地图、地图中的对象,如建筑物、交通灯、车辆和行人。CARLA服务器通常装载一个默认映射(通常是Town10)。如果您想用另一个映射启动CARLA,请使用config.py脚本
./config.py --map Town05
我们还可以使用world对象从客户端加载地图
client.load_world('Town05')
三、监视导航
在具有图形显示界面的电脑上运行Carla,会弹出一个窗口用来观看模拟器内部情况。除非使用 RenderOffScreen
命令行指定。
监视器有助于将你的模拟可视化。通过监视器,你可以熟悉你加载的地图,并且看到你正在做的任何改变的结果,比如增加车辆,改变天气,打开/关闭地图的不同层,以及为了调试的目的。
你可以用鼠标控制监视器内视角的俯仰和偏航,用QWE-ASD键移动视角,在世界各地飞行。
- Q - move upwards (towards the top edge of the window)
- E - move downwards (towards the lower edge of the window)
- W - move forwards
- S - move backwards
- A - move left
- D - move right
鼠标左键点击拖拽可以改变俯仰角度和侧向角度。
我们也可以通过一下Python API来操控监视器的参数。
# Retrieve the spectator object
spectator = world.get_spectator()
# Get the location and rotation of the spectator through its transform
transform = spectator.get_transform()
location = transform.location
rotation = transform.rotation
# Set the spectator with an empty transform
spectator.set_transform(carla.Transform())
# This will set the spectator at the origin of the map, with 0 degrees
# pitch, yaw and roll - a good way to orient yourself in the map
四、添加NPC
通过上述的步骤,我们已经完成了服务器的启动以及地图的加载,但是通过监视器窗口,我们可以发现在模拟器中只有城市建筑,如果我们想要进行自动驾驶仿真测试那么还缺少交通参与者。
首先我们需要在蓝图中选择想要的车辆
# Get the blueprint library and filter for the vehicle blueprints
vehicle_blueprints = world.get_blueprint_library().filter('*vehicle*')
我们选择和车辆后,便需要在地图上找到合适位置点用来放置所要生成的车辆。为此,每个 CARLA 地图提供预定义的产生点均匀地分布在整个地图上。
# Get the map's spawn points
spawn_points = world.get_map().get_spawn_points()
# Spawn 50 vehicles randomly distributed throughout the map
# for each spawn point, we choose a random vehicle from the blueprint library
for i in range(0,50):
world.try_spawn_actor(random.choice(vehicle_blueprints), random.choice(spawn_points))
现在,我们还应该添加一个车辆,这将是我们的模拟的中心点。为了训练一个自主智能体,我们需要模拟一个自主智能体将要控制的车辆。在 CARLA 的说法中,我们经常把这种交通工具称为“自我交通工具”。
ego_vehicle = world.spawn_actor(random.choice(vehicle_blueprints), random.choice(spawn_points))
五、添加传感器
现代自动驾驶汽车通过一系列附加的传感器来理解和解释他们的环境。这些传感器包括光学摄像机、光流摄像机、激光雷达、雷达和加速度计。CARLA 建立了许多类型的传感器模型,用于为机器学习创建训练数据。这些传感器可以连接到车辆上,也可以连接到一个固定点上,例如摄像头。
# Create a transform to place the camera on top of the vehicle
camera_init_trans = carla.Transform(carla.Location(z=1.5))
# We create the camera through a blueprint that defines its properties
camera_bp = world.get_blueprint_library().find('sensor.camera.rgb')
# We spawn the camera and attach it to our ego vehicle
camera = world.spawn_actor(camera_bp, camera_init_trans, attach_to=ego_vehicle)
一旦我们生成了摄像机,我们需要通过 listen ()
方法将其设置为录制。Listen 方法以定义如何处理数据的回调作为参数。您可以将其传送到另一个程序,也可以将其保存到磁盘。
我们将使用 lambda 函数作为回调函数将数据保存到磁盘:
# Start camera with PyGame callback
camera.listen(lambda image: image.save_to_disk('out/%06d.png' % image.frame))
这将把数据保存到 out/文件夹,作为一系列根据模拟帧号命名的 PNG 图像文件。
六、让车动起来
现在我们已经在仿真器中添加了交通参与者和我们自己的车辆,并且启动了相机来记录数据。接下来我们就需要利用 Traffic manager
来让我们的车子动起来了!
交通管理器是 CARLA 的一个组成部分,它控制车辆在模拟地图的道路上自主移动,遵循道路惯例,并表现得像真正的道路使用者。
通过 world.get_actors()
方法在仿真器中遍历所有车俩,然后使用 sat_autopilot()
方法将车辆的控制权移交给交通管理器。
for vehicle in world.get_actors().filter('*vehicle*'):
vehicle.set_autopilot(True)
现在你的模拟正在运行,许多车辆在地图上行驶,摄像机记录着其中一辆车的数据。然后可以使用这些数据为机器学习算法提供信息,以训练自主驾驶代理。交通管理员有很多功能可以定制交通行为,你可以在这里了解更多。
这是最基本的可能的模拟设置,现在你可以进一步深入到文档的更多细节,你可以使用许多额外的传感器来生成数据,和许多其他功能的 CARLA,可以使你的模拟更详细,更真实。
七、指定车辆为自我车辆
自我车辆是一个重要的概念时,要记住使用 CARLA。自我飞行器指的是将成为模拟重点的飞行器。在大多数 CARLA 用例中,它很可能是您将附加传感器和/或您的自动驾驶机器学习堆栈将控制的车辆。它之所以重要,是因为它是一些有助于提高模拟效率的模拟操作的基础,例如:
- 加载大型地图贴片: 大型地图(如城镇12)是由贴片组成的,只有在需要时才加载,以提高 CARLA 的性能。自我车辆的位置决定了使用哪些瓷砖。只有离自我飞行器最近的瓷砖才能装载。
- 混合物理模式: 如果你的模拟包含许多由交通管理器控制的车辆,计算所有这些车辆的物理是非常昂贵的计算。混合物理模式使物理计算仅限于自我车辆附近的车辆,从而节省了计算资源。
要定义 Ego Vehicle,您应该设置 Vehicle carla 的 role _ name
属性。演员对象的蓝图,当你产生你的自我车辆:
ego_bp = world.get_blueprint_library().find('vehicle.lincoln.mkz_2020')
ego_bp.set_attribute('role_name', 'hero')
ego_vehicle = world.spawn_actor(ego_bp, random.choice(spawn_points))
设置车辆为自动驾驶模式
ego_vehicle.set_autopilot(True)