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中支持的传感器类型:
相机传感器中部分可设置的参数:
在蓝图中设置相机的参数:
# 获取指定传感器的蓝图.
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_to和attachment_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. 数据
不同传感器数据之间存在不同的差异,但是传感器数据之间也存在相同的属性。通用属性如下所示:
通用属性 | 类型 | 描述 |
---|---|---|
frame | int | 帧数 |
timestamp | double | 时间戳 |
transform | carla.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官方文档——传感器