Main Content

Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Simular el seguimiento de la trayectoria del espacio conjunto en MATLAB

En este ejemplo se muestra cómo simular el movimiento del espacio conjunto de un manipulador robótico bajo control de bucle cerrado.

Definir robot y estado inicial

Cargue un ABB IRB-120T desde la biblioteca de robots utilizando la función.loadrobot

robot = loadrobot("abbIrb120T","DataFormat","column","Gravity",[0 0 -9.81]); numJoints = numel(homeConfiguration(robot));

Defina parámetros de simulación, incluido el intervalo de tiempo durante el cual se simula la trayectoria, el estado inicial como , y el punto de ajuste de espacio conjunto.[joint configuration; jointVelocity]

% Set up simulation parameters tSpan = 0:0.01:0.5; q0 = zeros(numJoints,1); q0(2) = pi/4; % Something off center qd0 = zeros(numJoints,1); initialState = [q0; qd0];  % Set up joint control targets targetJointPosition = [pi/2 pi/3 pi/6 2*pi/3 -pi/2 -pi/3]'; targetJointVelocity = zeros(numJoints,1); targetJointAcceleration = zeros(numJoints,1);

Visualice la posición del objetivo.

show(robot,targetJointPosition)

ans =    Axes (Primary) with properties:               XLim: [-1.5000 1.5000]              YLim: [-1.5000 1.5000]            XScale: 'linear'            YScale: 'linear'     GridLineStyle: '-'          Position: [0.1300 0.1100 0.7750 0.8150]             Units: 'normalized'    Show all properties  

Comportamiento del modelo con control de espacio conjunto

Con un objeto, simule el movimiento de bucle cerrado del modelo en una variedad de controladores. En este ejemplo se comparan algunos de ellos. Cada instancia utiliza la función para calcular la derivada de estado.derivative Aquí, el estado es 2 vector de elemento, donde está el número de uniones en el objeto asociado.n-[joint configuration; joint velocity]nrigidBodyTree

Control de par computado

El control de par calculado utiliza un cálculo de dinámica inversa para compensar la dinámica del robot. El controlador controla la dinámica de error de bucle cerrado de cada unión basada en una respuesta de segundo orden.

Cree un y especifique el modelo de robot.jointSpaceMotionModel Establezca el archivo en ."MotionType""ComputedTorqueControl" Actualice la dinámica de errores utilizando y especifique el tiempo de sedimentación deseado y el rebasamiento respectivamente.updateErrorDynamicsFromStep Alternativamente, puede establecer la relación de amortiguación y la frecuencia natural directamente en el objeto.

computedTorqueMotion = jointSpaceMotionModel("RigidBodyTree",robot,"MotionType","ComputedTorqueControl"); updateErrorDynamicsFromStep(computedTorqueMotion,0.2,0.1);

Este modelo de movimiento requiere que se proporcione la posición, la velocidad y la aceleración.

qDesComputedTorque = [targetJointPosition; targetJointVelocity; targetJointAcceleration];

Para ver un ejemplo de este controlador en la práctica en Simulink, consulte el ejemplo.Controle el movimiento del manipulador LBR a través de comandos de par conjunto

Control conjunto independiente

Con un control de conjunto independiente, modele cada unión como un sistema independiente que tiene una respuesta de seguimiento de segundo orden. Este tipo de modelo es un comportamiento idealizado y se utiliza mejor cuando la respuesta es lenta, o cuando la dinámica no tendrá un impacto significativo en la trayectoria resultante. En esos casos, se comportará igual que el control de par calculado, pero con menos sobrecarga computacional.

Cree otro utilizando el tipo de movimiento.joinSpaceMotionModel"IndependentJointMotion"

IndepJointMotion = jointSpaceMotionModel("RigidBodyTree",robot,"MotionType","IndependentJointMotion"); updateErrorDynamicsFromStep(IndepJointMotion,0.2,0.1);

Este modelo de movimiento requiere que se proporcione la posición, la velocidad y la aceleración.

qDesIndepJoint = [targetJointPosition; targetJointVelocity; targetJointAcceleration];

Control proporcional-derivado

El Control Proporcional-Derivado, o Control DE PD, combina la compensación de gravedad con ganancias proporcionales y derivadas. A pesar de la naturaleza más simple en relación con otros modelos de forma cerrada, el controlador de PD puede ser estable para todos los valores de ganancia positivos, lo que lo convierte en una opción deseable. Aquí, las ganancias de PD se establecen como matrices -por-, donde está el número de articulaciones en el objeto asociado.nnnrigidBodyTree Para este robot, 6.n Además, PD Control no requiere un perfil de aceleración, por lo que su vector de estado es solo un vector de 2 elementos de configuraciones de juntas y velocidades de unión.n

pdMotion = jointSpaceMotionModel("RigidBodyTree",robot,"MotionType","PDControl"); pdMotion.Kp = diag(300*ones(1,6)); pdMotion.Kd = diag(10*ones(1,6));

Este modelo de movimiento requiere que se proporcione la posición y la velocidad.

qDesPD = [targetJointPosition; targetJointVelocity];

Simular el uso de un solver ODE

La función genera la derivada de estado, que se puede integrar mediante un solucionador de ecuaciones diferenciales ordinarias (ODE) como .derivativeode45 Para cada modelo de movimiento, el solver ODE genera un vector de columna -elemento que cubre y una matriz de 2 por- del vector de estado de 2 elementos en cada instante en el tiempo.mtspanmn

Calcule la trayectoria de cada modelo de movimiento utilizando el solucionador de ODE más adecuado para cada sistema.

[tComputedTorque,yComputedTorque] = ode45(@(t,y)derivative(computedTorqueMotion,y,qDesComputedTorque),tSpan,initialState); [tIndepJoint,yIndepJoint] = ode45(@(t,y)derivative(IndepJointMotion,y,qDesIndepJoint),tSpan,initialState); [tPD,yPD] = ode15s(@(t,y)derivative(pdMotion,y,qDesPD),tSpan,initialState);

Resultados de la gráfica

Una vez completada la simulación, compare los resultados uno al lado del otro. Cada trazado muestra la posición de la articulación en la parte superior y la velocidad en la parte inferior. Las líneas discontinuas indican las trayectorias de referencia, mientras que las líneas sólidas muestran la respuesta simulada.

% Computed Torque Control figure subplot(2,1,1) plot(tComputedTorque,yComputedTorque(:,1:numJoints)) % Joint position hold all plot(tComputedTorque,targetJointPosition*ones(1,length(tComputedTorque)),'--') % Joint setpoint title('Computed Torque Motion: Joint Position') xlabel('Time (s)') ylabel('Position (rad)') subplot(2,1,2) plot(tComputedTorque,yComputedTorque(:,numJoints+1:end)) % Joint velocity title('Joint Velocity') xlabel('Time (s)') ylabel('Velocity (rad/s)')

En la siguiente gráfica, utilice un control de unión independiente para confirmar que el movimiento de par calculado se comporta de forma equivalente en algunos supuestos simplificadores.

% Independent Joint Motion figure subplot(2,1,1) plot(tIndepJoint,yIndepJoint(:,1:numJoints)) hold all plot(tIndepJoint,targetJointPosition*ones(1,length(tIndepJoint)),'--') title('Independent Joint Motion: Position') xlabel('Time (s)') ylabel('Position (rad)') subplot(2,1,2); plot(tIndepJoint,yIndepJoint(:,numJoints+1:end)) title('Joint Velocity') xlabel('Time (s)') ylabel('Velocity (rad/s)')

Por último, el Controlador de Datos sobre El Rendimiento utiliza ganancias bastante agresivas para lograr tiempos de subida similares, pero a diferencia de los otros enfoques, las articulaciones individuales se comportan de manera diferente, ya que cada articulación y los cuerpos asociados tienen propiedades dinámicas ligeramente diferentes que no son compensado por el controlador.

% PD with Gravity Compensation figure subplot(2,1,1) plot(tPD,yPD(:,1:numJoints)) hold all plot(tPD,targetJointPosition*ones(1,length(tPD)),'--') title('PD Controlled Joint Motion: Position') xlabel('Time (s)') ylabel('Position (rad)') subplot(2,1,2) plot(tPD,yPD(:,numJoints+1:end)) title('Joint Velocity') xlabel('Time (s)') ylabel('Velocity (rad/s)')

Visualizar las trayectorias como una animación

Para ver cómo se ve este comportamiento en 3D, el siguiente ejemplo de ayuda útil traza el movimiento del robot en el tiempo. La tercera entrada es el número de fotogramas entre cada muestra.

exampleHelperRigidBodyTreeAnimation(robot,yComputedTorque,1);

exampleHelperRigidBodyTreeAnimation(robot,yIndepJoint,1);

exampleHelperRigidBodyTreeAnimation(robot,yPD,1);