主要内容

createPlanningTemplate

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

描述

例子

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

例子

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

例子

全部折叠

这个例子展示了如何使用createPlanningTemplate函数生成一个模板,用于自定义自己的状态空间定义和用于路径规划算法的采样器。模板提供了一个简单的实现。

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

createPlanningTemplate

类和属性定义

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

classdefMyCustomStateSpace <导航。StateSpace &...matlabshared.planning.internal.EnforceScalarHandle属性UniformDistribution NormalDistribution%在这里指定其他属性结束

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

类构造函数

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

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

  • 调用基类的构造函数。

  • 对于本例,您可以使用预定义值指定正态分布和均匀分布属性值NormalDistributionUniformDistribution类。

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

方法函数obj = MyCustomStateSpace spaceName =“MyCustomStateSpace”;numStateVariables = 3;statbounds = [-100 100;% (min马克斯)-100 100;-100 100);obj@nav.StateSpace (spaceName numStateVariables stateBounds);obj。NormalDistribution = matlabshared.tracking.internal.NormalDistribution (numStateVariables);obj。UniformDistribution = matlabshared.tracking.internal.UniformDistribution (numStateVariables);%此处用户定义的属性值结束

复制语义

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

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

执行国家界限

指定如何确保状态始终在状态范围内。对于本例,状态值在状态边界的最小值或最大值处趋于饱和。

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

样品一致

指定跨均匀分布进行抽样的行为。金宝app支持多种语法来约束在一定距离内均匀分布到附近的一个状态,并对多个状态进行抽样。

STATE = sampleUniform(OBJ) 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;状态= obj.UniformDistribution.sample (numSamples);结束

高斯分布的样本

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

STATE = sampleGaussian(OBJ, MEANSTATE, STDDEV) STATE = sampleGaussian(OBJ, MEANSTATE, STDDEV)

函数state = sampleGaussian(obj, meanState, stdDev, varargin) narginchk(3,4);[meanState, stdDev, numSamples] = obj. txt;validateSampleGaussianInput (meanState stdDev,变长度输入宗量{:});obj.NormalDistribution.Mean = meanState;obj.NormalDistribution.Covariance =诊断接头(stdDev。^ 2);状态= obj.NormalDistribution.sample (numSamples);状态= obj.enforceStateBounds(状态);结束

国家之间插入

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

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

计算状态距离

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

函数/ /距离= obj, state1, state2nav.internal.validation.validateStateMatrix (nan, state1 obj。NumStateVariables,“距离”“state1”);nav.internal.validation.validateStateMatrix (state2、尺寸(state1, 1), obj。NumStateVariables,“距离”“state2”);stateDiff = bsxfun(@minus, state2, state1);dist = sqrt(sum(stateDiff.))^2, 2));结束

终止方法和类部分。

结束结束

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

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

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

createPlanningTemplate (“StateValidator”

类和属性定义

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

classdefMyCustomStateValidator <导航。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(州、南obj.StateSpace.NumStateVariables...“isStateValid”“状态”);边界= obj.StateSpace.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状态为index-1。firstinvalidx = find(~interpValid, 1);如果isempty(firstinvalidx) isValid = true;lastValid = state2;其他的isValid = false;lastValid = interpStates (firstInvalidIdx-1:);结束结束

终止方法和类部分。

结束结束

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

介绍了R2019b