In Ignition Gazebo, all systems are loaded as plugins at runtime. To create a system plugin for use in the simulation environment, follow the steps below.
Decide on interfaces to implement
The first step of implementing a system plugin is to determine the subset of available interfaces to implement. Aside from the base System
object, there are currently three additional available interfaces:
- ISystemPreUpdate
- Has read-write access to world entities and components.
- Executed with simulation time at (t0).
- Can be used to modify state before physics runs, for example for applying control signals or performing network synchronization.
- ISystemUpdate
- Has read-write access to world entities and components.
- Responsible for propagating time from (t0) to (t0 + dt).
- Used for physics simulation step.
- ISystemPostUpdate
- Has read-only access to world entities and components.
- Executed with simulation time at (t0 + dt).
- Used to read out results at the end of a simulation step to be used for sensor or controller updates.
Systems that are only used to read the current state of the world (sensors, graphics, and rendering) should implement ISystemPostUpdate
.
Generally, systems that do not manage physics stepping will not need to implement the ISystemUpdate
interface.
Controllers and systems that provide feedback based on the state of the world will need to implement ISystemPostUpdate
to read the state at the end of an update frame, as well as ISystemPreUpdate
to provide feedback at the beginning of the next frame.
Implement Header
The header should include the System
header:
Your System object should inherit from the System
object as well as from any interfaces that it provides. It should then implement the corresponding methods from the inherited interfaces.
Register Plugin
If the library will only contain one plugin:
If the library will contain multiple plugins, in one implementation do as above, and then for each successive implementation use:
Implement Source
Implement the system class as usual, for example:
Setup the build
In your CMakeLists.txt
add the following
Loading your plugin
In the SDF file representing your simulation, add the plugin to the world
section: