trajectoryOptimalFrenet

为参考路径寻找最优轨迹

描述

trajectoryOptimalFrenet对象为参考路径生成一个最优的、可行的、无碰撞的轨迹。

计划函数计算的最优轨迹开始和终端状态。该函数为每对状态采样多条轨迹,并选择一条代价最小的可行轨迹。

创建

描述

规划师= trajectoryOptimalFrenet (refPath,验证器)创建一个trajectoryOptimalFrenet对象与引用路径,refPath,以an的形式n2组(xy]路径点和状态验证器,验证器,指定为validatorOccupancyMap对象。

例子

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

输入参数

全部展开

引用路径,指定为n2的矩阵(xy]对,n是路径点的数量。

例子:(100100;400400)

数据类型:

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

属性

全部展开

请注意

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

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

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

数据类型:

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

数据类型:

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

数据类型:

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

数据类型:

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

数据类型:

数据类型:结构体

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

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

数据类型:

在车辆运动方向上的最大加速度。将此值指定为以逗号分隔的对“MaxAcceleration”m/s中的实标量为正2。若要降低车辆在前进或倒车方向上的加速度限制,则要降低此值。

数据类型:

数据类型:结构体

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

数据类型:

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

例如,leftLaneChangeCost = @(状态)((状态(结束,2)< refPath(结束,2))*10)创建一个成本函数句柄来优先处理左车道更改。

数据类型:函数处理

此属性是只读的。

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

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

  • 成本-轨道成本。

  • MaxAcceleration-轨迹的最大加速度。

  • MaxCurvature-轨迹的最大曲率。

  • 可行的-四元素向量(速度,加速度,曲率,碰撞]表明了轨迹的有效性。

    元素的值可以是,

    • 1-轨迹是有效的。

    • 0-轨迹无效。

    • 1-没有检查轨道。

数据类型:结构体

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

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

数据类型:

在目标状态垂直方向上偏离参考路径的一组偏差,以米为单位指定。

数据类型:

在运动方向的目标状态的速度,用m/s表示为正的标量。

数据类型:

在目标状态下运动方向上的加速度,用m/s表示为正的标量2

数据类型:

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

数据类型:

数据类型:结构体

引用路径的路径点,指定为n2的矩阵(xy]对,n是路径点的数量。路径点可作为规划此规划器优化的备选轨迹的参考点。

数据类型:

每个轨迹的纵向段数。将此值指定为以逗号分隔的对“NumSegments”一个正的标量。此属性生成中间纵向终端状态,所有横向终端状态与之结合,以便为每个终端状态生成更多的运动原语。

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

数据类型:

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

数据类型:

对象的功能

cart2frenet 把笛卡尔状态转换成弗雷涅状态
frenet2cart 把弗雷涅状态转换成笛卡尔状态
计划 计划最优轨迹
显示 想象的轨迹

例子

全部折叠

这个例子展示了如何使用a来规划一个最优的轨迹trajectoryOptimalFrenet对象。

创建并分配映射到状态验证器

创建一个用于冲突检查的状态验证器对象。

stateValidator = validatorOccupancyMap;

创建一个障碍网格地图。

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

创建一个binaryOccupancyMap使用网格映射。

地图= binaryOccupancyMap(网格);

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

stateValidator。地图=地图;

规划和可视化轨迹

为计划者创建一个参考路径。

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

声明cost函数句柄来优先处理左车道更改。

leftLaneChangeCost = @(状态)((状态(结束,2)< refPath(结束,2))*10);

使用引用路径、状态验证器和自定义成本函数初始化planner对象。

规划师= trajectoryOptimalFrenet (refPath stateValidator,“CostFunction”,leftLaneChangeCost);

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

planner.TerminalStates。纵向= 100;planner.TerminalStates。横向= 10:10:10;planner.FeasibilityParameters。MaxAcceleration = 10;

轨迹规划

车辆的初始状态。

initFrenetState = 0 (1,6);

从最初的Frenet状态规划一个轨迹。

计划(计划、initFrenetState);

轨迹可视化

将地图和轨迹形象化。

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

这个例子展示了如何在最优轨迹规划中分割纵向末端状态trajectoryOptimalFrenet对象。

创建并分配映射到状态验证器

创建一个用于冲突检查的状态验证器对象。

statevalidator = validatorOccupancyMap;

创建一个障碍网格地图。

网格= 0 (50100);网格(22:24,28:33)= 1;网格(18:20 37:42)= 1;网格(29:31 72:77)= 1;

创建一个binaryOccupancyMap使用网格映射。

地图= binaryOccupancyMap(网格);

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

statevalidator。地图=地图;

规划和可视化轨迹

为计划者创建一个参考路径。

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

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

规划师= trajectoryOptimalFrenet (refPath statevalidator);

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

planner.TerminalStates。纵向= 100;planner.FeasibilityParameters。MaxAcceleration = 10;

轨迹规划

车辆的初始状态。

initFrenetState = 0 (1,6);

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

计划。NumSegments = 3;

从最初的Frenet状态规划一个轨迹。

计划(计划、initFrenetState);

轨迹可视化

将地图和轨迹形象化。

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

限制

  • 引用路径中的自交叉可能会导致意外行为。

  • 计划员不支持反向驱动。金宝app

  • 规划的初始方向应该在内部-π/ 2π/ 2指向引用路径。

  • 限制TerminalStates实时应用,因为计算复杂性随着它的增长而增长。

参考文献

[1] Werling, Moritz, Julius Ziegler, Soren Kammel和Sebastian Thrun。" Frenet框架下动态街道场景的最佳轨迹生成"2010年IEEE机器人和自动化国际会议。2010年,页987 - 993。

扩展功能

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

介绍了R2019b