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

news2025/1/10 16:29:36

文章目录

  • 前言
  • 一、目标
  • 二、代码内容
  • 三、工程搭建
    • 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.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 自定义的传感器开发,写到 这里已经有点累了,晚安。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969301.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大数据技术原理-NoSQL数据库的应用

摘要 本实验报告聚焦于"大数据技术原理"课程中的NoSQL数据库实验。实验环境包括MySQL、Redis、MongoDB、Java以及Hadoop。实验内容涉及Redis和MongoDB的安装、配置和基本操作&#xff0c;包括数据的插入、删除和查询。此外&#xff0c;实验还包括使用Java API对Mong…

【统计全为 1 的正方形子矩阵】python刷题记录

R3-分治篇 class Solution:def countSquares(self, matrix: List[List[int]]) -> int:rowlen(matrix)collen(matrix[0])dp[[0]*(col1) for _ in range(row1)]ret0for i in range(row):for j in range(col):if matrix[i][j]1:dp[i1][j1]min(dp[i][j1],dp[i1][j],dp[i][j])1re…

umi-request全局响应拦截器

文章目录 介绍思路实现方法1.直接修改 umi-request方法2.自定义 request 实例&#xff0c;通过 umi-request 库进行配置 介绍 后端设计统一返回比如BaseResponse对象&#xff0c;前端也需要接收这个对象&#xff0c;从data取出想要的返回值。 前端请求比如之前返回的是numbe…

windows子系统wsl完成本地化设置locale,LC_ALL

在 Windows 的子系统 Linux&#xff08;WSL&#xff09;环境中&#xff0c;解决本地化设置问题可以采取以下步骤&#xff1a; 1. **检查本地化设置**&#xff1a; 打开你的 WSL 终端&#xff08;比如 Ubuntu、Debian 等&#xff09;&#xff0c;运行以下命令来查看当前的本…

大数据技术基础编程、实验和案例----大数据课程综合实验案例

一、实验目的 (1&#xff09;熟悉Linux系统、MySQL、Hadoop、HBase、Hive、Sqoop、R、Eclipse等系统和软件的安装和使用&#xff1b; (2&#xff09;了解大数据处理的基本流程&#xff1b; (3&#xff09;熟悉数据预处理方法&#xff1b; (4&#xff09;熟悉在不同类型数据库之…

湖南(用户洞察)源点咨询 论用户画像于精准营销之意义作用

湖南源点市场调研咨询认为&#xff0c;精准描摹用户画像是实现有效获客的重要方法。 因为只有通过用户画像&#xff0c;我们才能够持续不断了解用户现阶段的需求&#xff0c;痛点以及偏好。 用户画像不是简单的理解为对人群打标签&#xff0c;而是要通过大量的数据采集和分析…

螺旋文字滚动特效源码解析

如图所示&#xff0c;今天看到一个很炫酷的双文字螺旋滚动特效&#xff0c;两行文字呈螺旋状变化&#xff0c;在网站中这样的效果对用户很有吸引力。本文将基于原网站解析如何实现这个炫酷的效果&#xff0c;基于这个动图可以分析出需要实现的要点&#xff1a; 文字呈螺旋状滚…

管理流创建schema流程源码解析

一、简析 schema是pulsar重要的功能之一&#xff0c;现在就一起从源码的视角看下管理流创建schema时客户端和服务端的表现 客户端 客户端主要经历以下四个步骤 创建Schema实例 根据数据类型创建相对应的实例&#xff0c;例如Avro创建AvroSchema、JSON创建JSONSchema等 获取…

1.1、centos stream 9安装Kubernetes v1.30集群 环境说明

最近正在学习kubernetes&#xff0c;买了一套《Kubernetes权威指南 从Docker到Kubernetes实践全接触(第六版)》这本书讲得很好&#xff0c;上下两册&#xff0c;书中k8s的版本是V1.29&#xff0c;目前官网最新版本是v1.30。强烈建议大家买一套看看。 Kubernetes官网地址&#x…

jenkins使用docker api配置自签证书 +发布项目

配置证书 1、创建目录/etc/docker/certs&#xff0c; 在该目录下执行下列命令 openssl genrsa -aes256 -out ca-key.pem 4096 openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pemopenssl genrsa -out server-key.pem 4096 \ openssl req -subj "/…

常见的应急救援设备有哪些_鼎跃安全

在我们的生活中&#xff0c;应急事件的发生常常是突如其来的&#xff0c;它们对人民的生命财产安全构成重大威胁&#xff0c;同时也对社会稳定提出严峻挑战。在这样的紧急情况下&#xff0c;迅速开展有效的救援工作显得尤为重要。而在整个救援过程中&#xff0c;应急设备的使用…

【简历】湘南某二本学院:前端简历指导,秋招面试通过率低

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 这是一份25届二本同学的前端简历&#xff0c;但是这个简历&#xff0c;因为学校是个二本的专业&#xff0c;虽然说主体是在小公司&#x…

计算机基础(Windows 10+Office 2016)教程 —— 第6章 电子表格软件Excel 2016(下)

电子表格软件Excel 2016 6.4 Excel 2016的公式与函数6.4.1 公式的概念6.4.2 公式的使用6.4.3 单元格的引用6.4.4 函数的使用6.4.5 快速计算与自动求和 6.5 Excel 2016的数据管理6.5.1 数据排序6.5.2 数据筛选6.5.3 分类汇总6.5.4 分组显示6.5.5 合并计算 6.6 Excel 2016的图表6…

什么品牌的开放式耳机好用?南卡、韶音、漫步者 三款口碑超群机型横评

现如今耳机几乎成为了日常标配&#xff0c;因为选择合适的耳机成为我们不可忽视的需求。开放式耳机凭借其既能沉浸于高品质音乐&#xff0c;又能保持对周围环境的敏锐感知的独特优势&#xff0c;在市场中脱颖而出&#xff0c;尤其受到运动爱好者及追求生活品质的朋友们的喜爱。…

风吸杀虫灯采用新型技术 无公害诱虫捕虫

TH-FD2S】风吸杀虫灯利用害虫的趋光性和对特定波长的光源&#xff08;如紫外光、蓝光&#xff09;的敏感性&#xff0c;通过光波引诱害虫成虫扑灯。同时&#xff0c;内置的风扇产生强烈的气流&#xff0c;形成负压区&#xff0c;将害虫迅速吸入到收集器中。害虫在收集器内被风干…

排序算法:快速排序,golang实现

目录 前言 快速排序 代码示例 1. 算法包 2. 快速排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 快速排序的思想 快速排序的实现逻辑 1. 选择基准值 (Pivot) 2. 分区操作 (Partition) 3. 递归排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行…

从入门到自动化:一篇文章掌握Python的80%

Python作为一种高级编程语言&#xff0c;以其简洁明了的语法和强大的功能性&#xff0c;在全球编程社区内享有极高的声誉。本文将带领你从Python的基础语法入手&#xff0c;介绍其常用库的应用&#xff0c;以及如何将Python用于数据分析、网络爬虫和简单的自动化任务&#xff0…

模板(c++)part2

目录 1.非类型模板参数 2.特化 2.1函数模板特化 2.2类模板特化 2.2.1全特化 2.2.2偏特化 3.模板分离编译 1.非类型模板参数 注意&#xff0c;假如 #define N 10 template<class T> class A { private:T a[N]; }; 这样的一个类模板&#xff0c;a数组的大小是定死的 …

canvas绘制表格

canvas绘制表格 最近在为公司产品做技术预研&#xff0c;经理让用canvas做一个表格&#xff0c;于是就有了这篇博客。 我们的数据是后端通过MQTT推送过来的 我在代码中也直接使用了 具体MQTT的实现代码&#xff0c;可见博客 在vue使用MQTT 在这里为了方便实用我直接封装成组件…

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组⑥ | 11.15 - 11.17

前言 第11章对应的内容选择题和案例分析都会进行考查&#xff0c;这一章节属于10大管理的内容&#xff0c;学习要以教材为准。本章上午题分值预计在15分。 目录 11.15 规划资源管理 11.15.1 主要输入 11.15.2 主要工具与技术 11.15.3 主要输出 11.16 估算活动资源 11.1…