主要内容

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

这个例子展示了如何在3D模拟环境中可视化车辆运动,使用Unreal Engine®从Epic Games®渲染。它紧随着Simulink中的自动泊车服务金宝app的例子。

介绍

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

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

  2. 从现场创建一个路线计划。

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

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

从3D场景创建Costmap

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

%加载并显示停车场的图像sceneName =“LargeParkingLot”;[sceneImage, sceneRef] = helperGetSceneImage(sceneName);可视化场景图像图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;%米车辆长度= centerToFront + centerToRear + front toverhang + rearOverhang;车辆尺寸(车辆长度,车辆宽度,车辆高度,...“FrontOverhang”frontOverhang,“RearOverhang”, rearOverhang);costmap.CollisionChecker.VehicleDimensions = vehicleDims;

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

costmap.CollisionChecker.NumCircles = 5;

从3D场景创建路线计划

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

data =负载(“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结构)-45.2 -33.5 8.5 180 -0.7 250(1×1结构)-45.2 -0.7 -33.5 - -13.5 250 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场景和Ego Vehicle

关闭图形,打开模型。

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

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

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

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

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

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

sim (modelName)

在仿真运行过程中,Simulink环境通过可视化引擎更新金宝app车辆的位置和方向模拟3D车辆与地面跟踪块。在3D可视化引擎中,一个新窗口显示了ego车辆。的自动停车员图中以蓝色为规划路径,红色为车辆实际路径。的停车操作图中显示了一个用于搜索最终停车机动的本地成本图。

探索增强路径规划系统

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

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

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

打开路径规划器子系统。

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

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

关闭模型和图形。

bdclose所有helperCloseFigures

结论

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

金宝app支持功能

helperCreateCostmapFromImage

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

helperCreateMask

函数[BW, maskedRGBImage] = helperCreateMask (RGB)%helperCreateMask阈值RGB图像使用自动生成的代码从颜色阈值应用程序。% [BW,maskedRGBImage] = createMask(RGB)阈值图像RGB使用%颜色阈值应用程序自动生成的代码%范围的每个通道的颜色空间是在应用程序中设置的%分割掩码以BW格式返回,掩码和的合成%原始RGB图像在maskedRGBImage中返回。%转换RGB图像到选定的颜色空间我= RGB;%根据直方图设置为通道1定义阈值channel1Min = 67.000;channel1Max = 216.000;%根据直方图设置定义通道2的阈值channel2Min = 68.000;channel2Max = 171.000;%根据直方图设置定义通道3的阈值channel3Min = 69.000;channel3Max = 160.000;%根据选择的直方图阈值创建掩码sliderBW =(我(::1)> = channel1Min) &(我(:,:1)< = channel1Max) &...(我(::2)> = channel2Min) &(我(:,:2)< = channel2Max) &...(我(::3)> = channel3Min) &(我(:,:,3)< = channel3Max);BW = sliderBW;基于输入图像初始化输出屏蔽图像maskedRGBImage =我;%当BW为假时,设置背景像素为零maskedRGBImage(repmat(~BW,[1 1 3])) = 0;结束

helperCloseFigures

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

另请参阅

功能

应用程序

相关的话题