Plugins 101 - modulabs/gazebo-tutorial GitHub Wiki
ํ๋ฌ๊ทธ์ธ์ shared library (๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)๋ก ์ฝ์ ํ๋ค. ํ๋ฌ๊ทธ์ธ์ standard C++ classes (ํ์ค c++ ํด๋์ค)๋ก ๋ชจ๋ ๊ธฐ๋ฅ์ ์ง์ ์ ๊ทผํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
ํ๋ฌ๊ทธ์ธ์ ์๋์ ๊ฐ์ ์ด์ ๋ก ์ ์ฉํ๋ค:
- ๊ฐ๋ฐ์๊ฐ ๊ฐ์ ๋ณด์ ๊ฑฐ์ ๋ชจ๋ ๋ถ๋ถ์ ์ ์ดํ ์ ์๋ค
- ์ฝ๊ฒ ๊ณต์ ํ ์ ์๋ ๋ ๋ฆฝ์ ์ธ ๋ฃจํด์ด๋ค
- ์คํ์ค์ธ ์์คํ ์์ ์ฝ์ ๋ฐ ์ ๊ฑฐ๊ฐ ๊ฐ๋ฅํ๋ค
์ด์ ๋ฒ์ ์ ๊ฐ์ ๋ณด์์๋ controllers (์ปจํธ๋กค๋ฌ)๋ฅผ ์ฌ์ฉํ๋ค. ์ปจํธ๋กค๋ฌ๋ ํ๋ฌ๊ทธ์ธ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์ํ์ง๋ง, ์ ์ ์ผ๋ก ์ปดํ์ผ๋์๋ค (statically compiled). ํ๋ฌ๊ทธ์ธ์ ๋ณด๋ค ๋ ์ตํต์ฑ์ด ์์ด (flexible), ์ฌ์ฉ์๊ฐ ์๋ฎฌ๋ ์ด์ ์ ํฌํจํ ๊ธฐ๋ฅ์ ๊ณ ๋ฅด๊ณ ์ ํํ ์ ์๋ค.
์๋์ ๊ฐ์ ๊ฒฝ์ฐ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด์ผ ํ๋ค:
- ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ (programmatically)์ผ๋ก ์๋ฎฌ๋ ์ด์ ์ ๋ณ๊ฒฝํ๊ธฐ๋ฅผ ์ํ๋ ๊ฒฝ์ฐ
์: ๋ชจ๋ธ ์ด๋, ์ด๋ฒคํธ ๋์, ์ ์ ์กฐ๊ฑด์ ๊ฐ์ง ์๋ก์ด ๋ชจ๋ธ ์ฝ์
- ์ ์ก ์ธต (transport layer)์ ์ค๋ฒํค๋(overhead) ์์ด ๊ฐ์ ๋ณด์ ๋น ๋ฅธ ์ธํฐํ์ด์ค๋ฅผ ์ํ๋ ๊ฒฝ์ฐ
์: ๋ฉ์์ง์ ์ง๋ ฌํ ๋ฐ ๋น ์ง๋ ฌํ๊ฐ ์๋ค.
- ๋ค๋ฅธ์ฌ๋์๊ฒ ๋์์ด ๋๊ฑฐ๋ ๊ณต์ ํ๊ธฐ๋ฅผ ์ํ๋ ์ฝ๋๊ฐ ์๋ ๊ฒฝ์ฐ
ํ์ฌ๋ 6 ๊ฐ์ง ํ๋ฌ๊ทธ์ธ์ด ์๋ค.
- World
- Model
- Sensor
- System
- Visual
- GUI (Graphical User Interface)
๊ฐ ํ๋ฌ๊ทธ์ธ์ ๊ฐ์ ๋ณด์ ๋ค๋ฅธ ์์๋ก ๊ด๋ฆฌ๋๋ค. ์๋ฅผ ๋ค์ด, Model Plugin์ ๊ฐ์ ๋ณด์ ํน์ ๋ชจ๋ธ์ ์ฒจ๋ถํ์ฌ ์ ์ด๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก World plugin ์ world์, Sensor plugin์ ํน์ ์ผ์์ ์ ์ฉ๋๋ค. System plugin์ ๋ช ๋ น์ค (command line)์์ ์ง์ ๋๊ณ , ๊ฐ์ ๋ณด๊ฐ ์์ํ๋ ๋์ ๋ก๋ฉ๋๋ค. ์ด ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉ์๊ฐ ์์ ํ๋ก์ธ์ค(Startup process)๋ฅผ ์ ์ดํ ์ ์๋๋ก ์ ๊ณตํ๋ค.
ํ๋ฌ๊ทธ์ธ์ ์ํ๋ ๊ธฐ๋ฅ์ ๊ธฐ๋ฐ์ผ๋ก ์ ํํด์ผ ํ๋ค. World plugin์ ๋ฌผ๋ฆฌ ์์ง, ์ฃผ๋ณ ์กฐ๋ช ๋ฑ์ world ์์ฑ์ ์ ์ดํ๋๋ฐ ์ฌ์ฉํ๋ค. Model plugin ์ ๋ชจ๋ธ์ ์กฐ์ธํธ ๋ฐ ์ํ๋ฅผ ์ ์ดํ๋๋ฐ ์ฌ์ฉํ๋ค. Sensor plugin์ ์ผ์ ์ ๋ณด๋ฅผ ์์งํ๊ณ ์ผ์ ์์ฑ์ ์ ์ดํ๋๋ฐ ์ฌ์ฉํ๋ค.
ํ๋ฌ๊ทธ์ธ์ ๋จ์ํ๊ฒ ์ค๊ณ๋์ด์๋ค. Bare bones world plugin์ ๋ช ๊ฐ์ง ๋ฉค๋ฒ ํจ์๊ฐ ์๋ ํด๋์ค๋ก ๊ตฌ์ฑ๋์ด์๋ค.
๋จผ์ debian์์ ๊ฐ์ ๋ณด๋ฅผ ์ค์นํ๋ค๋ฉด, ๊ฐ์ ๋ณด ๊ฐ๋ฐ ํ์ผ์ ์ค์นํ๋์ง ํ์ธํด๋ผ. ๋ง์ฝ source๋ก ๊ฐ์ ๋ณด๋ฅผ ์ค์นํ๋ค๋ฉด, ์ด ๋จ๊ณ๋ฅผ ๋ฌด์ํ ์ ์๋ค. ๋ง์ฝ ๊ฐ์ ๋ณด 6๊ฐ ์๋ ๋ค๋ฅธ ๋ฒ์ ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ๋ฒ์ ์ 6์ผ๋ก ๋ฐ๊พธ์ด๋ผ.
$ sudo apt-get install libgazebo6-dev
๊ทธ๋ฆฌ๊ณ ์๋ก์ด ํ๋ฌ๊ทธ์ธ์ ์ํ ๋๋ ํ ๋ฆฌ์ .cc ํ์ผ์ ๋ง๋ ๋ค:
$ mkdir ~/gazebo_plugin_tutorial
$ cd ~/gazebo_plugin_tutorial
$ gedit hello_world.cc
hello_world.cc ์ ์๋ ๋ด์ฉ์ ๋ณต์ฌํ๋ค:
#include <gazebo/gazebo.hh>
namespace gazebo
{
class WorldPluginTutorial : public WorldPlugin
{
public: WorldPluginTutorial() : WorldPlugin()
{
printf("Hello World!\n");
}
public: void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
{
}
};
GZ_REGISTER_WORLD_PLUGIN(WorldPluginTutorial)
}์ ์ฝ๋๋ the Gazebo sources์ ์์ผ๋ฉฐ, ๊ทธ์ ๋ง๋ CMakeLists.txt ํ์ผ๋ ํจ๊ป์๋ค: examples/plugins/hello_world/hello_world.cc
#include <gazebo/gazebo.hh>
namespace gazebo
{gazebo/gazebo.hh ํ์ผ์ ๊ธฐ๋ณธ ๊ฐ์ ๋ณด ํจ์์ ํต์ฌ ์์๋ฅผ ํฌํจํ๊ณ ์๋ค. gazebo/physics/physics.hh, ๋๋ gazebo/rendering/rendering.hh, gazebo/sensors/sensors.hh๋ ํ์์์ ํฌํจ๋์ด์ผํ๋ฏ๋ก ํฌํจ๋์ด์์ง ์๋ค. ๋ชจ๋ ํ๋ฌ๊ทธ์ธ์ ๊ฐ์ ๋ณด ๋ค์์คํ์ด์ค (namespace)๊ฐ ์์ด์ผ ํ๋ค.
class WorldPluginTutorial : public WorldPlugin
{
public: WorldPluginTutorial() : WorldPlugin()
{
printf("Hello World!\n");
}ํ๋ฌ๊ทธ์ธ์ ํ๋ฌ๊ทธ์ธ ํ์
์ ์์ํด์ผ ํ๋ฉฐ, ์ด ๊ฒฝ์ฐ๋ WorldPlugin class๋ฅผ ์์ํ ๊ฒ์ด๋ค.
public: void Load(physics::WorldPtr _world, sdf::ElementPtr _sdf)
{
}Load ํจ์์์์ ๋ค๋ฅธ ์ธ์๋ SDF์ธ๋ฐ, ๋ก๋๋ SDF ํ์ผ์๋ ์์(elements)์ ์์ฑ(attributes)์ด ํฌํจ๋์ด์๋ค.
GZ_REGISTER_WORLD_PLUGIN(WorldPluginTutorial)๋ง์ง๋ง์ผ๋ก, ํ๋ฌ๊ทธ์ธ์ GZ_REGISTER_WORLD_PLUGIN ๋งคํฌ๋ก(macro)๋ฅผ ์ฌ์ฉํ์ฌ ์๋ฎฌ๋ ์ดํฐ์ ๋ฑ๋กํด์ผ ํ๋ค. ์ด ๋งคํฌ๋ก์ ์ ์ผํ ํ๋ผ๋ฏธํฐ(parameter)๋ ํด๋์ค ์ด๋ฆ์ด๋ค. ๊ฐ ํ๋ฌ๊ทธ์ธ ํ์
์ ๋ฐ๋ผ ์ฌ์ฉํ๋ ๋งคํฌ๋ก๊ฐ ์๋ค: GZ_REGISTER_MODEL_PLUGIN, GZ_REGISTER_SENSOR_PLUGIN, GZ_REGISTER_GUI_PLUGIN, GZ_REGISTER_SYSTEM_PLUGIN and GZ_REGISTER_VISUAL_PLUGIN.
๋ค์ ์น์ ์์๋ ์ด ํ๋ฌ๊ทธ์ธ์ ์ปดํ์ผ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ์ฌ ์ค๋ช ํ๋ค.
๊ฐ์ ๋ณด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์น๋์ด์๋์ง ํ์ธํ๋ค.
์ ํ๋ฌ๊ทธ์ธ์ ์ปดํ์ผํ๋ ค๋ฉด ~/gazebo_plugin_tutorial/CMakeLists.txt์ ์์ฑํด์ผ ํ๋ค:
$ gedit ~/gazebo_plugin_tutorial/CMakeLists.txt
CMakeLists.txt ํ์ผ์ ์๋ ๋ด์ฉ์ ๋ณต์ฌํ๋ค:
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
find_package(gazebo REQUIRED)
include_directories(${GAZEBO_INCLUDE_DIRS})
link_directories(${GAZEBO_LIBRARY_DIRS})
list(APPEND CMAKE_CXX_FLAGS "${GAZEBO_CXX_FLAGS}")
add_library(hello_world SHARED hello_world.cc)
target_link_libraries(hello_world ${GAZEBO_LIBRARIES})๋ชจ๋ downstream software๋ฅผ ๊ฐ์ ๋ณด์ ์ปดํ์ผํ๊ธฐ ์ํด์๋ c++11 ํ๋๊ทธ๊ฐ ํ์ํ๋ค. ์๋ ๋ด์ฉ์ ์ถ๊ฐํ๋ค:
list(APPEND CMAKE_CXX_FLAGS "${GAZEBO_CXX_FLAGS}")๋น๋ ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๋ค
$ mkdir ~/gazebo_plugin_tutorial/build
$ cd ~/gazebo_plugin_tutorial/build
$ cmake ../
$ make
์ปดํ์ผํ๋ฉด ๊ฐ์ ๋ณด ์๋ฎฌ๋ ์ด์
์ ์ฝ์
ํ ์ ์๋ ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ฑ๋๋ค: ~/gazebo_plugin_tutorial/build/libhello_world.so
๋ง์ง๋ง์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝ๋ก๋ฅผ GAZEBO_PLUGIN_PATH์ ์ถ๊ฐํ๋ค:
$ export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:~/gazebo_plugin_tutorial/build
Note: ์ด๊ฒ์ ํ์ฌ ์ ๊ฒฝ๋ก๋ง ๋ณ๊ฒฝํ๋ค. ๋ง์ฝ ์๋ก์ด ํฐ๋ฏธ๋์ ์ด๋๋ง๋ค ๋์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด,
~/.bashrcํ์ผ์ ์ ๋ด์ฉ์ ์ถ๊ฐํด๋ผ.
ํ๋ฌ๊ทธ์ธ์ ์์๊ฐ์ด ๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ปดํ์ผํ๋ฉด, world, model, ๋๋ SDF ํ์ผ (์์ธ ์ ๋ณด๋ SDF ๋ฌธ์ ์ฐธ๊ณ )์ ์ฐ๊ฒฐํ ์ ์๋ค. ์์ ์ ๊ฐ์ ๋ณด๋ SDF ํ์ผ์ ๋ถ์(parsing)ํ๊ณ , ํ๋ฌ๊ทธ์ธ์ ์ฐพ์ ์ฝ๋๋ฅผ ๋ก๋ํ๋ค. ๊ฐ์ ๋ณด๊ฐ ํ๋ฌ๊ทธ์ธ์ ์ฐพ์ ์ ์๊ฒ ํ๋ ๊ฒ์ด ์ค์ํ๋ค. ํ๋ฌ๊ทธ์ธ์ ๋ํ ์ ์ฒด ๊ฒฝ๋ก๊ฐ ์ง์ ๋์๊ฑฐ๋ ํ๋ฌ๊ทธ์ธ์ด GAZEBO_PLUGIN_PATH ํ๊ฒฝ๋ณ์์ ๊ฒฝ๋ก์ ์กด์ฌํด์ผ ํ๋ค.
world ํ์ผ์ ๋ง๋ค๊ณ ์๋ ์ฝ๋๋ฅผ ๋ณต์ฌํ๋ค. ์์ ํ์ผ์ examples/plugins/hello_world/hello.world์์ ์ฐพ์ ์ ์๋ค.
$ gedit ~/gazebo_plugin_tutorial/hello.world
<?xml version="1.0"?>
<sdf version="1.4">
<world name="default">
<plugin name="hello_world" filename="libhello_world.so"/>
</world>
</sdf>์ด์ ๊ฐ์ ๋ณด์ ํจ๊ป ์คํํ๋ค:
$ gzserver ~/gazebo_plugin_tutorial/hello.world --verbose
์๋์ ๋น์ทํ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์๋ค:
Gazebo multi-robot simulator, version 6.1.0
Copyright (C) 2012-2015 Open Source Robotics Foundation.
Released under the Apache 2 License.
http://gazebosim.org
[Msg] Waiting for master.
[Msg] Connected to gazebo master @ http://127.0.0.1:11345
[Msg] Publicized address: 172.23.1.52```
Hello World!