본문 바로가기
로봇 이야기/ros2

매니퓰레이터(manipulator) URDF 모델링

by 노땅엔진니어 2022. 12. 31.

URDF로 로봇을 모델링하고 시뮬레이션을 실험하기 좋은 로봇 모델은 로봇팔(manipulator) 입니다. XML로 URDF 모봇 모델링을 할 수 있지만 xacro(XML macro)로 모델링을 하는 것이 훨씬 간단하기 때문에 이 예제에서는 xacro로 모델링을 하였습니다.

보통 로봇팔을 모델링 할 때 6 자유도(DOF, Degree of Freedom)를 많이 사용하지만, 이 예제에서는 왼쪽 그림과 같이 4 자유도를 갖는 로봇팔로 모델링을 했습니다. 로봇팔에 사용되는 관절은 회전 관절(revolute joint)를 사용하여, 실제 로봇을 만들 때 서보모터를 사용하면 쉽게 구현을 할 수 있습니다.

 

 

 

 

 

 

 

 

 

 1. 링크 (link, 몸체)

링크는 몸체(강체)로써 눈에 보이는 <visual>태그와 눈에는 보이지 않지만, 다른 링크(몸체)와의 충돌들을 위해 <collison>태그로 표현을 합니다. 보통은 <visual>태그와 <collision> 태그는 같은 크기를 갖습니다. XML로 작성을 하게되면 <visual>태그와 <collison>태그에 상수 값으로 직접 기술하게 됩니다. 만약 크기가 변경되어 수정을 하게 된다면 일일이 <visual>태그와 <collison>태그에 있는 상수 값을 수정해야 합니다. xacro로 구현을 하게되면 링크의 크기를 속성으로 정의하고 URDF를 작성하면 나중에 수정을 하더라도 속성에 있는 값을 변경하면 <visual>태그와 <collison>태그에 있는 사이즈가 동시에 수정 됩니다.

다음은 위 로봇팔에서 원통형 링크와 박스형(box) 링크를 위한 크기를 속성(property)으로 정의 하였습니다.

  <xacro:property name="base_radius" value="0.1"/>
  <xacro:property name="base_height" value="0.2"/>

  <xacro:property name="arm_width" value="0.05"/>
  <xacro:property name="arm_length" value="0.05"/>
  <xacro:property name="arm_height" value="0.2"/>

  <xacro:property name="extra_height" value="0.05"/>

  <xacro:property name="mass" value="0.1"/>

base_radius와 base_height는 아래 그림의 원통형 링크의 반지름과 높이이고, arm_width, arm_length, arm_height는 박스형 링크의 크기를 나타 냅니다. extra_height는 링크 들 사이의 여유 공간입니다.

 2. URDF에서의 원점 (origin)

URDF에서 원점은 <origin>태그로 정의를 합니다.  <origin> 태그에는 직교 좌표계 "xyz="와 오일러 각 좌표계 "rpy="가 있습니다. 직교 좌표계의 단위는 미터(meter)이고 오일러 각 좌표계는 라디안(radian, 호도법 입니다.

직교 좌표계의 원점은 링크의 중심이 원점입니다. 우리는 링크의 시작점에 원점(0, 0, 0)을 두는 것에 더 익숙 합니다. 아래 그림에서 왼쪽은 URDF에서 원점의 위치이고 오른쪽 그림은 우리가 익숙한 원점을 두기 위해서는 높이에서 (height/2)와 같이 이동을 해야 합니다.

원점은 <visual>, <collision>, <inertial> 태그 모두에 있습니다. 위 원통형의 원점 값은 "xyz="0 0 ${base_height/2}"이고 아래 예는 박스형 링크의 원점에 대한 속성 입니다. 아래 예에서 extra_height 값을 준 것은 링크간 붙지 않도록 하기 위해 여유를 둔 것입니다.

  <xacro:property name="link_visual_box">
    <visual>
      <origin xyz="0 0 ${arm_height/2+extra_height}" rpy="0 0 0" />
      <geometry>
        <box size="${arm_width} ${arm_length} ${arm_height}"/>
      </geometry>
      <xacro:insert_block name="yellow_material" />
    </visual>
  </xacro:property>

ROS2의 rviz(3D visualization tool)은 우리가 모델링 한 URDF를 시각적으로 보여 줍니다. URDF 모델링에서 링크는 <visual>태그가 있지만 관절에는 <visual>태그가 없습니다. 이는 rviz에서 관절은 눈으로 보여지는 것이 없다는 의미 입니다. rviz에서 관절의 직각 좌표계(아래 그림에서 빨(x축), 녹(y축), 파(z축) 좌표계)로 보여 집니다. 옵션을 통해서 보이지 않도록 할 수 있습니다.

링크와 관절 모두 원점 <origin> 태그를 통해서 좌표계에서 자신의 위치를 표현 합니다. 다만, 관절의 원점 <origin> 태그를 통해서 정의된 태그는 이후에 연결되는 링크와 관절의 기준 좌표계가 됩니다.

이를 아래 그림을 통해 설명을 한다면 원통형 링크는 rviz에서 첫번째 링크이기 때문에 좌표계는 rviz의 전역 좌표계 원점에서 시작을 합니다. 또한 첫번째 관절 또한 rviz의 전역 좌표계 원점에서 시작을 합니다.

첫 번째 관절의 좌표는 rviz의 원점에서 (0, 0, height_1+extra_height) 입니다. 관절은 새로운 좌표계를 생성 합니다. 이는 관절 이후에 연결되는 링크와 관절의 원점 (0, 0, 0)은 rviz의 전역 좌표계로 보았을 때는 (0, 0, height_1+extra_height) 입니다. 링크와 관절에서 같은 <origin>이지만 이와 같은 차이가 있습니다. <origin>에는 또한 rpy(roll, pitch, yaw) 좌표계가 있습니다. 이는 직각 좌표계와 마찬가지로 관절에서 회전을 하면 그 이후에 연결되는 링크와 관절은 회전한 만큼이 원점이 됩니다.

 3. 회전 관절 (revolute joint)

회전은 회전 축이 필요 합니다. URDF에서 회전 관절에서 회전 축을 표시하지 않으면 기본 회전 축은 x축 입니다. 회전 축을 변경하기 위해서는 <axis> 태그를 통해서 변경을 합니다. 

아래 그림은 <axis xyz="1 0 0">(x축), <axis xyz="0 1 0">(y축), <axis xyz="0 0 1">(z축)에 대한 회전 축 및 회전 방향을 보여 줍니다. 회전 관절에서 각도의 증가는 반시계 방향 입니다.

회전 관절의 형태는 연속형(continuous)과 불연속성(revolute)가 있는데 회전 관절(revolute joint)에는 회전의 각도의 범위가 반드시 필요 합니다. 각도 범위에서 낮은 쪽 각도는 lower이고 높은 쪽 각도는 upper로 나타 냅니다. 당연한 이야기지만 각도는 라디안(radian, 호도법 입니다.

회전 축을 변경할 수 있는 방법은 <axis>태그가 아닌 <origin> 태그의 rpy(roll, pitch, yaw)를 통해서도 변경 할 수 있습니다. 두 가지의 차이점은 <axis> 태크를 통해서 회전 축을 변경하면 해당 관절에만 적용되고, 관절 이후에 연결되는 링크나 관절에는 영향을 주지 않습니다. <origin> 태그를 통해 관절 자체의 방향을 변경하여 축을 변경하면 이후의 링크나 관절의 좌표계에 영향을 줍니다.

아래는 로봇팔의 가장 아래에 있는 원통형 링크에 연결된 관절로써 z축을 회전축으로 사용을 합니다.

  <xacro:macro name="revolute_circle_joint_macro" params="suffix parent child axis:='0.0 0.0 1.0'">
    <joint name="joint_${suffix}" type="revolute">
      <origin xyz="0.0 0.0 ${extra_height+arm_height}" rpy="0.0 0.0 0.0"/>
      <parent link="${parent}"/>
      <child link="${child}"/>
      <axis xyz="${axis}"/>
      <limit lower="${circle_revolute_lower}" upper="${circle_revolute_upper}" effort="30" velocity="1"/>
    </joint>
  </xacro:macro>

 4. 로봇 시뮬레이션

매니퓰레이터 URDF 전체 소스는 https://github.com/duvallee/ros2-gazebo-simulation/archive/refs/tags/urdf_manipulator_example.zip 에서 다운로드 받을  수  있습니다. 다운로드 받은 소스는 ROS2-foxy 버전으로 다음과 같이 빌드를  할 수 있습니다.

$ colcon build
$ source ./install/local_setup.bash
$ colcon build

위와 같이 빌드가 성공하면 ROS2 런처(launch)로 실행을 합니다.

 $ ros2 launch manipulator manipulator.launch.py

실행화면은 다음과 같습니다.

 

 

 

댓글