이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.
역기구학을 사용하여 2차원 경로 추적하기
소개
이 예제는 inverseKinematics
클래스를 사용하여 단순한 2차원 매니퓰레이터의 역기구학을 계산하는 방법을 보여줍니다. 이 매니퓰레이터 로봇은 회전 조인트를 가진 단순한 2자유도 평면 매니퓰레이터로, 여러 강체를 rigidBodyTree
객체로 조립하여 만듭니다. 원형 궤적이 2차원 평면에서 생성되어 역기구학 솔버에 점으로 제공됩니다. 솔버는 이 궤적을 구현하기 위한 조인트 위치를 계산합니다. 마지막으로, 원형 궤적을 구현하는 로봇 컨피규레이션을 애니메이션으로 표시합니다.
로봇 만들기
rigidBodyTree
객체를 만들고 강체와 강체에 연결된 조인트를 만듭니다. 각 강체의 기하 속성을 지정하고 로봇에 추가합니다.
빈 강체 트리 모델을 만드는 것부터 시작합니다.
robot = rigidBodyTree('DataFormat','column','MaxNumBodies',3);
로봇 팔의 길이를 지정합니다.
L1 = 0.3; L2 = 0.3;
'joint1'
조인트가 있는 'link1'
바디를 추가합니다.
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');
'joint2'
조인트가 있는 'link2'
바디를 추가합니다.
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');
'fix1'
고정 조인트가 있는 'tool'
엔드 이펙터를 추가합니다.
body = rigidBody('tool'); joint = rigidBodyJoint('fix1','fixed'); setFixedTransform(joint, trvec2tform([L2, 0, 0])); body.Joint = joint; addBody(robot, body, 'link2');
로봇의 세부 정보를 표시하여 입력 속성의 유효성을 검사합니다. 로봇에는 2개의 비고정 조인트가 필요합니다. 링크 바디는 회전 조인트를 통해 부모 바디에 연결되고 엔드 이펙터는 고정 조인트를 통해 부모 바디에 연결됩니다.
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) --------------------
궤적 정의하기
10초 동안 추적할 원을 정의합니다. 이 원은 반지름이 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))];
역기구학 해
inverseKinematics
객체를 사용하여 궤적을 따라 지정된 엔드 이펙터 위치를 구현하는 로봇 컨피규레이션의 해를 구합니다.
컨피규레이션 해를 행렬 qs
로 사전 할당합니다.
q0 = homeConfiguration(robot); ndof = length(q0); qs = zeros(count, ndof);
역기구학 솔버를 만듭니다. 이 워크플로에서는 엔드 이펙터 자세에 중요한 유일한 요인이 xy 카테시안 점이므로 weight
벡터의 네 번째와 다섯 번째 요소에 0이 아닌 가중치를 지정합니다. 나머지 요소는 모두 0으로 설정합니다.
ik = inverseKinematics('RigidBodyTree', robot); weights = [0, 0, 0, 1, 1, 0]; endEffector = 'tool';
점의 궤적을 순환하면서 원을 추적합니다. 각 점마다 ik
객체를 호출하여 엔드 이펙터 위치를 구현하는 조인트 컨피규레이션을 생성합니다. 나중에 사용할 수 있도록 컨피규레이션을 저장합니다.
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
해를 애니메이션으로 보기
해의 각 프레임마다 해당 로봇 컨피규레이션을 사용하여 로봇을 플로팅합니다. 또한 목표 궤적도 플로팅합니다.
궤적의 첫 번째 컨피규레이션에서의 로봇을 표시합니다. 플롯을 조정하여 원이 그려지는 2차원 평면을 표시합니다. 목표 궤적을 플로팅합니다.
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])
rateControl
객체를 설정하여 초당 15프레임의 고정 레이트로 로봇 궤적을 표시합니다. 역기구학 솔버의 각 컨피규레이션에서의 로봇을 표시합니다. 팔이 원형 궤적을 추적하며 움직이는 모습을 관찰합니다.
framesPerSecond = 15; r = rateControl(framesPerSecond); for i = 1:count show(robot,qs(i,:)','PreservePlot',false); drawnow waitfor(r); end
참고 항목
rigidBodyTree
| rigidBody
| rigidBodyJoint
| inverseKinematics