This tutorial shows how to develop a simple plugin that implements a 3D policy and includes a sample list of Feature Features.
Prerequisites
Write a simple physics plugin
First we need to create a workspace
Examine the code
To set up all libraries needed to implement physics feature, we need to include the following:
- FeatureList header: to define a list of Feature that will be implemented for the plugin, e.g. GetEngineInfo.
- FeaturePolicy header: to specify the metadata about the coordinate system (e.g. 2 or 3 dimensions) and numeric system (e.g. float, int) that the
Features
will be implemented accordingly. GetEntities.hh
header: to retrieve the pre-defined list of features in Gazebo Physics. Please refer to this API Reference for a list of features defined inGetEntities.hh
and Understanding the Physics Plugin tutorial for an example list of common features implemented with a plugin.Register.hh
header: to register a plugin to Gazebo Physics.
Next, we use a dummy namespace mock
and list all the features we would like to implement.
The plugin will be able to return its physics engine metadata. We will now implement our plugin class named HelloWorldPlugin
using the defined FeatureList above. The class is inherited from Implements3d to declare that the plugin's HelloWorldFeatureList
will be in the 3D coordinate system.
Because we are not using a real physics engines, a dummy physics engines is defined inside member function InitiateEngine
by simply setting the engineName
to HelloWorld
, and returning the engine object using Identity
. Then, we define the metadata getters GetEngineIndex
and GetEngineName
for the feature GetEngineInfo (please look into corresponding public member functions defined in the subclasses). A list of other pre-defined features can be found in the GetEntities
FeatureList.
Finally, we only have to register our plugin in Gazebo Physics as a physics engine by:
Note that:
- The first argument is the name of the class that wraps the physics engine into a plugin.
- The second argument is the
FeaturePolicy
for this plugin, i.e.FeaturePolicy3d
- The third argument is the
FeatureList
, specifying all the features that this plugin provides, i.e.HelloWorldFeatureList
Setup CMakeLists.txt for building (Version: gz-physics8)
Now create a file named CMakeLists.txt
with your favorite editor and add these lines for finding gz-plugin
and gz-physics
dependencies for the Fortress release:
Build and run
Compile the plugin
Your current plugin folder should look like this:
Now you can build the plugin by:
This will generate the HelloWorldPlugin
library under build
. The exact name of the library file depends on the operating system such as libHelloWorldPlugin.so
on Linux, libHelloWorldPlugin.dylib
on MacOS, and HelloWorldPlugin.dll
on Windows.
Test loading the plugin on Linux
Please first follow the Loading physics plugins tutorial to create a simple loader. Then we test our plugin using the loader as follow:
And you will see the engine info of our plugin: