主要内容

createPlanningTemplate

创建路径规划接口的示例实现

描述

例子

createPlanningTemplate类的子类创建规划模板导航。StateSpace类。该函数在MATLAB中打开一个文件®编辑器。保存您的自定义实现,并确保该文件在MATLAB路径中可用。替代语法:createPlanningTemplate(“StateSpace”)

例子

createPlanningTemplate(“StateValidator”)类的子类创建模板导航。StateValidator类。

例子

全部折叠

方法的使用createPlanningTemplate函数生成模板,用于自定义与路径规划算法一起使用的状态空间定义和采样器。模板提供了一个简单的实现。

调用create template函数。此函数生成一个类定义文件,供您修改为自己的实现。

createPlanningTemplate

类和属性定义

模板的第一部分指定类定义和类的所有属性。从导航。StateSpace类。对于本例,为均匀分布和正态分布创建一个属性。您可以在这里指定任何其他用户定义属性。

classdefMyCustomStateSpace < nav.;StateSpace &...matlabshared.planning.internal.EnforceScalarHandle属性UniformDistribution NormalDistribution此处指定其他属性结束

保存自定义状态空间类,并确保文件名与类名匹配。

类构造函数

使用构造函数设置状态空间的名称、状态变量的数量并定义其边界。或者,您可以向函数添加输入参数,并在创建对象时传入变量。

  • 对于每个状态变量,定义(最小最大)状态边界的值。

  • 调用基类的构造函数。

  • 对于本例,使用预定义的方法指定正态分布和均匀分布属性值NormalDistribution而且UniformDistribution类。

  • 在这里指定任何其他用户定义的属性值。

方法函数obj = MyCustomStateSpace spaceName =“MyCustomStateSpace”;numstatvariables = 3;stateBounds = [-100 100;%[最小最大值]-100 100;-100 100);obj@nav.StateSpace(spaceName, numStateVariables, stateBounds);obj。NormalDistribution = matlabshared.tracking.internal.NormalDistribution(numstatvariables);obj。UniformDistribution = matlabshared.tracking.internal.UniformDistribution(numStateVariables);%用户定义的属性值结束

复制语义

指定复制方法定义。将所有用户定义变量的值复制到一个新对象中,因此copyObj是深度拷贝。本例中给出的默认行为创建一个具有相同名称、状态边界和分布的对象的新副本。

函数copyObj = copy(obj) copyObj = feval(类(obj));copyObj。StateBounds = obj.StateBounds;copyObj。UniformDistribution = obj.UniformDistribution.copy;copyObj。NormalDistribution = obj.NormalDistribution.copy;结束

加强州界

指定如何确保状态总是在状态边界内。对于本例,状态值在状态边界的最小值或最大值处饱和。

函数nav.internal.validation.validateStateMatrix(state, nan, obj, state)NumStateVariables,“enforceStateBounds”“状态”);boundedState =状态;boundedState = min(max(boundedState, obj.StateBounds(:,1)'),...obj.StateBounds (:, 2) ');结束

样品一致

指定跨均匀分布采样的行为。支持多种语法,将均匀分布限制在一定距离内的附近状态,并对多个状态进行采样。

STATE = sampleUniform(OBJ,NUMSAMPLES) STATE = sampleUniform(OBJ,NEARSTATE,DIST) STATE = sampleUniform(OBJ,NEARSTATE,DIST,NUMSAMPLES)

对于本例,使用验证函数来处理变长度输入宗量处理不同输入参数的输入。

函数state = sampleUniform(obj, varargin) narginchk(1,4);[numSamples, stateBounds] = obj.validateSampleUniformInput(varargin{:});obj.UniformDistribution.RandomVariableLimits = stateBounds;state = obj.UniformDistribution.sample(numSamples);结束

高斯分布样本

指定跨高斯分布采样的行为。支持对单个状态或多个状态进行采样的多种语法。

STATE = sample高斯(OBJ, MEANSTATE, STDDEV)

函数state = sampleGaussian(obj, meanState, stdDev, varargin) narginchk(3,4);[meanState, stdDev, numSamples] = obj.]validateSampleGaussianInput(meanState, stdDev, varargin{:});obj.NormalDistribution.Mean = meanState;obj. normaldistribution . co方差= diag(stdDev.^2);state = obj.NormalDistribution.sample(numSamples);state = obj.enforceStateBounds(state);结束

在状态之间插值

定义如何在状态空间中的两个状态之间进行插值。使用一个输入,分数,以确定如何沿两个状态之间的路径进行采样。在本例中,使用状态之间的差异定义一个基本的线性插值方法。

函数interpState = interpolate(obj, state1, state2, fraction) narginchk(4,4);[state1, state2, fraction] = obj。validateInterpolateInput(state1, state2, fraction);stateDiff = state2 - state1;interpState = state1 + fraction' * stateDiff;结束

计算状态之间的距离

指定如何计算状态空间中两个状态之间的距离。使用state1而且state2用于定义开始和结束位置的输入。两个输入都可以是单个状态(行向量)或多个状态(行向量矩阵)。对于这个例子,基于每对状态位置之间的欧几里得距离计算距离。

函数Dist = distance(obj, state1, state2) narginchk(3,3);nav.internal.validation.validateStateMatrix(state1, nan, obj。NumStateVariables,“距离”“state1”);nav.internal.validation.validateStateMatrix(state2, size(state1,1)), obj。NumStateVariables,“距离”“state2”);stateDiff = bsxfun(@minus, state2, state1);dist = sqrt(sum(stateDiff.)^2, 2));结束

终止方法和类部分。

结束结束

保存状态空间类定义。现在可以使用类构造函数为状态空间创建对象。

方法的使用createPlanningTemplate函数生成用于自定义自己的状态验证类的模板。状态验证与路径规划算法一起使用,以确保有效路径。模板函数为示例目的提供了一个基本实现。

调用create template函数。此函数生成一个类定义文件,供您修改为自己的实现。保存该文件。

createPlanningTemplate (“StateValidator”

类和属性定义

模板的第一部分指定类定义和类的所有属性。从导航。StateValidator类。您可以在这里指定任何其他用户定义属性。

classdefMyCustomStateValidator < nav.;StateValidator &...matlabshared.planning.internal.EnforceScalarHandle属性%用户定义属性结束

保存您的自定义状态验证器类,并确保您的文件名与类名匹配。

类构造函数

使用构造函数设置状态空间验证器的名称并指定状态空间对象。如果没有提供,则为状态空间设置一个默认值。调用基类的构造函数。初始化任何其他用户定义属性。本例使用的默认值为MyCustomStateSpace,这在前面的例子中已经说明了。

方法函数obj = MyCustomStateValidator(space) narginchk(0,1)如果nargin == 0 space = MyCustomStateSpace;结束obj@nav.StateValidator(空间);初始化用户定义的属性结束

复制语义

指定复制方法定义。将所有用户定义变量的值复制到一个新对象中,因此copyObj是深度拷贝。本例中给出的默认行为创建了一个具有相同类型的对象的新副本。

函数copyObj = copy(obj) copyObj = feval(class(obj), obj. statespace);结束

检查状态有效性

定义如何验证给定的状态。的状态输入可以是单个行向量,也可以是多个状态的行向量矩阵。为状态空间的任何特殊验证行为定制此函数,例如针对障碍物的碰撞检查。

函数isValid = isStateValid(obj, state) narginchk(2,2);nav.internal.validation.validateStateMatrix(state, nan, obj. statspace . numstatevariables,...“isStateValid”“状态”);bounds = obj. statspace . statebounds ';inBounds = state >= bounds(1,:) & state <= bounds(2,:);isValid = all(inBounds, 2);结束

检查运动有效性

定义如何生成状态之间的运动,并确定它是否有效。对于本例,使用linspace在状态之间均匀地插入并检查这些状态是否有效使用isStateValid.自定义此函数以在状态之间进行采样或考虑其他分析方法,以确定车辆是否可以在给定状态之间移动。

函数[isValid, lastValid] = isMotionValid(obj, state1, state2) narginchk(3,3);state1 = nav.internal.validation.validateStateVector(state1,...obj.StateSpace.NumStateVariables,“isMotionValid”“state1”);state2 = nav.internal.validation.validateStateVector(state2,...obj.StateSpace.NumStateVariables,“isMotionValid”“state2”);如果(~ obj.isStateValid (state1))错误(“statevalidator: StartStateInvalid”"运动的起始状态无效");结束在状态之间的固定间隔内插,并检查状态有效性numInterpPoints = 100;interpStates = obj. statspace .interpolate(state1, state2, linspace(0,1,numInterpPoints));interpValid = obj.isStateValid(interpStates);查找无效状态。设置lastValid state为index-1。firstInvalidIdx = find(~interpValid, 1);如果isempty(firstInvalidIdx) isValid = true;lastValid = state2;其他的isValid = false;lastValid = interpStates(firstInvalidIdx-1,:);结束结束

终止方法和类部分。

结束结束

保存状态空间验证器类定义。现在可以使用类构造函数创建对象,以验证给定状态空间的状态。

版本历史

R2019b引入

Baidu
map