文章目录
- 前言
- 一、目标
- 二、代码内容
- 三、工程搭建
- 1、更改点总览
- 2、工程修改
- 1)代码文件拷贝至目标路径
- 2)SafeDistanceSensor.cpp 修改
- 3)SafeDistanceSerializer.h 修改
- 4)SafeDistanceEvent.h 修改
- 5)Sensor.h 修改
- 6)重编译PythonAPI
- 7) 安装PythonAPI
- 8) make launch
- 9) 设置carla运行fps
- 10) 修改manual_control.py文件
- 3、传感器验证
- 1)运行CARLA
- 2)运行manual_control.py
前言
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 类是一个用于存储安全距离事件数据的类。 |
三、工程搭建
1、更改点总览
2、工程修改
1)代码文件拷贝至目标路径
注意:路径严格按照自己的路径进行
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\
2)SafeDistanceSensor.cpp 修改
将Box->SetHiddenInGame(true);
改为Box->SetHiddenInGame(false);
设置为false之后将安全距离传感器设置到车辆后会有可视化的boudingbox,主要为了方便我们调试;
3)SafeDistanceSerializer.h 修改
将ActorId id = episode.FindActor(actor).GetActorId();
改为 ActorId id = episode.FindCarlaActor(actor)->GetActorId();
老方法已经弃用,不修改会导致编译报错;
4)SafeDistanceEvent.h 修改
将Array<rpc::ActorId>(std::move(data)) {}
改为 Array<rpc::ActorId>(0u, std::move(data)) {}
老方法已经弃用,不修改会导致编译报错;
5)Sensor.h 修改
路径:\UnrealEngine\carla\Unreal\CarlaUE4\Plugins\Carla\Source\Carla\Sensor\Sensor.h
将void Tick(const float DeltaTime) final;
改成void Tick(const float DeltaTime);
,不修改同样会导致编译报错;
6)重编译PythonAPI
打开编译终端输入make clean
,完成后再输入make PythonAPI
;
7) 安装PythonAPI
请注意进入你的dist文件夹
a)终端输入pip uninstall carla
卸载旧的PythonAPI;
b)终端输入pip install .\carla-0.9.14-cp37-cp37m-win_amd64.whl
安装PythonAPI
8) make launch
终端输入make launch
进入unreal engine界面
9) 设置carla运行fps
这个是要设置,如果不设置的话,carla client的fps会极低;
10) 修改manual_control.py文件
修改这个的作用主要用于验证安全距离传感器是否生效,至于为什么要加到这里是因为,可以通过按键移动和调整车辆位置
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)
函数调用,位置可以按照我的样式加;
3、传感器验证
1)运行CARLA
2)运行manual_control.py
运行manual_control.py
并且移动自车到目标车,靠近目标车后,会自动打印Vehicle too close: vehicle.audi.a2
;
综上,完成了carla 自定义的传感器开发,写到 这里已经有点累了,晚安。