Main Content

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

kinematicTrajectory

Generador de trayectoria impulsado por tasa

Desde R2019b

Descripción

El kinematicTrajectory System object™ genera trayectorias utilizando aceleración y velocidad angular especificadas.

Para generar una trayectoria a partir de tasas:

  1. Cree el objeto kinematicTrajectory y establezca sus propiedades.

  2. Llame al objeto con argumentos, como si fuera una función.

Para obtener más información sobre cómo funcionan los System objects, consulte What Are System Objects?

Creación

Descripción

ejemplo

trajectory = kinematicTrajectory devuelve un System object, trajectory, que genera una trayectoria basada en la aceleración y la velocidad angular.

ejemplo

trajectory = kinematicTrajectory(Name,Value) establece cada propiedad Name en el Value especificado. Las propiedades no especificadas tienen valores predeterminados.

Ejemplo: trajectory = kinematicTrajectory('SampleRate',200,'Position',[0,1,10]) crea un System object de trayectoria cinemática, trajectory, con una frecuencia de muestreo de 200 Hz y la posición inicial establecida en [0,1,10].

Propiedades

expandir todo

Si una propiedad es ajustable, puedes cambiar su valor en cualquier momento.

Frecuencia de muestreo de la trayectoria en Hz, especificada como un escalar positivo.

Ajustable: Yes

Tipos de datos: single | double

Estado de posición en el sistema de coordenadas de navegación local en metros, especificado como un vector fila de tres elementos.

Ajustable: Yes

Tipos de datos: single | double

Estado de velocidad en el sistema de coordenadas de navegación local en m/s, especificado como un vector fila de tres elementos.

Ajustable: Yes

Tipos de datos: single | double

Estado de orientación en el sistema de coordenadas de navegación local, especificado como un cuaternión escalar o una matriz real de 3 por 3. La orientación es una rotación del marco desde el sistema de coordenadas de navegación local hasta el marco del cuerpo actual.

Ajustable: Yes

Tipos de datos: quaternion | single | double

Fuente del estado de aceleración, especificada como 'Input' o 'Property'.

  • 'Input' –– especifica el estado de aceleración como argumento de entrada al objeto de trayectoria cinemática

  • 'Property' –– especifique el estado de aceleración estableciendo la propiedad Acceleration

Ajustable: No

Tipos de datos: char | string

Estado de aceleración en m/s2, especificado como un vector fila de tres elementos.

Ajustable: Yes

Dependencias

Para habilitar esta propiedad, establezca AccelerationSource en 'Property'.

Tipos de datos: single | double

Fuente del estado de velocidad angular, especificada como 'Input' o 'Property'.

  • 'Input' –– especifica el estado de velocidad angular como argumento de entrada al objeto de trayectoria cinemática

  • 'Property' –– especifica el estado de velocidad angular configurando la propiedad AngularVelocity

Ajustable: No

Tipos de datos: char | string

Estado de velocidad angular en rad/s, especificado como un vector fila de tres elementos.

Ajustable: Yes

Dependencias

Para habilitar esta propiedad, establezca AngularVelocitySource en 'Property'.

Tipos de datos: single | double

Número de muestras por cuadro de salida, especificado como un entero positivo.

Ajustable: No

Dependencias

Para habilitar esta propiedad, establezca AngularVelocitySource en 'Property' y AccelerationSource en 'Property'.

Tipos de datos: single | double

Uso

Descripción

ejemplo

[position,orientation,velocity,acceleration,angularVelocity] = trajectory(bodyAcceleration,bodyAngularVelocity) genera el estado de la trayectoria y luego actualiza el estado de la trayectoria según bodyAcceleration y bodyAngularVelocity.

Esta sintaxis solo es válida si AngularVelocitySource está establecido en 'Input' y AccelerationSource está establecido en 'Input'.

[position,orientation,velocity,acceleration,angularVelocity] = trajectory(bodyAngularVelocity) genera el estado de la trayectoria y luego actualiza el estado de la trayectoria según bodyAngularVelocity.

Esta sintaxis solo es válida si AngularVelocitySource está establecido en 'Input' y AccelerationSource está establecido en 'Property'.

[position,orientation,velocity,acceleration,angularVelocity] = trajectory(bodyAcceleration) genera el estado de la trayectoria y luego actualiza el estado de la trayectoria según bodyAcceleration.

Esta sintaxis solo es válida si AngularVelocitySource está establecido en 'Property' y AccelerationSource está establecido en 'Input'.

[position,orientation,velocity,acceleration,angularVelocity] = trajectory() genera el estado de la trayectoria y luego actualiza el estado de la trayectoria.

Esta sintaxis solo es válida si AngularVelocitySource está establecido en 'Property' y AccelerationSource está establecido en 'Property'.

Argumentos de entrada

expandir todo

Aceleración en el sistema de coordenadas del cuerpo en metros por segundo al cuadrado, especificada como una matriz N-por-3.

N es el número de muestras en el cuadro actual.

Velocidad angular en el sistema de coordenadas del cuerpo en radianes por segundo, especificada como una matriz N por 3.

N es el número de muestras en el cuadro actual.

Argumentos de salida

expandir todo

Posición en el sistema de coordenadas de navegación local en metros, devuelta como una matriz N-por-3.

N es el número de muestras en el cuadro actual.

Tipos de datos: single | double

Orientación en el sistema de coordenadas de navegación local, devuelta como un vector columna de cuaternión N -por-1 o un arreglo real de 3 por 3-por- N . Cada cuaternión o matriz de rotación de 3 por 3 es una rotación de cuadro desde el sistema de coordenadas de navegación local hasta el sistema de coordenadas del cuerpo actual.

N es el número de muestras en el cuadro actual.

Tipos de datos: single | double

Velocidad en el sistema de coordenadas de navegación local en metros por segundo, devuelta como una matriz N-por-3.

N es el número de muestras en el cuadro actual.

Tipos de datos: single | double

Aceleración en el sistema de coordenadas de navegación local en metros por segundo al cuadrado, devuelta como una matriz N-por-3.

N es el número de muestras en el cuadro actual.

Tipos de datos: single | double

Velocidad angular en el sistema de coordenadas de navegación local en radianes por segundo, devuelta como una matriz N-por-3.

N es el número de muestras en el cuadro actual.

Tipos de datos: single | double

Funciones del objeto

expandir todo

perturbationsPerturbación definida en el objeto.
perturbAplicar perturbaciones al objeto.
stepEjecutar el algoritmo System object

Ejemplos

contraer todo

Cree un kinematicTrajectory System object™ predeterminado y explore la relación entre la entrada, las propiedades y las trayectorias generadas.

trajectory = kinematicTrajectory
trajectory = 
  kinematicTrajectory with properties:

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

Por defecto, el objeto kinematicTrajectory tiene una posición inicial de [0 0 0] y una velocidad inicial de [0 0 0]. La orientación se describe mediante un cuaternión (1 + 0i + 0j + 0k).

El objeto kinematicTrajectory mantiene un estado visible y grabable en las propiedades Position, Velocity y Orientation.. Cuando llama al objeto, se genera el estado y luego se actualiza.

Por ejemplo, llame al objeto especificando una aceleración y una velocidad angular relativas al sistema de coordenadas del cuerpo.

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

La posición, orientación y velocidad de salida del objeto trajectory corresponden al estado informado por las propiedades antes de llamar al objeto. El estado trajectory se actualiza después de ser llamado y es observable desde las propiedades:

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'

La salida acceleration y angularVelocity del objeto trajectory corresponden a los bodyAcceleration y bodyAngularVelocity, excepto que se devuelven en el sistema de coordenadas de navegación. Utilice la salida orientation para rotar acceleration y angularVelocity al sistema de coordenadas del cuerpo y verifique que sean aproximadamente equivalentes a bodyAcceleration y bodyAngularVelocity.

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

     5     5     0

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

     0     0     1

El kinematicTrajectory System object™ le permite modificar el estado de la trayectoria a través de las propiedades. Establezca la posición en [0,0,0] y luego llame al objeto con una aceleración y velocidad angular especificadas en el sistema de coordenadas del cuerpo. Con fines ilustrativos, clone el objeto trajectory antes de modificar la propiedad Position . Llame a ambos objetos y observe que las posiciones divergen.

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

Este ejemplo muestra cómo crear una trayectoria que oscila a lo largo del eje norte de un sistema de coordenadas NED local utilizando el System object™ kinematicTrajectory .

Cree un objeto kinematicTrajectory predeterminado. La orientación inicial predeterminada está alineada con el sistema de coordenadas NED local.

traj = kinematicTrajectory
traj = 

  kinematicTrajectory with properties:

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

Defina una trayectoria con una duración de 10 segundos que consista en una rotación alrededor del eje este (paso) y una oscilación a lo largo del eje norte del sistema de coordenadas NED local. Utilice la frecuencia de muestreo predeterminada 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;

Trazar la señal de control de aceleración.

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')

Genere la trayectoria muestra por muestra en un bucle. El System object kinematicTrajectory asume que las entradas de aceleración y velocidad angular están en el sistema de coordenadas del cuerpo del sensor local. Gire las señales de control de aceleración y velocidad angular desde el sistema de coordenadas NED al sistema de coordenadas del cuerpo del sensor usando rotateframe y el estado Orientation . Actualiza un gráfico tridimensional de la posición en cada momento. Agregue pause para imitar el procesamiento en tiempo real. Una vez que se completa el ciclo, traza la posición a lo largo del tiempo. Al girar las señales de control accNED y angVelNED al sistema de coordenadas del cuerpo local se garantiza que el movimiento se mantenga a lo largo del eje descendente.

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')

Convierta la orientación registrada a ángulos de Euler y grafique. Aunque la orientación de la plataforma cambió con el tiempo, la aceleración siempre actuó a lo largo del eje Norte.

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')

Este ejemplo muestra cómo generar una trayectoria de bobina usando el objeto kinematicTrajectory System object™.

Cree una trayectoria circular con una duración de 1000 segundos y una frecuencia de muestreo de 10 Hz. Establezca el radio del círculo en 5000 metros y la velocidad en 80 metros por segundo. Establezca la velocidad de ascenso en 100 metros por segundo y la inclinación en 15 grados. Especifique la orientación inicial apuntando en la dirección del movimiento.

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);

Especifique una aceleración y una velocidad angular constantes en el sistema de coordenadas del cuerpo. Gire la estructura del cuerpo para tener en cuenta el tono.

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);

Llame a trajectory con la aceleración y velocidad angular especificadas en el sistema de coordenadas del cuerpo. Trazar la posición, orientación y velocidad en el tiempo.

[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 object. The axes object with title Position, xlabel North (m), ylabel East (m) 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 object. The axes object with title Orientation, xlabel Time (s), ylabel Rotation (degrees) 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 object. The axes object with title Speed, xlabel Time (s), ylabel Speed (m/s) contains an object of type line.

Defina una velocidad angular constante y una aceleración constante que describan una trayectoria circular en espiral.

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];

Crea un objeto de trayectoria cinemática.

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

Llame al objeto de trayectoria cinemática en un bucle y registre la salida de posición. Trazar la posición a lo largo del tiempo.

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 object. The axes object with title Position, xlabel X (m), ylabel Y (m) contains an object of type line.

Capacidades ampliadas

Historial de versiones

Introducido en R2019b

Consulte también