본문으로 바로가기

ROS라는 아이가 꽤 재미있다는 이야기를 드렸고... 그 후 언제나 그렇듯 기초스런 설치하기 등등을 하다가... 표윤석 박사님의 책[바로가기]을 구매하고는 좀 더 재미있는 공부를 하고 있는 중이라는 이야기를 드렸는데요.^^ 이번에는 ROS에 있는 RViz라는 3D 시각화 툴의 사용법[바로가기]을 기초스럽게 소개할까 합니다. 언제나 그렇듯~ 본 포스팅은 표박사님의 책 중 일부 내용을 그저 따라하는 아무런 수준이 없는 그런 이야기입니다.^^

cd ~/catkin_ws/src/
catkin_create_pkg testbot_description urdf
cd testbot_description
mkdir urdf
cd urdf
subl testbot.urdf

먼저 catkin_create_pkg 명령으로 패키지를 만듭니다. urdf를 사용할 겁니다.^^ 그건 좀 있다가...

저는 Sublime Text를 사용하니까 subl명령으로 편집기를 여는 거구요^^ 아 Sublime Text에 대한 글도 꽤 올렸으니 한 번 보세요^^[바로가기]

test_robot이라는 이름으로 urdf를 입력하는 것입니다. 세부적으로 코드를 잠시 보면~~

    <material name="black">
        <color rgba="0.0 0.0 0.0 1.0"/>
    </material>
    <material name="orange">
        <color rgba="1.0 0.423529411765 0.0392156862745 1.0"/>
    </material>

먼저 이 부분은 material을 미리 정의해둔 부분으로 블랙과 오랜지 색상을 잡아 준 것입니다.

    <link name="base"/>

    <joint name="fixed" type="fixed">
        <parent link="base"/>
        <child link="link1"/>
    </joint>

먼저 기저(base)를 잡고 joint를 parent와 child의 관계를 설정해주고...

    <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 1.0"/>
            <mass value="1"/>
            <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
        </inertial>
    </link>

그리고.. base에 붙을 link1을 정의해 줍니다. collisionvisual, inertial을 설정해 주어야 합니다. 각각 그 안에서 사용되는 의미는 단어만 봐도 쉽게 아실 수 있을 듯 합니다. 이런 식으로 URDF를 기술하면 됩니다. 전체 코드는

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

    <material name="black">
        <color rgba="0.0 0.0 0.0 1.0"/>
    </material>
    <material name="orange">
        <color rgba="1.0 0.423529411765 0.0392156862745 1.0"/>
    </material>

    <link name="base"/>

    <joint name="fixed" type="fixed">
        <parent link="base"/>
        <child link="link1"/>
    </joint>

    <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 1.0"/>
            <mass value="1"/>
            <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
        </inertial>
    </link>

    <joint name="joint1" type="revolute">
        <parent link="link1"/>
        <child link="link2"/>
        <origin rpy="0 0 0" xyz="0 0 0.25"/>
        <axis xyz="0 0 1"/>
        <limit effort="30" lower="-2.617" upper="2.617" velocity="1.571"/>
    </joint>

    <link name="link2">
        <collision>
            <origin rpy="0 0 0" xyz="0 0 0.5"/>
            <geometry>
                <box size="0.1 0.1 0.5"/>
            </geometry>
        </collision>
        <visual>
            <origin rpy="0 0 0" xyz="0 0 0.5"/>
            <geometry>
                <box size="0.1 0.1 0.5"/>
            </geometry>
            <material name="orange"/>
        </visual>
        <inertial>
            <origin rpy="0 0 0" xyz="0 0 1.0"/>
            <mass value="1"/>
            <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
        </inertial>
    </link>

    <joint name="joint2" type="revolute">
        <parent link="link2"/>
        <child link="link3"/>
        <origin rpy="0 0 0" xyz="0 0 0.75"/>
        <axis xyz="0 1 0"/>
        <limit effort="30" lower="-2.617" upper="2.617" velocity="1.571"/>
    </joint>

    <link name="link3">
        <collision>
            <origin rpy="0 0 0" xyz="0 0 0.5"/>
            <geometry>
                <box size="0.1 0.1 1"/>
            </geometry>
        </collision>
        <visual>
            <origin rpy="0 0 0" xyz="0 0 0.5"/>
            <geometry>
                <box size="0.1 0.1 1"/>
            </geometry>
            <material name="black"/>
        </visual>
        <inertial>
            <origin rpy="0 0 0" xyz="0 0 0.5"/>
            <mass value="1"/>
            <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
        </inertial>
    </link>

    <joint name="joint3" type="revolute">
        <parent link="link3"/>
        <child link="link4"/>
        <origin rpy="0 0 0" xyz="0 0 1.0"/>
        <axis xyz="0 1 0"/>
        <limit effort="30" lower="-2.617" upper="2.617" velocity="1.571"/>
    </joint>

    <link name="link4">
        <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="orange"/>
        </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>

</robot>

입니다.^^

이 상태에서...

check_urdf testbot.urdf

check_urdf 명령으로 urdf의 내용이 무결한지 확인할 수 있습니다.

urdf_to_graphiz testbot.urdf

이제 urdf_to_graphiz 명령으로 작성된 urdf의 내용을 블럭선도와 같은 개념도로 확인할 수 있도록 pdf 출력을 볼 수 있습니다.

이렇게 말이죠^^

cd ~/catkin_ws/src/testbot_description
mkdir launch
cd launch
subl testbot.launch

이제 다시 launch파일을 만들어야 합니다. 위 명령을 이용해서 

<launch>
	<arg name="model" default="$(find testbot_description)/urdf/testbot.urdf" />
	<arg name="gui" default="True" />
	<param name="robot_description" textfile="$(arg model)" />
	<param name="use_gui" value="$(arg gui)" />
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"/>
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
</launch>

launch 파일에서는 방금 작성한 urdf 파일도 연결하고 필요한 publisher 등의 노드를 실행하는 것을 설정하는 모양입니다만... 저는 표박사님 책을 따라가는 수준이므로 여기에 대한 자세한 이야기는 좀 더 공부하면서 하도록 하죠~~~(라고 말하고 도망^^)

roslaunch testbot_description testbot.launch 

roslaunch 명령으로 방금 만든 launch 파일을 실행합니다. 또 다른 터미널을 열어서...

rosrun rviz rviz

이제 rosrun 명령으로 rviz를 실행합니다.^^

그러면 이런 창이 뜰겁니다. 빨간색 에러스러운(^^) 느낌이 나더라도 놀라지 마시고(^^)

하단의 ADD 버튼을 눌러서 RobotModel을 선택해 줍니다.

Fixed Framemap이라는 항목에서

base를 선택해 줍니다. 그러면 화면에 있듯이 에러스러운(^^) 아이들이 사라지네요^^

그러면 저렇게 링크로 연결된 저 아이들이 나타납니다.

각 관절의 각도를 조절해 줄 수 있습니다. 그래서 움직임을 확인도 할 수 있구요. 아주 간편한 방식이기 때문에 꽤 유용합니다.

testbot_description.zip

마지막으로 팩키지 폴더를 첨부합니다.^^

신고