在本节,我们将向您介绍Carla的Python API
。
Carla中有几种类型的对象。首先,您当然拥有world
(世界),这就是你的环境。这样,您便拥有了这个世界中的actors
(角色)。角色诸如汽车、汽车上的传感器、行人等之类的东西。最后,我们有blueprints
(蓝图)。蓝图是我们角色的属性。
有了这些信息,让我们开始编写一些实际的代码。让我们制造一辆可以生成汽车并简单地向前行驶的汽车。
1. 导入carla及其他依赖包
代码的前几行,我只是从examples目录中的其他脚本之一复制并粘贴的,下面还将在目录examples中编写我们的代码。
import glob
import os
import sys
try:
# 由相对路径导入carla包
sys.path.append(glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % (
sys.version_info.major,
sys.version_info.minor,
'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0])
except IndexError:
pass
import carla
上面的代码非常简单,在这里所做的所有工作就是找到carla.egg文件,这就是我们在Carla包本身中使用的文件。为了实际导入carla,我们需要找到它,这也是为什么我们现在只是将文件扔到examples目录中的原因。您也可以只将所需的Carla文件移动到site-packagesPython中,然后也以这种方式导入。
接下来,我们将再进行一些导入:
import random
import time
import numpy as np # numpy
import cv2 # opencv-python
如果需要,请安装numpy和cv2:
pip install opencv-python numpy
2. 定义actor_list
(角色列表),并清理
我们要立即处理的第一件事是actor_list
(角色列表),并在完成后清理它们。回想一下,我们既有客户端又有服务器。当我们开始在服务器上运行客户端时,我们在服务器上创建参与者。如果我们只是退出而没有清理,我们的参与者仍然会在服务器上。
actor_list = []
try:
finally:
print('destroying actors')
for actor in actor_list:
actor.destroy()
print('done.')
3. 创建world
(世界)及blueprint
(蓝图)
在这里,我们将在尝试/最后中封装大部分代码。我们将尝试所有的逻辑和参与者创建,然后最后一步将为我们清理。
接下来,回想一下我们在Carla有3个主要的“事物”:world(世界),blueprint(蓝图)和actors(角色)。首先,我们将连接到我们的服务器,了解世界,然后访问蓝图。
actor_list = []
try:
client = carla.Client('localhost', 2000) # 连接端口号2000
client.set_timeout(2.0) # 连接超时2秒
world = client.get_world()
blueprint_library = world.get_blueprint_library()
请注意,您需要运行CarlaUE4.exe(或CarlaUE4.sh)才能进行连接。
4. 创建特斯拉model3,并进行控制
现在我们有了蓝图,我们可以进行筛选。例如:
bp = blueprint_library.filter('model3')[0] # 创建特斯拉model3
这将为我们提供特斯拉model3的默认蓝图。既然有了蓝图,我们就可以生成这辆车,但是在哪里?Carla带有大约200个生成点,因此我们可以随机选择其中之一:
spawn_point = random.choice(world.get_map().get_spawn_points())
现在我们可以生成那辆车了:
vehicle = world.spawn_actor(bp, spawn_point)
我们通过以下方式控制汽车:
vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=0.0)) # 油门1.0,方向盘0.0
最后,别忘了将此车辆添加到我们需要跟踪和清理的actor_list
列表中:
actor_list.append(vehicle)
太好了,我们有汽车,我们可以实际运行。让我们运行5秒钟,然后清理:
time.sleep(5)
- 完整的代码如下
# control.py
import glob
import os
import sys
try:
sys.path.append(glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % (
sys.version_info.major,
sys.version_info.minor,
'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0])
except IndexError:
pass
import carla
import random
import time
import numpy as np
import cv2
im_width = 640
im_height = 480
def process_img(image):
i = np.array(image.raw_data)
i2 = i.reshape((im_height, im_width, 4))
i3 = i2[:, :, :3]
cv2.imshow("", i3)
cv2.waitKey(1)
return i3/255.0
actor_list = []
try:
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]
print(bp)
spawn_point = random.choice(world.get_map().get_spawn_points())
vehicle = world.spawn_actor(bp, spawn_point)
vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=0.0))
actor_list.append(vehicle)
# sleep for 5 seconds, then finish:
time.sleep(5)
finally:
print('destroying actors')
for actor in actor_list:
actor.destroy()
print('done.')
(1) 执行CarlaUE4.exe
(或CarlaUE4.sh)
(2) 运行 python3.7.exe control.py
现在,可能很难在5秒钟内找到您的汽车,但是可以去服务器上查看一下carla环境,使用鼠标往下看,然后s
开始放大。例如:
我们可以将脚本运行到现在为止,并且从上方看,我们可能可以看到:
很难看到,但是当它移动时,很容易发现。请注意,汽车可能会在隧道中产生。如果您没看到车辆,只需再次运行脚本即可。