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을 정의해 줍니다. collision과 visual, 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 Frame의 map이라는 항목에서
base를 선택해 줍니다. 그러면 화면에 있듯이 에러스러운(^^) 아이들이 사라지네요^^
그러면 저렇게 링크로 연결된 저 아이들이 나타납니다.
각 관절의 각도를 조절해 줄 수 있습니다. 그래서 움직임을 확인도 할 수 있구요. 아주 간편한 방식이기 때문에 꽤 유용합니다.
마지막으로 팩키지 폴더를 첨부합니다.^^
'Robot > Robot Program - ROS' 카테고리의 다른 글
ROS Moveit으로 turtlebot_arm 프로젝트 설치 후 구동해 보기 (4) | 2016.06.24 |
---|---|
유니티(Unity) UI의 Toggle Button과 아두이노의 Push Button 연동하기 (4) | 2016.06.22 |
ROS의 RViz로 세계적인 수술용 로봇 daVinci 다빈치를 만나보자 (2) | 2016.06.21 |
ROS 메세지 - 토픽과 서비스 실습하기 (12) | 2016.06.15 |
유니티에서 ARDUnity를 이용하여 아두이노에 연결된 서보모터 움직여 보기 (2) | 2016.06.14 |
ROS 팩키지 만들기 따라하기 (4) | 2016.06.08 |
아두이노 푸시버튼으로 아두니티(ARDUnity)를 이용해서 유니티에서 폭파 효과 주기 (14) | 2016.06.03 |