主要内容

使用混合A星生成路径规划代码

这个例子展示了如何使用Hybrid a *算法在地图中执行代码生成来为车辆规划无碰撞路径。在MATLAB®中验证算法后,使用codegen(MATLAB编码器)函数,生成一个MEX函数。将算法中生成的MEX文件可视化规划路径。

将算法写入规划路径

创建一个函数,codegenPathPlanner,它使用plannerHybridAStar对象在映射中规划从开始姿态到目标姿态的路径。

函数path = codegenPathPlanner(mapData,startPose,goalPose)% # codegen创建一个二进制占用图map = binaryoccuancymap (mapData);创建一个状态空间对象stateSpace = stateSpaceSE2;将状态空间边界更新为与映射限制相同。stateSpace。StateBounds = [map.XWorldLimits;map.YWorldLimits;[-pi pi]];使用状态空间和映射对象构造一个状态验证器对象validator = validatorOccupancyMap(stateSpace,Map= Map);设置验证器的验证距离验证器。ValidationDistance = 0.01;将状态验证器对象分配给plannerHybridAStar对象planner = plannerHybridAStar(验证器);为给定的起始姿势和目标姿势计算一个路径pathObj = plan(planner,startPose,goalPose);从路径对象中提取路径姿态path = pathObj.States;结束

该函数充当标准Hybrid a *路径规划调用的包装器。它接受标准输入,并返回一个无碰撞的路径作为数组。因为不能使用句柄对象作为代码生成支持的函数的输入或输出,所以在函数内部创建planner对象。金宝app保存codegenPathPlanner函数在当前文件夹中。

在MATLAB中验证路径规划算法

生成代码前在MATLAB中验证路径规划算法。

生成一个随机的二维迷宫地图。

map = mapMaze(5,MapSize=[25 25],MapResolution=1);mapData =占用矩阵(map);

定义开始姿势和目标姿势为[xy)向量。x而且y位置单位为米,和θ指定以弧度为单位的方向角度。

startPose = [3 3 pi/2];goalPose = [22 22 pi/2];

为指定的开始姿势、目标姿势和地图规划路径。

path = codegenPathPlanner(mapData,startPose,goalPose);

可视化计算路径。

表演(binaryOccupancyMap (mapData))%启动状态散射(startPose (1, 1), startPose(1、2),“g”“填充”%目标状态散射(goalPose (1, 1), goalPose(1、2),“r”“填充”%的路径情节(路径(:1),路径(:,2),“r -”线宽= 2)传说(“开始姿势”“目标姿势”“MATLAB生成路径”传奇(位置=“西北”

图中包含一个轴对象。标题为“二进制占用网格”的轴对象包含图像、散点、线类型的4个对象。这些对象分别代表起始姿态、目标姿态、MATLAB生成的路径。

路径规划算法生成代码

你可以使用codegen(MATLAB编码器)函数或MATLAB编码器(MATLAB编码器)应用程序生成代码。对于本例,通过调用生成一个MEX文件codegen在MATLAB命令行。属性为函数的每个输入指定样例输入参数arg游戏选项,func_inputs输入参数。

调用codegen函数,并在单元格数组中指定输入参数。此函数创建一个单独的codegenPathPlanner_mex函数要使用。方法也可以生成C代码选项输入参数。这一步可能需要一些时间。

codegen配置:墨西哥人codegenPathPlannerarg游戏{mapData, startPose, goalPose}
代码生成成功。

使用生成的MEX函数验证结果

通过为指定的开始姿态、目标姿态和映射调用MEX版本的路径规划算法来规划路径。

mexPath = codegenPathPlanner_mex(mapData,startPose,goalPose);

通过MEX版本的路径规划算法计算出的路径可视化。

散射(mexPath (: 1) mexPath (:, 2),...标志=“o”...MarkerFaceColor =“b”...MarkerEdgeColor =“b”)传说(“开始姿势”“目标姿势”“MATLAB生成路径”"MEX生成路径"传奇(位置=“西北”)举行

图中包含一个轴对象。标题为“二进制占用网格”的轴对象包含图像、散点、线类型的5个对象。这些对象分别表示起始姿态、目标姿态、MATLAB生成路径、MEX生成路径。

检查生成代码的性能

将生成的MEX函数的执行时间与原始函数的执行时间进行比较,使用时间

time = timeit(@() codegenPathPlanner(mapData,startPose,goalPose))
时间= 0.3735
mexTime = timeit(@() codegenPathPlanner_mex(mapData,startPose,goalPose))
mexTime = 0.0474
时间/ mexTime
Ans = 7.8872

本例中,MEX函数的运行速度提高了5倍以上。结果可能因系统而异。

使用生成的MEX函数在新建地图中规划路径

为新的开始规划一条路径,并在新地图中设定目标。新映射的大小必须与生成MEX函数时使用的映射相同。

生成一个随机的二维迷宫地图。

mapNew = mapMaze(5,MapSize=[25 25],MapResolution=1);mapDataNew =占用矩阵(mapNew);

指定开始姿势和目标姿势。

startposennew = [22 3 pi/2];goalposennew = [3 22 pi/2];

为指定的开始姿势、目标姿势和地图规划路径。

pathNew = codegenPathPlanner_mex(mapDataNew, startposennew, goalposennew);

可视化由MEX函数计算的新路径。

表演(binaryOccupancyMap (mapDataNew))%启动状态散射(startPoseNew (1, 1), startPoseNew(1、2),“g”“填充”%目标状态散射(goalPoseNew (1, 1), goalPoseNew(1、2),“r”“填充”%的路径情节(pathNew (: 1) pathNew (:, 2),“r -”线宽= 2)传说(“开始姿势”“目标姿势”"MEX生成路径"传奇(位置=“东北”

图中包含一个轴对象。标题为“二进制占用网格”的轴对象包含图像、散点、线类型的4个对象。这些对象表示开始姿势、目标姿势、MEX生成路径。