问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Carla Unreal Engine源码:如何自定义开发传感器

创作时间:
作者:
@小白创作中心

Carla Unreal Engine源码:如何自定义开发传感器

引用
CSDN
1.
https://blog.csdn.net/zataji/article/details/140858585

Carla是一个开源的自动驾驶模拟器,广泛用于自动驾驶研究和开发。它基于Unreal Engine构建,提供了丰富的传感器接口。然而,有时我们可能需要自定义传感器以满足特定的仿真需求。本文将介绍如何在Carla和Unreal Engine中自定义开发传感器。

一、目标

本文主要讲解如何在carla源码中增加一个安全距离传感器,这个传感器定义了一个安全区域,当有目标侵入区域传感器则工作并且探测到。开发难点在于官方提供的案例比较旧,存在较多的坑,如果按照官方的教程100%编译会出错,所以写这篇文章来和大家分享整个搭建过程。

二、代码内容

  1. 下载安全传感器实现代码,共
  • SafeDistanceSensor.h
  • SafeDistanceSensor.cpp
  • SafeDistanceSerializer.h
  • SafeDistanceSerializer.cpp
  • SafeDistanceEvent.h
    五个文件;

  1. 代码的作用
文件名
作用描述
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 修改


Arrayrpc::ActorId(std::move(data)) {};
改为
Arrayrpc::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 自定义的传感器开发。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号