Robotics

[로봇공학] 2. DH parameter로 복잡한 로봇팔 표현

로보고니 2024. 10. 6. 14:47
반응형

서론

이전 글에서 Forward Kinematics를 사용하여 로봇팔의 각 관절 각도와 Link의 길이를 가지고 끝점의 좌표를 계산했다. 그리고 그것을 매트랩 시뮬레이션을 통해서 눈으로 직접 확인했다.

 

이전 글에서 시뮬레이션했던 로봇팔은 Planar 2 DOF Robot Arm이기 때문에 정말 간단하고 단순하게 생겼다. 덕분에 기구학 계산도 어렵지 않게 할 수 있었다. 

PUMA 560

하지만 PUMA 560과 같이 조금 더 복잡해진다면 우리는 이 로봇팔의 각 관절의 각도를 가지고 어떻게 해야 끝점의 좌표를 계산할 수 있을까? 특히, Z축 방향의 회전을 하는 3차원 로봇팔의 경우에는 그 계산이 점점 더 복잡해진다.

 

그래서 우리는 단순한 2 DOF 로봇팔이 아니라 6 DOF 이상의 로봇팔도 쉽게 계산하기 위해서 DH parameter라는 DH 변수를 알아볼 것이다.


DH parameter

DH 파라미터는 DH 변수 혹은 Denavit-Hartenberg parameter라고도 부른다. 이것은 보통 표로 제공이 되는데, 이 표에는 각 관절의 각도와 링크의 길이가 적혀있다. 그리고 이 각도와 길이를 가지고 우리는 Forward Kinematics를 쉽게 계산할 수 있게 되는 것이다.

 

DH parameter에는 두 가지 버전이 있다. Modified DH parameterClassical DH parameter이다. 지금 더 많이 사용하는 것은 Modified이지만 혹시나 Classical의 방법이 있을 수도 있다. 하지만 이 둘을 활용하는 방법은 동일하기 때문에, 순서만 잘 확인해서 사용하면 된다.

 

Modified DH Parameter

Modified DH Parameter는 예전부터 사용해 오던 DH Parameter의 순서이다. 사실 DH Parameter를 공부하면서 classical인지 modified인지가 중요한 것이 아니다. 그 둘은 그저 순서의 차이일 뿐, 각 파라미터가 어떤 뜻을 가지고 있는지 알아야 한다.

PUMA 560의 DH Parameter

이것은 위에 있었던 PUMA 560의 DH Parameter이다. 이 표를 보면 알 수 있듯이 4개의 파라미터가 있다. 우리는 로봇을 분석하기 위해서 한 점을 찍어야 한다. 그리고 그 점의 위치는 보통 첫 번째 관절로 정한다. 그렇다면 우리는 그 점을 기준으로 이 표와 함께 로봇을 천천히 분석할 수 있다.

 

첫번째 나오는 알파(x축 각도)부터 보자. 첫 점을 찍은 곳을 기준으로 xyz 좌표계를 설정한다. 그리고 x 축을 기준으로 알파 값만큼 회전 시킨다. 그리고 나서 a(x축 변위)의 값만큼 x축 방향으로 이동한다. 그리고는 d(z축 변위) z축 방향으로 d만큼 이동해주고, 세타(z축 각도)의 각도만큼 z축을 기준으로 회전시켜준다.

 

로봇팔을 단 4개의 변수를 가지고 정의한 것이다. 위에서 언급한 순서를 차근차근 따라가다 보면 어느새 하나의 로봇팔을 그릴 수 있는 것이다. 보통 세타를 변수로 많이 정의하며, 우리는 세타의 값을 조절하면서 로봇팔을 움직이게 된다. 그래서 처음 DH Parameter를 가지고 로봇팔이 어떻게 생겼는지 분석할 때는 세타에 0을 넣어서 계산하면 편하다.

 

그리고 몇 번 DH Parameter를 사용하다 보면 같은 로봇팔인데 다른 DH Parameter가 정의되는 것을 확인할 수 있는데, 이것은 하나의 로봇팔이 하나의 DH Parameter를 갖지 않는다는 것을 알 수 있다.

 

참고로 알파와 a, 세타와 d는 서로 자리가 바뀌더라도 영향을 미치지 않는다. 즉, (a, 알파, d, 세타)와 (알파, a, 세타, d)는 동일하다.

Classical DH Parameter

사실 Classical DH Parameter와 크게 다르지 않다. 이를 해석하는 방법과 정의하는 방법은 동일하지만 그 순서에 차이가 있다. 정확히는 x축을 먼저 회전시키는지, z축을 먼저 회전시키는지의 차이가 있다. 그래서 Classical과 Modified를 구분하지 않고 사용하게 되면 전혀 다른 모양의 로봇팔을 정의할 수 있다.

 

Classical DH Parameter와 Modified DH Parameter의 차이는 앞서 말했듯이 어떤 것을 먼저 회전시키는지이다. Classical의 경우 z축을 먼저 회전시키기 때문에 (d, 세타, a, 알파)의 순서로 구성된다.

 

하지만, 사실 Classical과 Modified가 혼용되어 사용되기도 한다. 그래서 Matlab에서 DH Parameter를 사용할 때는 라이브러리를 읽어보거나 간단한 값을 넣어 직접 확인해 본 뒤에 사용하는 것을 추천한다.


DH Parameter를 사용한 Transformation matrix

이제 DH Parameter를 만들었다면 이를 사용하여 Transformation matrix를 만들 수 있다. 오늘은 6자유도를 가진 Indy 7 로봇팔을 가지고 Forward Kinematics를 계산해볼 것이다.

Indy 7 로봇팔
Indy 7 DH Parameter

우리는 앞에서 DH Parameter를 배웠기에, 이 DH Parameter 표를 보고 Indy 7 로봇팔을 그릴 수 있어야 한다. 그리고 이 Indy 7의 DH Parameter를 가지고 Matalba에서 Forward Kinematics를 계산할 것이다.

전체 코드

clc; clear; close all;

function T_06 = for_pos(theta1, theta2, theta3, theta4, theta5, theta6)
    % alpha_i-1 a_i-1 d_i theta_i
    DH_para = [0 0 0.300 theta1+0;
               pi/2 0 0 theta2+pi/2;
               0 0.400 0 theta3+pi/2;
               pi/2 0 0.350 theta4+pi;
               pi/2 0 0.150 theta5+0;
               -pi/2 0 0.200 theta6+0;];
    
    % alpha, a, theta, d
    T_01 = [rotx(DH_para(1,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(1,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(1,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(1,3); 0 0 0 1;];
    T_12 = [rotx(DH_para(2,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(2,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(2,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(2,3); 0 0 0 1;];
    T_23 = [rotx(DH_para(3,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(3,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(3,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(3,3); 0 0 0 1;];
    T_34 = [rotx(DH_para(4,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(4,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(4,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(4,3); 0 0 0 1;];
    T_45 = [rotx(DH_para(5,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(5,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(5,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(5,3); 0 0 0 1;];
    T_56 = [rotx(DH_para(6,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(6,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(6,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(6,3); 0 0 0 1;];
    
    T_06 = T_01*T_12*T_23*T_34*T_45*T_56;
end

a = for_pos(0, 0, 0, 0, 0, 0)

 

결과 화면

Indy 7 Forward Kinematics 결과 화면

코드 분석

DH Parameter

 % alpha_i-1 a_i-1 d_i theta_i
DH_para = [0 0 0.300 theta1+0;
           pi/2 0 0 theta2+pi/2;
           0 0.400 0 theta3+pi/2;
           pi/2 0 0.350 theta4+pi;
           pi/2 0 0.150 theta5+0;
           -pi/2 0 0.200 theta6+0;];

Transformation matrix를 계산하는 함수에서 가장 먼저 해준 것은 DH Parameter를 정의해주는 것이다. 이것은 표에서 이미 제공이 되었기 때문에 간단하게 matrix를 만들 수 있다.

 

Transformation matrix

% alpha, a, theta, d
T_01 = [rotx(DH_para(1,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(1,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(1,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(1,3); 0 0 0 1;];
T_12 = [rotx(DH_para(2,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(2,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(2,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(2,3); 0 0 0 1;];
T_23 = [rotx(DH_para(3,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(3,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(3,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(3,3); 0 0 0 1;];
T_34 = [rotx(DH_para(4,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(4,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(4,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(4,3); 0 0 0 1;];
T_45 = [rotx(DH_para(5,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(5,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(5,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(5,3); 0 0 0 1;];
T_56 = [rotx(DH_para(6,1)),[0;0;0];0 0 0 1;]*[1 0 0 DH_para(6,2); 0 1 0 0; 0 0 1 0; 0 0 0 1]*[rotz(DH_para(6,4)),[0;0;0]; 0 0 0 1]*[1 0 0 0; 0 1 0 0; 0 0 1 DH_para(6,3); 0 0 0 1;];

T_06 = T_01*T_12*T_23*T_34*T_45*T_56;

그다음으로는 정의된 DH Parameter를 사용하여 Transformation matrix를 만들어줬다.

 

앞서 소개했듯이 알파와 세타는 각 x축과 z축을 기준으로 회전시키는 것이다. 그래서 그것들은 rotx와 rotz를 사용하여 rotation matrix를 만들었다. 그다음으로는 a와 d를 각 x축과 z축으로 Translation 시켜야 하기 때문에 이를 사용하여 translation matrix를 만들었다.

 

그리고 Modified DH Parameter의 순서에 맞게 각 matrix를 곱해주면 각 관절 사이의 Transformation matrix가 만들어진다. 마지막으로 모든 Transformation matrix를 곱해주면 Indy 7 로봇팔의 Transformation matrix가 완성된다.

 

최종적으로, 이 함수에 각 관절의 각도를 넣어주면 각도에 따른 끝점의 위치가 출력된다.


마무리

오늘은 로봇공학에서 로봇팔을 정의하기 위해서 반드시 알아야 하는 DH Parameter에 대해서 공부했다. 그리고 6자유도를 가지는 Indy 7의 DH Parameter를 가지고 Matlab에서 이를 활용하여 Forward Kinematics를 계산하기도 했다. 이제 아무리 복잡한 로봇팔이 오더라도 우리는 DH Parameter만 있다면 그 로봇팔에 대한 분석은 어렵지 않게 할 수 있을 것이다.

 

이렇게 Forward Kinematics를 위한 공부가 모두 끝났으니 이제는 Inverse Kinematics에 대해서 공부할 것이다. 역기구학 공부를 통해 Task space와 Joint space를 자유롭게 넘나들 수 있기를 기대한다.

 

 

 

반응형