Make a Mobile Robot - modulabs/gazebo-tutorial GitHub Wiki
์ด ํํ ๋ฆฌ์ผ์ Gazebo์ ๊ธฐ๋ณธ์ ์ธ ๋ชจ๋ธ ๊ด๋ฆฌ์ ๊ดํด ์ค๋ช ํ๊ณ ์์ง์์ ์ํด differential drive mechanism์ ์ฌ์ฉํ๋ tow wheeled mobile robot์ ์์ฑํ๋ ๊ณผ์ ์ ํตํด ์ฌ์ฉ์๊ฐ ์ป๋ ๋ชจ๋ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ด์ ๋ชจ๋ธ์ ๊ธฐ๋ณธ์ ์ธ ๋ชจ๋ธ ํํ์ ์ต์ํด์ง๋๋ก ์ฐ์ตํ๋ค.
๋น์ ์ ๋น์ ์ ๋ชจ๋ธ์ ์์ฑํ ๊ฒ ์ด๋ค. ๋น์ ์ ๋ชจ๋ธ์ ๊ฐ์ ๋ณด ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด๋ ๊ตฌ์กฐ์ ๋ฐ๋ฅธ ํฌ๋งท์ ๊ท์น์ ๋ฐ๋ผ์ผ ํ๋ค.
- ๋ชจ๋ธ ํด๋๋ฅผ ์์ฑํด๋ผ.
$ mkdir -p ~/.gazebo/models/my_robot
- ๋ชจ๋ธ config ํ์ผ์ ์์ฑํด๋ผ.
$ gedit ~/.gazebo/models/my_robot/model.config
- ๋ค์์ ๋ด์ฉ์ ๋ณต์ฌํด๋ผ.
<?xml version="1.0"?>
<model>
<name>My Robot</name>
<version>1.0</version>
<sdf version='1.4'>model.sdf</sdf>
<author>
<name>My Name</name>
<email>[email protected]</email>
</author>
<description>
My awesome robot.
</description>
</model>-
model.sdf ํ์ผ์ ์์ฑํด๋ผ.
$ gedit ~/.gazebo/models/my_robot/model.sdf
-
๋ค์์ ๋ด์ฉ์ ๋ณต์ฌํด๋ผ.
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
</model>
</sdf>์ด๋ฒ step์ ๋๊ฐ์ ๋ฐํด๋ฅผ ๊ฐ์ง ์ฌ๊ฐํ ๋ฒ ์ด์ค๋ฅผ ์์ฑ ํ ๊ฒ ์ด๋ค. ๊ฐ๋จํ ์์ํ๊ณ step๋ค์์ ๋ชจ๋ธ์ ์์ฑํ๋ ๊ฒ์ ์ค์ํ๋ค. ์ฒซ step์์ ๋ชจ๋ธ์ ๊ฐ๋จํ ํํ์ ๋ ์ด์์์ด๋ค. ์ด๊ฒ์ ํ๊ธฐ์ํด ์ฐ๋ฆฌ์ ๋ชจ๋ธ์ static์ด ๋ ๊ฒ์ด๊ณ ์ด๊ฒ์ ์๋ฏธ๋ ๋ฌผ๋ฆฌ์์ง์ ์ํฅ์ ๋ฐ์ง ์๋ ๋ค๋ ๊ฒ์ด๋ค. ๋ชจ๋ธ์ด ํ ์ฅ์์์ ๋จธ๋ฌผ๋ฌ ์์ ์ ์๊ฒ ๋๊ณ ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ชจ๋ ์์๋ค์ ์ ์ ํ ์ ๋ ฌํ ์ ์๋๋ก ํด์ค๋ค.
- true์ model.sdf ํ์ผ์ ์ถ๊ฐํ๋ฏ๋ก ๋ชจ๋ธ์ด staticํ๊ฒ ํ๋ค.
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>true</static>
</model>
</sdf>- model.sdf ํ์ผ์ ์์ ํ์ฌ ์ฌ๊ฐํ ๋ฒ ์ด์ค๋ฅผ ์ถ๊ฐํ๋ค.
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>true</static>
<link name='chassis'>
<pose>0 0 .1 0 0 0</pose>
<collision name='collision'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</collision>
<visual name='visual'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</visual>
</link>
</model>
</sdf>์ฌ๊ธฐ์์ ์ฐ๋ฆฌ๋ 0.4 x 0.2 x 0.1(m) ํฌ๊ธฐ์ ๋ฐ์ค๋ฅผ ๋ง๋ค์๋ค. collision ์์๋ ์ถฉ๋ ๊ฐ์ง ์์ง์ ์ํด ํํ๊ฐ ๋ช ์๋๋ค. visual ์์๋ ๋ ๋๋ง ์์ง์ ์ํด ํํ๊ฐ ๋ช ์ ๋๋ค. ๋๊ฐ์ ๊ฒฝ์ฐ์ collision๊ณผ visual ์์๋ ๊ฐ๋ค. ํ์ง๋ง ๋ณต์กํ mesh๋ฅผ ์ฌ์ฉํ๋ visual ์์์ ๋จ์ํ ํํ์ collision์์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์ผ๋ฐ์ ์ด๋ค. ์ด๊ฒ์ ์ฑ๋ฅ ํฅ์์ ๋์์ ์ค ๊ฒ ์ด๋ค.
-
gazebo๋ฅผ ๋์ํ์ฌ ๋น์ ์ ๋ชจ๋ธ์ ๋ถ๋ฌ์ค์. ๊ฐ์ ๋ณด GUI ์ธํฐํ์ด์ค์ Insert Model์ ํตํด ๋น์ ์ ๋ชจ๋ธ์ ๋ถ๋ฌ์ฌ ์ ์๋ค.
$ gazebo
๋น์ ์ ํฐ์ ๋ฐ์ค๊ฐ ์ง๋ฉด์์ 1๋ฏธํฐ ์ ๋ ๋ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- ์ด์ ์ฐ๋ฆฌ๋ ๋ฐํด๋ฅผ ๋ก๋ด์ ์ถ๊ฐ ํ ๊ฒ์ด๋ค. ๋ฐํด๋ ๋ง์ฐฐ์ ๊ฐ์ง์ง ์๋ ๊ตฌ์ด๋ค. ์ด๋ฐ ์ข ๋ฅ์ ๋ฐํด๊ฐ ์กฐ์ธํธ๋ฅผ ๊ฐ์ง๋ ๋ฐํด๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ณด๋ค ๋ซ๋ค. ์๋ํ๋ฉด ์ด๊ฒ์ ๋ฌผ๋ฆฌ์์ง์์ ๋ ์ ์ ๊ตฌ์ ์กฐ๊ฑด์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ด๋ค.
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>true</static>
<link name='chassis'>
<pose>0 0 .1 0 0 0</pose>
<collision name='collision'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</collision>
<visual name='visual'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</visual>
<collision name='caster_collision'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu>0</mu>
<mu2>0</mu2>
<slip1>1.0</slip1>
<slip2>1.0</slip2>
</ode>
</friction>
</surface>
</collision>
<visual name='caster_visual'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
</visual>
</link>
</model>
</sdf>๋น์ ์ ๋ชจ๋ธ์ด ๋ก๋ด์ ๋์ ๋ฐํด๊ฐ ๋ํ๋๋์ง ์ํํด๋ด๋ผ. ๋น์ ์ ๊ฐ์ ๋ณด๋ฅผ ๋ค์ ์์ ํ ํ์๊ฐ ์๋ค. ๋น์ ์ ์์ ๋ ๋ชจ๋ธ์ ๊ฐ์ ๋ณด์ ์ฝ์ ํ ๋ ๋งค๋ฒ ๋์คํฌ๋ก ๋ถํฐ ์ฌ๋ก๋ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- Tip : ๋ฉ๋ด์ฐฝ์ View๋ฅผ ํด๋ฆญํ๊ณ Collisions๋ฅผ ํด๋ฆญํ๋ฉด ์ถฉ๋ ์์ญ์ด ์ฃผํฉ์์ผ๋ก ํ์ ๋๋๊ฑธ ํ์ธํ์ค ์ ์์ต๋๋ค.
5.์ด์ ์ผ์ชฝ ๋ฐํด๋ฅผ ์ถ๊ฐ ํด๋ณด์ ๋ค์๊ณผ ๊ฐ์ด model.sdfํ์ผ์ ์์ ํด๋ผ.
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>true</static>
<link name='chassis'>
<pose>0 0 .1 0 0 0</pose>
<collision name='collision'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</collision>
<visual name='visual'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</visual>
<collision name='caster_collision'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu>0</mu>
<mu2>0</mu2>
<slip1>1.0</slip1>
<slip2>1.0</slip2>
</ode>
</friction>
</surface>
</collision>
<visual name='caster_visual'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
</visual>
</link>
<link name="left_wheel">
<pose>0.1 0.13 0.1 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</visual>
</link>
</model>
</sdf>๋ค์ Gazebo๋ฅผ ์คํ ์ํค๊ณ ๋น์ ์ ๋ก๋ด ๋ชจ๋ธ์ ์ฝ์ ์์ผ๋ผ. ์ ํํ ์์น์ ๋ฐํด๊ฐ ๋ํ๋๋์ง ํ์ธํด๋ผ.
6.์ฐ๋ฆฌ๋ ์ผ์ชฝ ๋ฐํด๋ฅผ ๋ณต์ฌ ํจ์ผ๋ก์จ ์ค๋ฅธ์ชฝ ๋ฐํด๋ฅผ ๋ง๋ค ์ ์๋ค ๊ทธ๋ฆฌ๊ณ ๋ฐํด ๋งํฌ์ ์ฐ์น๋ฅผ ์กฐ์ ํ ์ ์๋ค.
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>true</static>
<link name='chassis'>
<pose>0 0 .1 0 0 0</pose>
<collision name='collision'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</collision>
<visual name='visual'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</visual>
<collision name='caster_collision'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu>0</mu>
<mu2>0</mu2>
<slip1>1.0</slip1>
<slip2>1.0</slip2>
</ode>
</friction>
</surface>
</collision>
<visual name='caster_visual'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
</visual>
</link>
<link name="left_wheel">
<pose>0.1 0.13 0.1 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</visual>
</link>
<link name="right_wheel">
<pose>0.1 -0.13 0.1 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</visual>
</link>
</model>
</sdf>ํ์์ ๊น์ง ๋ก๋ด์ ํ๋์ ์ค์์ ํ๋์ ๊ตฌ ๋ฐํด์ ๋๊ฐ์ ํ ๋ฐํด๋ฅผ ๊ฐ์ง ๋ก๋ด์ด๋ค.
- <static>์ false๋ก ์ ํ ํ์ฌ ๋ชจ๋ธ์ dynamicํ๊ฒ ๋ง๋ ๋ค. ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ํ ๋ฐํด์ hinge ์กฐ์ธํธ๋ฅผ ์ถ๊ฐํ๋ค.
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>false</static>
<link name='chassis'>
<pose>0 0 .1 0 0 0</pose>
<collision name='collision'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</collision>
<visual name='visual'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</visual>
<collision name='caster_collision'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu>0</mu>
<mu2>0</mu2>
<slip1>1.0</slip1>
<slip2>1.0</slip2>
</ode>
</friction>
</surface>
</collision>
<visual name='caster_visual'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
</visual>
</link>
<link name="left_wheel">
<pose>0.1 0.13 0.1 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</visual>
</link>
<link name="right_wheel">
<pose>0.1 -0.13 0.1 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</visual>
</link>
<joint type="revolute" name="left_wheel_hinge">
<pose>0 0 -0.03 0 0 0</pose>
<child>left_wheel</child>
<parent>chassis</parent>
<axis>
<xyz>0 1 0</xyz>
</axis>
</joint>
<joint type="revolute" name="right_wheel_hinge">
<pose>0 0 0.03 0 0 0</pose>
<child>right_wheel</child>
<parent>chassis</parent>
<axis>
<xyz>0 1 0</xyz>
</axis>
</joint>
</model>
</sdf>๋๊ฐ์ ์กฐ์ธํธ๋ y์ถ 0 1 0 ์ ๋ํ์ฌ ํ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ํ ๋ฐํด๋ ์ค์์ ์ฐ๊ฒฐ๋๋ค.
-
๊ฐ์ ๋ณด๋ฅผ ์์ํ๊ณ ๋น์ ์ ๋ชจ๋ธ์ ์ฝ์ ํ๋ค. ์คํฌ๋ฆฐ ์ค๋ฅธ์ชฝ์ ์ ๋ค์ ํด๋ฆญํ๊ณ ์ผ์ชฝ์ผ๋ก ๊ทธ๊ฒ์ ๋๋๊ทธํ์ฌ๋ผ.
-
์๋ก์ด ์ฐฝ์ด ๋ํ๋๋ฉฐ ์ด ์ฐฝ์ ๊ฐ ์กฐ์ธํธ์ ๋ํ ๋ค์ํ ์ปจํธ๋กค๋ฌ๋ค์ ํฌํจํ๋ค.(Note ๋น์ ์ด ์ ์ดํ๊ธฐ ์ํ๋ ๋ชจ๋ธ์ด ์ ํ๋์ด์๋์ง ํ์ธ ํ๋ค.)
-
Force ํญ ์๋์ ๊ฐ์กฐ์ธํธ์ ์ฝ 0.1Nm์ ํ์ ๊ฐํด๋ผ. ๋ก๋ด์ด ์ฃผ๋ณ์ ์์ง์ธ๋ค.
-
์ถํํฉ๋๋ค. ๋น์ ์ ์ด์ ๊ธฐ๋ณธ์ ์ธ ๋ชจ๋ฐ์ผ ๋ก๋ด์ ๊ฐ์ก์ต๋๋ค.