Make a model - modulabs/gazebo-tutorial GitHub Wiki

1. Overview

์ด๋ฒˆ ํŠœํ† ๋ฆฌ์–ผ์€ SDF ๋ชจ๋ธ์˜ ๊ฐ์ฒด์— ๋Œ€ํ•œ ์„ธ๋ถ€์‚ฌํ•ญ๋“ค์„ ์„œ์ˆ ํ•œ๋‹ค.

SDF ๋ชจ๋ธ๋“ค์€ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ์—์„œ ๋ณต์žกํ•œ ๋กœ๋ด‡๊นŒ์ง€ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ <model> SDF tag์™€ ์—ฐ๊ด€ ๋˜์–ด ์žˆ๊ณ  ์ด๊ฒƒ์€ ๋งํฌ, ์กฐ์ธํŠธ ์ถฉ๋Œ ๊ฐ์ฒด, ์‹œ๊ฐ์ ์ธ ์š”์†Œ, ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์˜ ๋ชจ์Œ์ด๋‹ค. ๋ชจ๋ธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์›ํ•œ๋Š” ๋ชจ๋ธ์˜ ๋ณต์žก์„ฑ์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒˆ ํŽ˜์ด์ง€๋Š” ๋‹น์‹ ์˜ ๋ชจ๋ธ์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€์— ๊ด€ํ•ด ๋ช‡๊ฐ€์ง€ ํŒ์„ ์ œ๊ณตํ•  ๊ฒƒ์ด๋‹ค.

2. Components of a SDF Models

Links

link๋Š” ๋ชจ๋ธ์˜ ํ•˜๋‚˜์˜ body์˜ ๋ฌผ๋ฆฌ์ ์ธ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. ์ด๊ฒƒ์€ wheel๋  ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ joint ์—ฐ๊ฒฐ์—์„œ ํ•˜๋‚˜์˜ link์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ฐ link๋Š” ๋งŽ์€ ์ถฉ๋Œ๊ณผ ์‹œ๊ฐ์  ์š”์†Œ๋ฅผ ํฌํ•จํ•œ๋‹ค. ์„ฑ๋Šฅ๊ณผ ์•ˆ์ „์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋‹น์‹ ์˜ ๋ชจ๋ธ์—์„œ Link์˜ ์ˆ˜๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋„๋ก ๋…ธ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํƒ์ž ๋ชจ๋ธ์€ 5๊ฐœ์˜ link(๋‹ค๋ฆฌ:4๊ฐœ, ์ƒํŒ:1๊ฐœ)๊ฐ€ ์กฐ์ธํŠธ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋ชน์‹œ ๋ณต์žกํ•˜๋‹ค. ํŠนํžˆ ๊ฐ ์กฐ์ธํŠธ๋“ค์€ ๊ฒฐ์ฝ” ์›€์ง์ด์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์‹  ํƒ์ž๋Š” 1๊ฐœ link์™€ 5๊ฐœ ์ถฉ๋Œ ์š”์†Œ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

Collision

collision ์š”์†Œ๋Š” ์ถฉ๋Œ ์ฒดํฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ธฐํ•˜ํ•™ ๊ตฌ์กฐ๋ฅผ ํฌํ•จํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋‹จ์ˆœํ•œ ํ˜•ํƒœ(์„ ํ˜ธ ๋œ๋‹ค.)๊ฐ€ ๋  ์ˆ˜ ๋„ ์žˆ๊ณ  ์‚ผ๊ฐํ˜• ๋ฉ”์‹œ๊ฐ€(๋” ๋งŽ์€ ์ž์›์ด ์†Œ๋ชจ๋œ๋‹ค.) ๋  ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋‚˜์˜ Link๋Š” ๋งŽ์€ ์ถฉ๋Œ ์š”์†Œ๋ฅผ ํฌํ•จํ•œ๋‹ค.

Visual

visual ์š”์†Œ๋Š” link์˜ ํŒŒํŠธ๋“ค์„ ์‹œ๊ฐ์ ์œผ๋กœ ํƒ€๋‚ดํ‹ฐ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜๋‚˜์˜ link๋Š” 0๊ฐ ํ˜น์€ ๊ทธ ์ด์ƒ์˜ visual ์š”์†Œ๋ฅผ ๊ฐ€์ง„๋‹ค.

Inertial

inertial ์š”์†Œ๋Š” Link์˜ ์งˆ๋Ÿ‰๊ณผ ํšŒ์ „ ๊ด€์„ฑ ํ–‰๋ ฌ๊ณผ ๊ฐ™์€ ๋™์—ญํ•™ ์ •๋ณด๋ฅผ ๋ฌ˜์‚ฌํ•œ๋‹ค.

Sensor

์„ผ์„œ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ๋“ค์—์„œ ์‚ฌ์šฉ๋˜๋Š” world๋กœ ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ํš๋“ํ•œ๋‹ค. ํ•˜๋‚˜์˜ link๋Š” 0๊ฐœ ํ˜น์€ ๊ทธ ์ด์ƒ์˜ sensor๋ฅผ ๊ฐ€์ง„๋‹ค.

Light

light ์š”์†Œ๋Š” link์— ๋ถ™์–ด ์žˆ๋Š” light ์†Œ์Šค๋ฅผ ๋ฌ˜์‚ฌํ•œ๋‹ค. ํ•˜๋‚˜์˜ link๋Š” 0๊ฐœ ํ˜น์€ ๊ทธ ์ด์ƒ์˜ light์„ ๊ฐ€์ง„๋‹ค.

Joints

ํ•˜๋‚˜์˜ joint๋Š” ๋‘๊ฐœ์˜ link๋ฅผ ์—ฐ๊ฒฐํ•œ๋‹ค. ๋ถ€๋ชจ ์ž์‹๊ด€๊ณ„๊ฐ€ ์ถ•์˜ ํšŒ์ „๊ณผ ์กฐ์ธํŠธ์˜ ๋ฆฌ๋ฐ‹๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ํŒŒ๋ผ๋ฏธํ„ฐ๋“ค์— ๋”ฐ๋ผ ํ˜•์„ฑ๋œ๋‹ค.

Plugins

ํ•˜๋‚˜์˜ plugin์€ ํ•˜๋‚˜์˜ ๋ชจ๋ธ์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด ์ œ3์ž์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ณต์œ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.

3. Building a Model

Step 1: Collect your meshes

์ด๋ฒˆ ์Šคํ…์—์„œ ๋‹น์‹ ์˜ ๋ชจ๋ธ์„ ๊ตฌ์ถ•ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ 3D mesh ํŒŒ์ผ์„ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ๋‹ค. ๊ฐ€์ œ๋ณด๋Š” ๋ฐ•์Šค, ๊ตฌ, ์‹ค๋ฆฐ๋”์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ์˜ ์…‹ํŠธ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ๋งŒ์•ฝ ๋‹น์‹ ์˜ ๋ชจ๋ธ์ด ํ›จ์”ฌ ๋ณต์žกํ•˜ ํ˜•ํƒœ๋ฅผ ํ•„์š”๋กœ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด ๊ณ„์† ํ•ด์„œ ์ฝ์–ด๋ผ.

Meshes๋“ค์€ ๋‹ค์–‘ํ•œ ๊ณณ์—์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. Google's 3D warehouse๋Š” ์ข‹์€ 3D ๋ชจ๋ธ์˜ ์ €์žฅ์†Œ ์ด๋‹ค. ์ด ๋Œ€์‹ ์œผ๋กœ ๋‹น์‹ ์€ ์ด๋ฏธ ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹น์‹ ์€ Blender ํ˜น์€ Sketchup๊ณผ ๊ฐ™์€ 3D ๋ชจ๋ธ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํ™œ์šฉํ•˜์—ฌ ๋‹น์‹  ์ž์‹ ๋งŒ์˜ mesh๋“ค์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ฐ€์ œ๋ณด๋Š” STL, Collada, OBJ๋กœ ํฌ๋งท์ด ๋œ meshํŒŒ์ผ๋“ค์„ ํ•„์š”๋กœ ํ•œ๋‹ค.

  • Tip : mesh๋ฅผ ์›์ ์˜ ์„ผํ„ฐ์— ์œ„์น˜ ์‹œํ‚ค๋„๋ก ์ด๋™ ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ ๋‹น์‹ ์˜ 3D ๋ชจ๋ธ๋ง ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•ด๋ผ. ์ด๊ฒƒ์€ ๊ฐ€์ œ๋ณด์—์„œ ๋ชจ๋ธ์„ ์œ„์น˜์‹œํ‚ค๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ๋  ๊ฒƒ ์ด๋‹ค.

  • Tip : Collada, OBJ ํŒŒ์ผ ํฌ๋งท์€ ๋‹น์‹ ์ด material์„ mesh์— ๋ถ™์ด๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•œ๋‹ค. ์ด๋Ÿฐ ๋ฉ”์นด๋‹ˆ์ฆ˜์„ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋‹น์‹ ์˜ mesh์˜ ์‹œ๊ฐ์ ์ธ ๋ชจ์Šต์„ ํ–ฅ์ƒ ์‹œํ‚จ๋‹ค.

  • Tip : mesh๋ฅผ ๋‹จ์ˆœํ™” ์‹œ์ผœ๋ผ. ์ด๊ฒƒ์€ ๋‹น์‹ ์ด ์ถฉ๋Œ ์š”์†Œ๋กœ์„œ mesh๋ฅผ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋ผ๋ฉด ๋งž๋Š” ๋ง์ด๋‹ค. ์ถฉ๋Œ ์š”์†Œ๋กœ ์ € ์ˆ˜์ค€์˜ ๋‹ค๊ฐํ˜• mesh๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์‹œ๊ฐ์  ์š”์†Œ๋กœ ๊ณ  ์ˆ˜์ „์˜ ๋‹ค๊ฐํ˜• mesh๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๊ด€ํ–‰์ด๋‹ค. ํ›จ์”ฌ ๋” ๋‚˜์€ ์Šต๊ด€์€ ์ถฉ๋Œ ์š”์†Œ๋กœ ์ด๋ฏธ ์ œ๊ณตํ•˜๋Š” ํ˜•ํƒœ(๋ฐ•์Šค, ๊ตฌ, ์‹ค๋ฆฐ๋”) ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • Tip : Onshape๋Š” ์›น๊ธฐ๋ฐ˜ ์บ๋“œ ์†Œํ”„ํŠธ์›จ์–ด๋กœ ๋ฐ์ดํ„ฐ๋ฅผ exportํ•  ๋•Œ Collada์™€ STL ํฌ๋งท์„ ์ง€์›ํ•ด ์ค๋‹ˆ๋‹ค. ์ด๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•œ ๋ชจ๋ธ์€ ์†์‰ฝ๊ฒŒ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Step 2: Make your model SDF file

์•„์ฃผ ๋‹จ์ˆœํ•œ ๋ชจ๋ธ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ๋ชจ๋ธ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด๋ผ. ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ๋‹น์‹ ์ด ์•Œ๊ณ  ์žˆ๋Š” ์ž‘์—…์ด๋‚˜ ๋งค์šฐ ์‰ฝ๊ฒŒ ๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ณ  ์ตœ์†Œํ•œ์˜ ๋ฐ•์Šค ๋ชจ๋ธ์ด ์žˆ๋‹ค. ์ด ๋ฐ•์Šค ๋ชจ๋ธ์€ ๋‹จ์œ„ ์‚ฌ์ด์ฆˆ์˜ ์ถฉ๋Œ ๊ธฐ๊ตฌํ•™์  ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋‹จ์œ„ ๊ด€์„ฑ ํ–‰๋ ฌ์„ ๊ฐ€์ง„๋‹ค.

box.sdf ๋ชจ๋ธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด๋ผ.

$ gedit box.sdf

box.sdf ํŒŒ์ผ์— ๋‹ค์Œ์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•ด๋ผ.

    <?xml version='1.0'?>
    <sdf version="1.4">
    <model name="my_model">
      <pose>0 0 0.5 0 0 0</pose>
      <static>true</static>
        <link name="link">
          <inertial>
            <mass>1.0</mass>
            <inertia> <!-- inertias are tricky to compute -->
              <!-- http://gazebosim.org/tutorials?tut=inertia&cat=build_robot -->
              <ixx>0.083</ixx>       <!-- for a box: ixx = 0.083 * mass * (y*y + z*z) -->
              <ixy>0.0</ixy>         <!-- for a box: ixy = 0 -->
              <ixz>0.0</ixz>         <!-- for a box: ixz = 0 -->
              <iyy>0.083</iyy>       <!-- for a box: iyy = 0.083 * mass * (x*x + z*z) -->
              <iyz>0.0</iyz>         <!-- for a box: iyz = 0 -->
              <izz>0.083</izz>       <!-- for a box: izz = 0.083 * mass * (x*x + y*y) -->
            </inertia>
          </inertial>
          <collision name="collision">
            <geometry>
              <box>
                <size>1 1 1</size>
              </box>
            </geometry>
          </collision>
          <visual name="visual">
            <geometry>
              <box>
                <size>1 1 1</size>
              </box>
            </geometry>
          </visual>
        </link>
      </model>
    </sdf>

๋ฐ•์Šค ๊ธฐ๊ตฌ์˜ ์›์ ์€ ๋ฐ•์Šค ๊ธฐ๊ตฌํ•™์˜ ์ค‘์‹ฌ์— ์œ„์น˜ํ•ด ์žˆ๋‹ค. ๋ฐ•์Šค์˜ ๋ฐ”๋‹ฅ์ด ์ง€๋ฉด์˜ ๋†’์ด์™€ ๊ฐ™๋„๋ก ํ•˜๊ธฐ์œ„ํ•ด์„œ <pose>0 0 0.5 0 0 0</pose>์ด ์ถ”๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • Tip : ์œ„์˜ ์˜ˆ์ œ๋Š” simple box model์„ static์œผ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋ธ์„ ์›€์ง์ด์ง€ ๋ชปํ•˜๋„๋ก ํ•œ๋‹ค. ์ด ํŠน์ง•์€ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•˜๋Š” ์ค‘์— ์œ ์šฉํ•˜๋‹ค. ์ผ๋‹จ ๋‹น์‹ ์˜ ๋ชจ๋ธ ์ƒ์„ฑ์ด ์™„๋ฃŒ๋˜๊ณ  ๋‚œํ›„ ๋‹น์‹ ์˜ ๋ชจ๋ธ์ด ์›€์ง์ผ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์›ํ•œ๋‹ค๋ฉด ํƒœ๊ทธ๋ฅผ false๋ฅผ ๋ฐ”๊พธ์–ด๋ผ.

Step 3: Add to the model SDF file

.sdf ํŒŒ์ผ๋กœ ์ผ์„ ํ•˜๋ฉด์„œ ์ฒœ์ฒœํžˆ ํ›จ์”ฌ ๋ณต์žกํ•œ ๋ชจ๋ธ๋กœ ์ถ”๊ฐ€๋ฅผ ์‹œ์ž‘ํ•ด๋ผ. ๊ฐ ์ƒˆ๋กœ์šด ์ถ”๊ฐ€์™€ ํ•จ๊ป˜ ๋‹น์‹ ์˜ ๋ชจ๋ธ์ด ์ •ํ™•ํ•˜๋„๋ก graphical client๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ชจ๋ธ์„ ๋กœ๋“œํ•ด๋ผ. ์—ฌ๊ธฐ์— ํŠน์ง•๋“ค์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ์ข‹์€ ์ˆœ์„œ๋ฅผ ์ œ์‹œํ•œ๋‹ค.

  1. link ์ถ”๊ฐ€
  2. collision ์š”์†Œ ์„ค์ •
  3. visual ์š”์†Œ ์„ค์ •
  4. inertial properties ์„ค์ • (ํ•„์ˆ˜)
  5. 1๋กœ ๋Œ์•„๊ฐ€๋ผ ๋ชจ๋“  link๋“ค์ด ์ถ”๊ฐ€ ๋  ๋•Œ๊นŒ์ง€
  6. ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ชจ๋“  joint๋ฅผ ์ถ”๊ฐ€ํ•ด๋ผ.
  7. ํ•„์š”ํ•˜๋‹ค๋ฉด ๋ชจ๋“  plugin์„ ์ถ”๊ฐ€ํ•ด๋ผ.
โš ๏ธ **GitHub.com Fallback** โš ๏ธ