主要内容

trajectoryOptimalFrenet

沿着参考路径找到最优轨迹

描述

trajectoryOptimalFrenet对象是一个路径规划器,它基于参考路径对局部轨迹进行采样和计算。规划器根据参考路径和对象中的其他参数生成一组终端状态。规划器然后使用4将状态连接到每个终端状态th或5th阶多项式。为了选择最优路径,对采样轨迹进行运动学可行性、碰撞和成本评估。

创建

描述

trajectoryOptimalFrenet (参考路径验证器创建一个trajectoryOptimalFrenet对象的引用路径,参考路径的形式n2组xy路径点和状态验证器,验证器,指定为validatorOccupancyMap对象。

例子

规划师= trajectoryOptimalFrenet (___名称,值以任意顺序使用一个或多个名称-值对设置附加属性。

输入参数

全部展开

的引用路径n2的矩阵xy对,n是路径点的数量。

例子:(100100; 400400)

数据类型:

状态验证器对象,指定为validatorOccupancyMap对象。

属性

全部展开

请注意

“重量”“FeasibilityParameters”属性,则不能一次指定整个结构。相反,将它们的字段单独设置为名称-值对。例如,trajectoryOptimalFrenet (refPath验证器,“偏差”,0)设置“偏差”结构场“重量”

所有轨迹成本的权值,指定为包含对应轨迹属性的成本乘数标量的结构。总轨迹成本是所有属性的总和乘以它们的权重。这个结构有这些字段。

代价函数将权值乘以到达终端状态所花费的总时间。指定此值为逗号分隔的对“时间”一个正标量,单位是秒。

数据类型:

代价函数将权值乘以生成轨迹的总长度。指定此值为逗号分隔的对“ArcLength”一个正标量,单位是米。

数据类型:

代价函数将权重乘以横向挺杆的平方积分。这个值决定了横向轨迹(垂直于参考路径)的攻击性。指定此值为逗号分隔的对“LateralSmoothness”一个正标量。为了惩罚计划轨迹中的侧向挺举,增加了这个成本值。

数据类型:

成本函数将权重乘以纵向挺拔的平方积分。这个值决定了轨迹在纵向方向(参考路径的方向)的侵略性。指定此值为逗号分隔的对“LongitudinalSmoothness”一个正标量。为了惩罚较大的前进和后退加速度变化,增加这个成本值。

数据类型:

成本函数将权重乘以轨迹末端到参考路径的垂直距离,单位为米。指定此值为逗号分隔的对“偏差”一个正标量,单位是米。

数据类型:

数据类型:结构体

可行性参数,指定为包含标量值的结构,用于检查弹道的有效性。这个结构有这些字段。

车辆可以执行的最大曲率。指定此值为逗号分隔的对“MaxCurvature”m是正的实标量-1.这个值决定了轨迹的运动学可行性。

数据类型:

车辆运动方向上的最大加速度。指定此值为逗号分隔的对“MaxAcceleration”一个正实标量,单位是m/s2.要降低车辆在前进或后退方向上的加速度限制,请降低该值。

数据类型:

数据类型:结构体

轨迹离散状态之间的时间间隔。指定此值为逗号分隔的对“TimeResolution”一个正的实标量,单位是秒。这些离散状态决定了状态有效性和代价函数。

数据类型:

用户定义的cost函数,指定为函数句柄。这个函数必须接受一个矩阵n7,TRAJSTATES,并返回一个标量形式的成本值。的计划函数返回成本最低的路径。

例如,leftLaneChangeCost = @(states)((states(end,2) < refPath(end,2))*10)创建一个成本函数处理优先左车道变更。

数据类型:函数处理

此属性是只读的。

“TrajectoryList”属性,返回为包含所有候选轨迹及其相应参数的结构数组。每个结构都有以下字段:

  • 轨迹——一个n7的矩阵xyθ卡巴速度加速度时间,在那里n为轨迹航迹点的个数。

  • 成本-轨道成本。

  • MaxAcceleration-弹道的最大加速度。

  • MaxCurvature-轨迹的最大曲率。

  • 可行的-一个四元向量速度加速度曲率碰撞表明了弹道的有效性。

    元素的值可以是:

    • 1—轨迹有效。

    • 0-轨迹无效。

    • -1—未检查轨迹。

数据类型:结构体

包含相对于参考路径的目标状态列表的结构。这些参数定义了在开始和每个目标状态之间生成可选轨迹段的采样行为。这个结构有这些字段。

轨迹段的长度,指定为以米为单位的矢量。

数据类型:

目标状态下垂直方向与参考路径的偏差排列,以米为单位的矢量。

数据类型:

目标状态下运动方向上的速度,以m/s为单位指定为正标量。

数据类型:

目标状态运动方向上的加速度,指定为m/s的正标量2

数据类型:

执行轨迹段的结束时间数组,以秒为单位指定为正向量。

数据类型:

数据类型:结构体

参考路径的路径点,指定为n2的矩阵xy对,n是路径点的数量。路径点作为规划可选轨迹的参考,由该规划器优化。

数据类型:

每个轨迹的纵向段数。指定此值为逗号分隔的对“NumSegments”一个正标量。这个特性产生了中间的纵向终端状态,所有横向终端状态都被合并到纵向终端状态,以产生更多的运动基元到每个终端状态。

例如,“NumSegments”,2在每个纵向终端状态之间创建两个分区。轨迹产生以达到所有可用的横向终端状态的中间纵向状态。

数据类型:

在横向方向上与参考路径的偏移。指定此值为逗号分隔的对“偏差偏移”和一个标量。在横向方向上,负值将偏移偏移到右侧,正值将偏移偏移到参考路径的左侧。当避开参考路径中的障碍物时,设置此属性使您的解决方案偏向某个转弯方向。

数据类型:

对象的功能

cart2frenet 将笛卡尔状态转换为弗涅特状态
复制 创建对象的深层副本
frenet2cart 将弗奈状态转换为笛卡儿状态
计划 计划最优轨迹
显示 想象的轨迹

例子

全部折叠

这个例子展示了如何使用trajectoryOptimalFrenet对象。

创建映射并将其分配给状态验证程序

为碰撞检查创建一个状态验证器对象。

stateValidator = validatorOccupancyMap;

创建一个障碍网格地图。

网格= 0 (50100);网格(24:26 48:53)= 1;

创建一个binaryOccupancyMap用网格地图。

地图= binaryOccupancyMap(网格);

将映射分配给状态验证器。

stateValidator。地图=地图;

规划和可视化轨迹

为规划器创建一个参考路径。

refPath =[0, 25岁,100年,25);

使用引用路径和状态验证器初始化规划器对象。

规划师= trajectoryOptimalFrenet (refPath stateValidator);

指定纵向终端状态、横向偏差和最大加速度值。

planner.TerminalStates.Longitudinal = 100;planner.TerminalStates.Lateral = 10:5:10;planner.FeasibilityParameters.MaxAcceleration = 10;

指定靠近左侧终端状态的偏差偏移值,以优先处理左侧车道变更。

计划。DeviationOffset = 5;

轨迹规划

飞行器的初始笛卡儿状态。

initCartState = [0 25 pi/9 0 0]; / /初始化

将车辆的笛卡儿状态转换为弗涅特状态。

initFrenetState = cart2frenet(规划师,initCartState);

从最初的弗涅特状态开始计划一个轨迹。

计划(计划、initFrenetState);

轨迹可视化

可视化地图和轨迹。

显示(map)显示(规划师,“轨迹”“所有”

图中包含一个坐标轴。以二进制占用网格为标题的坐标轴包含图像、直线、patch等5个对象。这些对象表示路径点、参考路径、最优轨迹。

该算例说明了如何利用a来划分最优轨迹规划中的纵向末端状态trajectoryOptimalFrenet对象。

创建映射并将其分配给状态验证程序

为碰撞检查创建一个状态验证器对象。

statevalidator = validatorOccupancyMap;

创建一个障碍网格地图。

网格= 0 (50100);网格(25:27 28:33)= 1;网格(16:18,37:42)= 1;网格(29:31 72:77)= 1;

创建一个binaryOccupancyMap用网格地图。

地图= binaryOccupancyMap(网格);

将映射分配给状态验证器。

statevalidator。地图=地图;

规划和可视化轨迹

为规划器创建一个参考路径。

refPath =[0, 25岁,30岁,30岁,75年,20,100,25);

使用引用路径和状态验证器初始化规划器对象。

规划师= trajectoryOptimalFrenet (refPath statevalidator);

指定纵向终端状态、横向偏差和最大加速度值。

planner.TerminalStates.Longitudinal = 100;planner.TerminalStates.Lateral = 5:5:5;planner.FeasibilityParameters.MaxAcceleration = 10;

分配纵向终端状态的分区数。

planner.NumSegments=3;

轨迹规划

车辆的初始Frenet状态。

initFrenetState = 0 (1,6);

从最初的弗涅特状态开始计划一个轨迹。

计划(计划、initFrenetState);

轨迹可视化

可视化地图和轨迹。

显示(map)显示(规划师,“轨迹”“所有”)举行

生成车道边界

计算参考路径的终点为弗涅特态。

refPathEnd = cart2frenet(planner,[planner. waypoints (end,:) 0 0 0]);

用半车道宽度值计算横向终端状态两侧的车道偏移量。

laneOffsets = unique([planer . terminalstates . lateral +2.5]);

计算直角状态下的车道位置。

numLaneOffsets =元素个数(laneOffsets);xRefPathEnd =装天花板(refPathEnd (1));laneXY = 0 ((numLaneOffsets * xRefPathEnd) + numLaneOffsets, 2);xIndex = 0;laneID = 1: numLaneOffsetsx = 1:xRefPathEnd laneCart = frenet2cart(planner,[x 0 0 laneOffsets(laneID) 0 0]);xIndex = xIndex + 1;laneXY (xIndex:) = laneCart (1:2);结束xIndex = xIndex + 1;laneXY (xIndex:) =南(1、2);结束

情节车道边界。

情节(laneXY (: 1) laneXY (:, 2),“线宽”, 0.5,“颜色”(0.5 0.5 0.5),“DisplayName的”“车道边界”“线型”“——”

图中包含一个坐标轴。以二进制占用网格为标题的坐标轴包含图像、直线、patch等6个对象。这些对象代表路径点,参考路径,最优轨迹,车道边界。

限制

  • 参考路径中的自交叉可能导致意想不到的行为。

  • 规划师不支持反向驾驶。万博1manbetx

  • 最初的规划方向应该在-π/ 2π/ 2到参考路径。

  • 限制…的数量TerminalStates用于实时应用,因为计算复杂性会随之增长。

工具书类

[1] Werling, Moritz, Julius Ziegler, Sören Kammel, Sebastian Thrun。“弗涅特框架下动态街道场景的最优轨迹生成”2010 IEEE机器人与自动化国际会议.2010年,页987 - 993。

扩展功能

C / c++代码生成
使用MATLAB®Coder™生成C和c++代码。

介绍了R2019b