Contenido principal

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

Descripción

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

Para generar una trayectoria a partir de tasas:

  1. Cree el objeto kinematicTrajectory y configure sus propiedades.

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

Para más información sobre el funcionamiento de los System objects, consulte ¿Qué son los System Objects?

Creación

Descripción

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 una trayectoria cinemática System object, trajectory, con una frecuencia de muestreo de 200 Hz y la posición inicial establecida en [0,1,10].

ejemplo

Propiedades

expandir todo

Si una propiedad es ajustable, puede modificar 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 para el objeto de trayectoria cinemática

  • 'Property' –– especifica 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 para el objeto de trayectoria cinemática

  • 'Property' –– especifica el estado de la 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

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

Esta sintaxis solo es válida si AngularVelocitySource se establece en 'Input' y AccelerationSource se establece en 'Input'.

ejemplo

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

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

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

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

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

Esta sintaxis solo es válida si AngularVelocitySource se establece en 'Property' y AccelerationSource se establece 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, devuelto como un vector columna de cuaternión de N por 1 o una matriz 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, devuelto 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: [1×1 quaternion]
                 Velocity: [0 0 0]
       AccelerationSource: 'Input'
    AngularVelocitySource: 'Input'

De forma predeterminada, 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 escribible 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: [1×1 quaternion]
                 Velocity: [0.0500 0.0500 0]
       AccelerationSource: 'Input'
    AngularVelocitySource: 'Input'

La salida acceleration y angularVelocity del objeto trajectory corresponden a 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 verificar 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

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. Para 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 kinematicTrajectory System object ™.

Crea 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: [1×1 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. kinematicTrajectory System object 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 utilizando 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 utilizando 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

expandir todo

Historial de versiones

Introducido en R2019b

Consulte también