Creating a Gazebo plugin
From The Player Project
Creating a Plugin for Gazebo
This tutorial will cover how to access and control the internals of Gazebo through a very simple plugin interface.
The original purpose of this plugin interface was to provide the ability to animate objects in a world. However, it's also possible to control almost every aspect of Gazebo.
The Code
This plugin interface allows you to directly insert (and remove) a chunk of code into a running Gazebo simulation. The following is an example plugin that listens to the World Update Callback (which is fired once every step of the simulator), and prints out a message.
#include <boost/bind.hpp>
#include <gazebo/gazeboserver.hh>
namespace gazebo
{
class Elevator : public Plugin
{
/// Constructor
public: Elevator() : Plugin()
{
open_ = 0;
raise_ = 0;
}
/// Mandatory load function, neded by gazebo
public: void Load()
{
// Get the right and left doors, and the lift
rightDoor_ = (Body*)World::Instance()->GetEntityByName("doors::right");
leftDoor_ = (Body*)World::Instance()->GetEntityByName("doors::left");
lift_ = (Body*)World::Instance()->GetEntityByName("lift::body");
// Get the first contact sensor
contact_ = (Geom*)World::Instance()->GetEntityByName("contact::body::COM_Entity::geom");
contact_->SetContactsEnabled(true);
contact_->ConnectContactCallback(boost::bind(&Elevator::ContactCB, this));
// Get the second contact sensor
contact2_ = (Geom*)World::Instance()->GetEntityByName("lift::body::COM_Entity::contact");
contact2_->SetContactsEnabled(true);
contact2_->ConnectContactCallback(boost::bind(&Elevator::Contact2CB, this));
// Get an update callback
World::Instance()->ConnectWorldUpdateStartSignal(boost::bind(&Elevator::UpdateCB, this));
}
/// Gazebo callback that contact occured on the plate in front of the door
private: void ContactCB()
{
open_ = 1;
}
/// Gazebo callback that contact occured on the plate in the elevator
private: void Contact2CB()
{
raise_ = 1;
}
/// Gazebo update callback
public: void UpdateCB()
{
if (open_ == 1)
{
rightDoor_->SetLinearVel(Vector3(0, -0.5, 0));
leftDoor_->SetLinearVel(Vector3(0, 0.5, 0));
}
if (raise_ == 1)
{
lift_->SetLinearVel(Vector3(0,0,0.5));
}
}
private: int open_, raise_;
private: Body *rightDoor_, *leftDoor_, *lift_;
private: Geom *contact_, *contact2_;
};
/// Register this plugin with gazebo. This is mandatory
GZ_REGISTER_PLUGIN("Elevator", Elevator)
}