主要内容

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

这个例子展示了如何在使用Epic Games®的虚幻引擎®渲染的3D模拟环境中可视化车辆运动。它紧跟着Simulink中的自动泊车服务的例子。

简介

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

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

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

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

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

从3D场景创建成本图

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

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

图中包含一个axes对象。坐标轴对象包含一个image类型的对象。

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

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

sceneImageBinary = helperCreateCostmapFromImage (sceneImage);

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

sceneImageBinary = imread (“sim3d_LargeParkingLotBinary.bmp”);

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

获取地图左下角的位置mapplocation = [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,“通货膨胀”“关闭”);

图中包含一个axes对象。坐标轴对象包含一个image类型的对象。

传说

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

centerToFront = 1.104;%米centerToRear = 1.343;%米frontOverhang = 0.828;%米rearOverhang = 0.589;%米vehicleWidth = 1.653;%米vehicleHeight = 1.513;%米vehicleLength = centerToFront + centerToRear + frontOverhang + rearOverhang;= vehicle - dimensions (vehicle - length, vehicle - width, vehicle - height, vehicle - length, vehicle - length, vehicle - width, vehicle - height,...“FrontOverhang”frontOverhang,“RearOverhang”, rearOverhang);costmap.CollisionChecker.VehicleDimensions = vehicleDims;

通过指定包围车辆的圆圈数来设置膨胀半径。

costmap.CollisionChecker.NumCircles = 5;

从3D场景创建路线计划

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

data =负载(“routePlanUnreal.mat”);routePlan = data.routePlan% #好< NOPTS >
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结构
绘制车辆在起始姿势: startPose = routePlan.StartPose (1);持有helperPlotVehicle (startPose vehicleDims,“DisplayName的”目前提出的传说)n = 1:路由计划的高度提取目标路径点vehiclePose = routePlan {n,“EndPose”};画好姿势legendEntry = sprintf (“目标%我”n);helperPlotVehicle (vehiclePose vehicleDims,“DisplayName的”, legendEntry);持有结束持有

图中包含一个axes对象。坐标轴对象包含43个类型为image, polygon的对象。这些物体代表当前姿势、目标1、目标2、目标3、目标4、目标5。

配置3D场景和自我车辆

关闭图形并打开模型。

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

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

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

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

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

模拟模型,看看车辆如何开进所需的停车位。

sim (modelName)

图停车机动包含一个轴对象。标题为Local costmap的坐标轴对象包含9个类型为图像、直线、多边形的对象。

图自动泊车服务包含一个轴线对象。带有标题Global costmap的axis对象包含类型为图像、直线、多边形的261个对象。

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

探索增强路径规划系统

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

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

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

打开路径规划器子系统。

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

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

关闭模型和图形。

bdclose所有helperCloseFigures

结论

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

支持功能

helperCreateCostmapFromImage

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

helperCreateMask

函数[BW, maskedRGBImage] = helperCreateMask (RGB)阈值RGB图像使用colorThresholder应用程序自动生成的代码。% [BW,MASKEDRGBIMAGE] = createMask(RGB)阈值图像RGB使用%从colorThresholder应用程序自动生成的代码颜色空间的每个通道的%范围在应用程序中设置%分割掩码在BW中返回,以及掩码和%原始RGB图像返回为maskedRGBImage。%由colorThresholder app在2021年10月22日自动生成%------------------------------------------------------将RGB图像转换为选定的颜色空间我= 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为false的背景像素为零。maskedRGBImage(repmat(~BW,[1 1 3])) = 0;结束

helperCloseFigures

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

另请参阅

功能

应用程序

相关的话题

Baidu
map