主要内容

可视化自动泊车代客使用虚幻引擎模拟

本示例展示了如何在使用Epic Games®的虚幻引擎®渲染的3D模拟环境中可视化车辆运动。它紧跟Simulink中的自动泊车代客金宝app的例子。

简介

自动驾驶工具箱™集成了虚幻引擎仿真环境在Simulink®。金宝app您可以使用此环境在预先构建的场景中可视化车辆的运动。该环境提供了一种直观的方法来分析路径规划和车辆控制算法的性能。的Simulink中的自动泊车代客金宝app实例说明了如何在Simulink中设计一个自动代客泊车系统的路径规划和车辆控制算法。金宝app这个例子展示了如何使用可视化引擎增强模型来可视化场景中的车辆运动。这个工作流程中的步骤是:

  1. 从3D场景创建一个成本图。

  2. 在现场制作一个路线计划。

  3. 在Simulink中配置3D场景和自我车辆。金宝app

  4. 在3D场景中模拟和可视化车辆的运动。

从3D场景创建成本图

可视化集成带有许多预先构建的场景。每个场景都配有高分辨率图像,可用于探索场景。使用helperShowSceneImage函数显示图像。本例使用大型停车场现场。

载入并显示停车场的图像sceneName =“LargeParkingLot”;[sceneImage, sceneRef] = helperGetSceneImage(sceneName);可视化场景图像figure helperShowSceneImage(sceneImage, sceneRef)

这样的高分辨率图像是在一定分辨率下对环境的精确描绘。您可以使用此映像来创建vehicleCostmap用于路径规划和导航。

首先,估计图像的空闲空间。自由空间是指车辆行驶时不会与其他静态物体发生碰撞的区域,如停放的汽车、锥锥和道路边界,也不会越过标记的界线。在本例中,您可以根据图像的颜色来估计空闲空间。使用颜色阈值从图像处理工具箱中的应用程序进行分割,并从图像生成二值图像。您还可以使用helper函数helperCreateCostmapFromImage在示例的最后生成二值图像:

sceneImageBinary = helperCreateCostmapFromImage(sceneImage);

或者,加载一个预先生成的二进制图像。

sceneImageBinary = imread(“sim3d_LargeParkingLotBinary.bmp”);

接下来,从二值图像创建一个成本图。使用二值图像指定每个单元的成本值。

获取地图的左下角位置mapLocation = [sceneRef.XWorldLimits(1), sceneRef.YWorldLimits(1)];%[米,米]%计算分辨率mapWidth = sceneRef.XWorldLimits(2)-sceneRef.XWorldLimits(1);%米cellSize = mapWidth/size(sceneImageBinary, 2);创建成本图costmap = vehicleCostmap(im2single(sceneImageBinary),“CellSize”cellSize,“MapLocation”, mapLocation);图绘制(costmap,“通货膨胀”“关闭”);传说

您还需要根据3D场景中可用的车辆指定自动停放的车辆的尺寸。这个例子使用了a的维数掀背车.这些维度需要在成本图和Simulink模型之间保持一致。金宝app

centerToFront = 1.104;%米centerToRear = 1.343;%米frontOverhang = 0.828;%米rearOverhang = 0.589;%米vehicleWidth = 1.653;%米vehicleHeight = 1.513;%米vehicllength = centerToFront + centerToRear + frontOverhang + rearOverhang;vehicleDims = vehicleDimensions(vehicllength, vehicleWidth, vehicleHeight,...“FrontOverhang”frontOverhang,“RearOverhang”, rearOverhang);costmap.CollisionChecker.VehicleDimensions = vehicleDims;

通过指定环绕车辆的圈数来设置膨胀半径。

costmap.CollisionChecker.NumCircles = 5;

从3D场景创建路线计划

全局路线计划被描述为为了到达一个停车位而穿越的一系列车道段。中描述的工具可以交互地从场景图像中选择中间目标位置为虚幻引擎模拟选择路点.在本例中,路由计划已经创建并存储在表中。在模拟之前,PreLoadFcn模型的回调函数加载路由计划。

数据=负载(“routePlanUnreal.mat”);routePlan = data.routePlan% #好< NOPTS >以起始姿势绘制车辆startPose = routePlan.StartPose(1,:);持有helperPlotVehicle (startPose vehicleDims,“DisplayName的”目前提出的传说)n = 1: height(routePlan)提取目标路径点vehiclePose = routePlan{n,“EndPose”};绘制姿势legendEntry = sprintf(“目标%我”n);helperPlotVehicle (vehiclePose vehicleDims,“DisplayName的”, legendEntry);持有结束持有
routePlan = 5×3表StartPose EndPose属性  _______________________ _______________________ __________ 180 180 -33.5 8.5 44.5 1×1结构-33.5 - 8.5 180 -45.2 - -0.7 250 1×1结构-45.2 -0.7 250 -33.5 -13.5 0 1×1结构-33.5 - -13.5 0 -20.3 -13.5 7 1×1结构-20.3 - -13.5 -13.5 - -6.8 90 1×1结构

配置3D场景和自我车辆

关闭图形并打开模型。

helperCloseFigures如果~ ispc错误([“3D模拟只支持微软”金宝appchar (174),“窗口”char (174),“。”]);结束modelName =“APVWith3DSimulation”;open_system snapnow (modelName)

该模型扩展了Simulink中的自动泊车代客示例中使用的模型,添加了两个用于在3D场景中可视化车辆的块:金宝app

  • 模拟三维场景配置:实现三维仿真环境。的场景描述参数设置为大型停车场

  • 模拟三维车辆与地面跟踪:提供一个界面,改变车辆在3D场景中的位置和方向。的类型车辆的掀背车与车辆尺寸相一致costmap.这一块的输入是车辆的(X, Y)位置以米和偏航航向角度,单位为度。这些值在世界坐标系统中。

在3D场景中可视化车辆运动

模拟模型,看看车辆如何驶入所需的停车位。

sim (modelName)

在模拟运行过程中,Simulink环境通过金宝app模拟三维车辆与地面跟踪块。一个新的窗口在3D可视化引擎中显示自我载具。的自动代泊车员图中蓝色为规划路径,红色为车辆实际路径。的停车操作图中显示了用于搜索最终停车机动的局部成本图。

探索增强路径规划系统

Path Planner块使用最优快速探索随机树(RRT*)算法通过环境地图规划一条可行的路径。为了保证规划算法的性能,对路径规划模块进行了修改,包括两个独立的模块:

  • 驱动方式:使用整个停车场的成本图进行导航。方法中也使用了此实现Simulink中的自动泊车代客金宝app的例子。

  • 停车模式:使用本地成本图为最后的停车机动。本地开销映射是开销映射的一个子映射,具有方形形状。要指定此映射的大小,请使用本地成本图大小(m)参数。较小维度的成本图可以显著减少寻找通往最终停车位的可行路径的计算负担。它还增加了在相同的规划器设置下找到可行路径的概率。

打开路径规划器子系统。

open_system ([modelName,/路径规划的),“力”

这两个路径规划器模块实现为启用子系统(金宝app模型)块。使能信号来自IsParkingManeuver输入信号配置从行为规划器块发送的总线。当启用停车模式子系统时,将创建一个本地成本图,其中中心作为车辆的当前位置。

关闭模型和图形。

bdclose所有helperCloseFigures

结论

本例展示了如何将3D仿真与Simulink中现有的自动泊车代客集成在一起,以可视化三维停车场场景中的车辆运动。金宝app

金宝app支持功能

helperCreateCostmapFromImage

函数BW = helpcreatecostmapfromimage (sceneImage)% #好< DEFNU >从RGB映像创建一个成本映射。翻转场景图像sceneImage = flipud(sceneImage);从颜色阈值应用程序调用自动生成的代码BW = helpcreatemask (sceneImage);平滑图像BW = im2uint8(medfilt2(BW));%调整BW = imresize(BW, 0.5);%计算补码BW =缺陷(BW);结束

helperCreateMask

函数[BW,maskedRGBImage] = helperCreateMask(RGB)使用colorThresholder应用程序自动生成的代码来阈值RGB图像。% [BW,MASKEDRGBIMAGE] = createMask(RGB) thresholds image RGB using%从colorThresholder应用程序自动生成的代码颜色空间的每个通道的%范围是在应用程序中设置的%分割掩码返回在BW中,和掩码的复合%原始RGB图像返回在maskedRGBImage。由colorThresholder应用程序在2021年10月22日自动生成%------------------------------------------------------将RGB图像转换为所选颜色空间I = rgb;根据直方图设置定义通道1的阈值channel1Min = 42.000;channel1Max = 179.000;根据直方图设置定义通道2的阈值channel2Min = 66.000;channel2Max = 191.000;根据直方图设置定义通道3的阈值channel3Min = 67.000;channel3Max = 164.000;根据所选的直方图阈值创建掩码sliderBW =(我(::1)> = channel1Min) &(我(:,:1)< = channel1Max) &...(我(::2)> = channel2Min) &(我(:,:2)< = channel2Max) &...(我(::3)> = channel3Min) &(我(:,:,3)< = channel3Max);BW = sliderBW;根据输入图像初始化输出掩码图像。maskedRGBImage = RGB;设置BW为假的背景像素为零。maskedRGBImage(repmat(~BW,[1 1 3])) = 0;结束

helperCloseFigures

函数helperCloseFigures ()关闭除模拟可视化外的所有图形查找所有图形对象打架= findobj(“类型”“图”);%关闭数字i = 1: length(打架andles) close(打架andles(i));结束结束

另请参阅

功能

应用程序

相关的话题