Main Content

Trazado de rutas 2-D con cinemática inversa

Introducción

En este ejemplo se muestra cómo calcular la cinemática inversa para un manipulador 2D simple utilizando la clase.inverseKinematics El robot manipulador es un simple manipulador plano de 2 grados de libertad con juntas revolutadas que se crea ensamblando cuerpos rígidos en un objeto.rigidBodyTree Una trayectoria circular se crea en un plano 2D y se da como puntos al solucionador de cinemática inversa. El solucionador calcula las posiciones de unión necesarias para lograr esta trayectoria. Finalmente, el robot se anima para mostrar las configuraciones del robot que logran la trayectoria circular.

Construir el robot

Cree un objeto y sólidos rígidos con sus uniones asociadas.rigidBodyTree Especifique las propiedades geométricas de cada cuerpo rígido y agréguelo al robot.

Comience con un modelo de árbol de sólido rígido en blanco.

robot = rigidBodyTree('DataFormat','column','MaxNumBodies',3); 

Especifique las longitudes de brazo para el brazo robótico.

L1 = 0.3; L2 = 0.3; 

Agregue el cuerpo con la articulación.'link1''joint1'

body = rigidBody('link1'); joint = rigidBodyJoint('joint1', 'revolute'); setFixedTransform(joint,trvec2tform([0 0 0])); joint.JointAxis = [0 0 1]; body.Joint = joint; addBody(robot, body, 'base'); 

Agregue el cuerpo con la articulación.'link2''joint2'

body = rigidBody('link2'); joint = rigidBodyJoint('joint2','revolute'); setFixedTransform(joint, trvec2tform([L1,0,0])); joint.JointAxis = [0 0 1]; body.Joint = joint; addBody(robot, body, 'link1'); 

Agregue el efector final con una unión fija.'tool''fix1'

body = rigidBody('tool'); joint = rigidBodyJoint('fix1','fixed'); setFixedTransform(joint, trvec2tform([L2, 0, 0])); body.Joint = joint; addBody(robot, body, 'link2'); 

Mostrar detalles del robot para validar las propiedades de entrada. El robot debe tener dos juntas no fijas para los cuerpos rígidos y un cuerpo fijo para el efector final.

showdetails(robot) 
-------------------- Robot: (3 bodies)   Idx    Body Name    Joint Name    Joint Type    Parent Name(Idx)   Children Name(s)  ---    ---------    ----------    ----------    ----------------   ----------------    1        link1        joint1      revolute             base(0)   link2(2)      2        link2        joint2      revolute            link1(1)   tool(3)      3         tool          fix1         fixed            link2(2)    -------------------- 

Definir la trayectoria

Defina un círculo que se trazará en el transcurso de 10 segundos. Este círculo está en el plano con un radio de 0,15.xy

t = (0:0.2:10)'; % Time count = length(t); center = [0.3 0.1 0]; radius = 0.15; theta = t*(2*pi/t(end)); points = center + radius*[cos(theta) sin(theta) zeros(size(theta))]; 

Solución cinemática inversa

Utilice un objeto para encontrar una solución de configuraciones robóticas que logren las posiciones del efector final dadas a lo largo de la trayectoria.inverseKinematics

Preasignar soluciones de configuración como una matriz .qs

q0 = homeConfiguration(robot); ndof = length(q0); qs = zeros(count, ndof); 

Cree el solucionador de cinemática inversa. Dado que los puntos cartesianos son los únicos factores importantes de la pose del efecto final para este flujo de trabajo, especifique un peso distinto de cero para el cuarto y quinto elementodel vector.xyweight Todos los demás elementos se establecen en cero.

ik = inverseKinematics('RigidBodyTree', robot); weights = [0, 0, 0, 1, 1, 0]; endEffector = 'tool'; 

Recorre la trayectoria de los puntos para trazar el círculo. Llame al objeto de cada punto para generar la configuración de unión que alcanza la posición del efector final.ik Almacene las configuraciones que se usará más adelante.

qInitial = q0; % Use home configuration as the initial guess for i = 1:count     % Solve for the configuration satisfying the desired end effector     % position     point = points(i,:);     qSol = ik(endEffector,trvec2tform(point),weights,qInitial);     % Store the configuration     qs(i,:) = qSol;     % Start from prior solution     qInitial = qSol; end 

Animar la solución

Trazar el robot para cada fotograma de la solución utilizando esa configuración específica del robot. Además, trazar la trayectoria deseada.

Muestre el robot en la primera configuración de la trayectoria. Ajuste el trazado para mostrar el plano 2D en el que se dibuja ese círculo. Trazar la trayectoria deseada.

figure show(robot,qs(1,:)'); view(2) ax = gca; ax.Projection = 'orthographic'; hold on plot(points(:,1),points(:,2),'k') axis([-0.1 0.7 -0.3 0.5]) 

Configure un objeto para mostrar la trayectoria del robot a una velocidad fija de 15 fotogramas por segundo.rateControl Muestre el robot en cada configuración desde el solucionador cinemático inverso. Observe cómo el brazo traza la trayectoria circular mostrada.

framesPerSecond = 15; r = rateControl(framesPerSecond); for i = 1:count     show(robot,qs(i,:)','PreservePlot',false);     drawnow     waitfor(r); end 

Consulte también

| | |

Temas relacionados