前言

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射线的粗细

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 time


def 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:
        pass
    finally:
        # 清理
        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、编译再运行


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

Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐