[ROS] Rviz 로봇 모델 만들기

Nodazi·2024년 1월 9일
0

ROS

목록 보기
7/21
post-thumbnail

🤔0.개요

Rviz 및 urdf를 활용하여 자동차 모델링을 해보자.

🗒1.예제코드

🤖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_chassisparent로 선언하여 기준으로 삼는다는 뜻이고 기준점에서 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로 구성된다.

💻2.실습

위 내용을 토대로 반대쪽 바퀴를 추가하고, 아래쪽에 캐스터 휠을 추가한 로봇을 제작해보자.

🤖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축도 확인하였다.

업로드중..

🗿3.Meshes 설정하기

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를 다룰줄 알면 모델링을 할때 유용 할 것 같다.

profile
GoGoSing

0개의 댓글

관련 채용 정보