文章目录
- 前言
- 一、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)
参数名 | 描述 |
---|---|
InWorld | carla当前世界 |
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、编译再运行
综上,完成两种探测锥体的实现,如有问题及时沟通;