可视化自动泊车代客使用三维模拟

此示例演示如何使用Simulink®和自动化驾驶工具箱™在三维可视化引擎场景中可视化车辆运动。金宝app它紧跟着Simulink的自动泊车服务金宝app的例子。

介绍

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

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

  2. 从场景中创建路线计划。

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

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

从3D场景创建成本地图

可视化集成附带了许多预先构建的场景。每个场景都有一个高分辨率的图像,可以用来探索场景。使用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的维数掀背车。这些维度需要在costmap和Simulink模型之间保持一致。金宝app

centerToFront = 1.104;%米centerToRear = 1.343;%米frontOverhang = 0.828;%米rearOverhang = 0.589;%米vehicleWidth = 1.653;%米vehicleHeight = 1.513;%米车辆长度=中前+中后+前verhang +后悬;车辆尺寸(车辆长度,车辆宽度,车辆高度,“FrontOverhang”frontOverhang,“RearOverhang”,rearOverhang);costmap.CollisionChecker。VehicleDimensions = vehicleDims;

通过指定包围车辆的圆数来设置充气半径。

costmap.CollisionChecker。NumCircles = 5;

从3D场景创建路线计划

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

data =负载(“routePlanUnreal.mat”);routePlan = data.routePlan% #好< NOPTS >%绘制车辆在起始姿势:startPose = routePlan.StartPose (1);持有helperPlotVehicle (startPose vehicleDims,“DisplayName的”,目前提出的传说)n = 1:高度(路径图)提取目标路径点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 -0.7 8.5 180 -45.2 250(1×1结构)-13.5 -33.5 -45.2 -0.7 250 0(1×1结构)-33.5 - -13.5 -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 =“AutomatedParkingValetWith3DSimulation”;open_system snapnow (modelName)

该模型扩展了Simulink例子中自动泊车代客的模型,增加了两个块来实现车辆在三维场景中的可视化:金宝app

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

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

在三维场景中可视化车辆运动

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

sim (modelName)

仿真运行时,Simulink环境通过仿真工具更新车辆在三金宝app维可视化引擎中的位置和方向具有地面跟踪的仿真3D车辆块。一个新的窗口显示自我车辆在三维可视化引擎。的自动停车员图中蓝色表示计划的路径,红色表示车辆的实际路径。的停车操作图中显示了用于搜索最终停车机动的局部成本图。

探索增强的路径规划系统

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

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

  • 停车模式:使用本地成本地图为最后的停车机动。局部成本图是成本图的一个子图,它具有一个正方形的形状。若要指定此映射的大小,请使用局部成本图大小(m)“路径规划器”块的参数对话框。小维的成本图大大减少了寻找到最终停车位的可行路径的计算量。它也增加了找到一个可行路径的概率给定相同的规划师设置。

打开路径规划子系统。

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

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

关闭模型和数字。

bdclose所有helperCloseFigures

结论

该实例展示了如何将三维仿真与Simulink中现有的自动泊车代客系统集成起来,实现车辆在三维停车场场景中的运动可视化。金宝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为假时,将背景像素设置为0maskedRGBImage(repmat(~BW,[1 1 3])) = 0;结束

helperCloseFigures

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

另请参阅

功能

应用程序

相关的话题