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引入
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。