kinematicTrajectory

Управляемый скоростью генератор траектории

Описание

The kinematicTrajectory Система object™ генерирует траектории, используя заданные ускорение и скорость вращения.

Чтобы сгенерировать траекторию из скоростей:

  1. Создайте kinematicTrajectory Объекту и установите его свойства.

  2. Вызывайте объект с аргументами, как будто это функция.

Дополнительные сведения о работе системных объектов см. в разделе «Что такое системные объекты?».

Создание

Описание

пример

trajectory = kinematicTrajectory возвращает Системный объект, trajectory, который генерирует траекторию, основанную на ускорении и скорости вращения.

пример

trajectory = kinematicTrajectory(Name,Value) устанавливает каждое свойство Name к заданной Value. Неопределенные свойства имеют значения по умолчанию.

Пример: trajectory = kinematicTrajectory('SampleRate',200,'Position',[0,1,10]) создает кинематическую траекторию системного объекта, trajectoryсо скоростью дискретизации 200 Гц и начальным положением, установленным на [0,1,10].

Свойства

расширить все

Если свойство настраивается, можно изменить его значение в любой момент.

Частота дискретизации траектории в Гц, заданная в виде положительной скалярной величины.

Настраиваемый: Да

Типы данных: single | double

Положение состояния в локальной навигационной системе координат в метрах, заданное как трехэлементный вектор-строка.

Настраиваемый: Да

Типы данных: single | double

Состояние скорости в локальной навигационной системе координат в м/с, заданное как трехэлементный вектор-строка.

Настраиваемый: Да

Типы данных: single | double

Состояние ориентации в локальной навигационной системе координат, заданное как скалярный кватернион или действительная матрица 3 на 3. Ориентация является поворотом системы координат локальной навигации к текущему каркасу кузова.

Настраиваемый: Да

Типы данных: quaternion | single | double

Источник состояния ускорения, заданный как 'Input' или 'Property'.

  • 'Input' - задайте состояние ускорения как входной параметр к объекту кинематической траектории

  • 'Property' - задайте состояние ускорения путем установки Acceleration свойство

Настраиваемый: Нет

Типы данных: char | string

Состояние ускорения в м/с2, заданный как трехэлементный вектор-строка.

Настраиваемый: Да

Зависимости

Чтобы включить это свойство, установите значение AccelerationSource на 'Property'.

Типы данных: single | double

Источник скорости вращения, заданный как 'Input' или 'Property'.

  • 'Input' - задайте скорость вращения состояние как входной параметр к объекту кинематической траектории

  • 'Property' -- задайте скорость вращения путем установки AngularVelocity свойство

Настраиваемый: Нет

Типы данных: char | string

Скорость вращения состояние в рада/с, заданное как трехэлементный вектор-строка.

Настраиваемый: Да

Зависимости

Чтобы включить это свойство, установите значение AngularVelocitySource на 'Property'.

Типы данных: single | double

Количество выборок в выходной системе координат, заданное как положительное целое число.

Настраиваемый: Нет

Зависимости

Чтобы включить это свойство, установите значение AngularVelocitySource на 'Property' и AccelerationSource к 'Property'.

Типы данных: single | double

Использование

Описание

пример

[position,orientation,velocity,acceleration,angularVelocity] = trajectory(bodyAcceleration,bodyAngularVelocity) выводит состояние траектории, а затем обновляет состояние траектории на основе bodyAcceleration и bodyAngularVelocity.

Этот синтаксис действителен только в том случае, если AngularVelocitySource установлено в 'Input' и AccelerationSource установлено в 'Input'.

[position,orientation,velocity,acceleration,angularVelocity] = trajectory(bodyAngularVelocity) выводит состояние траектории, а затем обновляет состояние траектории на основе bodyAngularAcceleration.

Этот синтаксис действителен только в том случае, если AngularVelocitySource установлено в 'Input' и AccelerationSource установлено в 'Property'.

[position,orientation,velocity,acceleration,angularVelocity] = trajectory(bodyAcceleration) выводит состояние траектории, а затем обновляет состояние траектории на основе bodyAcceleration.

Этот синтаксис действителен только в том случае, если AngularVelocitySource установлено в 'Property' и AccelerationSource установлено в 'Input'.

[position,orientation,velocity,acceleration,angularVelocity] = trajectory() выводит состояние траектории, а затем обновляет состояние траектории.

Этот синтаксис действителен только в том случае, если AngularVelocitySource установлено в 'Property' и AccelerationSource установлено в 'Property'.

Входные параметры

расширить все

Ускорение в системе координат тела в метрах в секунду в квадрате, заданное как N-на-3 матрица.

N - количество выборок в текущей системе координат.

Скорость вращения в системе координат тела в радианах в секунду, заданная как N-на-3 матрица.

N - количество выборок в текущей системе координат.

Выходные аргументы

расширить все

Положение в локальной навигационной системе координат в метрах, возвращаемое как матрица N -by-3.

N - количество выборок в текущей системе координат.

Типы данных: single | double

Ориентация в локальной навигационной системе координат, возвращенная как N-на-1 кватернион вектора-столбца или 3х3-бай- N вещественный массив. Каждый кватернион или матрица вращения 3 на 3 является поворотом системы координат локальной навигации в текущую систему координат тела.

N - количество выборок в текущей системе координат.

Типы данных: single | double

Скорость в локальной навигационной системе координат в метрах в секунду, возвращенная как матрица N -by-3.

N - количество выборок в текущей системе координат.

Типы данных: single | double

Ускорение в локальной навигационной системе координат в метрах в секунду в квадрате, возвращаемое как N-на-3 матрица.

N - количество выборок в текущей системе координат.

Типы данных: single | double

Скорость вращения в локальной навигационной системе координат в радианах в секунду, возвращаемая как N-на-3 матрица.

N - количество выборок в текущей системе координат.

Типы данных: single | double

Функции объекта

расширить все

perturbationsВозмущение, заданное для объекта
perturbПрименить возмущения к объекту
stepЗапуск алгоритма системного объекта

Примеры

свернуть все

Создайте kinematicTrajectory по умолчанию Система object™ и исследует связь между входом, свойствами и сгенерированными траекториями.

trajectory = kinematicTrajectory
trajectory = 
  kinematicTrajectory with properties:

               SampleRate: 100
                 Position: [0 0 0]
              Orientation: [1x1 quaternion]
                 Velocity: [0 0 0]
       AccelerationSource: 'Input'
    AngularVelocitySource: 'Input'

По умолчанию в kinematicTrajectory объект имеет начальное положение [0 0 0] и начальную скорость [0 0 0]. Ориентация описывается кватернионом (1 + 0i + 0j + 0k).

The kinematicTrajectory объект поддерживает видимое и доступное для записи состояние в свойствах Position, Velocity, и Orientation. Когда вы вызываете объект, состояние выводится и затем обновляется.

Например, вызовите объект, задав ускорение и скорость вращения относительно системы координат тела.

bodyAcceleration = [5,5,0];
bodyAngularVelocity = [0,0,1];
[position,orientation,velocity,acceleration,angularVelocity] = trajectory(bodyAcceleration,bodyAngularVelocity)
position = 1×3

     0     0     0

orientation = quaternion
     1 + 0i + 0j + 0k

velocity = 1×3

     0     0     0

acceleration = 1×3

     5     5     0

angularVelocity = 1×3

     0     0     1

Положение, ориентация и выход скорости от trajectory объект соответствует состоянию, сообщаемому свойствами перед вызовом объекта. The trajectory состояние обновляется после вызова и наблюдаемо из свойств:

trajectory
trajectory = 
  kinematicTrajectory with properties:

               SampleRate: 100
                 Position: [2.5000e-04 2.5000e-04 0]
              Orientation: [1x1 quaternion]
                 Velocity: [0.0500 0.0500 0]
       AccelerationSource: 'Input'
    AngularVelocitySource: 'Input'

The acceleration и angularVelocity выход из trajectory объект соответствует bodyAcceleration и bodyAngularVelocity, за исключением того, что они возвращаются в систему координат навигации. Используйте orientation выход для поворота acceleration и angularVelocity в систему координат тела и проверьте, что они примерно эквивалентны bodyAcceleration и bodyAngularVelocity.

rotatedAcceleration = rotatepoint(orientation,acceleration)
rotatedAcceleration = 1×3

     5     5     0

rotatedAngularVelocity = rotatepoint(orientation,angularVelocity)
rotatedAngularVelocity = 1×3

     0     0     1

The kinematicTrajectory Системная object™ позволяет изменять состояние траектории с помощью свойств. Установите положение на [0,0,0], а затем вызовите объект с заданным ускорением и скоростью вращения в системе координат тела. В иллюстративных целях клонируйте trajectory объект перед изменением Position свойство. Вызовите оба объекта и заметьте, что положения расходятся.

trajectoryClone = clone(trajectory);
trajectory.Position = [0,0,0];

position = trajectory(bodyAcceleration,bodyAngularVelocity)
position = 1×3

     0     0     0

clonePosition = trajectoryClone(bodyAcceleration,bodyAngularVelocity)
clonePosition = 1×3
10-3 ×

    0.2500    0.2500         0

В этом примере показано, как создать траекторию, колеблющуюся вдоль Северной оси локальной системы координат NED с помощью kinematicTrajectory Системные object™.

Создайте kinematicTrajectory по умолчанию объект. Начальная ориентация по умолчанию выровнена по локальной системе координат NED.

traj = kinematicTrajectory
traj = 

  kinematicTrajectory with properties:

               SampleRate: 100
                 Position: [0 0 0]
              Orientation: [1x1 quaternion]
                 Velocity: [0 0 0]
       AccelerationSource: 'Input'
    AngularVelocitySource: 'Input'

Задайте траекторию на длительность 10 секунд, состоящую из вращения вокруг оси Востока (тангаж) и колебаний вдоль северной оси локальной системы координат NED. Используйте kinematicTrajectory по умолчанию частота дискретизации.

fs = traj.SampleRate;
duration = 10;

numSamples = duration*fs;

cyclesPerSecond = 1;
samplesPerCycle = fs/cyclesPerSecond;
numCycles = ceil(numSamples/samplesPerCycle);
maxAccel = 20;

triangle = [linspace(maxAccel,1/fs-maxAccel,samplesPerCycle/2), ...
    linspace(-maxAccel,maxAccel-(1/fs),samplesPerCycle/2)]';
oscillation = repmat(triangle,numCycles,1);
oscillation = oscillation(1:numSamples);

accNED = [zeros(numSamples,2),oscillation];

angVelNED = zeros(numSamples,3);
angVelNED(:,2) = 2*pi;

Постройте график сигнала управления ускорением.

timeVector = 0:1/fs:(duration-1/fs);

figure(1)
plot(timeVector,oscillation)
xlabel('Time (s)')
ylabel('Acceleration (m/s)^2')
title('Acceleration in Local NED Coordinate System')

Сгенерируйте выборку по траектории в цикле. The kinematicTrajectory Системный объект предполагает, что входы ускорения и скорости вращения находятся в локальной системе координат тела датчика. Поверните сигналы управления ускорением и скоростью вращения от системы координат NED к системе координат тела датчика с помощью rotateframe и Orientation состояние. Обновляйте 3-D график положения каждый раз. Добавить pause для имитации обработки в реальном времени. Когда цикл будет завершен, постройте график положения с течением времени. Вращение accNED и angVelNED управляющие сигналы к локальной системе координат тела гарантируют, что движение остается вдоль оси Вниз.

figure(2)
plotHandle = plot3(traj.Position(1),traj.Position(2),traj.Position(3),'bo');
grid on
xlabel('North')
ylabel('East')
zlabel('Down')
axis([-1 1 -1 1 0 1.5])
hold on

q = ones(numSamples,1,'quaternion');
for ii = 1:numSamples
     accBody = rotateframe(traj.Orientation,accNED(ii,:));
     angVelBody = rotateframe(traj.Orientation,angVelNED(ii,:));

    [pos(ii,:),q(ii),vel,ac] = traj(accBody,angVelBody);

    set(plotHandle,'XData',pos(ii,1),'YData',pos(ii,2),'ZData',pos(ii,3))

    pause(1/fs)
end

figure(3)
plot(timeVector,pos(:,1),'bo',...
     timeVector,pos(:,2),'r.',...
     timeVector,pos(:,3),'g.')
xlabel('Time (s)')
ylabel('Position (m)')
title('NED Position Over Time')
legend('North','East','Down')

Преобразуйте записанную ориентацию в углы Эйлера и постройте график. Хотя ориентация платформы изменялась с течением времени, ускорение всегда действовало вдоль оси Север.

figure(4)
eulerAngles = eulerd(q,'ZYX','frame');
plot(timeVector,eulerAngles(:,1),'bo',...
     timeVector,eulerAngles(:,2),'r.',...
     timeVector,eulerAngles(:,3),'g.')
axis([0,duration,-180,180])
legend('Yaw','Pitch','Roll')
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation')

В этом примере показано, как сгенерировать траекторию катушки с помощью kinematicTrajectory Системные object™.

Создайте круговую траекторию для 1000-секундной длительности и частоты дискретизации 10 Гц. Установите радиус круга равным 5000 метров, а скорость - 80 метров в секунду. Установите скорость набора высоты 100 метров в секунду и тангаж 15 степеней. Задайте начальную ориентацию как указанную в направлении движения.

duration = 1000; % seconds
fs = 10;         % Hz
N = duration*fs; % number of samples

radius = 5000;   % meters
speed = 80;      % meters per second
climbRate = 50;  % meters per second
initialYaw = 90; % degrees
pitch = 15;      % degrees

initPos = [radius, 0, 0];
initVel = [0, speed, climbRate];
initOrientation = quaternion([initialYaw,pitch,0],'eulerd','zyx','frame');

trajectory = kinematicTrajectory('SampleRate',fs, ...
    'Velocity',initVel, ...
    'Position',initPos, ...
    'Orientation',initOrientation);

Задайте постоянное ускорение и скорость вращения в системе координат тела. Поверните каркас кузова, чтобы учесть тангаж.

accBody = zeros(N,3);
accBody(:,2) = speed^2/radius;
accBody(:,3) = 0.2;

angVelBody = zeros(N,3);
angVelBody(:,3) = speed/radius;

pitchRotation = quaternion([0,pitch,0],'eulerd','zyx','frame');
angVelBody = rotateframe(pitchRotation,angVelBody);
accBody = rotateframe(pitchRotation,accBody);

Функции trajectory с заданными ускорением и скоростью вращения в системе координат тела. Постройте график положения, ориентации и скорости с течением времени.

[position, orientation, velocity] = trajectory(accBody,angVelBody);

eulerAngles = eulerd(orientation,'ZYX','frame');
speed = sqrt(sum(velocity.^2,2));

timeVector = (0:(N-1))/fs;

figure(1)
plot3(position(:,1),position(:,2),position(:,3))
xlabel('North (m)')
ylabel('East (m)')
zlabel('Down (m)')
title('Position')
grid on

Figure contains an axes. The axes with title Position contains an object of type line.

figure(2)
plot(timeVector,eulerAngles(:,1),...
     timeVector,eulerAngles(:,2),...
     timeVector,eulerAngles(:,3))
axis([0,duration,-180,180])
legend('Yaw (Rotation Around Down)','Pitch (Rotation Around East)','Roll (Rotation Around North)')
xlabel('Time (s)')
ylabel('Rotation (degrees)')
title('Orientation')

Figure contains an axes. The axes with title Orientation contains 3 objects of type line. These objects represent Yaw (Rotation Around Down), Pitch (Rotation Around East), Roll (Rotation Around North).

figure(3)
plot(timeVector,speed)
xlabel('Time (s)')
ylabel('Speed (m/s)')
title('Speed')

Figure contains an axes. The axes with title Speed contains an object of type line.

Задайте постоянную скорость вращения и постоянное ускорение, которые описывают спиральную круговую траекторию.

Fs = 100;
r = 10;
speed = 2.5;
initialYaw = 90;

initPos = [r 0 0];
initVel = [0 speed 0];
initOrient = quaternion([initialYaw 0 0], 'eulerd', 'ZYX', 'frame');

accBody = [0 speed^2/r 0.01];
angVelBody = [0 0 speed/r];

Создайте объект кинематической траектории.

traj = kinematicTrajectory('SampleRate',Fs, ...
    'Position',initPos, ...
    'Velocity',initVel, ...
    'Orientation',initOrient, ...
    'AccelerationSource','Property', ...
    'Acceleration',accBody, ...
    'AngularVelocitySource','Property', ...
    'AngularVelocity',angVelBody);

Вызовите объект кинематической траектории в цикле и запишите выход положения. Постройте график положения с течением времени.

N = 10000;
pos = zeros(N, 3);
for i = 1:N
    pos(i,:) = traj();
end

plot3(pos(:,1), pos(:,2), pos(:,3))
title('Position')
xlabel('X (m)')
ylabel('Y (m)')
zlabel('Z (m)')

Figure contains an axes. The axes with title Position contains an object of type line.

Расширенные возможности

.

См. также

Введенный в R2019b