Rviz 및 urdf를 활용하여 자동차 모델링을 해보자.
🤖robot.urdf
<?xml version= "1.0" ?>
<robot name = "robot">
<!--link - chassis -->
<link name = "link_chassis">
<interial>
<mass value="10"/>
<origin xyz ="0 0 0.3" rpy = "0 0 0"/>
<intertia ixx = " 1.5417" ixy = "0" ixz = "0" iyy="3.467" iyx = "0" izz= "4.742" />
</interial>
<collision>
<geometry>
<box size = "2 1.3 0.4"/>
</geometry>
</collision>
<visual>
<geometry>
<box size = "2 1.3 0.4"/>
</geometry>
<material name ="Red">
<color rgba = "1 0 0 1"/>
</material>
</visual>
</link>
<!-- Joint - chassis / left wheel -->
<joint name="joint_chassis_left_wheel" type="continuous">
<origin rpy="0 0 0" xyz="-0.5 0.65 0" />
<child link="link_left_wheel" />
<parent link="link_chassis" />
<axis rpy="0 0 0" xyz="0 1 0" />
<limit effort="10000" velocity="1000" />
<joint_properties damping="1.0" friction="1.0" />
</joint>
<!-- Link - left wheel -->
<link name="link_left_wheel">
<inertial>
<mass value="1" />
<origin xyz="0 0 0" rpy="0 0 0" />
<inertia ixx="0.002526666666667" ixy="0" ixz="0" iyy="0.002526666666667" iyz="0" izz="0.005"/>
</inertial>
<collision>
<origin rpy="1.5707 0 0" xyz = "0 0.18 0" />
<geometry>
<cylinder length="0.12" radius ="0.4"/>
</geometry>
</collision>
<visual>
<origin rpy="1.5707 0 0" xyz = "0 0.18 0" />
<geometry>
<cylinder length="0.12" radius ="0.4"/>
</geometry>
</visual>
<collision>
<origin rpy="1.5707 0 0" xyz = "0 0.06 0" />
<geometry>
<cylinder length="0.12" radius ="0.08"/>
</geometry>
</collision>
<visual>
<origin rpy="1.5707 0 0" xyz = "0 0.06 0" />
<geometry>
<cylinder length="0.12" radius ="0.08"/>
</geometry>
</visual>
</link>
</robot>
launch 파일은 생략한다.
Rviz를 통해 위 코드를 동작시켜보면 아래의 그림과 같은 모형이 나타난다.
각각의 코드가 어떤역할을 하길래 위와 같은 동작을 수행 할 수 있는 것일까?
<!-- Joint - chassis / left wheel -->
<joint name="joint_chassis_left_wheel" type="continuous">
<origin rpy="0 0 0" xyz="-0.5 0.65 0" />
<child link="link_left_wheel" />
<parent link="link_chassis" />
<axis rpy="0 0 0" xyz="0 1 0" />
<limit effort="10000" velocity="1000" />
<joint_properties damping="1.0" friction="1.0" />
</joint>
위 코드는 link_chassis
를 parent
로 선언하여 기준으로 삼는다는 뜻이고 기준점에서 origin
속성만큼의 값만큼 떨어진 곳에 link_left_wheel
를 연결한다는 뜻이다.origin
에서 rpy
는 기울어짐 정도이고, xyz
는 위상차이로 상대적인 좌표를 나타내는 것이다.
axis
는 어떤 축을 기준으로 link를 작동시킬 것인지 나타내는 것이고, 위코드에는 y축을 기준으로 움직이기 때문에 위와같이 선언하였다.
<link name="link_left_wheel">
<inertial>
<mass value="1" />
<origin xyz="0 0 0" rpy="0 0 0" />
<inertia ixx="0.002526666666667" ixy="0" ixz="0" iyy="0.002526666666667" iyz="0" izz="0.005"/>
</inertial>
<collision>
<origin rpy="1.5707 0 0" xyz = "0 0.18 0" />
<geometry>
<cylinder length="0.12" radius ="0.4"/>
</geometry>
</collision>
<visual>
<origin rpy="1.5707 0 0" xyz = "0 0.18 0" />
<geometry>
<cylinder length="0.12" radius ="0.4"/>
</geometry>
</visual>
<collision>
<origin rpy="1.5707 0 0" xyz = "0 0.06 0" />
<geometry>
<cylinder length="0.12" radius ="0.08"/>
</geometry>
</collision>
<visual>
<origin rpy="1.5707 0 0" xyz = "0 0.06 0" />
<geometry>
<cylinder length="0.12" radius ="0.08"/>
</geometry>
</visual>
</link>
위 내용은 link_left_wheel
에 대한 내용을 담고 있다. 무게와 좌표 등을 담고 있다. 충돌 정보를 담고 있는 collision
그리고 보여지는 요소 visual
로 구성된다.
위 내용을 토대로 반대쪽 바퀴를 추가하고, 아래쪽에 캐스터 휠을 추가한 로봇을 제작해보자.
🤖robot.urdf
<?xml version= "1.0" ?>
<robot name = "robot">
<!--link - chassis -->
<link name = "link_chassis">
<interial>
<mass value="10"/>
<origin xyz ="0 0 0.3" rpy = "0 0 0"/>
<intertia ixx = " 1.5417" ixy = "0" ixz = "0" iyy="3.467" iyx = "0" izz= "4.742" />
</interial>
<collision>
<geometry>
<box size = "2 1.3 0.4"/>
</geometry>
</collision>
<visual>
<geometry>
<box size = "2 1.3 0.4"/>
</geometry>
<material name ="Purple">
<color rgba = "0.5 0 1 1"/>
</material>
</visual>
</link>
<!-- Joint - chassis / left wheel -->
<joint name="joint_chassis_left_wheel" type="continuous">
<origin rpy="0 0 0" xyz="-0.5 0.65 0" />
<child link="link_left_wheel" />
<parent link="link_chassis" />
<axis rpy="0 0 0" xyz="0 1 0" />
<limit effort="10000" velocity="1000" />
<joint_properties damping="1.0" friction="1.0" />
</joint>
<!-- Link - left wheel -->
<link name="link_left_wheel">
<inertial>
<mass value="1" />
<origin xyz="0 0 0" rpy="0 0 0" />
<inertia ixx="0.002526666666667" ixy="0" ixz="0" iyy="0.002526666666667" iyz="0" izz="0.005"/>
</inertial>
<!--hub cap-->
<visual>
<origin rpy="1.5707 0 0" xyz = "0 0.24 0" />
<geometry>
<box size = "0.05 0.5 0.01"/>
</geometry>
<material name ="White">
<color rgba = "1 1 1 1"/>
</material>
</visual>
<!--big wheel -->
<collision>
<origin rpy="1.5707 0 0" xyz = "0 0.18 0" />
<geometry>
<cylinder length="0.12" radius ="0.4"/>
</geometry>
</collision>
<visual>
<origin rpy="1.5707 0 0" xyz = "0 0.18 0" />
<geometry>
<cylinder length="0.12" radius ="0.4"/>
</geometry>
<material name ="Black">
<color rgba = "0 0 0 1"/>
</material>
</visual>
<collision>
<origin rpy="1.5707 0 0" xyz = "0 0.06 0" />
<geometry>
<cylinder length="0.12" radius ="0.08"/>
</geometry>
</collision>
<visual>
<origin rpy="1.5707 0 0" xyz = "0 0.06 0" />
<geometry>
<cylinder length="0.12" radius ="0.08"/>
</geometry>
<material name ="Gray">
<color rgba = "0.5 0.5 0.5 1"/>
</material>
</visual>
</link>
<!-- Joint - chassis / right wheel -->
<joint name="joint_chassis_right_wheel" type="continuous">
<origin rpy="0 0 0" xyz="-0.5 -0.65 0" />
<child link="link_right_wheel" />
<parent link="link_chassis" />
<axis rpy="0 0 0" xyz="0 1 0" />
<limit effort="10000" velocity="1000" />
<joint_properties damping="1.0" friction="1.0" />
</joint>
<!-- Link - right wheel -->
<link name="link_right_wheel">
<inertial>
<mass value="1" />
<origin xyz="0 0 0" rpy="0 0 0" />
<inertia ixx="0.002526666666667" ixy="0" ixz="0" iyy="0.002526666666667" iyz="0" izz="0.005"/>
</inertial>
<!--hub cap-->
<visual>
<origin rpy="1.5707 0 0" xyz = "0 -0.24 0" />
<geometry>
<box size = "0.05 0.5 0.01"/>
</geometry>
<material name ="White">
<color rgba = "1 1 1 1"/>
</material>
</visual>
<collision>
<origin rpy="1.5707 0 0" xyz = "0 -0.18 0" />
<geometry>
<cylinder length="0.12" radius ="0.4"/>
</geometry>
</collision>
<visual>
<origin rpy="1.5707 0 0" xyz = "0 -0.18 0" />
<geometry>
<cylinder length="0.12" radius ="0.4"/>
</geometry>
<material name ="Black">
<color rgba = "0 0 0 1"/>
</material>
</visual>
<collision>
<origin rpy="1.5707 0 0" xyz = "0 -0.06 0" />
<geometry>
<cylinder length="0.12" radius ="0.08"/>
</geometry>
</collision>
<visual>
<origin rpy="1.5707 0 0" xyz = "0 -0.06 0" />
<geometry>
<cylinder length="0.12" radius ="0.08"/>
</geometry>
<material name ="Gray">
<color rgba = "0.5 0.5 0.5 1"/>
</material>
</visual>
</link>
<!-- Joint - chassis / caster wheel -->
<joint name="joint_chassis_caster_wheel" type="fixed">
<origin rpy="0 0 0" xyz="0.25 0 -0.15" />
<child link="link_caster_wheel" />
<parent link="link_chassis" />
<axis rpy="0 0 0" xyz="0 1 0" />
<limit effort="10000" velocity="1000" />
<joint_properties damping="1.0" friction="1.0" />
</joint>
<!-- Link - right wheel -->
<link name="link_caster_wheel">
<inertial>
<mass value="1" />
<origin xyz="0 0 0" rpy="0 0 0" />
<inertia ixx="0.002526666666667" ixy="0" ixz="0" iyy="0.002526666666667" iyz="0" izz="0.005"/>
</inertial>
<!--caster wheel-->
<collision>
<origin rpy="1.5707 0 0" xyz = "0.5 0 0" />
<geometry>
<sphere radius ="0.3"/>
</geometry>
</collision>
<visual>
<origin rpy="1.5707 0 0" xyz = "0.5 0 0" />
<geometry>
<sphere radius ="0.2"/>
</geometry>
<material name ="Black">
<color rgba = "0 0 0 1"/>
</material>
</visual>
<!--caster mini wheel -->
<collision>
<origin rpy="1.5707 0 0" xyz = "0.5 0 -0.1" />
<geometry>
<sphere radius ="0.15"/>
</geometry>
</collision>
<visual>
<origin rpy="1.5707 0 0" xyz = "0.5 0 -0.1" />
<geometry>
<sphere radius ="0.15"/>
</geometry>
<material name ="While">
<color rgba = "1 1 1 1"/>
</material>
</visual>
</link>
</robot>
학습내용을 토대로 위 로봇을 모델링 하였다. TF축도 확인하였다.
urdf를 통해 로봇을 디자인할때 .stl
과 같은 파일을 이용하여 물체의 외형을 변경 할 수 있다. 앞에서 만든 자동차 모형에 mesh
속성을 추가해보자.
<!--big wheel -->
<collision>
<origin rpy="1.5707 0 0" xyz = "0 0.18 0" />
<geometry>
<cylinder length="0.12" radius ="0.4"/>
</geometry>
</collision>
<visual>
<origin rpy="1.5707 0 0" xyz = "0 0.18 0" />
<geometry>
<mesh filename ="package://robot_description/meshes/wheel.stl"/>
</geometry>
<material name ="Black">
<color rgba = "0 0 0 1"/>
</material>
</visual>
mesh 파일을 다운로드 하여 src/robot_description/meshes
파일에 .stl
파일을 추가하여 위의 코드와 같이 geometry 속성에서 불러와서 사용하였다. 위 코드는 몸통에 Mesh를 적용 한 것이며 바퀴에도 따로 적용시켰다.
부드러워진 자동차의 형태. Cad를 다룰줄 알면 모델링을 할때 유용 할 것 같다.