赞
踩
Carla是一个开源的自动驾驶模拟器,广泛用于自动驾驶研究和开发。它基于Unreal Engine构建,提供了丰富的传感器接口。然而,有时我们可能需要自定义传感器以满足特定的仿真需求。本文将介绍如何在Carla和Unreal Engine中自定义开发传感器。
本文主要讲解如何在carla源码中增加一个安全距离传感器,这个传感器定义了一个安全区域,当有目标侵入区域传感器则工作并且探测到。开发难点在于官方提供的案例比较旧,存在较多的坑,如果按照官方的教程100%编译会出错,所以写这篇文章来和大家分享整个搭建过程。
1、下载安全传感器实现代码,共SafeDistanceSensor.h
、SafeDistanceSensor.cpp
、 SafeDistanceSerializer.h
、 SafeDistanceSerializer.cpp
、SafeDistanceEvent.h
五个文件;
2、代码的作用
文件名 | 作用描述 |
---|---|
SafeDistanceSensor.h | 声明自定义传感器类 ASafeDistanceSensor ,如标记类为Unreal Engine类、声明构造函数、重写基类函数、将参数接口暴露到Unreal Engine。 |
SafeDistanceSensor.cpp | 实现自定义传感器类 ASafeDistanceSensor 具体功能,如创建UBoxComponent组件、定义传感器的属性和默认值、设置传感器的所有者、周期更新发送数据等。 |
SafeDistanceSerializer.h | 实现数据序列化类 SafeDistanceSerializer 的具体功能,序列化函数 Serialize 将检测到的演员列表转换为一个二进制缓冲区,方便在网络上传输或存储。 |
SafeDistanceSerializer.cpp | 实现了 SafeDistanceSerializer 类的 Deserialize 方法,用于将原始传感器数据反序列化为 SafeDistanceEvent 对象 |
SafeDistanceEvent.h | SafeDistanceEvent 类是一个用于存储安全距离事件数据的类。 |
注意:路径严格按照自己的路径进行
a)将SafeDistanceSensor.h
与SafeDistanceSensor.cpp
拷贝至:\UnrealEngine\carla\Unreal\CarlaUE4\Plugins\Carla\Source\Carla\Sensor\
b)将SafeDistanceSerializer.h
与SafeDistanceSerializer.cpp
拷贝至:\UnrealEngine\carla\LibCarla\source\carla\sensor\s11n
c)将SafeDistanceEvent.h
拷贝至:\UnrealEngine\carla\LibCarla\source\carla\sensor\data
d)将SensorData.cpp
拷贝至:\UnrealEngine\carla\PythonAPI\carla\source\libcarla
e)将SensorRegistry.h
拷贝至:\UnrealEngine\carla\LibCarla\source\carla\sensor\
将Box->SetHiddenInGame(true);
改为Box->SetHiddenInGame(false);
设置为false之后将安全距离传感器设置到车辆后会有可视化的boudingbox,主要为了方便我们调试;
将ActorId id = episode.FindActor(actor).GetActorId();
改为 ActorId id = episode.FindCarlaActor(actor)->GetActorId();
老方法已经弃用,不修改会导致编译报错;
将Array<rpc::ActorId>(std::move(data)) {}
改为 Array<rpc::ActorId>(0u, std::move(data)) {}
老方法已经弃用,不修改会导致编译报错;
路径:\UnrealEngine\carla\Unreal\CarlaUE4\Plugins\Carla\Source\Carla\Sensor\Sensor.h
将void Tick(const float DeltaTime) final;
改成void Tick(const float DeltaTime);
,不修改同样会导致编译报错;
打开编译终端输入make clean
,完成后再输入make PythonAPI
;
请注意进入你的dist文件夹
a)终端输入pip uninstall carla
卸载旧的PythonAPI;
b)终端输入pip install .\carla-0.9.14-cp37-cp37m-win_amd64.whl
安装PythonAPI
终端输入make launch
进入unreal engine界面
这个是要设置,如果不设置的话,carla client的fps会极低;
修改这个的作用主要用于验证安全距离传感器是否生效,至于为什么要加到这里是因为,可以通过按键移动和调整车辆位置
a)创建SafeDistanceSensor
的类,用于生成创建安全距离传感器以及注册回调函数,当有目标进入安全区域则会回调_in_detection_zone
函数;
class SafeDistanceSensor(object):
def __init__(self, parent_actor):
self._parent = parent_actor
self.world = self._parent.get_world()
bp = self.world.get_blueprint_library().find('sensor.other.safe_distance')
self.sensor = self.world.spawn_actor(bp, carla.Transform(), attach_to=self._parent)
self.world_ref = weakref.ref(self.world)
self.sensor.listen(self._in_detection_zone)
def _in_detection_zone(self, event):
world = self.world_ref()
for actor_id in event:
vehicle = world.get_actor(actor_id)
print('Vehicle too close: %s' % vehicle.type_id)
位置就随便加在CollisionSensor
类上面吧
b)增加custom_spawn_actor函数到class World(object)
这个类中,这个函数用于生成目标车辆到自车前方20m,方便制造调试场景;
def custom_spawn_actor(self): blueprint_library = self.world.get_blueprint_library() vehicle_bp = blueprint_library.filter('vehicle.*')[0] # 获取自车的变换(位置和旋转) transform = self.player.get_transform() # 计算目标车的生成位置(在自车前方20米) forward_vector = transform.get_forward_vector() spawn_location = transform.location + carla.Location(forward_vector.x * 20, forward_vector.y * 20, forward_vector.z * 20) # 生成目标车 spawn_transform = carla.Transform(spawn_location, transform.rotation) target_vehicle = self.world.spawn_actor(vehicle_bp, spawn_transform) if target_vehicle: print(f"Spawned target vehicle at {spawn_transform.location}") else: print("Failed to spawn target vehicle") return target_vehicle
位置就随便加在next_weather
函数上面吧
c)在class World(object)
类的__init__(self, carla_world, hud, args)
加入变量定义self.safedistance_sensor = None
,就加在__init__(self, carla_world, hud, args)
函数的最末尾就行了;
d)在restart(self)
函数中加入self.custom_spawn_actor()
和self.safedistance_sensor = SafeDistanceSensor(self.player)
函数调用,位置可以按照我的样式加;
运行manual_control.py
并且移动自车到目标车,靠近目标车后,会自动打印Vehicle too close: vehicle.audi.a2
;
综上,完成了carla 自定义的传感器开发,写到 这里已经有点累了,晚安。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。