使用混合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生成路径”传奇(位置=“西北”)
路径规划算法生成代码
你可以使用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生成路径"传奇(位置=“西北”)举行从
检查生成代码的性能
将生成的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生成路径"传奇(位置=“东北”)