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.

waypointTrajectory

Generador de trayectoria de waypoint

Descripción

waypointTrajectory System object™ genera trayectorias basadas en puntos de referencia específicos. Al crear el System object, puede elegir especificar el tiempo de llegada, la velocidad o la velocidad respecto al suelo en cada punto de referencia. Opcionalmente, puede especificar otras propiedades, como la orientación en cada punto de referencia. Consulte Algoritmos para obtener más detalles.

Para generar una trayectoria a partir de waypoints:

  1. Cree el objeto waypointTrajectory y configure sus propiedades.

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

Para obtener más información sobre cómo funcionan los objetos del sistema, consulte ¿Qué son los objetos del sistema?.

Creación

Descripción

trajectory = waypointTrajectory devuelve un System object, trajectory, que genera una trayectoria basada en puntos de referencia estacionarios predeterminados.

ejemplo

trajectory = waypointTrajectory(Waypoints,TimeOfArrival) especifica la hora de llegada en la que la trayectoria generada pasa por cada punto de referencia. Consulte la propiedad TimeOfArrival para obtener más detalles.

Sugerencia

Cuando especifique el argumento TimeOfArrival, no debe especificar estas propiedades:

  • JerkLimit

  • InitialTime

  • WaitTime

ejemplo

trajectory = waypointTrajectory(Waypoints,GroundSpeed=groundSpeed) especifica la velocidad respecto al suelo a la que pasa la trayectoria generada en cada punto de referencia. Consulte la propiedad GroundSpeed para obtener más detalles.

ejemplo

trajectory = waypointTrajectory(Waypoints,Velocities=velocities) especifica la velocidad a la que pasa la trayectoria generada en cada punto de referencia. Consulte la propiedad Velocities para obtener más detalles.

trajectory = waypointTrajectory(___,Name=Value) establece cada propiedad utilizando argumentos de nombre-valor. Las propiedades no especificadas tienen valores predeterminados o inferidos. Puede utilizar esta sintaxis con cualquiera de las sintaxis anteriores.

ejemplo

Ejemplo: trajectory = waypointTrajectory([10,10,0;20,20,0;20,20,10],[0,0.5,10]) crea una trayectoria de punto de referencia System object, trajectory, que comienza en el punto de referencia [10,10,0] y luego pasa por [20,20,0] después de 0,5 segundos y [20,20,10] después de 10 segundos.

Propiedades

expandir todo

A menos que se indique lo contrario, las propiedades son no ajustables, lo que significa que no puede modificar sus valores después de llamar al objeto. Los objetos se bloquean cuando llama a ellos, y la función release los desbloquea.

Si una propiedad es ajustable, puede modificar su valor en cualquier momento.

Para obtener más información sobre cómo modificar los valores de las propiedades, consulte Diseñar sistemas en MATLAB utilizando System objects.

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

Ajustable: Yes

Tipos de datos: double

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

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Posiciones en el sistema de coordenadas de navegación en metros, especificadas como una matriz N por 3. Las columnas de la matriz corresponden al primer, segundo y tercer eje, respectivamente. Las filas de la matriz, N, corresponden a puntos de referencia individuales.

Sugerencia

Para dejar que la trayectoria espere en un waypoint específico, utilice una de las dos opciones:

  • Si especificó el argumento de entrada TimeOfArrival, repita la coordenada del punto de referencia en dos filas consecutivas.

  • Si no especificó el argumento de entrada TimeOfArrival, especifique el tiempo de espera utilizando la propiedad WaitTime.

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Tiempo correspondiente a la llegada a cada punto de referencia en segundos, especificado como un vector columna de N elementos. El número de muestras, N, debe ser el mismo que el número de muestras (filas) definido por Waypoints.

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Dependencias

Para establecer esta propiedad, no debe especificar estas propiedades:

  • JerkLimit

  • InitialTime

  • WaitTime

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Velocidad en el sistema de coordenadas de navegación en cada punto de referencia en metros por segundo, especificada como una matriz N por 3. Las columnas de la matriz corresponden al primer, segundo y tercer eje, respectivamente. El número de muestras, N, debe ser el mismo que el número de muestras (filas) definido por Waypoints.

Si la velocidad se especifica como un valor distinto de cero, el objeto calcula automáticamente el curso de la trayectoria en función de la velocidad. Si la velocidad se especifica como cero, el objeto infiere el curso de la trayectoria a partir de puntos de referencia adyacentes.

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Dirección de viaje horizontal, especificada como un vector real de elemento N en grados. El número de muestras, N, debe ser el mismo que el número de muestras (filas) definido por Waypoints. Si no se especifica Velocities ni Course, el rumbo se infiere de los puntos de referencia.

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Dependencias

Para establecer esta propiedad, no se debe especificar la propiedad Velocities.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Velocidad respecto al suelo en cada punto de referencia, especificada como un vector real de N elementos en m/s. Si no se especifica la propiedad, se deduce de los puntos de referencia. El número de muestras, N, debe ser el mismo que el número de muestras (filas) definido por Waypoints.

  • Para representar el movimiento hacia adelante, especifique valores positivos de velocidad de desplazamiento.

  • Para representar el movimiento hacia atrás, especifique valores negativos de velocidad de desplazamiento.

  • Para representar el movimiento en reversa, separe los valores de velocidad sobre el terreno positivos y negativos por un valor de velocidad sobre el terreno cero.

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Dependencias

Para establecer esta propiedad, no se debe especificar la propiedad Velocities.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Velocidad de ascenso en cada punto de referencia en metros por segundo, especificada como un vector real de N elemento . El número de muestras, N, debe ser el mismo que el número de muestras (filas) definido por Waypoints. Si no se especifica Velocities ni Course, la velocidad de ascenso se infiere de los puntos de referencia.

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Dependencias

Para establecer esta propiedad, no se debe especificar la propiedad Velocities.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Límite de sacudida longitudinal, especificado como un escalar positivo en m/s3. Jerk es la derivada temporal de la aceleración. Cuando especifica esta propiedad, el objeto produce un perfil de aceleración trapezoidal horizontal basado en el límite de sacudida. Si el objeto waypointTrajectory no puede alcanzar el JerkLimit especificado, el objeto emite un error.

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Dependencias

Para establecer esta propiedad, no se debe especificar la propiedad TimeOfArrival.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Tiempo antes de que comience la trayectoria, especificado como un escalar no negativo en segundos. El objeto informa cantidades, como posición y velocidad, como NaN antes de que comience la trayectoria.

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Dependencias

Para establecer esta propiedad, no se debe especificar la propiedad TimeOfArrival. En su lugar, debe especificar la propiedad GroundSpeed o Velocities al crear el objeto.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Tiempo de espera en cada punto de referencia, especificado como un vector de N elementos de escalares no negativos. N debe ser el mismo que el número de muestras (filas) definido por Waypoints.

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Dependencias

Para establecer esta propiedad, no se debe especificar la propiedad TimeOfArrival.

Si especificó la propiedad TimeOfArrival, no podrá especificar el tiempo de espera a través de esta propiedad. En su lugar, especifique el tiempo de espera repitiendo la coordenada del punto de referencia en dos filas consecutivas en la propiedad Waypoints.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Orientación en cada punto de referencia, especificada como un vector columna de N elementos quaternion o un arreglo de 3 por 3 por N de números reales. Cada quaternion debe tener una norma de 1. Cada matriz de rotación de 3 por 3 debe ser una matriz ortonormal. El número de cuaterniones o matrices de rotación, N, debe ser el mismo que el número de muestras (filas) definidas por Waypoints.

Si Orientation se especifica mediante cuaterniones, la clase subyacente debe ser double.

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Tipos de datos: double

Esta propiedad o parámetro es de solo lectura.

Alinee el ángulo de inclinación con la dirección del movimiento, especificada como true o false. Cuando se especifica como true, el ángulo de inclinación se alinea automáticamente con la dirección del movimiento. Si se especifica como false, el ángulo de inclinación se establece en cero (orientación de nivel).

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Dependencias

Para establecer esta propiedad, no se debe especificar la propiedad Orientation.

Esta propiedad o parámetro es de solo lectura.

Alinee el ángulo de balanceo para contrarrestar la fuerza centrípeta, especificada como true o false. Cuando se especifica como true, el ángulo de balanceo contrarresta automáticamente la fuerza centrípeta. Si se especifica como false, el ángulo de balanceo se establece en cero (orientación plana).

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Dependencias

Para establecer esta propiedad, no se debe especificar la propiedad Orientation.

Esta propiedad o parámetro es de solo lectura.

Marco de referencia de la trayectoria, especificado como 'NED' (Noreste-Abajo) o 'ENU' (Este-Norte-Arriba).

Sólo puedes establecer esta propiedad como un argumento de nombre-valor durante la construcción.

Uso

Descripción

[position,orientation,velocity,acceleration,angularVelocity] = trajectory() genera un marco de datos de trayectoria basado en argumentos y propiedades de creación especificados.

ejemplo

Argumentos de salida

expandir todo

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

M se especifica mediante la propiedad SamplesPerFrame.

Tipos de datos: double

Orientación en el sistema de coordenadas de navegación local, devuelto como un vector columna de M por 1 quaternion o un arreglo real de 3 por 3 por M.

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.

M se especifica mediante la propiedad SamplesPerFrame.

Tipos de datos: double

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

M se especifica mediante la propiedad SamplesPerFrame.

Tipos de datos: double

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

M se especifica mediante la propiedad SamplesPerFrame.

Tipos de datos: double

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

M se especifica mediante la propiedad SamplesPerFrame.

Tipos de datos: double

Funciones del objeto

Para usar una función de objeto, especifique el System object como el primer argumento de entrada. Por ejemplo, para liberar recursos de sistema de un System object llamado obj, utilice la siguiente sintaxis:

release(obj)

expandir todo

waypointInfoObtener tabla de información de waypoints
lookupPoseObtener información de pose durante un tiempo determinado.
perturbationsPerturbación definida en el objeto.
perturbAplicar perturbaciones al objeto.
cloneCreate duplicate System object
stepEjecutar el algoritmo System object
releaseRelease resources and allow changes to System object property values and input characteristics
resetReset internal states of System object
isDoneEnd-of-data status

Ejemplos

contraer todo

trajectory = waypointTrajectory
trajectory = 
  waypointTrajectory with properties:

         SampleRate: 100
    SamplesPerFrame: 1
          Waypoints: [2×3 double]
      TimeOfArrival: [2×1 double]
         Velocities: [2×3 double]
             Course: [2×1 double]
        GroundSpeed: [2×1 double]
          ClimbRate: [2×1 double]
        Orientation: [2×1 quaternion]
          AutoPitch: 0
           AutoBank: 0
     ReferenceFrame: 'NED'

Inspeccione los puntos de referencia predeterminados y los tiempos de llegada llamando a waypointInfo. Por defecto, los waypoints indican una posición estacionaria durante un segundo.

waypointInfo(trajectory)
ans=2×2 table
    TimeOfArrival     Waypoints 
    _____________    ___________

          0          0    0    0
          1          0    0    0

Cree una trayectoria cuadrada y examine la relación entre las restricciones de los puntos de referencia, la frecuencia de muestreo y la trayectoria generada.

Crea una trayectoria cuadrada definiendo los vértices del cuadrado. Defina la orientación en cada punto de referencia como apuntando en la dirección del movimiento. Especifique una frecuencia de muestreo de 1 Hz y utilice el valor predeterminado SamplesPerFrame de 1.

waypoints = [0,0,0; ... % Initial position
             0,1,0; ...
             1,1,0; ...
             1,0,0; ...
             0,0,0];    % Final position

toa = 0:4; % time of arrival
         
orientation = quaternion([0,0,0; ...
                          45,0,0; ...
                          135,0,0; ...
                          225,0,0; ...
                          0,0,0], ...
                          "eulerd","ZYX","frame");

trajectory = waypointTrajectory(waypoints, ...
    TimeOfArrival=toa, ...
    Orientation=orientation, ...
    SampleRate=1);

Crea una figura y traza la posición inicial de la plataforma.

figure(1)
plot(waypoints(1,1),waypoints(1,2),"b*")
axis([-1,2,-1,2])
axis square
xlabel("X")
ylabel("Y")
title("Position")
grid on
hold on

Figure contains an axes object. The axes object with title Position, xlabel X, ylabel Y contains a line object which displays its values using only markers.

En un bucle, recorra la trayectoria para generar la posición actual y la orientación actual. Trace la posición actual y registre la orientación. Utilice pause para imitar el procesamiento en tiempo real.

orientationLog = zeros(toa(end)*trajectory.SampleRate,1,"quaternion");
count = 1;
while ~isDone(trajectory)
   [currentPosition,orientationLog(count)] = trajectory();

   plot(currentPosition(1),currentPosition(2),"bo")
   
   pause(trajectory.SamplesPerFrame/trajectory.SampleRate)
   count = count + 1;
end
hold off

Figure contains an axes object. The axes object with title Position, xlabel X, ylabel Y contains 5 objects of type line. One or more of the lines displays its values using only markers

Convierta los cuaterniones de orientación a ángulos de Euler para facilitar la interpretación y luego trace la orientación en el tiempo.

figure(2)
eulerAngles = eulerd([orientation(1);orientationLog],"ZYX","frame");
plot(toa,eulerAngles(:,1),"ko", ...
     toa,eulerAngles(:,2),"bd", ...
     toa,eulerAngles(:,3),"r.");
title("Orientation Over Time")
legend("Rotation around Z-axis","Rotation around Y-axis","Rotation around X-axis")
xlabel("Time (seconds)")
ylabel("Rotation (degrees)")
grid on

Figure contains an axes object. The axes object with title Orientation Over Time, xlabel Time (seconds), ylabel Rotation (degrees) contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Rotation around Z-axis, Rotation around Y-axis, Rotation around X-axis.

Hasta ahora, el objeto de trayectoria solo ha generado los waypoints que se especificaron durante la construcción. Para interpolar entre puntos de referencia, aumente la frecuencia de muestreo a una velocidad más rápida que el tiempo de llegada de los puntos de referencia. Establezca la frecuencia de muestreo trajectory en 100 Hz y llame a reset.

trajectory.SampleRate = 100;
reset(trajectory)

Crea una figura y traza la posición inicial de la plataforma. En un bucle, recorra la trayectoria para generar la posición actual y la orientación actual. Trace la posición actual y registre la orientación. Utilice pause para imitar el procesamiento en tiempo real.

figure(1)
plot(waypoints(1,1),waypoints(1,2),"b*")
title("Position")
axis([-1,2,-1,2])
axis square
xlabel("X")
ylabel("Y")
grid on
hold on

orientationLog = zeros(toa(end)*trajectory.SampleRate,1,"quaternion");
count = 1;
while ~isDone(trajectory)
   [currentPosition,orientationLog(count)] = trajectory();
   
   plot(currentPosition(1),currentPosition(2),"bo")
   
   pause(trajectory.SamplesPerFrame/trajectory.SampleRate)
   count = count + 1;
end
hold off

Figure contains an axes object. The axes object with title Position, xlabel X, ylabel Y contains 401 objects of type line.

La salida de la trayectoria ahora parece circular. Esto se debe a que waypointTrajectory System object™ minimiza la aceleración y la velocidad angular al interpolar, lo que da como resultado movimientos más suaves y realistas en la mayoría de los escenarios.

Convierta los cuaterniones de orientación a ángulos de Euler para facilitar la interpretación y luego trace la orientación en el tiempo. La orientación también se interpola.

figure(2)
eulerAngles = eulerd([orientation(1);orientationLog],"ZYX","frame");
t = 0:1/trajectory.SampleRate:4;
plot(t,eulerAngles(:,1),"ko", ...
     t,eulerAngles(:,2),"bd", ...
     t,eulerAngles(:,3),"r.");
title("Orientation Over Time")
legend("Rotation around Z-axis","Rotation around Y-axis","Rotation around X-axis")
xlabel("Time (seconds)")
ylabel("Rotation (degrees)")
grid on

Figure contains an axes object. The axes object with title Orientation Over Time, xlabel Time (seconds), ylabel Rotation (degrees) contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Rotation around Z-axis, Rotation around Y-axis, Rotation around X-axis.

El algoritmo waypointTrajectory interpola los puntos de referencia para crear una trayectoria suave. Para volver a la trayectoria cuadrada, proporcione más puntos de referencia, especialmente alrededor de cambios bruscos. Para realizar un seguimiento de los tiempos, puntos de referencia y orientación correspondientes, especifique toda la información de la trayectoria en una única matriz.

               % Time, Waypoint, Orientation
trajectoryInfo = [0,   0,0,0,    0,0,0; ... % Initial position
                  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; ...
                  3.1, 0.9,0,0,  270,0,0; ...
                  
                  3.9, 0.1,0,0,  270,0,0; ...
                  4,   0,0,0,    270,0,0];    % Final position

trajectory = waypointTrajectory(trajectoryInfo(:,2:4), ...
    TimeOfArrival=trajectoryInfo(:,1), ...
    Orientation=quaternion(trajectoryInfo(:,5:end),"eulerd","ZYX","frame"), ...
    SampleRate=100);

Crea una figura y traza la posición inicial de la plataforma. En un bucle, recorra la trayectoria para generar la posición actual y la orientación actual. Trace la posición actual y registre la orientación. Utilice pause para imitar el procesamiento en tiempo real.

figure(1)
plot(waypoints(1,1),waypoints(1,2),"b*")
title("Position")
axis([-1,2,-1,2])
axis square
xlabel("X")
ylabel("Y")
grid on
hold on

orientationLog = zeros(toa(end)*trajectory.SampleRate,1,"quaternion");
count = 1;
while ~isDone(trajectory)
   [currentPosition,orientationLog(count)] = trajectory();
   
   plot(currentPosition(1),currentPosition(2),"bo")
   
   pause(trajectory.SamplesPerFrame/trajectory.SampleRate)
   count = count+1;
end
hold off

Figure contains an axes object. The axes object with title Position, xlabel X, ylabel Y contains 401 objects of type line.

La salida de la trayectoria ahora parece más cuadrada, especialmente alrededor de los vértices con puntos de referencia.

Convierta los cuaterniones de orientación a ángulos de Euler para facilitar la interpretación y luego trace la orientación en el tiempo.

figure(2)
eulerAngles = eulerd([orientation(1);orientationLog],"ZYX","frame");
t = 0:1/trajectory.SampleRate:4;
eulerAngles = plot(t,eulerAngles(:,1),"ko", ...
                   t,eulerAngles(:,2),"bd", ...
                   t,eulerAngles(:,3),"r.");
title("Orientation Over Time")
legend("Rotation around Z-axis", ...
       "Rotation around Y-axis", ...
       "Rotation around X-axis", ...
       "Location", "SouthWest")
xlabel("Time (seconds)")
ylabel("Rotation (degrees)")
grid on

Figure contains an axes object. The axes object with title Orientation Over Time, xlabel Time (seconds), ylabel Rotation (degrees) contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent Rotation around Z-axis, Rotation around Y-axis, Rotation around X-axis.

Este ejemplo muestra cómo crear una trayectoria de arco utilizando waypointTrajectory System object ™. waypointTrajectory crea una ruta a través de puntos de referencia específicos que minimiza la aceleración y la velocidad angular. Después de crear una trayectoria de arco, restringe la trayectoria para que esté dentro de límites preestablecidos.

Crear una trayectoria de arco

Defina una matriz de restricciones que consta de puntos de referencia, tiempos de llegada y orientación para una trayectoria de arco. La trayectoria generada pasa por los puntos de referencia en los momentos especificados con la orientación especificada. waypointTrajectory System object requiere que la orientación se especifique utilizando cuaterniones o matrices de rotación. Convierte los ángulos de Euler guardados en la matriz de restricciones en cuaterniones al especificar la propiedad Orientation.

% Arrival, Waypoints, Orientation
constraints = [0,    20,20,0,    90,0,0;
               3,    50,20,0,    90,0,0;
               4,    58,15.5,0,  162,0,0;
               5.5,  59.5,0,0    180,0,0];

trajectory = waypointTrajectory(constraints(:,2:4), ...
    TimeOfArrival=constraints(:,1), ...
    Orientation=quaternion(constraints(:,5:7),"eulerd","ZYX","frame"));

Llame a waypointInfo en trajectory para devolver una tabla de las restricciones especificadas. Las propiedades de creación Waypoints, TimeOfArrival y Orientation son variables de la tabla. La tabla es conveniente para indexar mientras se traza.

tInfo = waypointInfo(trajectory)
tInfo=4×3 table
    TimeOfArrival         Waypoints            Orientation   
    _____________    ____________________    ________________

           0           20      20       0    {1×1 quaternion}
           3           50      20       0    {1×1 quaternion}
           4           58    15.5       0    {1×1 quaternion}
         5.5         59.5       0       0    {1×1 quaternion}

El objeto de trayectoria genera la posición actual, la velocidad, la aceleración y la velocidad angular en cada llamada. Llama a trajectory en un bucle y traza la posición a lo largo del tiempo. Almacene en caché las otras salidas.

figure(1)
plot(tInfo.Waypoints(1,1),tInfo.Waypoints(1,2),"b*")
title("Position")
axis([20,65,0,25])
xlabel("North")
ylabel("East")
grid on
daspect([1 1 1])
hold on

orient = zeros(tInfo.TimeOfArrival(end)*trajectory.SampleRate,1,"quaternion");
vel = zeros(tInfo.TimeOfArrival(end)*trajectory.SampleRate,3);
acc = vel;
angVel = vel;

count = 1;
while ~isDone(trajectory)
   [pos,orient(count),vel(count,:),acc(count,:),angVel(count,:)] = trajectory();

   plot(pos(1),pos(2),"bo")
   
   pause(trajectory.SamplesPerFrame/trajectory.SampleRate)
   count = count + 1;
end

Figure contains an axes object. The axes object with title Position, xlabel North, ylabel East contains 551 objects of type line.

Inspeccione la orientación, velocidad, aceleración y velocidad angular a lo largo del tiempo. waypointTrajectory System object™ crea una ruta a través de las restricciones especificadas que minimizan la aceleración y la velocidad angular.

figure(2)
timeVector = 0:(1/trajectory.SampleRate):tInfo.TimeOfArrival(end);
eulerAngles = eulerd([tInfo.Orientation{1};orient],"ZYX","frame");
plot(timeVector,eulerAngles(:,1), ...
     timeVector,eulerAngles(:,2), ...
     timeVector,eulerAngles(:,3));
title("Orientation Over Time")
legend("Rotation around Z-axis", ...
       "Rotation around Y-axis", ...
       "Rotation around X-axis", ...
       "Location","southwest")
xlabel("Time (seconds)")
ylabel("Rotation (degrees)")
grid on

Figure contains an axes object. The axes object with title Orientation Over Time, xlabel Time (seconds), ylabel Rotation (degrees) contains 3 objects of type line. These objects represent Rotation around Z-axis, Rotation around Y-axis, Rotation around X-axis.

figure(3)
plot(timeVector(2:end),vel(:,1), ...
     timeVector(2:end),vel(:,2), ...
     timeVector(2:end),vel(:,3));
title("Velocity Over Time")
legend("North","East","Down")
xlabel("Time (seconds)")
ylabel("Velocity (m/s)")
grid on

Figure contains an axes object. The axes object with title Velocity Over Time, xlabel Time (seconds), ylabel Velocity (m/s) contains 3 objects of type line. These objects represent North, East, Down.

figure(4)
plot(timeVector(2:end),acc(:,1), ...
     timeVector(2:end),acc(:,2), ...
     timeVector(2:end),acc(:,3));
title("Acceleration Over Time")
legend("North","East","Down","Location","southwest")
xlabel("Time (seconds)")
ylabel("Acceleration (m/s^2)")
grid on

Figure contains an axes object. The axes object with title Acceleration Over Time, xlabel Time (seconds), ylabel Acceleration (m/s Squared baseline ) contains 3 objects of type line. These objects represent North, East, Down.

figure(5)
plot(timeVector(2:end),angVel(:,1), ...
     timeVector(2:end),angVel(:,2), ...
     timeVector(2:end),angVel(:,3));
title("Angular Velocity Over Time")
legend("North","East","Down")
xlabel("Time (seconds)")
ylabel("Angular Velocity (rad/s)")
grid on

Figure contains an axes object. The axes object with title Angular Velocity Over Time, xlabel Time (seconds), ylabel Angular Velocity (rad/s) contains 3 objects of type line. These objects represent North, East, Down.

Restringir la trayectoria del arco dentro de límites preestablecidos

Puede especificar puntos de referencia adicionales para crear trayectorias dentro de límites determinados. Cree límites superior e inferior para la trayectoria del arco.

figure(1)
xUpperBound = [(20:50)';50+10*sin(0:0.1:pi/2)';60*ones(11,1)];
yUpperBound = [20.5.*ones(31,1);10.5+10*cos(0:0.1:pi/2)';(10:-1:0)'];

xLowerBound = [(20:49)';50+9*sin(0:0.1:pi/2)';59*ones(11,1)];
yLowerBound = [19.5.*ones(30,1);10.5+9*cos(0:0.1:pi/2)';(10:-1:0)'];

plot(xUpperBound,yUpperBound,"r","LineWidth",2);
plot(xLowerBound,yLowerBound,"r","LineWidth",2)

Figure contains an axes object. The axes object with title Position, xlabel North, ylabel East contains 553 objects of type line.

Para crear una trayectoria dentro de los límites, agregue puntos de referencia adicionales. Crea un nuevo waypointTrajectory System object ™ y luego llámalo en un bucle para trazar la trayectoria generada. Almacene en caché la salida de orientación, velocidad, aceleración y velocidad angular del objeto trajectory.

            % Time,  Waypoint,     Orientation
constraints = [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;
               3.3,  53,19.5,0,    108,0,0;
               3.6,  55.5,18.25,0, 126,0,0;
               3.9,  57.5,16,0,    144,0,0;
               4.2,  59,14,0,      162,0,0;
               4.5,  59.5,10,0     180,0,0;
               5,    59.5,5,0      180,0,0;
               5.5,  59.5,0,0      180,0,0];

trajectory = waypointTrajectory(constraints(:,2:4), ...
    TimeOfArrival=constraints(:,1), ...
    Orientation=quaternion(constraints(:,5:7),"eulerd","ZYX","frame"));
tInfo = waypointInfo(trajectory);

figure(1)
plot(tInfo.Waypoints(1,1),tInfo.Waypoints(1,2),"b*")

count = 1;
while ~isDone(trajectory)
   [pos,orient(count),vel(count,:),acc(count,:),angVel(count,:)] = trajectory();

   plot(pos(1),pos(2),"gd")
   
   pause(trajectory.SamplesPerFrame/trajectory.SampleRate)
   count = count + 1;
end

Figure contains an axes object. The axes object with title Position, xlabel North, ylabel East contains 1104 objects of type line.

La trayectoria generada ahora encaja dentro de los límites especificados. Visualice la orientación, velocidad, aceleración y velocidad angular de la trayectoria generada.

figure(2)
timeVector = 0:(1/trajectory.SampleRate):tInfo.TimeOfArrival(end);
eulerAngles = eulerd(orient,"ZYX","frame");
plot(timeVector(2:end),eulerAngles(:,1), ...
     timeVector(2:end),eulerAngles(:,2), ...
     timeVector(2:end),eulerAngles(:,3));
title("Orientation Over Time")
legend("Rotation around Z-axis", ...
       "Rotation around Y-axis", ...
       "Rotation around X-axis", ...
       "Location","southwest")
xlabel("Time (seconds)")
ylabel("Rotation (degrees)")
grid on

Figure contains an axes object. The axes object with title Orientation Over Time, xlabel Time (seconds), ylabel Rotation (degrees) contains 3 objects of type line. These objects represent Rotation around Z-axis, Rotation around Y-axis, Rotation around X-axis.

figure(3)
plot(timeVector(2:end),vel(:,1), ...
     timeVector(2:end),vel(:,2), ...
     timeVector(2:end),vel(:,3));
title("Velocity Over Time")
legend("North","East","Down")
xlabel("Time (seconds)")
ylabel("Velocity (m/s)")
grid on

Figure contains an axes object. The axes object with title Velocity Over Time, xlabel Time (seconds), ylabel Velocity (m/s) contains 3 objects of type line. These objects represent North, East, Down.

figure(4)
plot(timeVector(2:end),acc(:,1), ...
     timeVector(2:end),acc(:,2), ...
     timeVector(2:end),acc(:,3));
title("Acceleration Over Time")
legend("North","East","Down")
xlabel("Time (seconds)")
ylabel("Acceleration (m/s^2)")
grid on

Figure contains an axes object. The axes object with title Acceleration Over Time, xlabel Time (seconds), ylabel Acceleration (m/s Squared baseline ) contains 3 objects of type line. These objects represent North, East, Down.

figure(5)
plot(timeVector(2:end),angVel(:,1), ...
     timeVector(2:end),angVel(:,2), ...
     timeVector(2:end),angVel(:,3));
title("Angular Velocity Over Time")
legend("North","East","Down")
xlabel("Time (seconds)")
ylabel("Angular Velocity (rad/s)")
grid on

Figure contains an axes object. The axes object with title Angular Velocity Over Time, xlabel Time (seconds), ylabel Angular Velocity (rad/s) contains 3 objects of type line. These objects represent North, East, Down.

Tenga en cuenta que, si bien la trayectoria generada ahora se ajusta dentro de los límites espaciales, la aceleración y la velocidad angular de la trayectoria son más erráticas porque los puntos de referencia están demasiado especificados.

Considere una trayectoria en una pista de carreras como la siguiente.

Counter-clockwise race track trajectory with corne points at (0,0,0), (20,0,0), (20,5,0) and (0,5,0) and velocity of 2 m/s

Los cuatro puntos de las esquinas de la trayectoria son (0,0,0), (20,0,0), (20,5,0) y (0,5,0) en metros, respectivamente. Por lo tanto, especifique los puntos de referencia de un bucle como:

wps = [0 0 0;
      20 0 0;
      20 5 0;
      0  5 0;
      0  0 0];

Supongamos que la trayectoria tiene una velocidad constante de 2 m/s y, por tanto, las velocidades en los cinco puntos de referencia son:

vels = [2 0 0;
        2 0 0;
       -2 0 0;
       -2 0 0;
        2 0 0];

La hora de llegada a los cinco waypoints es:

t = cumsum([0 20/2 5*pi/2/2 20/2 5*pi/2/2]');

La orientación de la trayectoria en los cinco puntos de referencia son:

eulerAngs = [0 0 0;
             0 0 0;
           180 0 0;
           180 0 0;
             0 0 0]; % Angles in degrees.
% Convert Euler angles to quaternions.
quats = quaternion(eulerAngs,"eulerd","ZYX","frame");

Especifique la frecuencia de muestreo como 100 para suavizar las líneas de trayectoria.

fs = 100;

Construye el waypointTrajectory.

traj = waypointTrajectory(wps,SampleRate=fs, ...
        Velocities=vels,...
        TimeOfArrival=t,...
        Orientation=quats);

Muestra y traza la trayectoria.

[pos, orient, vel, acc, angvel] = traj();
i = 1;

spf = traj.SamplesPerFrame;
while ~isDone(traj)
    idx = (i+1):(i+spf);
    [pos(idx,:), orient(idx,:), ...
        vel(idx,:), acc(idx,:), angvel(idx,:)] = traj();
    i = i+spf;
end

Traza la trayectoria y los puntos de referencia especificados.

plot(pos(:,1),pos(:,2), wps(:,1),wps(:,2), "--o")
xlabel("X (m)")
ylabel("Y (m)")
zlabel("Z (m)")
legend({"Trajectory", "Waypoints"})
axis equal

Figure contains an axes object. The axes object with xlabel X (m), ylabel Y (m) contains 2 objects of type line. These objects represent Trajectory, Waypoints.

Crea un objeto waypointTrajectory que conecta dos puntos de referencia. La velocidad de la trayectoria en los dos puntos de referencia es 0 m/s y 10 m/s, respectivamente. Restrinja el límite de sacudida a 0,5 m/s3 para habilitar el perfil de aceleración trapezoidal.

waypoints = [0  0  0;
            10 50 10];
speeds = [0 10];
jerkLimit = 0.5;
trajectory = waypointTrajectory(waypoints,GroundSpeed=speeds,JerkLimit=jerkLimit);

Obtenga el tiempo inicial y el tiempo final de la trayectoria consultando la propiedad TimeOfArrival. Cree marcas de tiempo para muestrear la trayectoria.

t0 = trajectory.TimeOfArrival(1);
tf = trajectory.TimeOfArrival(end);
sampleTimes = linspace(t0,tf,100);

Obtenga la información de posición, velocidad y aceleración en estas marcas de tiempo muestreadas utilizando la función de objeto lookupPose.

[position,~,velocity,acceleration,~] = lookupPose(trajectory,sampleTimes);

Trazar la trayectoria.

figure()
plot3(position(:,1),position(:,2),position(:,3))
xlabel("x (m)")
ylabel("y (m)")
zlabel("z (m)")
title("Trajectory")

Figure contains an axes object. The axes object with title Trajectory, xlabel x (m), ylabel y (m) contains an object of type line.

Trazar el perfil de velocidad.

figure()
subplot(3,1,1)
plot(sampleTimes,velocity(:,1));
ylabel("v_x (m/s)")
title("Velocity Profile")
subplot(3,1,2)
plot(sampleTimes,velocity(:,2));
ylabel("v_y (m/s)")
subplot(3,1,3)
plot(sampleTimes,velocity(:,3));
ylabel("v_z (m/s)")
xlabel("Time (sec)")

Figure contains 3 axes objects. Axes object 1 with title Velocity Profile, ylabel v_x (m/s) contains an object of type line. Axes object 2 with ylabel v_y (m/s) contains an object of type line. Axes object 3 with xlabel Time (sec), ylabel v_z (m/s) contains an object of type line.

Trazar el perfil de aceleración. De los resultados se desprende que el perfil de aceleración del movimiento plano es trapezoidal.

figure()
subplot(3,1,1)
plot(sampleTimes,acceleration(:,1));
axis padded
ylabel("a_x (m/s^2)")
title("Acceleration Profile")
subplot(3,1,2)
plot(sampleTimes,acceleration(:,2));
ylabel("a_y (m/s^2)")
axis padded
subplot(3,1,3)
plot(sampleTimes,acceleration(:,3));
ylabel("a_z (m/s^2)")
xlabel("Time (sec)")

Figure contains 3 axes objects. Axes object 1 with title Acceleration Profile, ylabel a_x (m/s^2) contains an object of type line. Axes object 2 with ylabel a_y (m/s^2) contains an object of type line. Axes object 3 with xlabel Time (sec), ylabel a_z (m/s^2) contains an object of type line.

Algoritmos

waypointTrajectory System object define una trayectoria que pasa suavemente por puntos de referencia. La trayectoria conecta los puntos de referencia a través de una interpolación que asume que la dirección de la gravedad expresada en el marco de referencia de la trayectoria es constante. Generalmente, puedes usar waypointTrajectory para modelar trayectorias de plataformas o vehículos dentro de un lapso de distancia de cientos de kilómetros.

La trayectoria plana (proyección del plano x-y) consta de curvas clotoides fragmentadas. La curvatura de la curva entre dos puntos de referencia consecutivos varía linealmente con la longitud de la curva entre ellos. La dirección tangente de la ruta en cada punto de referencia se elige para minimizar las discontinuidades en la curvatura, a menos que el curso se especifique explícitamente a través de la propiedad Course o implícitamente a través de la propiedad Velocities. Una vez establecido la ruta, el objeto utiliza la interpolación cúbica de Hermite para calcular la ubicación del vehículo a lo largo de la ruta en función del tiempo y la distancia plana recorrida. Si se especifica la propiedad JerkLimit, los objetos producen un perfil de aceleración trapezoidal horizontal para cualquier segmento que se encuentre entre dos puntos de referencia. El perfil de aceleración trapezoidal consta de tres subsegmentos:

  • Un subsegmento de sacudida de magnitud constante

  • Un subsegmento de aceleración de magnitud constante

  • Un subsegmento de sacudida de magnitud constante

El componente normal (componente z) de la trayectoria se elige posteriormente para satisfacer un spline por partes que preserva la forma (PCHIP), a menos que la velocidad de ascenso se especifique explícitamente a través de la propiedad ClimbRate o la tercera columna de la propiedad Velocities. Elija el signo de la velocidad de ascenso en función del ReferenceFrame seleccionado:

  • Cuando se selecciona un marco de referencia 'ENU', especificar una velocidad de ascenso positiva da como resultado un valor creciente de z.

  • Cuando se selecciona un marco de referencia 'NED', especificar una velocidad de ascenso positiva da como resultado un valor decreciente de z.

Puede definir la orientación del vehículo a través de la ruta de dos formas principales:

  • Si se especifica la propiedad Orientation, entonces el objeto utiliza un spline cuaternionario cúbico por partes para calcular la orientación a lo largo de la ruta en función del tiempo.

  • Si no se especifica la propiedad Orientation, la guiñada del vehículo siempre estará alineada con la trayectoria. El balanceo y el cabeceo se controlan entonces mediante los valores de propiedad AutoBank y AutoPitch, respectivamente.

    AutoBankAutoPitchDescripción
    falsefalseEl vehículo está siempre nivelado (cabeceo y balanceo cero). Esto se utiliza normalmente para embarcaciones marinas grandes.
    falsetrueEl paso del vehículo está alineado con la trayectoria y su balanceo es siempre cero. Normalmente se utiliza para vehículos terrestres.
    truefalseEl cabeceo y el balanceo del vehículo se eligen de modo que su eje local z esté alineado con la aceleración neta (incluida la gravedad). Esto se utiliza normalmente para embarcaciones de ala giratoria.
    truetrueEl balanceo del vehículo se elige de modo que su plano transversal local se alinee con la aceleración neta (incluida la gravedad). El paso del vehículo está alineado con la vía. Normalmente se utiliza para vehículos de dos ruedas y aviones de ala fija.

Capacidades ampliadas

expandir todo

Historial de versiones

Introducido en R2019b

expandir todo

Consulte también

Objetos