waypointTrajectory

航点的轨迹发生器

描述

waypointTrajectory系统对象™生成使用指定的航点轨迹。当你创建系统对象时,可以选择指定的到来,速度和方向在每个航点的时间。

从路径点生成轨迹:

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

  2. 调用对象,就好像它是一个功能。

要了解更多有关系统对象的方式工作,请参阅什么是系统对象?(MATLAB)。

创建

描述

例子

弹道= waypointTrajectory返回系统对象,弹道,其基于默认固定航点的轨迹。

例子

弹道= 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秒后。

创建参数

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

如果您指定的任何创作的说法,则必须同时指定航点TimeOfArrival创建参数。您可以指定航点TimeOfArrival作为唯一的价值论点或名称 - 值对。

属性

全部展开

除非另有说明,性质nontunable,这意味着您不能在调用对象后更改它们的值。对象在您调用它们时锁定,以及释放功能解锁他们。

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

有关更改属性值的更多信息,请参阅系统设计在MATLAB中使用系统对象(MATLAB)。

轨迹的采样率(Hz),为正的标量。

可调:

数据类型:

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

可调:

数据类型:

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

依赖

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

数据类型:

到达每个运行点的时间(以秒为单位),指定为N- 元素列向量。的第一要素TimeOfArrival一定是0.样本的数目,N,必须是通过所定义的相同的样品(行)的数目航点.

依赖

要设置此属性,还必须设置为有效值航点财产。

数据类型:

速度在导航坐标系中在米每秒每路点,指定为N3矩阵。矩阵的列分别对应于第一轴、第二轴和第三轴。样本的数目,N,必须是通过所定义的相同的样品(行)的数目航点.

如果速度指定为非零值,则对象自动计算轨迹的路线。如果速度指定为零,则目标从邻近的航路点推断轨迹的路线。

依赖

要设置此属性,还必须设置为有效值航点TimeOfArrival属性。

数据类型:

行进水平方向,指定为N度 - 元素实数向量。样本的数目,N,必须是通过所定义的相同的样品(行)的数目航点.如果没有速度也不课程指定,则从路点推断路线。

依赖

要设置该属性,速度属性不能在创建对象指定。

数据类型:

地面速度在每个路点,指定为N在米 - 元素实向量/秒。如果没有指定的属性,它是从航点推断。样本的数目,N,必须是通过所定义的相同的样品(行)的数目航点.

依赖

要设置该属性,速度属性不能在对象创建时指定。

数据类型:

Climbrate在每个路点,指定为N度 - 元素实数向量。样本的数目,N,必须是通过所定义的相同的样品(行)的数目航点.如果没有速度也不课程指定,则从路径点推断攀岩。

依赖

要设置该属性,速度属性不能在对象创建时指定。

数据类型:

取向在每个路点,指定为N-元件四元数列向量或3×3逐N实数数组。四元数或旋转矩阵的数目,N,必须是通过所定义的相同的样品(行)的数目航点.

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

依赖

要设置此属性,还必须设置为有效值航点TimeOfArrival属性。

数据类型:四元数|

将俯仰角与运动方向对齐,指定为真正要么.当指定为真正,俯仰角度自动与运动方向一致。如果指定为,俯仰角度设置为零(水平方向)。

依赖

要设置该属性,取向属性不能在对象创建时指定。

调整滚转角以抵消向心力,规定为真正要么.当指定为真正,侧倾角自动抵销向心力。如果指定为,侧倾角被设定为零(平坦取向)。

依赖

要设置该属性,取向属性不能在对象创建时指定。

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

用法

描述

例子

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

输出参数

全部展开

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

SamplesPerFrame财产。

数据类型:

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

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

SamplesPerFrame财产。

数据类型:

速度在本地导航坐标系中米每秒,返回一个3矩阵。

SamplesPerFrame财产。

数据类型:

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

SamplesPerFrame财产。

数据类型:

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

SamplesPerFrame财产。

数据类型:

对象函数

要使用对象函数,请将系统对象指定为第一个输入参数。例如,释放系统对象的系统资源OBJ,使用以下语法:

释放(OBJ)

全部展开

waypointInfo 获取航点信息表
lookupPose 获取一定时间内的姿态信息
克隆 创建重复的系统对象
系统对象算法
释放 释放资源并允许更改系统对象属性值和输入特征
重置 重置内部状态系统对象
已经完成了 状态数据结束,

例子

全部收缩

轨迹= waypointTrajectory
轨迹= waypointTrajectory与属性:采样率:100 SamplesPerFrame:1路标:[2×3双] TimeOfArrival:[2×1双]速度对:[2×3双]路线:[2×1双]地面速度:[2×1双] ClimbRate:[2×1双]定位:[2×1四元数] AutoPitch:0自助银行:0 ReferenceFrame: 'NED'

检查默认的航点和到达时间通过调用waypointInfo.默认情况下,航点表示一秒钟一个固定的位置。

waypointInfo(轨迹)
ans =2×2表TimeOfArrival路标点_________________ ___________ 0 0 0 0 1 0 0 0

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

通过定义正方形的顶点创建一个正方形轨迹。在每个路点如在运动方向指向定义方向。指定一个1赫兹的采样率和使用默认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股票”,“帧”);轨迹= waypointTrajectory(锚点,...'到达的时间'toa,...'取向'取向,...'采样率',1);

创建人物和情节平台的初始位置。

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

在循环中,通过的轨迹,以输出的当前位置和当前方向的步骤。绘制当前位置和日志的方向。利用暂停模拟实时处理。

orientationLog = 0 (toa(结束)* trajectory.SampleRate 1“四元数”);计数= 1;~isDone(弹道)[currentPosition,orientationLog(count)] =弹道();currentPosition的情节(currentPosition (1), (2),“波”count = count + 1; / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /结束持有

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

图(2)eulerAngles = eulerd([orientation(1);orientationLog],“ZYX股票”,“帧”);情节(TOA,为:eulerAngles(:,1),'KO',...TOA,为:eulerAngles(:,2),'BD',...TOA,为:eulerAngles(:,3),“r”。);标题(“定位在时间”)图例(“旋转围绕Z轴”,绕轴旋转的,“旋转围绕X轴”)xlabel(的时间(秒))ylabel(的旋转(度)网格)

到目前为止,弹道对象只输出构建期间指定的路径点。若要在路径点之间插入,请将采样率增加到比到达路径点的时间更快的速度。设置弹道采样率为100hz,呼叫重置.

trajectory.SampleRate = 100;复位(轨迹)

创建人物和情节平台的初始位置。在循环中,通过的轨迹,以输出的当前位置和当前方向的步骤。绘制当前位置和日志的方向。利用暂停模拟实时处理。

图(1)情节(锚点(1,- 1),锚点(1、2)," b *’)标题(“位置”)轴([ -  1,2,-1,2])轴广场包含('X')ylabel('Y'网格)持有orientationLog = 0 (toa(结束)* trajectory.SampleRate 1“四元数”);计数= 1;~isDone(弹道)[currentPosition,orientationLog(count)] =弹道();currentPosition的情节(currentPosition (1), (2),“波”count = count + 1; / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /结束持有

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

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

图(2)eulerAngles = eulerd([orientation(1);orientationLog],“ZYX股票”,“帧”);t = 0:1 / trajectory.SampleRate: 4;情节(吨,为:eulerAngles(:,1),'KO',...吨,为:eulerAngles(:,2),'BD',...吨,为:eulerAngles(:,3),“r”。);标题(“定位在时间”)图例(“旋转围绕Z轴”,绕轴旋转的,“旋转围绕X轴”)xlabel(的时间(秒))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,90,0,0;...1.9,0.9,1 0 90,0,0;...2,1,1,0,135,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;...3.9,0.1,0,0,270,0,0;...4,0,0,0,270,0,0];%最终位置轨迹= waypointTrajectory (trajectoryInfo (: 2:4)...'到达的时间',trajectoryInfo(:,1),...'取向',四元数(trajectoryInfo(:,5:端),“eulerd”,“ZYX股票”,“帧”...'采样率',100);

创建人物和情节平台的初始位置。在循环中,通过的轨迹,以输出的当前位置和当前方向的步骤。绘制当前位置和日志的方向。利用暂停模拟实时处理。

图(1)情节(锚点(1,- 1),锚点(1、2)," b *’)标题(“位置”)轴([ -  1,2,-1,2])轴广场包含('X')ylabel('Y'网格)持有orientationLog = 0 (toa(结束)* trajectory.SampleRate 1“四元数”);计数= 1;~isDone(弹道)[currentPosition,orientationLog(count)] =弹道();currentPosition的情节(currentPosition (1), (2),“波”count = count+1; / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /结束持有

轨迹输出现在似乎更类似正方形的,特别是在顶点与航点。

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

图(2)eulerAngles = eulerd([orientation(1);orientationLog],“ZYX股票”,“帧”);t = 0:1 / trajectory.SampleRate: 4;eulerAngles =情节(t, eulerAngles (: 1),'KO',...吨,为:eulerAngles(:,2),'BD',...吨,为:eulerAngles(:,3),“r”。);标题(“定位在时间”)图例(“旋转围绕Z轴”,...绕轴旋转的,...“旋转围绕X轴”,...'位置',“西南”)xlabel(的时间(秒))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),...'到达的时间'约束(:1),...'取向',四元数(约束(:,5:7),“eulerd”,“ZYX股票”,“帧”));

呼叫waypointInfo弹道返回指定约束的表。创建属性航点,TimeOfArrival取向是表的变量。该表便于在绘图时建立索引。

tInfo = waypointInfo(轨迹)
tInfo = 4x3表到达时间航路点定位为0 20 20 0 {1x1四元数}3 50 20 0 {1x1四元数}4 58 15.5 0 {1x1四元数}5.5 59.5 0 {1x1四元数}

轨迹对象输出的当前位置,速度,加速度,和角速度在每次呼叫。呼叫弹道在一个循环,并绘制随时间变化的位置。缓存其他输出。

图(之一)图(tInfo.Waypoints(1,1),tInfo.Waypoints(1,2)," b *’)标题(“位置”)轴([65 0 25])包含(“北”)ylabel('东'网格)daspect([1 1 1])保持东方= 0 (tInfo.TimeOfArrival(结束)* trajectory.SampleRate, 1,“四元数”);VEL =零(tInfo.TimeOfArrival(结束)* trajectory.SampleRate,3);ACC = VEL;angVel = VEL;计数= 1;〜isDone(轨迹)[POS,东方(计数),电平(计数,:),ACC(计数,:),angVel(计数,:)] =轨迹();情节(POS(1),POS(2),“波”count = count + 1; / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /结束

检查方向,速度,加速度和角随时间的速度。的waypointTrajectory系统对象™创建通过指定的约束最小化加速度和角速度的路径。

图(2)timeVector = 0:(1 / trajectory.SampleRate):tInfo.TimeOfArrival(端);为:eulerAngles = eulerd([tInfo.Orientation {1};东方]“ZYX股票”,“帧”);情节(timeVector,为:eulerAngles(:,1),...timeVector eulerAngles (:, 2),...timeVector eulerAngles (:, 3));标题(“定位在时间”)图例(“旋转围绕Z轴”,...绕轴旋转的,...“旋转围绕X轴”,...'位置','西南')xlabel(的时间(秒))ylabel(的旋转(度)网格)图(3)情节(timeVector(2:结束),VEL(:,1),...timeVector(2:结束),或者(:,2),...timeVector(2:结束),或者(:,3));标题(速度随着时间的)图例(“北”,'东','下')xlabel(的时间(秒))ylabel(“速度(米/秒)”网格)图(4)积(timeVector(2:结束),ACC(:,1),...timeVector(2:结束)、acc (:, 2),...timeVector(2:结束)、acc (:, 3));标题(“加速过时间”)图例(“北”,'东','下','位置','西南')xlabel(的时间(秒))ylabel(“加速度(m / s ^ 2)”网格)图(5)图(timeVector(2:结束),angVel (: 1),...timeVector(2:结束),angVel(:,2),...timeVector(2:结束),angVel(:,3));标题(角速度除以时间)图例(“北”,'东','下')xlabel(的时间(秒))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),...'到达的时间'约束(:1),...'取向',四元数(约束(:,5:7),“eulerd”,“ZYX股票”,“帧”));TINFO = waypointInfo(轨迹);图(之一)图(tInfo.Waypoints(1,1),tInfo.Waypoints(1,2)," b *’) count = 1;〜isDone(轨迹)[POS,东方(计数),电平(计数,:),ACC(计数,:),angVel(计数,:)] =轨迹();情节(POS(1),POS(2),'GD'count = count + 1; / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /结束

生成的轨迹现在符合规定的范围内。可视化的取向,速度,加速度和角速度所产生的轨迹。

图(2)timeVector = 0:(1 / trajectory.SampleRate):tInfo.TimeOfArrival(端);为:eulerAngles = eulerd(东方,“ZYX股票”,“帧”);情节(timeVector(2:结束),eulerAngles (: 1),...timeVector(2:结束),eulerAngles (:, 2),...timeVector(2:结束),为:eulerAngles(:,3));标题(“定位在时间”)图例(“旋转围绕Z轴”,...绕轴旋转的,...“旋转围绕X轴”,...'位置','西南')xlabel(的时间(秒))ylabel(的旋转(度)网格)图(3)情节(timeVector(2:结束),VEL(:,1),...timeVector(2:结束),或者(:,2),...timeVector(2:结束),或者(:,3));标题(速度随着时间的)图例(“北”,'东','下')xlabel(的时间(秒))ylabel(“速度(米/秒)”网格)图(4)积(timeVector(2:结束),ACC(:,1),...timeVector(2:结束)、acc (:, 2),...timeVector(2:结束)、acc (:, 3));标题(“加速过时间”)图例(“北”,'东','下')xlabel(的时间(秒))ylabel(“加速度(m / s ^ 2)”网格)图(5)图(timeVector(2:结束),angVel (: 1),...timeVector(2:结束),angVel(:,2),...timeVector(2:结束),angVel(:,3));标题(角速度除以时间)图例(“北”,'东','下')xlabel(的时间(秒))ylabel(“角速度(rad / s)”网格)

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

扩展功能

另请参阅

介绍了R2018b