carla unreal engine源码:如何自定义开发传感器


前言

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


一、目标

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

点击进入官网搭建教程


二、代码内容

点击跳转进入下载源码

1、下载安全传感器实现代码,共SafeDistanceSensor.hSafeDistanceSensor.cppSafeDistanceSerializer.hSafeDistanceSerializer.cppSafeDistanceEvent.h 五个文件;

在这里插入图片描述


2、代码的作用

文件名作用描述
SafeDistanceSensor.h声明自定义传感器类 ASafeDistanceSensor,如标记类为Unreal Engine类、声明构造函数、重写基类函数、将参数接口暴露到Unreal Engine。
SafeDistanceSensor.cpp实现自定义传感器类 ASafeDistanceSensor具体功能,如创建UBoxComponent组件、定义传感器的属性和默认值、设置传感器的所有者、周期更新发送数据等。
SafeDistanceSerializer.h实现数据序列化类 SafeDistanceSerializer 的具体功能,序列化函数 Serialize 将检测到的演员列表转换为一个二进制缓冲区,方便在网络上传输或存储。
SafeDistanceSerializer.cpp实现了 SafeDistanceSerializer 类的 Deserialize 方法,用于将原始传感器数据反序列化为 SafeDistanceEvent 对象
SafeDistanceEvent.hSafeDistanceEvent 类是一个用于存储安全距离事件数据的类。

三、工程搭建

1、更改点总览

在这里插入图片描述

在这里插入图片描述


2、工程修改

1)代码文件拷贝至目标路径

注意:路径严格按照自己的路径进行

a)将SafeDistanceSensor.hSafeDistanceSensor.cpp拷贝至:\UnrealEngine\carla\Unreal\CarlaUE4\Plugins\Carla\Source\Carla\Sensor\

b)将SafeDistanceSerializer.hSafeDistanceSerializer.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.hvoid 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 自定义的传感器开发,写到 这里已经有点累了,晚安。

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自动驾驶simulation

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值