Carla传感器

1.介绍

Carla中传感器类别多种多样,不同传感器数据之间也存在差异。但是传感器的使用方法之间存在一致性。本文介绍Carla中传感器使用的通用方法。有关传感器的描述可以在carla.Sensor类中查看

2. 传感器的通用方法

在介绍传感器的通用方法之前,需要明确传感器在什么时候获取数据以及如何获取数据。

1、获取数据的时间(WHEN)
传感器数据的获取时间取决于传感器的类型。部分传感器的在每一个时间步中获取数据,部分传感器通过特定事件触发获取数据。

在每一个时间步中获取数据:
	 - Depth camera.
	 - Gnss sensor.
	 - IMU sensor.
	 - Lidar raycast.
	 - SemanticLidar raycast.
	 - Radar.
	 - RGB camera.
	 - RSS sensor.
	 - Semantic Segmentation camera

通过特定事件触发获取数据:
 - Collision detector.
 - Lane invasion detector.
 - Obstacle detector

2、如何获取数据(HOW)
每种类型的传感器都有一个listen方法, 使用listen方法获取并处理传感器获取的数据。

1. 设置传感器参数

传感器参数决定了获取数据的质量,可修改的传感器参数见Carla官方文档。Carla中支持的传感器类型:
Carla中支持的传感器类型
相机传感器中部分可设置的参数:
在这里插入图片描述
在蓝图中设置相机的参数:

# 获取指定传感器的蓝图.
blueprint = world.get_blueprint_library().find('sensor.camera.rgb')
# 修改蓝图的属性以设置图像分辨率和视场角。
blueprint.set_attribute('image_size_x', '1920')
blueprint.set_attribute('image_size_y', '1080')
blueprint.set_attribute('fov', '110')
# 每隔1秒拍摄1次图片
blueprint.set_attribute('sensor_tick', '1.0')

2. 安装传感器

spawn_actor方法中使用attachment_toattachment_type参数将相机传感器按装到车辆上

transform = carla.Transform(carla.Location(x=0.8, z=1.7))

# 以下两种方式等价
sensor = world.spawn_actor(blueprint, transform, attach_to=my_vehicle, attachment_type=Attachment.Rigid)
sensor = world.spawn_actor(blueprint, transform, attach_to=my_vehicle)
attachment_to:决定传感器安装的对象,一般设置为目标车辆
attachment:决定传感器相对车辆的位移,可选参数为Rigid和SpringArm
	Rigid:默认值,传感器相对车辆的位移是固定的
	SpringArm:传感器相对车辆的位移不固定,传感器可在一定范围内移动。
	
个人理解:在实车上固定传感器时,Rigid与SpringArm描述固定螺丝的松紧程度。Rigid相当于固定螺丝拧的紧一点,SpringArm相当于固定螺丝拧的松一点。

原文描述:

Rigid attachment:Movement is strict regarding its parent location. This is the proper attachment to retrieve data from the simulation.
SpringArm attachment:Movement is eased with little accelerations and decelerations. This attachment is only recommended to record videos from the simulation. The movement is smooth and “hops” are avoided when updating the cameras’ positions.

3.监听数据

传感器每次获取新数据时均会调用listen方法中的回调函数,对获取的数据进行处理。

# 自定义的数据处理方法
def sensor_callback(image):
    do_something
    
# 监听传感器数据,并对获取的数据进行处理。
camera.listen(lambda image: sensor_callback(image))

4. 数据

不同传感器数据之间存在不同的差异,但是传感器数据之间也存在相同的属性。通用属性如下所示:

通用属性类型描述
frameint帧数
timestampdouble时间戳
transformcarla.Transform获取数据时传感器的位姿

3. 代码示例

以下代码将在Carla中创建车辆,并将相机传感器安装到创建的车辆上,并展示获取的相机数据。

import glob
import os
import sys
import random
import os
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()

		# 创建车辆
        ego_vehicle_bp = blueprint_library.find('vehicle.mercedes-benz.coupe')
        transform = random.choice(world.get_map().get_spawn_points())
        ego_vehicle = world.spawn_actor(ego_vehicle_bp, transform)
        ego_vehicle.set_autopilot(True)

		# 获取相机蓝图
        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)
        # 监听数据
        camera.listen(lambda image: sensor_callback(image))
        sensor_list.append(camera)


        while True:
            spectator = world.get_spectator()
            transform = ego_vehicle.get_transform()
            spectator.set_transform(carla.Transform(transform.location + carla.Location(z=100),
                                                    carla.Rotation(pitch=-90)))

    finally:
        print('destroying actors')
        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()
        print('done.')


if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print(' - Exited by user.')

参考:Carla官方文档——传感器

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值