主要内容

waypointTrajectory

路径轨迹发生器

描述

waypointTrajectory系统对象™使用指定的路径点生成轨迹。当您创建System对象时,您可以选择指定每个路径点的到达时间、速度和方向。看到算法更多细节。

从路径点生成轨迹:

  1. 创建waypointTrajectory对象,并设置其属性。

  2. 调用对象,就像它是一个函数一样。

要了解有关系统对象如何工作的更多信息,请参阅什么是系统对象?

创建

描述

例子

弹道= waypointTrajectory返回一个System对象,弹道,它基于默认固定航点生成轨迹。

例子

弹道= waypointTrajectory (路点TimeOfArrival指定路点生成的轨迹经过TimeOfArrival在每一个路标。

例子

弹道= waypointTrajectory (路点TimeOfArrival名称,价值设置每个创建参数或属性的名字到指定的价值.未指定的属性和创建参数具有默认值或推断值。

例子:轨迹= waypointTrajectory([10 10 0; 20日20日0;20日20日10],[0,0.5,10])创建一个路径点轨迹系统对象,弹道,这始于航点[10 10 0],然后穿过[0] 20日20日0.5秒后(20、20、10)10秒后。

创建论点

创建参数是在创建System对象期间设置的属性,以后不能修改。如果没有显式设置创建参数值,则推断属性值。

如果指定任何创建参数,则必须同时指定路点TimeOfArrival创建参数。您可以指定路点TimeOfArrival作为仅值参数或名称-值对。

属性

全部展开

除非另有说明,属性是nontunable,这意味着您不能在调用对象之后更改它们的值。对象在调用时锁定,而释放函数打开它们。

如果一个属性是可调,您可以随时更改它的值。

有关更改属性值的更多信息,请参见在MATLAB中使用系统对象进行系统设计

以Hz为单位的轨迹采样率,指定为一个正标量。

可调:是的

数据类型:

每个输出帧的样本数,指定为一个正标量整数。

可调:是的

数据类型:

导航坐标系中的位置(以米为单位),指定为N3矩阵。矩阵的列分别对应于第一、第二和第三个轴。矩阵的行,N,对应于单独的路径点。

依赖关系

要设置此属性,还必须为TimeOfArrival财产。

数据类型:

到达每个航路点所对应的时间,以秒为单位N元列向量。第一个元素TimeOfArrival必须是0.样本数量,N,必须与所定义的样本数(行)相同路点

依赖关系

要设置此属性,还必须为路点财产。

数据类型:

导航坐标系中每个方向点的速度,单位为米/秒N3矩阵。矩阵的列分别对应于第一、第二和第三个轴。样本数量,N,必须与所定义的样本数(行)相同路点

如果速度被指定为一个非零值,物体会自动计算轨迹。如果速度被指定为零,物体从邻近的路径点推断轨迹。

依赖关系

要设置此属性,还必须为路点TimeOfArrival属性。

数据类型:

移动的水平方向,指定为N元素的实向量。样本数量,N,必须与所定义的样本数(行)相同路点.如果既不速度也不课程,则从路径点推断路线。

依赖关系

要设置此属性,请使用速度不得在对象创建中指定属性。

数据类型:

每个航路点的地面速度,指定为N- M / s中的真实矢量。如果未指定属性,则从航点中推断出它。样本数量,N,必须与所定义的样本数(行)相同路点

依赖关系

要设置此属性,请使用速度属性不能在创建对象时指定。

数据类型:

在每个航路点的爬升率,指定为N元素的实向量。样本数量,N,必须与所定义的样本数(行)相同路点.如果既不速度也不课程,则从路径点推断climbrate。

依赖关系

要设置此属性,请使用速度属性不能在创建对象时指定。

数据类型:

在每个路径点的方向,指定为N-元素四元数列向量或3 × 3 × -N实数数组。四元数或旋转矩阵的个数,N,必须与所定义的样本数(行)相同路点

如果取向由四元数指定,底层类必须是

依赖关系

要设置此属性,还必须为路点TimeOfArrival属性。

数据类型:四元数|

调整俯仰角度与运动方向,指定为真正的错误的.指定为真正的时,俯仰角度自动与运动方向对齐。如果指定为错误的时,俯仰角设为零(水平方向)。

依赖关系

要设置此属性,请使用取向属性不能在创建对象时指定。

调整滚角以抵消向心力,指定为真正的错误的.指定为真正的时,滚动角度自动抵消向心力。如果指定为错误的,卷角设定为零(扁平方向)。

依赖关系

要设置此属性,请使用取向属性不能在创建对象时指定。

轨迹的参考系,指定为NED的(向东 - 向下)或“ENU表示”(East-North-Up)。

用法

描述

例子

位置取向速度加速度angularVelocity] =轨迹()根据指定的创建参数和属性输出轨迹数据帧。

输出参数

全部展开

在本地导航坐标系中的位置,以米为单位,返回为3矩阵。

SamplesPerFrame财产。

数据类型:

在本地导航坐标系统中的方向,返回为1四元数列向量或3 × 3 × -真实的阵列。

每个四元素或3×3旋转矩阵是从本地导航坐标系到当前身体坐标系的帧旋转。

SamplesPerFrame财产。

数据类型:

在本地导航坐标系中的速度,单位为米每秒,返回为3矩阵。

SamplesPerFrame财产。

数据类型:

本地导航坐标系中的加速度,单位为米每秒的平方,返回为3矩阵。

SamplesPerFrame财产。

数据类型:

在本地导航坐标系中的角速度,单位为每秒弧度,返回为3矩阵。

SamplesPerFrame财产。

数据类型:

对象功能

要使用对象函数,请指定System对象作为第一个输入参数。例如,释放名为system的对象的系统资源obj.,使用下面的语法:

释放(obj)

全部展开

waypointInfo 获取路点信息表
lookupPose 获取某一时刻的姿势信息
扰动 物体上定义的扰动
扰乱 将扰动应用于对象
克隆 创建重复的系统对象
一步 运行系统对象算法
释放 释放资源并允许更改系统对象属性值和输入特征
重置 使内部状态复位系统对象
结束 资料终端状态

例子

全部收缩

trajectory = waypointtrajectory.
Trajectory = WayPointTrajectory具有属性:SAMPLERE:100 SamplesPerframe:1 WayPoints:[2x3 Double]时间轴:[2x3双]速度:[2x3双]课程:[2x1双]底次:[2x1双]爬山:[2x1双]定位:[2x1 quaternion] autopitch:0 autobank:0参考框架:'ned'

通过呼叫检查默认航点和抵达时间waypointInfo.默认情况下,航点指示一秒钟的静止位置。

waypointInfo(轨迹)
ans =2×2表TimeOfArrival锚点  _____________ ___________ 0 0 0 0 1 0 0 0

创建一个方形轨迹并检查路径点约束、采样率和生成的轨迹之间的关系。

通过定义正方形的顶点来创建正方形轨迹。定义每个路径点的方向指向运动的方向。指定1hz的采样率并使用默认值SamplesPerFrame为1。

航点= [0,0,0;...%初始位置0,1,0;...1 1 0;...1 0 0;...0, 0, 0);%最终位置toa = 0:4;到达时间百分比取向=四元数([0,0,0;...45 0 0;...135年,0,0;...225年,0,0;...0, 0, 0),...“eulerd”'Zyx''框架');trajectory = waypointtrajectory(航点,...“TimeOfArrival”toa,...“定位”取向,...“SampleRate”,1);

创建一个数字并绘制平台的初始位置。

图(1)情节(锚点(1,- 1),锚点(1、2)," b *’)标题(“位置”)轴([1、2、1、2])轴广场包含('X') ylabel ('是'网格)持有

在回路中,步进通过轨迹输出当前位置和电流方向。绘制当前位置并记录方向。用暂停模拟实时处理。

orientationLog = 0 (toa(结束)*轨迹。SampleRate 1“四元数”);count = 1;~isDone(trajectory) [currentPosition,orientationLog(count)] = trajectory(); / /当前位置currentPosition的情节(currentPosition (1), (2),“波”) pause(trajectory.SamplesPerFrame/trajectory.SampleRate) count = count + 1;结尾持有离开

将方向四元数转换为易于解释的欧拉角,然后绘制随时间变化的方向。

图(2)eulerAngles = eulerd([orientation(1);orientationLog],'Zyx''框架');情节(TOA,Eulerangles(:,1),“柯”...toa, eulerAngles (:, 2),“bd”...toa, eulerAngles (:, 3),“r”。);标题(的方向随时间变化)传说(绕z轴旋转的'围绕y轴旋转'绕轴旋转的)包含(的时间(秒)) ylabel (的旋转(度)网格)

到目前为止,轨迹对象只输出了在构造过程中指定的路点。为了在路径点之间插入,增加采样率,使其速度快于路径点到达的时间。设置弹道采样率为100赫兹和呼叫重置

trajectory.samplere = 100;重置(轨迹)

创建一个数字并绘制平台的初始位置。在回路中,步进通过轨迹输出当前位置和电流方向。绘制当前位置并记录方向。用暂停模拟实时处理。

图(1)情节(锚点(1,- 1),锚点(1、2)," b *’)标题(“位置”)轴([1、2、1、2])轴广场包含('X') ylabel ('是'网格)持有orientationLog = 0 (toa(结束)*轨迹。SampleRate 1“四元数”);count = 1;~isDone(trajectory) [currentPosition,orientationLog(count)] = trajectory(); / /当前位置currentPosition的情节(currentPosition (1), (2),“波”) pause(trajectory.SamplesPerFrame/trajectory.SampleRate) count = count + 1;结尾持有离开

现在输出的轨迹是圆形的。这是因为waypointTrajectory系统对象™最小化加速度和角速度时,插值,这导致平滑,更现实的运动在大多数情况下。

将方向四元数转换为易于解释的欧拉角,然后绘制随时间变化的方向。方向也是插值的。

图(2)eulerAngles = eulerd([orientation(1);orientationLog],'Zyx''框架');t = 0:1 / trajectory.SampleRate: 4;绘图(t,eulerangles(:,1),“柯”...t, eulerAngles (:, 2),“bd”...t, eulerAngles (:, 3),“r”。);标题(的方向随时间变化)传说(绕z轴旋转的'围绕y轴旋转'绕轴旋转的)包含(的时间(秒)) ylabel (的旋转(度)网格)

waypointTrajectory算法插值路径点,以创建一个平滑的轨迹。为了回到方形轨道,提供更多的路径点,特别是在急剧变化的周围。要跟踪相应的时间、路径点和方向,在一个矩阵中指定所有的轨迹信息。

时间,路标,方向轨迹= [0,0,0,0,0,0,0;...%初始位置0.1, 0, 0.1, 0, 0, 0, 0;...0.9,0,0.9,0,0,0,0;...1, 0, 1, 0, 45岁,0,0;...1.1,0.1,1,0,090,0,0;...1.9, 0.9, 1 0 90, 0, 0;...135年2 1 1 0,0,0;...2.1,1,0.9,0,180,0,0;...2.9,1,0.1,0,180,0,0;...3、1 0 0 225 0,0;...270年3.1,0.9,0,0,0,0;...270年3.9,0.1,0,0,0,0;...4, 0, 0, 0, 270, 0, 0);%最终位置轨迹= waypointTrajectory (trajectoryInfo (: 2:4)...“TimeOfArrival”trajectoryInfo (: 1),...“定位”四元数(trajectoryInfo(:, 5:结束),“eulerd”'Zyx''框架'),...“SampleRate”, 100);

创建一个数字并绘制平台的初始位置。在回路中,步进通过轨迹输出当前位置和电流方向。绘制当前位置并记录方向。用暂停模拟实时处理。

图(1)情节(锚点(1,- 1),锚点(1、2)," b *’)标题(“位置”)轴([1、2、1、2])轴广场包含('X') ylabel ('是'网格)持有orientationLog = 0 (toa(结束)*轨迹。SampleRate 1“四元数”);count = 1;~isDone(trajectory) [currentPosition,orientationLog(count)] = trajectory(); / /当前位置currentPosition的情节(currentPosition (1), (2),“波”) pause(trajectory.SamplesPerFrame/trajectory.SampleRate) count = count+1;结尾持有离开

轨迹输出现在看起来更加平方,特别是在带有航点的顶点周围。

将方向四元数转换为易于解释的欧拉角,然后绘制随时间变化的方向。

图(2)eulerAngles = eulerd([orientation(1);orientationLog],'Zyx''框架');t = 0:1 / trajectory.SampleRate: 4;eulerAngles =情节(t, eulerAngles (: 1),“柯”...t, eulerAngles (:, 2),“bd”...t, eulerAngles (:, 3),“r”。);标题(的方向随时间变化)传说(绕z轴旋转的...'围绕y轴旋转'...绕轴旋转的...“位置”“西南”)包含(的时间(秒)) ylabel (的旋转(度)网格)

此示例显示如何使用该示例使用该示例如何创建弧轨迹waypointTrajectory系统对象™。waypointTrajectory通过指定的路径点创建路径,使加速度和角速度最小化。创建弧轨迹后,将轨迹限制在预设的范围内。

创建一个圆弧轨迹

定义一个由航迹点、到达时间和方向组成的约束矩阵。生成的轨迹以指定的方向在指定的时间通过路径点。的waypointTrajectory系统对象需要使用四元数或旋转矩阵指定方向。在指定时,将保存在约束矩阵中的欧拉角转换为四元数取向财产。

到达,路标,方向约束条件= [0,20,20,0,90,0,0;3、50、20、0 90 0,0;4, 58岁,15.5,0 162 0,0;180年5.5,59.5,0,0,0,0);轨迹= waypointTrajectory(约束(:2:4)...“TimeOfArrival”约束(:1),...“定位”,四元数(限制(:,5:7),“eulerd”'Zyx''框架'));

调用waypointInfo弹道返回指定约束的表。创建属性路点TimeOfArrival,取向是表中的变量。该表便于在绘图时进行索引。

TINFO = WAYPOINTINFO(轨迹)
tInfo = 4x3 table TimeOfArrival Waypoints Orientation _____________ ____________________ ________________ 0 20 20 0 {1x1四元数}3 50 20 0 {1x1四元数}4 58 15.5 0 {1x1四元数}5.5 59.5 0 0 {1x1四元数}

每次调用时,弹道对象输出当前位置、速度、加速度和角速度。调用弹道在一个循环中,随着时间的推移绘制位置。缓存其他输出。

图(1)绘图(TINFO.WAYPOINTSS(1,1),TINFO.WAYPOINTS(1,2)," b *’)标题(“位置”)轴([65 0 25])包含('北') ylabel ('东'网格)DASPED([1 1 1])保持东方= 0 (tInfo.TimeOfArrival(结束)* trajectory.SampleRate, 1,“四元数”);韦尔= 0 (tInfo.TimeOfArrival * trajectory.SampleRate(结束),3);acc =韦尔;angVel =韦尔;count = 1;〜Isdone(轨迹)[POS,东方(计数),Vel(Count,:),ACC(Count,:),Angvel(Count,:)] = Trajectory();绘图(POS(1),POS(2),“波”) pause(trajectory.SamplesPerFrame/trajectory.SampleRate) count = count + 1;结尾

随着时间的推移检查方向,速度,加速度和角速度。的waypointTrajectorySystem object™通过指定的约束条件创建路径,使加速度和角速度最小化。

图(2)timeVector = 0:(1/trajectory.SampleRate):tInfo.TimeOfArrival(end);eulerAngles = eulerd ([tInfo.Orientation{1};东方),'Zyx''框架');情节(timeVector eulerAngles (: 1),...timeVector eulerAngles (:, 2),...timeVector eulerAngles (:, 3));标题(的方向随时间变化)传说(绕z轴旋转的...'围绕y轴旋转'...绕轴旋转的...“位置”“西南”)包含(的时间(秒)) ylabel (的旋转(度)网格)图(3)图(timeVector(2:结束),或者(:1),...timeVector(2:结束),或者(:,2),...timeVector(2:结束),或者(:,3));标题(速度随着时间的)传说('北''东'“下来”)包含(的时间(秒)) ylabel (“速度(米/秒)”网格)图(4)情节(timeVector(2:结束)、acc (: 1),...timeVector(2:结束)、acc (:, 2),...timeVector(2:结束)、acc (:, 3));标题('加速随着时间的推移')传说('北''东'“下来”“位置”“西南”)包含(的时间(秒)) ylabel (“加速度(m / s ^ 2)”网格)图(5)图(timeVector(2:结束),angVel (: 1),...timeVector(2:结束),angVel (:, 2),...timeVector(2:结束),angVel (:, 3));标题(“角速度随时间变化”)传说('北''东'“下来”)包含(的时间(秒)) ylabel (“角速度(rad / s)”网格)

将圆弧轨迹限制在预设范围内

你可以指定额外的路径点来创建给定范围内的轨迹。为弧形轨迹创建上界和下界。

图(1)xUpperBound =[(20:50)”,50 + 10 *罪(0:0.1:π/ 2);60 * 1(11日1)];yUpperBound =[20.5 . *的(31日1);10.5 + 10 * cos(0:0.1:π/ 2);(10:1:0)');xLowerBound =[(20:49)”;50 + 9 *罪(0:0.1:π/ 2);59 * 1(11日1)];yLowerBound =[19.5 . *的(30、1);10.5 + 9 * cos(0:0.1:π/ 2);(10:1:0)');情节(xUpperBound yUpperBound,“r”“线宽”2);情节(xLowerBound yLowerBound,“r”“线宽”, 2)

为了在边界内创建轨迹,添加额外的路径点。创建一个新的waypointTrajectory系统对象™,然后在循环中调用它来绘制生成的轨迹。缓存方向、速度、加速度和角速度输出弹道对象。

时间,路标,方向约束条件= [0,20,20,0,90,0,0;1.5, 35岁,20日0 90 0,0;2.5 45 20 0 90 0, 0;3、50、20、0 90 0,0;现年53岁的3.3,19.5,0,108,0,0;126年3.6,55.5,18.25,0,0,0;3.9, 57.5, 16日0 144 0,0;4.2, 59岁,14日0 162 0,0;4.5, 59.5, 10, 180 0, 0, 0;5, 59.5, 5, 180 0, 0, 0; 5.5, 59.5,0,0 180,0,0]; trajectory = waypointTrajectory(constraints(:,2:4),...“TimeOfArrival”约束(:1),...“定位”,四元数(限制(:,5:7),“eulerd”'Zyx''框架'));tinfo = waypointinfo(轨迹);图(1)绘图(TINFO.WAYPOINTSS(1,1),TINFO.WAYPOINTS(1,2)," b *’) count = 1;〜Isdone(轨迹)[POS,东方(计数),Vel(Count,:),ACC(Count,:),Angvel(Count,:)] = Trajectory();绘图(POS(1),POS(2),'GD') pause(trajectory.SamplesPerFrame/trajectory.SampleRate) count = count + 1;结尾

生成的轨迹现在符合指定的边界。可视化所生成轨迹的方向、速度、加速度和角速度。

图(2)timeVector = 0:(1/trajectory.SampleRate):tInfo.TimeOfArrival(end);eulerangles = eulerd(东方,'Zyx''框架');情节(timeVector(2:结束),eulerAngles (: 1),...timeVector(2:结束),eulerAngles (:, 2),...timeVector(2:结束),eulerAngles (:, 3));标题(的方向随时间变化)传说(绕z轴旋转的...'围绕y轴旋转'...绕轴旋转的...“位置”“西南”)包含(的时间(秒)) ylabel (的旋转(度)网格)图(3)图(timeVector(2:结束),或者(:1),...timeVector(2:结束),或者(:,2),...timeVector(2:结束),或者(:,3));标题(速度随着时间的)传说('北''东'“下来”)包含(的时间(秒)) ylabel (“速度(米/秒)”网格)图(4)情节(timeVector(2:结束)、acc (: 1),...timeVector(2:结束)、acc (:, 2),...timeVector(2:结束)、acc (:, 3));标题('加速随着时间的推移')传说('北''东'“下来”)包含(的时间(秒)) ylabel (“加速度(m / s ^ 2)”网格)图(5)图(timeVector(2:结束),angVel (: 1),...timeVector(2:结束),angVel (:, 2),...timeVector(2:结束),angVel (:, 3));标题(“角速度随时间变化”)传说('北''东'“下来”)包含(的时间(秒)) ylabel (“角速度(rad / s)”网格)

注意,虽然生成的轨迹现在符合空间边界,但轨迹的加速度和角速度有些不稳定。这是由于过度指定路径点。

算法

waypointTrajectorySystem对象定义了一个平稳地通过航路点的轨迹。轨迹通过插值连接航点,该插值呈现轨迹参考帧中的重力方向是恒定的。一般来说,你可以使用waypointTrajectory模型平台或车辆的轨迹在数百公里的跨度。

轨迹的平面路径x-y平面投影)由分段的线形曲线组成。两个连续路径点之间曲线的曲率随路径点之间曲线的长度线性变化。路径在每个路径点的切线方向被选择以最小化曲率上的不连续,除非路径明确地通过课程属性或隐式地通过速度财产。一旦路径建立,该对象使用三次埃尔米特插值来计算车辆的位置在整个路径作为时间和平面距离的函数。

法向分量(z-分量)的轨迹,以满足形状保持分段样条(PCHIP),除非爬升率明确地通过ClimbRate属性的第三列速度财产。根据所选选择攀登速率的符号ReferenceFrame

  • 选择“ENU”参考帧时,指定正爬速率导致越来越大的值z

  • 当选择“NED”参考系时,指定一个正爬升率将导致的值减小z

你可以通过两种主要的方式来定义车辆通过路径的方向:

  • 如果是取向属性,则对象使用分段三次、四元数样条来计算沿路径的方向作为时间的函数。

  • 如果是取向属性未指定,则飞行器的偏航始终与路径对齐。滚转和俯仰由autobank.AutoPitch分别为属性值。

    autobank. AutoPitch 描述
    错误的 错误的 车辆始终是水平(零间距和卷)。这通常用于大型海洋船只。
    错误的 真正的 车辆俯仰与路径对齐,其横摇始终为零。这通常用于地面车辆。
    真正的 错误的 车辆的俯仰和横摇的选择,使其本地化z-轴与净加速度(包括重力)对齐。这通常用于旋翼飞行器。
    真正的 真正的 选择车辆辊,使其局部横向平面与净加速度(包括重力)对齐。车辆间距与路径对齐。这通常用于两轮车辆和固定翼飞机。

扩展功能

另请参阅

介绍了R2019b