carla unreal engine源码:如何创建radar可视化探测锥

embedded/2024/9/20 1:20:46/ 标签: 虚幻, c++, 自动驾驶仿真, carla

文章目录

  • 前言
  • 一、C++实现方法
      • 1、DrawDebugCone函数
      • 2、carla工程修改
      • 3、make launch
      • 4、探测锥验证
  • 二、蓝图实现方法
      • 1、创建并打开蓝图
      • 2、打开蓝图事件图表
      • 3、绘制蓝图事件
      • 4、编译再运行


前言

1、在自动驾驶仿真调试以及测试过程中,我们经常会用到雷达的探测锥,能够很直观地看到目标是否在雷达探测范围内。
2、而在unreal engine中可视化探测锥体其实很简单,有两种方法,一种是通过创建蓝图的方法,一种是调用C++函数,这篇文章简单讲一下两种方法的实现。

在这里插入图片描述


一、C++实现方法

1、DrawDebugCone函数

其实就是Unreal engine用于绘制调试锥体的函数;

void DrawDebugCone(const UWorld* InWorld, FVector const& Origin, FVector const& Direction, float Length, float AngleWidth, float AngleHeight, int32 NumSides, FColor const& Color, bool bPersistentLines=false, float LifeTime=-1.f, uint8 DepthPriority = 0, float Thickness = 0.f)
参数名描述
InWorldcarla当前世界
Origin探测锥的起始位置
Direction探测锥的方向
Length探测锥的长度,即探测的最远距离
AngleWidth水平FOV`
AngleHeight垂直FOV`
NumSides探测射线的数量
Color探测射线的颜色
bPersistentLines是否不持久显示
LifeTime生存周期,-1表示永久存在
Thickness射线的粗细

carla_39">2、carla工程修改

1)找到对应路径下的:\unrealengine\carla\Unreal\CarlaUE4\Plugins\Carla\Source\Carla\Sensor\Radar.h,在private加入函数定义void DrawRadarCone();,如下图所示:

在这里插入图片描述


2)找到对应路径下的:\UnrealEngine\carla\Unreal\CarlaUE4\Plugins\Carla\Source\Carla\Sensor\Radar.cpp,将#include "Runtime/Engine/Public/DrawDebugHelpers.h"添加到上方,如下图所示:

在这里插入图片描述


3)找到对应路径下的:\UnrealEngine\carla\Unreal\CarlaUE4\Plugins\Carla\Source\Carla\Sensor\Radar.cpp,将下述代码复制到Radar.cpp的最下方;

void ARadar::DrawRadarCone() {FVector Origin = GetActorLocation(); // 获取雷达位置FVector Direction = GetActorForwardVector(); // 获取雷达前向矢量float Length = Range; // 雷达锥体探测范围float AngleWidth =FMath::DegreesToRadians(HorizontalFOV); // 横向FOV(度数转弧度)float AngleHeight =FMath::DegreesToRadians(VerticalFOV); // 纵向FOV(度数转弧度)int32 NumSides = 100; // 锥体的边数FColor Color = FColor::Yellow;  // 锥体的颜色DrawDebugCone(GetWorld(), Origin, Direction, Length,AngleWidth, AngleHeight,NumSides,Color,false, // 不持久显示-1.0f, // 持续时间(-1 表示不自动移除)0      // 射线的粗细程度);
}

在这里插入图片描述


4)在void ARadar::PostPhysTick(UWorld *World, ELevelTick TickType, float DeltaTime) 函数中加入对DrawRadarCone();的调用,如下图所示:

在这里插入图片描述


3、make launch

在这里插入图片描述
在这里插入图片描述

4、探测锥验证

1)需要编写python脚本生成radar,生成radar后会根据实际的fov参数可视化探测锥。

import carla
import random
import timedef set_spectator(carla_world, vehicle):carla_world.get_spectator().set_transform(carla.Transform(vehicle.get_transform().location +carla.Location(z=50), carla.Rotation(pitch=-90)))def main():# 连接到CARLA服务器client = carla.Client('localhost', 2000)client.set_timeout(10.0)# 获取仿真世界world = client.get_world()# 获取蓝图库blueprint_library = world.get_blueprint_library()# 选择车辆蓝图vehicle_bp = blueprint_library.filter('vehicle.*')[0]# 选择一个随机的起始位置spawn_points = world.get_map().get_spawn_points()spawn_point = random.choice(spawn_points)# 生成车辆vehicle = world.spawn_actor(vehicle_bp, spawn_point)set_spectator(world, vehicle)# 选择雷达蓝图radar_bp = blueprint_library.find('sensor.other.radar')# 设置雷达属性radar_bp.set_attribute('horizontal_fov', '30')  # 水平视场角radar_bp.set_attribute('vertical_fov', '10')    # 垂直视场角radar_bp.set_attribute('range', '20')           # 检测范围# 设置雷达的位置和方向radar_transform = carla.Transform(carla.Location(x=2.0, z=1.0))# 生成雷达传感器并附加到车辆上radar_sensor = world.spawn_actor(radar_bp, radar_transform, attach_to=vehicle)# 定义雷达数据处理回调函数def radar_callback(data):for detection in data:print(f"Detected object at distance: {detection.depth} meters")# 绑定回调函数到雷达传感器radar_sensor.listen(radar_callback)# 让仿真运行一段时间try:while True:time.sleep(1)except KeyboardInterrupt:passfinally:# 清理radar_sensor.stop()radar_sensor.destroy()vehicle.destroy()if __name__ == '__main__':main()

2)运行carla unreal engine以及python脚本

在这里插入图片描述

二、蓝图实现方法

1、创建并打开蓝图

1)创建空actor,编辑并选择蓝图,以camera为例,选择cameraActor;
在这里插入图片描述

2、打开蓝图事件图表

1、carla中一般不用蓝图的方法去实现,这里简单提供个方法,在蓝图的事件图表中设置;
在这里插入图片描述


3、绘制蓝图事件

在这里插入图片描述

4、编译再运行


综上,完成两种探测锥体的实现,如有问题及时沟通;


http://www.ppmy.cn/embedded/104508.html

相关文章

第三方软件测评中心分享:科技成果鉴定测试的必要性和流程

在飞速发展的科技时代,科技成果的保护和应用愈发重要,科技成果鉴定测试已经成为衡量和验证项目成功的重要环节。科技成果鉴定测试是指对科技项目成果进行评估、验证和认可的过程。这一过程通常由专家团队主导,旨在确保科技产品或研究成果达到…

Transformer直接预测完整数学表达式,推理速度提高多个数量级

前言 来自 Mata AI、法国索邦大学、巴黎高师的研究者成功让 Transformer 直接预测出完整的数学表达式。 转载自丨机器之心 符号回归,即根据观察函数值来预测函数数学表达式的任务,通常涉及两步过程:预测表达式的「主干」并选择数值常数&am…

1999-2023年上市公司年报文本数据(PDF+TXT)

1999-2023年上市公司年报文本数据(PDFTXT) 1、时间:1999-2023年 2、来源:上市公司年度报告 3、范围:A股上市公司,5600企业,6.3W份 4、格式:PDFTXT 5、下载链接: 199…

rknntoolkitlite2环境搭建

前言 RKNN Toolkit Lite2 工具支持运行在 RK3568: Debian10/Debian11(aarch64)、Ubuntu20/22(aarch64) RK3588: Debian10/Debian11(aarch64)、Ubuntu20/22(aarch64) 开发板上系统 p…

docke实战扩展二(docker build -t nginx:latest . 实战详解)

docker build -t nginx:latest . 是 Docker 中用于构建镜像的命令。下面我们来详细解释这个命令,并通过一个具体的生产案例来演示其实际应用。 命令解释 docker build:这是 Docker CLI 中用于构建镜像的命令。-t nginx:latest:这是为构建的镜像指定标签(tag)。-t 是 --ta…

【Python-办公自动化】批量修改EXCEL指定内容

欢迎来到"花花 Show Python",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。 自我介绍: 我热衷于将复杂的技术概念以简单易懂…

路径优化 minimum-snap(对A*的全局路径进行优化)

实现效果: 介绍: 使用Astar进行路径规划,使用minimum-snap进行路径优化处理,建议参考文章: 【附源码和详细的公式推导】Minimum Snap轨迹生成,闭式求解Minimum Snap问题,机器人轨迹优化&#…

Python实战项目:天气数据爬取+数据可视化(完整代码)_python爬虫实战

一、选题的背景 随着人们对天气的关注逐渐增加,天气预报数据的获取与可视化成为了当今的热门话题,天气预报我们每天都会关注,天气情况会影响到我们日常的增减衣物、出行安排等。每天的气温、相对湿度、降水量以及风向风速是关注的焦点。通过…

【回炉重造】企业流行的Java版本

Java Definition First Thing First Java 由一组规范、JSR和JEP定义,均由 Oracle 发布, 这些规范是在OpenJDK项目的源代码中实现的。 有多家供应商提供该源代码的版本。有些供应商会对这些版本收费,有些则不收费。 供应商包括 Azul、SAP、Amazon、M…

Spring Boot 项目打包及在宝塔面板上部署的简易指南

准备工作 一个可以访问的服务器,已安装宝塔面板。Java开发环境(JDK)已安装在服务器上。Maven或Gradle等构建工具,用于打包 Spring Boot 项目,我这里用的是 Maven集成开发环境,我这里使用的是IntelliJ IDEA…

多线程——概念

​ 进程 操作系统中进行资源分配的基本单位,进程就是进行中的程序,处于运行过程中的。 三个基本特征: 独立性:进程是独立运行,独立获取资源,独立接收调度的基本单。没有进程本身的统一,其他…

基于springboot+MySQL的图书管理系统的设计与实现-计算机毕设 附源码 13714

基于springboot的图书管理系统的设计与实现 目 录 摘要 1 绪论 1.1 研究背景与意义 1.2开发现状 1.3论文结构与章节安排 2 图书管理系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 …

一文看懂Kafka事务实现原理!

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 免责声明~ 任何文章不要过度深思!万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案…

科研绘图系列:python语言密度分布图(density plot)

介绍 密度分布图是一种统计图表,用于表示数据的分布情况。它通常用于展示变量的频率分布,但与直方图不同,密度分布图通过平滑曲线来表示数据的分布,而不是用柱状图来表示。这种图表可以更直观地展示数据的分布形状,如是否对称、是否多峰等。 在密度分布图中,横轴代表数…

Android在子线程中更新UI

Android在子线程中更新UI 和许多其他的GUI库一样,Android的UI也是线程不安全的。也就是说,如果想要更新应用程序里的UI元素,则必须在主线程中进行,否则就会出现异常。 眼见为实,让我们通过一个具体的例子来验证一下吧…

无法连接Redis服务问题排查

1. 检查 Redis 服务器是否正在运行 首先,确保 Redis 服务器正在运行。你可以在服务器或本地机器上运行以下命令来检查 Redis 服务器的状态: redis-cli ping 如果返回 PONG,说明 Redis 服务器正在运行。如果无法连接,则可能需要…

ACL学习笔记

1.ACL快速配置 需求:拒绝PC 1访问PC 3 (1)配置PC PC 1: PC 2: PC 3: (2)配置R1的接口IP信息 sys sysname R1 undo info-center enable interface GigabitEthernet0/0/0 ip address 192.168.1.1 255.255.255.0 qui…

Cypress 调用后端能力 task

在 Cypress 中的测试都是在前端运行的, 一些后端的操作是不可以直接调用的, 例如 fs, 但是可以通过 task 作为桥梁进行调用. 1. 在 cypress.config.js 中配置 e2e: {setupNodeEvents(on, config) {plugins(on, config);},2. 在 plugins/index.js 中实现 const fs require(&q…

C++:泛型如何使用

在 C 中,泛型(或模板)是一种强大的编程机制,用于编写可以处理不同数据类型的通用代码。泛型通过模板实现,使得代码在编译时生成具体类型的实现。主要有两种类型的模板:函数模板 和 类模板。 函数模板 函数…

[随便学学]在doker服务器中实现ssh免密登陆

前言:最近登陆服务器,发现每次都需要输密码。所以想看看有没有一劳永逸的办法,能够不输密码。免密登陆。 ssh(secure shell)是一种网络协议,用于在不安全的网络中建立安全的远程连接。ssh无密码登陆是通过公…