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

server/2024/9/20 1:25:12/ 标签: 虚幻, 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/server/107513.html

相关文章

12、stm32通过dht11读取温湿度

一、配置 二、代码 dht11.c /** dht11.c** Created on: Aug 19, 2024* Author: Administrator*/#include "main.h" #include "tim.h" #include "usart.h" #include "gpio.h" /**TIM3定时器实现us级延时*/ void Delay_us(uint16…

ZooKeeper 实战(六) - 分布式ID实现方案

ZooKeeper 实战(六) - 生成分布式ID 文章目录 ZooKeeper 实战(六) - 生成分布式ID1.何为分布式ID2.分布式ID方案3.创建ZooKeeper节点4.获取序列ID5.处理序列ID6.使用分布式ID7.完整代码8.功能优化8.1.问题思考?1.容量问题2.并发问题3.内存问题 8.2.解决并发问题8.3.…

python基础(11文件读取)

python系列文章目录 python基础(01变量&数据类型&运算符) python基础(02序列共性) python基础(03列表和元组) python基础(04字符串&字典) python基础(05集合set) pytho…

经验笔记:基于Token的身份认证及其安全性探讨

经验笔记:基于Token的身份认证及其安全性探讨 随着互联网应用的发展,安全可靠的身份认证变得越来越重要。传统的用户名/密码组合虽然简单易行,但存在诸多安全隐患,尤其是在大规模分布式系统中。因此,基于Token的身份认…

django学习入门系列之第十点《django的模板语法》

文章目录 获取请求与响应request获取请求方式在url中传递值在结构体中传递值返回一个值读取HTML中的内容 重定向(跳转网页)往期回顾 获取请求与响应 request request是一个对象,封装了用户通过浏览器发送过来的所有数据获取请求方式 获取请…

【C++】C++ STL 探索:String的使用与理解

C语法相关知识点可以通过点击以下链接进行学习一起加油!命名空间缺省参数与函数重载C相关特性类和对象-上篇类和对象-中篇类和对象-下篇日期类C/C内存管理模板初阶 这篇文章将带大家深入探讨C STL中的string使用与理解。在接下来的几篇文章中,我们将介绍…

点云数据介绍

本篇内容 通过PCD文件介绍点云数据如何通过PCL库读取和保存PCD点云数据文件 1 点云数据 最简单的点云数据就是一堆三维坐标点(x,y,z),除了坐标还可以记录每个点的颜色信息(r,g,b),或者强度信息&#xff…

【设计模式-装饰】

定义 装饰模式是一种结构型设计模式,它允许在不改变对象自身的前提下动态地给对象添加职责(功能)。通过使用装饰模式,可以将对象的功能扩展变得更加灵活和可维护,同时避免了类继承的复杂性。 特点 动态扩展对象功能…

【加密算法】有关国密4加密算法的实现

今天在对接乐企的时候,需要用到国密4算法对入参进行加密 之后对出参进行解密,乐企平台提供了算法实现,具体如下: import org.apache.commons.lang3.ObjectUtils; import org.bouncycastle.jce.provider.BouncyCastleProvider; im…

swagger使用

swagger可以自动的帮助开发人员生成接口文档&#xff0c;并对接口进行测试, 代替postman来进行后端测试 maven配置代码 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version…

【自动化】考试答题自动化完成答案,如何实现100%正确呢

一、科目仿真考试不能自动答题 我的答案是可以的&#xff0c;电脑程序可以模拟人的操作完成所有的答题并提交结束考试 二、分析页面内容 完成一个题目&#xff0c;包括判断题&#xff0c;对与错2选1答案&#xff0c;单选题ABCD4选1答案&#xff0c;多选题大家想一想 F12查看按…

Docker 部署 Kafka 可视化 Kafka-UI

前言 本文部署的Kafka-UI 是基于Docker Compose 部署 Kafka的KRaft模式&#xff0c;如有需要可访问下文链接 Docker Compose 部署 Kafka的KRaft模式 不用依赖 Zookeeper 此部署也适用于不是docker部署的kafka集群 1.启动 Kafka-UI 服务 1.1 kafka 来自docker安装 docker r…

【C++ Primer Plus习题】6.8

问题: 解答: #include <iostream> #include <fstream> #include <string> using namespace std;int main() {string filename;ifstream stream;char read_char;int count0;cout << "请输入要打开的文件:";getline(cin, filename);stream.op…

内存管理篇-06Per-CPU页帧缓存

per-CPU缓存是对伙伴系统的完善&#xff0c;也是伙伴系统中的一部分。再回顾一下zone结构体的内容&#xff0c;这里的__percpu *pageset实际上就是Per-CPU的实现机制&#xff0c;所以这里的内存实际上最少有三部分&#xff0c;&#xff08;1&#xff09;free_area管理了大部分的…

Excel如何快速的定位到某一列和快速知道当前列

Excel如何快速的定位到某一列和快速知道当前列 背景快速找到某一列---660列快速知道当前列 背景 由于某一次做excel数据太大需要快速知道某一列是多少列和快速定位到某一列对此写了这个 快速找到某一列—660列 SUBSTITUTE(ADDRESS(1, 660, 4), "1", ""…

nerfstudio半离线配置踩坑记录

安装torch2.1.2 with cuda11.8 由于清华镜像源&#xff08;包括阿里源和豆瓣源&#xff09;都没有torch2.1.2cu118的包&#xff0c;因此只能从pytorch官网下载。 服务器上直接通过下面pip的方式安装会由于网络原因中断&#xff0c;无奈只能在本地先把torch的包下载下来再上传到…

企业高性能web服务器(nginx)

目录 Web服务器基础介绍 正常情况下的单次web服务器访问流程 Apache 经典的 Web服务端 Apache prefork 模型 Apache work模型 Apache event模型 服务端的I/O流程 服务器的I/O 磁盘I/O 网络I/O 网络I/O处理过程 I/O模型 I/O模型相关概念 同步/异步 阻塞/非阻塞 网…

【2024年】为Python股票量化分析最新整理的免费股票数据API接口之实时数据

在最近一两年内&#xff0c;越来越多的人开始研究股票量化分析&#xff0c;而从事股票量化分析工作的第一步&#xff0c;就是获取股票数据&#xff0c;因为一切量化分析都是基于数据实现的&#xff0c;无论是实时交易数据、历史交易数据、财务数据还是基本面数据等数据&#xf…

list的使用及其相关知识点

目录 ◉list的底层逻辑 ◉关于list的新增功能 ▲splice功能 ▲remove函数 ▲unique函数 ▲merge函数 ▲sort函数 ▣迭代器类型 ▲reverse函数 作为数据容器之一的list和其他容器的使用上有很多相似的地方&#xff0c;比如都有大致相同的构造函数&#xff0c;大致相同的头插尾插…

排序算法刷题【leetcode88题目:合并两个有序数组、leetcode21:合并两个有序链表】

一、合并两个有序数组 题目比较简单&#xff0c;使用归并排序里面的同样的操作就可以&#xff0c;代码如下所示 #include <iostream> #include <vector> using namespace std;/* leetcode88题&#xff1a;合并两个有序数组 */ class Solution { public:void merge…