在Carla中创建车辆及传感器

1. 启动Carla服务器

在电脑中找到CarlaUE4.exe文件,双加运行。
CarlaUE4.exe
出现如下画面,说明Carla运行成功
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.')

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值