类和属性定义
模板的第一部分指定类定义和类的任何属性。源自导航。StateSpace
类。对于本例,为均匀分布和正态分布创建一个属性。您可以在这里指定任何其他用户定义的属性。
classdefMyCustomStateSpace <导航。StateSpace &...matlabshared.planning.internal.EnforceScalarHandle属性UniformDistribution NormalDistribution%在这里指定其他属性结束
保存自定义状态空间类,并确保文件名与类名匹配。
类构造函数
使用构造函数设置状态空间的名称、状态变量的数量,并定义其边界。或者,您可以向函数添加输入参数,并在创建对象时传递变量。
方法函数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;结束
计算状态距离
指定如何计算状态空间中两个状态之间的距离。使用state1
和state2
输入来定义开始和结束位置。两个输入都可以是单个状态(行向量)或多个状态(行向量矩阵)。对于这个例子,根据每对状态位置之间的欧氏距离计算距离。
函数/ /距离= 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));结束
终止方法和类部分。
保存状态空间类定义。现在可以使用类构造函数为状态空间创建对象。