1. 启动Carla服务器
在电脑中找到CarlaUE4.exe文件,双加运行。
出现如下画面,说明Carla运行成功
2. 创建Carla客户端
创建.py文件,引入必要的库文件和Carla库
import glob
import os
import sys
import random
import os
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
创建Carla客户端,连接Carla服务器。客户端的参数包括Carla服务器的IP地址和端口号,端口号默认为2000。
#创建Carla客户端,指定Carla服务器的IP地址和端口号
client = carla.Client('localhost', 2000)
#设置连接超时时间
client.set_timeout(10.0)
#使用world对象获取Carla服务器的“控制权”
world = client.get_world()
3. 创建车辆
从Carla蓝图中选择车辆蓝图
#获取Carla中所有蓝图
blueprint_library = world.get_blueprint_library()
#获取车联蓝图
vehicle_blueprints = blueprint_library.filter('*vehicle*')
#随机选择其中一个车辆蓝图
ego_vehicle_bp = random.choice(vehicle_blueprints)
选择车辆的出生点
#获取Carla中所有出生点
birth_point = world.get_map().get_spawn_points()
#随机选择其中一个出生点
transform = random.choice(birth_point)
使用spawn_actor创建车辆。
#创建车辆
ego_vehicle = world.spawn_actor(ego_vehicle_bp, transform)
将车辆设置为“自动驾驶模式”
ego_vehicle.set_autopilot(True)
也可以使用车辆id指定车辆类型:
ego_vehicle_bp = blueprint_library.find('vehicle.mercedes-benz.coupe')
Carla_09.10中可选的车辆类型有:
(id=vehicle.citroen.c3,tags=[vehicle, citroen, c3])
(id=vehicle.chevrolet.impala,tags=[vehicle, chevrolet, impala])
(id=vehicle.audi.a2,tags=[vehicle, audi, a2])
(id=vehicle.nissan.micra,tags=[vehicle, nissan, micra])
(id=vehicle.carlamotors.carlacola,tags=[vehicle, carlamotors, carlacola])
(id=vehicle.audi.tt,tags=[vehicle, audi, tt])
(id=vehicle.bmw.grandtourer,tags=[vehicle, bmw, grandtourer])
(id=vehicle.harley-davidson.low_rider,tags=[vehicle, harley-davidson, low_rider])
(id=vehicle.bmw.isetta,tags=[vehicle, bmw, isetta])
(id=vehicle.dodge_charger.police,tags=[vehicle, dodge_charger, police])
(id=vehicle.jeep.wrangler_rubicon,tags=[vehicle, jeep, wrangler_rubicon])
(id=vehicle.mercedes-benz.coupe,tags=[vehicle, mercedes-benz, coupe])
(id=vehicle.mini.cooperst,tags=[vehicle, mini, cooperst])
(id=vehicle.nissan.patrol,tags=[vehicle, nissan, patrol])
(id=vehicle.seat.leon,tags=[vehicle, seat, leon])
(id=vehicle.toyota.prius,tags=[vehicle, toyota, prius])
(id=vehicle.yamaha.yzf,tags=[vehicle, yamaha, yzf])
(id=vehicle.kawasaki.ninja,tags=[vehicle, kawasaki, ninja])
(id=vehicle.bh.crossbike,tags=[vehicle, bh, crossbike])
(id=vehicle.tesla.model3,tags=[vehicle, tesla, model3])
(id=vehicle.gazelle.omafiets,tags=[vehicle, gazelle, omafiets])
(id=vehicle.tesla.cybertruck,tags=[vehicle, tesla, cybertruck])
(id=vehicle.diamondback.century,tags=[vehicle, century, diamondback])
(id=vehicle.audi.etron,tags=[vehicle, audi, etron])
(id=vehicle.volkswagen.t2,tags=[vehicle, volkswagen, t2])
(id=vehicle.lincoln.mkz2017,tags=[vehicle, lincoln, mkz2017])
(id=vehicle.mustang.mustang,tags=[vehicle, mustang])
4. 创建传感器
选择传感器蓝图
camera_bp = blueprint_library.find('sensor.camera.rgb')
设置传感器参数及位置坐标
#设置传感器参数
camera_bp.set_attribute('image_size_x', '640')
camera_bp.set_attribute('image_size_y', '480')
camera_bp.set_attribute('fov', '110')
camera_bp.set_attribute('sensor_tick', '1.0')
#设置传感器位置坐标
camera_transform = carla.Transform(carla.Location(x=1.5, z=2.4))
创建传感器并将传感器放置在车辆上
#创建传感器,将传感器放置在车上。传感器坐标距离车辆坐标原点的值分别是(1.5,0,2.4)
camera = world.spawn_actor(camera_bp, camera_transform, attach_to=ego_vehicle)
注册回调函数,将传感器添加到传感器列表中
camera.listen(lambda image: sensor_callback(image))
sensor_list.append(camera)
定义sensor_callback
import numpy as np
import cv2
def sensor_callback(sensor_data, sensor_queue, sensor_name):
image = np.array(sensor_data.raw_data).reshape((480, 640, 4))
cv2.imshow("", image)
cv2.waitKey(1)
sensor_queue.put((sensor_data.frame, sensor_name))
Carla_09.10中可选的传感器类型有:
(id=sensor.other.radar,tags=[sensor, radar, other])
(id=sensor.other.collision,tags=[sensor, other, collision])
(id=sensor.camera.depth,tags=[sensor, camera, depth])
(id=sensor.other.lane_invasion,tags=[sensor, lane_invasion, other])
(id=sensor.camera.dvs,tags=[sensor, camera, dvs])
(id=sensor.other.imu,tags=[sensor, other, imu])
(id=sensor.other.gnss,tags=[sensor, other, gnss])
(id=sensor.lidar.ray_cast_semantic,tags=[sensor, lidar, ray_cast_semantic])
(id=sensor.other.obstacle,tags=[sensor, other, obstacle])
(id=sensor.lidar.ray_cast,tags=[sensor, lidar, ray_cast])
(id=sensor.camera.rgb,tags=[sensor, camera, rgb])
(id=sensor.camera.semantic_segmentation,tags=[sensor, camera, semantic_segmentation])
(id=sensor.other.rss,tags=[sensor, rss, other])
5. 运行结果
左图显示的是相机传感器返回的数据,右图是CarlaUE4中显示的画面
6. 收尾工作
代码运行结束,收回创建的车辆与传感器
actor_list = world.get_actors()
vehicle_list = list(actor_list.filter('vehicle.*'))
client.apply_batch([carla.command.DestroyActor(x) for x in vehicle_list])
for sensor in sensor_list:
sensor.destroy()
完整代码
import glob
import os
import sys
import random
import os
from queue import Queue
from queue import Empty
import numpy as np
import cv2
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
def sensor_callback(sensor_data):
image = np.array(sensor_data.raw_data).reshape((480, 640, 4))
cv2.imshow("", image)
cv2.waitKey(1)
def main():
sensor_list = []
try:
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
world = client.get_world()
blueprint_library = world.get_blueprint_library()
# create the ego vehicle
ego_vehicle_bp = blueprint_library.find('vehicle.mercedes-benz.coupe')
# black color
ego_vehicle_bp.set_attribute('color', '0, 0, 0')
# get a random valid occupation in the world
transform = random.choice(world.get_map().get_spawn_points())
# spawn the vehilce
ego_vehicle = world.spawn_actor(ego_vehicle_bp, transform)
# set the vehicle autopilot mode
ego_vehicle.set_autopilot(True)
# add a camera
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera_bp.set_attribute('image_size_x', '640')
camera_bp.set_attribute('image_size_y', '480')
camera_bp.set_attribute('fov', '110')
camera_bp.set_attribute('sensor_tick', '1.0')
camera_transform = carla.Transform(carla.Location(x=1.5, z=2.4))
camera = world.spawn_actor(camera_bp, camera_transform, attach_to=ego_vehicle)
# set the callback function
camera.listen(lambda image: sensor_callback(image))
sensor_list.append(camera)
while True:
world.tick()
finally:
vehicle_list = list(actor_list.filter('vehicle.*'))
client.apply_batch([carla.command.DestroyActor(x) for x in vehicle_list])
for sensor in sensor_list:
sensor.destroy()
print('done.')
if __name__ == '__main__':
try:
main()
except KeyboardInterrupt:
print(' - Exited by user.')