1. 기구학/역기구학 개념
일반적으로, 로봇암은 회전각 을 제어하는 모터로 구성된다. 하지만, 우리가 원하는 것은 로봇암의 End effector 를 정확한 x, y, z 위치와 effector의 자세각을 제어하는 것이다.
그러므로, 로봇암을 제어하는 문제는 다음 수식과 같이 회전각 공간을 위치와 자세각으로 표현되는 작업공간으로 행렬변환하는 문제가 된다.
이는 기하학적인 운동을 계산하는 것이므로, 기구학(FK. Forward Kinematic), 역기구학(RK. Reverse Kinematic)이라 칭한다.
좌표를 변환할 때 주로 사용하는 것은 동차행렬이며, 이는 4x4 행렬로 표현될 수 있다. 한 행렬안에, 이동, 회전, 스케일을 모두 표현할 수 있다. 변환행렬은 좌표 변환 기능(TF. transform function)을 담당한다.
로봇암은 joint와 link의 쌓으로 구성되므로, 각 joint별 회전각 를 이용해 변환행렬 t을 계산할 수 있으며, 이들 t1...tn의 행렬곱으로 작업공간의 위치와 자세각을 계산하는 tm 손쉽게 얻을 수 있다.
이를 역으로 풀면, 각 joint별 회전각을 얻을 수 있다. 결론적으로, 획득된 회전각들은 로봇암의 각 모터를 제어할 때 사용하면 된다.
이는 마치 게임 개발 시, 모델 지역좌표와 월드좌표를 계산하는 과정과 매우 유사하다. 이런 좌표변환은 컴퓨터 그래픽스에서 고전적인 좌표 표현 방식 중 하나이다.
2. ROS기반 로봇암 제어 순서
ROS을 이용한 로봇암 제어 방법은 다음과 같다.
1. ROS MoveIt 패키지 설치
2. URDF(Universal Robotic Description Format) 파일에 로봇암의 기구부의 조인트, 링크 지점, 형상, 물성(무게중심 등), 재질(색상 등) 정의하고 로봇암을 모델링함
3. MoveIt Setup Assistant 프로그램을 통해, 로봇암 정보 설정
이와 관련해, 다음 레퍼런스를 참고하였다.
상세 내용은 다음과 같다.
3. ROS URDF 파일 기반 로봇암 모델링
로봇암은 관절에 해당하는 조인트(joint), 관절과 관절을 연결하는 링크(link)로 다음 그림과 같이 구성된다. URDF는 조인트와 링크의 관계를 정의하는 포맷이다.위의 링크는 다음과 같은 URDF 포맷으로 정의할 수 있다. 파일명은 my_robot.urdf로 저장한다.
<robot name="test_robot">
<link name="link1" />
<link name="link2" />
<link name="link3" />
<link name="link4" />
<joint name="joint1" type="continuous">
<parent link="link1"/>
<child link="link2"/>
</joint>
<joint name="joint2" type="continuous">
<parent link="link1"/>
<child link="link3"/>
</joint>
<joint name="joint3" type="continuous">
<parent link="link3"/>
<child link="link4"/>
</joint>
</robot>
URDF를 사용하려면, 다음 라이브러리를 설치해야 한다.
$ sudo apt-get install liburdfdom-tools
제대로 작성했는 지를 체크하려면, 다음과 같은 명령을 입력한다.
$ check_urdf my_robot.urdf
이제 여기에, 로봇암 조인트 위치, 링크 치수를 정의한다.
<robot name="test_robot">
<link name="link1" />
<link name="link2" />
<link name="link3" />
<link name="link4" />
<joint name="joint1" type="continuous">
<parent link="link1"/>
<child link="link2"/>
<origin xyz="5 3 0" rpy="0 0 0" />
</joint>
<joint name="joint2" type="continuous">
<parent link="link1"/>
<child link="link3"/>
<origin xyz="-2 5 0" rpy="0 0 1.57" />
</joint>
<joint name="joint3" type="continuous">
<parent link="link3"/>
<child link="link4"/>
<origin xyz="5 0 0" rpy="0 0 -1.57" />
</joint>
</robot>
다음과 같이 조인트 회전축을 정의한다. 조인트 회전축은 벡터이며, 정규화되어 있다.
<robot name="test_robot">
<link name="link1" />
<link name="link2" />
<link name="link3" />
<link name="link4" />
<joint name="joint1" type="continuous">
<parent link="link1"/>
<child link="link2"/>
<origin xyz="5 3 0" rpy="0 0 0" />
<axis xyz="-0.9 0.15 0" />
</joint>
<joint name="joint2" type="continuous">
<parent link="link1"/>
<child link="link3"/>
<origin xyz="-2 5 0" rpy="0 0 1.57" />
<axis xyz="-0.707 0.707 0" />
</joint>
<joint name="joint3" type="continuous">
<parent link="link3"/>
<child link="link4"/>
<origin xyz="5 0 0" rpy="0 0 -1.57" />
<axis xyz="0.707 -0.707 0" />
</joint>
</robot>
이제 다시 URDF 파일을 체크하고, 로봇암을 시각적으로 확인해 본다.
$ check_urdf my_robot.urdf
$ urdf_to_graphiz my_robot.urdf
$ evince test_robot.pdf그럼 다음과 같은 로봇암 그래픽을 확인할 수 있다.
로봇암을 직접 프로그램으로 제어하면, 로봇암 부품끼리 충돌하는 문제가 빈번히 발생한다. 잘 생각하고 코딩했더라도, 충돌 문제를 피하기 어려우며, 부품끼리 충돌하면 로봇암 기구가 부서질 수도 있다. URDF는 충돌 범위를 각 링크 별로 지정할 수 있다.
아울러, 링크는 자중이 있어, 로봇암 움직임에 영향을 줄 수 있으므로, 무게중심을 정의할 필요가 있다.
다음은 하나의 링크에 대한 충돌 영역, 무게 중심 및 시각적으로 보이는 정보를 정의한 예이다.
<link name="link1">
<collision>
<origin rpy="0 0 0" xyz="0 0 0.25"/>
<geometry>
<box size="0.1 0.1 0.5"/>
</geometry>
</collision>
<visual>
<origin rpy="0 0 0" xyz="0 0 0.25"/>
<geometry>
<box size="0.1 0.1 0.5"/>
</geometry>
<material name="black"/>
</visual>
<inertial>
<origin rpy="0 0 0" xyz="0 0 0.25"/>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
여기서 material "black"은 URDF 파일에 미리 사전 정의되어 있어야 한다.
<material name="black">
<color rgba="0.0 0.0 0.0 1.0"/>
</material>
이런 방식으로, 로봇암을 상세히 정의할 수 있다.
3축 로봇암 MoveIt테스트를 위해, 오로카 세미나 자료인 URDF파일을 이용해 본다. 상세 내용은 다음 링크를 참고한다.
로봇암 구조는 다음과 같다.
다음은 turtlebot 패키지에 정의된 로봇암을 rviz 로 확인한 것이다.
4. ROS MoveIt
역기구학적 계산을 위해, 직접 앞의 변환행렬을 계산하고, 역함수를 계산해, 원하는 모터의 회전각을 얻을 수 있으나, ROS에서는 이미 이를 계산해 주는 MoveIt 패키지가 나와 있다.
MoveIt은 ROS Desktop 버전을 설치하였다면, 이미 설치되어 있을 것이다. 만약, 그렇지 않다면, 다음 링크를 참고해 설치를 한다.
MoveIt을 편리하게 설정하는 MoveIt Setup Assistant 도구가 있다. roscore를 실행하고, 다음 명령을 터미널에서 입력한다.
$ roslaunch moveit_setup_assistant setup_assistant.launch
그럼 다음과 같은 프로그램이 실행된다.
MoveIt을 이용하면, 다음과 같이 자기 충돌이 있는 지를 체크할 수 있다.
기타, 링크 설정, 로봇 포즈 설정 등을 할 수 있다.
MoveIt Setup Assistant를 이용한 MoveIt 설정 및 실행 방법은 다음을 참고하자.
자세한 내용은 다음 링크를 참고한다.