참고 http://gazebosim.org/tutorials?tut=plugins_hello_world&cat=write_plugin
.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)
}
Compiling the Plugin
Please make sure that gazebo has been properly installed.
To compile the above plugin, create ~/gazebo_plugin_tutorial/CMakeLists.txt
:
$ gedit ~/gazebo_plugin_tutorial/CMakeLists.txt
Copy the following in 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})
New in gazebo6
: c++11 flags are now required for all downstream software to compile against gazebo. This is done with the following line:
list(APPEND CMAKE_CXX_FLAGS "${GAZEBO_CXX_FLAGS}")
Create the build directory
$ mkdir ~/gazebo_plugin_tutorial/build
$ cd ~/gazebo_plugin_tutorial/build
Compile the code.
$ cmake ../
$ make
Compiling will result in a shared library, ~/gazebo_plugin_tutorial/build/libhello_world.so
, that can be inserted in a Gazebo simulation.
Lastly, add your library path to the GAZEBO_PLUGIN_PATH
:
$ export GAZEBO_PLUGIN_PATH=${GAZEBO_PLUGIN_PATH}:~/gazebo_plugin_tutorial/build
Note: This changes the path only for the current shell. If you want to use your plugin for every new temrinal you open, append the line above to the
~/.bashrc
file.
Using a Plugin
Once you have a plugin compiled as a shared library (see above), you can attach it to a world or model in an SDF file (see SDF documentation for more info). On startup, Gazebo parses the SDF file, locates the plugin, and loads the code. It is important that Gazebo is capable of finding the plugin. Either the full path to the plugin is specified, or the plugin exists in one of the paths in the GAZEBO_PLUGIN_PATH
environment variable.
Create a world file and copy the code below into it. The example world file can also be found in 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>
Now open it with gzserver
:
$ gzserver ~/gazebo_plugin_tutorial/hello.world --verbose
You should see output similar to:
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!
모델 플러그인
Prerequisites
Overview / HelloWorld Plugin Tutorial
Note: If you're continuing from the previous tutorial, make sure you put in the proper #include
lines for this tutorial that are listed below.
Code
Source: gazebo/examples/plugins/model_push
Plugins allow complete access to the physical properties of models and their underlying elements (links, joints, collision objects). The following plugin will apply a linear velocity to its parent model.
$ cd ~/gazebo_plugin_tutorial
$ gedit model_push.cc
Plugin Code:
#include <functional>
#include <gazebo/gazebo.hh>
#include <gazebo/physics/physics.hh>
#include <gazebo/common/common.hh>
#include <ignition/math/Vector3.hh>
namespace gazebo
{
class ModelPush : public ModelPlugin
{
public: void Load(physics::ModelPtr _parent, sdf::ElementPtr /*_sdf*/)
{
// Store the pointer to the model
this->model = _parent;
// Listen to the update event. This event is broadcast every
// simulation iteration.
this->updateConnection = event::Events::ConnectWorldUpdateBegin(
std::bind(&ModelPush::OnUpdate, this));
}
// Called by the world update start event
public: void OnUpdate()
{
// Apply a small linear velocity to the model.
this->model->SetLinearVel(ignition::math::Vector3d(.3, 0, 0));
}
// Pointer to the model
private: physics::ModelPtr model;
// Pointer to the update event connection
private: event::ConnectionPtr updateConnection;
};
// Register this plugin with the simulator
GZ_REGISTER_MODEL_PLUGIN(ModelPush)
}
Compiling the Plugin
Assuming the reader has gone through the Hello WorldPlugin tutorial all that needs to be done is to add the following lines to ~/gazebo_plugin_tutorial/CMakeLists.txt
add_library(model_push SHARED model_push.cc)
target_link_libraries(model_push ${GAZEBO_LIBRARIES})
Compiling this code will result in a shared library, ~/gazebo_plugin_tutorial/build/libmodel_push.so
, that can be inserted in a Gazebo simulation.
$ cd ~/gazebo_plugin_tutorial/build
$ cmake ../
$ make
Running the Plugin
This plugin is used in the world file examples/plugins/model_push/model_push.world
.
$ cd ~/gazebo_plugin_tutorial
$ gedit model_push.world
<?xml version="1.0"?>
<sdf version="1.4">
<world name="default">
<!-- Ground Plane -->
<include>
<uri>model://ground_plane</uri>
</include>
<include>
<uri>model://sun</uri>
</include>
<model name="box">
<pose>0 0 0.5 0 0 0</pose>
<link name="link">
<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>
<plugin name="model_push" filename="libmodel_push.so"/>
</model>
</world>
</sdf>
The hook to attach a plugin to a model is specified at the end of the model element block using:
<plugin name="model_push" filename="libmodel_push.so"/>
Add your library path to the GAZEBO_PLUGIN_PATH
:
$ export GAZEBO_PLUGIN_PATH=$HOME/gazebo_plugin_tutorial/build:$GAZEBO_PLUGIN_PATH
To start simulation, run
$ cd ~/gazebo_plugin_tutorial/
$ gzserver -u model_push.world
The -u
option starts the server in a paused state.
In a separate terminal, start the gui
$ gzclient
Click on the play button in the gui to unpause the simulation, and you should see the box move.
'ROS GAZEBO' 카테고리의 다른 글
가제보 월드 플러그인 (메세지로 객체 생성) (0) | 2019.05.05 |
---|---|
가제보 환경변수 목록 및 관리 (0) | 2019.05.05 |
플러그인 튜토리얼 (0) | 2019.05.05 |
센서 모델 모음 (압축) (0) | 2019.05.05 |
Sensor noise model 레퍼런스 (0) | 2019.05.05 |