Super Kawaii Cute Cat Kaoani URDF 튜토리얼(1) (Building Visual Robot Model)

연구/컴퓨터 그래픽스

URDF 튜토리얼(1) (Building Visual Robot Model)

치킨고양이짱아 2023. 1. 19. 14:53
728x90
728x90
728x90

skel file 이해하는것도 힘들었는데 isaac gym에서 skel file을 지원하지 않아서 urdf 파일을 새로 만들어야하는 상황이 생겨버렸다..ㅠㅠㅠㅠㅠㅠㅠ

어쨌든 이해해보자구!!

1. URDF란?

unified robot description format의 줄임말로, '로봇 기술용 통일 포맷'이라고 번역할 수 있다. 한마디로 로봇의 동작을 구현함에 있어서 URDF 포맷 하나로 어느 OS에서도 구현이 가능하다는 의미이다. 로봇의 움직임을 구현하는데 사용되며, xml format으로 제작이 가능하다.

2. URDF 로봇 제작해보기

http://wiki.ros.org/urdf/Tutorials

 

urdf/Tutorials - ROS Wiki

Prerequisite Learning URDF Step by Step Building a Visual Robot Model with URDF from ScratchLearn how to build a visual model of a robot that you can view in Rviz Building a Movable Robot Model with URDFLearn how to define movable joints in URDF Adding Phy

wiki.ros.org

위의 튜토리얼을 따라해보았다!

1) Multiple shapes

<?xml version="1.0"?>
<robot name="multipleshapes">
  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
    </visual>
  </link>

  <link name="right_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
    </visual>
  </link>

  <joint name="base_to_right_leg" type="fixed">
    <parent link="base_link"/>
    <child link="right_leg"/>
  </joint>

</robot>

위의 코드를 살펴보면 link가 2개가 있고 joint가 한개가 있다.

<link>

1) base_link는 실린더 모양으로 높이가 0.6m, 반지름이 0.2m이다.

2) right_leg는 box 모양으로 0.6m x 0.1m x 0.2m의 크기를 가진다.

<joint>

1) joint는 parent link와 child link에 대해 기술된다.

2) urdf는 결국 하나의 root를 가지는 트리 구조이다. 즉, 여기서 right leg의 위치는 root인 base link의 위치에 따라 달라진다.

 

위의 urdf 파일을 화면에 나타내면 다음과 같다.

link의 position을 지정해주지 않았기 때문에 모두 디폴트값인 (0, 0, 0)의 중심을 가지도록 만들어진듯하다.

 

2) Origins

<?xml version="1.0"?>
<robot name="origins">
  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
    </visual>
  </link>

  <link name="right_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
      <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
    </visual>
  </link>

  <joint name="base_to_right_leg" type="fixed">
    <parent link="base_link"/>
    <child link="right_leg"/>
    <origin xyz="0 -0.22 0.25"/>
  </joint>

</robot>

Multiple shape와 비슷한데 origin 이라는 tag가 세팅되어있다. 이를 좀 더 자세히 살펴보자.

여기서 주의해야할게 urdf 파일 format에서는 높이 방향이 z축이다.

 

<joint>

joint의 origin tag 먼저 살펴보자! joint는 parent link의 reference frame에 대해 정의된다.

base_to_right_leg를 보면, orign xyz = "0 -0.22 0.25"로 세팅이 되어 있는데 이 말은 base_to_right_leg가 parent refrence frame에 대해 y축으로 -0.22m, z축으로 0.25m 만큼 이동한 곳에 중심점을 가진다는 뜻이다.

이렇게 되면 child link의 visual origin tag에 관련없이, child link의 위치가 y축으로 -0.22, z축으로 0.25만큼 이동한다.

rpy(roll pitch yaw) offset은 세팅이 되어있지 않기 때문에 child link의 reference frame의 orientation은 parent link의 reference frame과 동일하다.

<link>

이제 link의 visual origin tag를 살펴보자!

right_leg를 살펴보면 rpy(roll pitch yaw)와 xyz offset가 모두 세팅되어있다. link의 origin tag는 진짜 origin으로부터 visual element의 origin을 결정한다고 보면 된다.

right_leg를 살펴보면 xyz offset이 "0 0 -0.3"으로 세팅되어있는데

joint가 정한 link의 frame(위 그림에서 1번 frame)으로부터 visual element의 origin이 z축으로 -0.3만큼 내려온다고 보면된다. (위 그림에서 2번 frame)

그리고 rpy가 "0 1.570575 0"으로 세팅이 되어 있는데 여기서 1.570575는 PI/2를 의미하는 값이다. visual element를 즉 y축 기준으로 90도 회전시킨다고 보면된다.

 즉 visual element의 frame은 위의 그림에서 3번 frame과 일치하게 된다.

여기서 0.6m x 0.1m x 0.2m의 직사각형을 그리게 되면

이런 모습이 된다. visual element의 위치와 관계 없이 joint의 origin은 직사각형의 위쪽 부분에 위치하므로 직사각형의 위쪽 부분에 joint가 연결되어 skeleotn이 움직인다고 생각하면 된다.

3. Material Girl

위의 예시로는 빨간색 link들만 만들어지고 있다..이제는 색깔을 바꿔보는 작업을 진행할 것이다!

<?xml version="1.0"?>
<robot name="materials">

  <material name="blue">
    <color rgba="0 0 0.8 1"/>
  </material>

  <material name="white">
    <color rgba="1 1 1 1"/>
  </material>


  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
      <material name="blue"/>
    </visual>
  </link>

  <link name="right_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
      <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
      <material name="white"/>
    </visual>
  </link>

  <joint name="base_to_right_leg" type="fixed">
    <parent link="base_link"/>
    <child link="right_leg"/>
    <origin xyz="0 -0.22 0.25"/>
  </joint>

  <link name="left_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
      <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
      <material name="white"/>
    </visual>
  </link>

  <joint name="base_to_left_leg" type="fixed">
    <parent link="base_link"/>
    <child link="left_leg"/>
    <origin xyz="0 0.22 0.25"/>
  </joint>

</robot>

위와 같이 material을 미리 정의해두고, link의 material tag에서 미리 정의해둔 이름을 세팅해주면, link의 색깔이 변하게 된다.

여기서는 right_leg라는 이름의 link와 left_leg라는 이름의 link는 white 색깔로 설정해주었고, base_link라는 이름의 link는 blue로 설정해주었다.

따라서 그 모습은 다음과 같다.

4. Finishing the Model

위에서 배운 방법들을 사용해서 확장해보면 다음과 같은 로봇도 만들 수 있다.

<?xml version="1.0"?>
<robot name="visual">

  <material name="blue">
    <color rgba="0 0 0.8 1"/>
  </material>
  <material name="black">
    <color rgba="0 0 0 1"/>
  </material>
  <material name="white">
    <color rgba="1 1 1 1"/>
  </material>

  <link name="base_link">
    <visual>
      <geometry>
        <cylinder length="0.6" radius="0.2"/>
      </geometry>
      <material name="blue"/>
    </visual>
  </link>

  <link name="right_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
      <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
      <material name="white"/>
    </visual>
  </link>

  <joint name="base_to_right_leg" type="fixed">
    <parent link="base_link"/>
    <child link="right_leg"/>
    <origin xyz="0 -0.22 0.25"/>
  </joint>

  <link name="right_base">
    <visual>
      <geometry>
        <box size="0.4 0.1 0.1"/>
      </geometry>
      <material name="white"/>
    </visual>
  </link>

  <joint name="right_base_joint" type="fixed">
    <parent link="right_leg"/>
    <child link="right_base"/>
    <origin xyz="0 0 -0.6"/>
  </joint>

  <link name="right_front_wheel">
    <visual>
      <origin rpy="1.57075 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.1" radius="0.035"/>
      </geometry>
      <material name="black"/>
    </visual>
  </link>
  <joint name="right_front_wheel_joint" type="fixed">
    <parent link="right_base"/>
    <child link="right_front_wheel"/>
    <origin rpy="0 0 0" xyz="0.133333333333 0 -0.085"/>
  </joint>

  <link name="right_back_wheel">
    <visual>
      <origin rpy="1.57075 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.1" radius="0.035"/>
      </geometry>
      <material name="black"/>
    </visual>
  </link>
  <joint name="right_back_wheel_joint" type="fixed">
    <parent link="right_base"/>
    <child link="right_back_wheel"/>
    <origin rpy="0 0 0" xyz="-0.133333333333 0 -0.085"/>
  </joint>

  <link name="left_leg">
    <visual>
      <geometry>
        <box size="0.6 0.1 0.2"/>
      </geometry>
      <origin rpy="0 1.57075 0" xyz="0 0 -0.3"/>
      <material name="white"/>
    </visual>
  </link>

  <joint name="base_to_left_leg" type="fixed">
    <parent link="base_link"/>
    <child link="left_leg"/>
    <origin xyz="0 0.22 0.25"/>
  </joint>

  <link name="left_base">
    <visual>
      <geometry>
        <box size="0.4 0.1 0.1"/>
      </geometry>
      <material name="white"/>
    </visual>
  </link>

  <joint name="left_base_joint" type="fixed">
    <parent link="left_leg"/>
    <child link="left_base"/>
    <origin xyz="0 0 -0.6"/>
  </joint>

  <link name="left_front_wheel">
    <visual>
      <origin rpy="1.57075 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.1" radius="0.035"/>
      </geometry>
      <material name="black"/>
    </visual>
  </link>
  <joint name="left_front_wheel_joint" type="fixed">
    <parent link="left_base"/>
    <child link="left_front_wheel"/>
    <origin rpy="0 0 0" xyz="0.133333333333 0 -0.085"/>
  </joint>

  <link name="left_back_wheel">
    <visual>
      <origin rpy="1.57075 0 0" xyz="0 0 0"/>
      <geometry>
        <cylinder length="0.1" radius="0.035"/>
      </geometry>
      <material name="black"/>
    </visual>
  </link>
  <joint name="left_back_wheel_joint" type="fixed">
    <parent link="left_base"/>
    <child link="left_back_wheel"/>
    <origin rpy="0 0 0" xyz="-0.133333333333 0 -0.085"/>
  </joint>

  <joint name="gripper_extension" type="fixed">
    <parent link="base_link"/>
    <child link="gripper_pole"/>
    <origin rpy="0 0 0" xyz="0.19 0 0.2"/>
  </joint>

  <link name="gripper_pole">
    <visual>
      <geometry>
        <cylinder length="0.2" radius="0.01"/>
      </geometry>
      <origin rpy="0 1.57075 0 " xyz="0.1 0 0"/>
    </visual>
  </link>

  <joint name="left_gripper_joint" type="fixed">
    <origin rpy="0 0 0" xyz="0.2 0.01 0"/>
    <parent link="gripper_pole"/>
    <child link="left_gripper"/>
  </joint>

  <link name="left_gripper">
    <visual>
      <origin rpy="0.0 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/>
      </geometry>
    </visual>
  </link>

  <joint name="left_tip_joint" type="fixed">
    <parent link="left_gripper"/>
    <child link="left_tip"/>
  </joint>

  <link name="left_tip">
    <visual>
      <origin rpy="0.0 0 0" xyz="0.09137 0.00495 0"/>
      <geometry>
        <mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/>
      </geometry>
    </visual>
  </link>
  <joint name="right_gripper_joint" type="fixed">
    <origin rpy="0 0 0" xyz="0.2 -0.01 0"/>
    <parent link="gripper_pole"/>
    <child link="right_gripper"/>
  </joint>

  <link name="right_gripper">
    <visual>
      <origin rpy="-3.1415 0 0" xyz="0 0 0"/>
      <geometry>
        <mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/>
      </geometry>
    </visual>
  </link>

  <joint name="right_tip_joint" type="fixed">
    <parent link="right_gripper"/>
    <child link="right_tip"/>
  </joint>

  <link name="right_tip">
    <visual>
      <origin rpy="-3.1415 0 0" xyz="0.09137 0.00495 0"/>
      <geometry>
        <mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/>
      </geometry>
    </visual>
  </link>

  <link name="head">
    <visual>
      <geometry>
        <sphere radius="0.2"/>
      </geometry>
      <material name="white"/>
    </visual>
  </link>
  <joint name="head_swivel" type="fixed">
    <parent link="base_link"/>
    <child link="head"/>
    <origin xyz="0 0 0.3"/>
  </joint>

  <link name="box">
    <visual>
      <geometry>
        <box size="0.08 0.08 0.08"/>
      </geometry>
      <material name="blue"/>
    </visual>
  </link>

  <joint name="tobox" type="fixed">
    <parent link="head"/>
    <child link="box"/>
    <origin xyz="0.1814 0 0.1414"/>
  </joint>
</robot>

위의 urdf 파일을 사용해서 만든 로봇의 모습은 다음과 같다.

 

 

728x90
728x90