Migration from Gazebo-classic: Link API
When migrating plugins from Gazebo-classic to Ignition Gazebo, developers will notice that the C++ APIs for both simulators are quite different. Be sure to check the plugin migration tutorial to get a high-level view of the architecture differences before using this guide.
This tutorial is meant to serve as a reference guide for developers migrating functions from the sim::phyiscs::Link class.
If you're trying to use some API which doesn't have an equivalent on Ignition yet, feel free to ticket an issue.
Link API
Gazebo-classic's sim::physics::Link provides lots of functionality, which can be divided in these categories:
- Properties: Setting / getting properties
- Example: Link::GetName / Link::SetName
- Read family: Getting children and parent
- Example: Link::GetCollision
- Write family: Adding children, changing parent
- Example: Link::RemoveChildren
- Lifecycle: Functions to control the link's lifecycle
- Example: Link::Init
- Others: Functions that don't fit any of the categories above
- Example: Link::PlaceOnEntity
You'll find the Ignition APIs below on the following headers:
- ignition/gazebo/Link.hh
- ignition/gazebo/Util.hh
- ignition/gazebo/SdfEntityCreator.hh
- ignition/gazebo/EntityComponentManager.hh
It's worth remembering that most of this functionality can be performed using the EntityComponentManager directly. The functions presented here exist for convenience and readability.
Properties
Most of Gazebo-classic's Link API is related to setting and getting properties. These functions are great candidates to have equivalents on Ignition Gazebo, because the Entity-Component-System architecture is perfect for setting components (properties) into entities such as links.
| Classic | Ignition |
|---|---|
| AddForce | gz::sim::Link::AddWorldForce |
| AddForceAtRelativePosition | TODO |
| AddForceAtWorldPosition | TODO |
| AddLinkForce | TODO |
| AddRelativeForce | TODO |
| AddRelativeTorque | TODO |
| AddTorque | gz::sim::Link::AddWorldWrench |
| AddType | ecm.CreateComponent<Type>(entity, Type()) |
| Battery | Use this system: gz::sim::systems::LinearBatteryPlugin |
| BoundingBox | TODO |
| CollisionBoundingBox | TODO |
| DirtyPose | Not supported |
| FillMsg | TODO |
| GetAngularDamping | TODO |
| GetEnabled | TODO |
| GetGravityMode | TODO |
| GetId | gz::sim::Link::Entity |
| GetInertial | gz::sim::Link::WorldInertialPose / gz::sim::Link::WorldInertialMatrix |
| GetKinematic | TODO |
| GetLinearDamping | TODO |
| GetName | gz::sim::Link::Name |
| GetSDF | TODO |
| GetSDFDom | TODO |
| GetSaveable | Not supported |
| GetScopedName | gz::sim::scopedName |
| GetSelfCollide | See model API |
| GetSensorName | See sensor API |
| GetType | gz::sim::entityType |
| GetWorldEnergy | TODO |
| GetWorldEnergyKinetic | gz::sim::Link::WorldKineticEnergy |
| GetWorldEnergyPotential | TODO |
| HasType | sim::components::Link::typeId == entityTypeId(entity, ecm) |
| InitialRelativePose | TODO |
| IsCanonicalLink | gz::sim::Link::IsCanonical |
| IsSelected | Selection is client-specific, not porting |
| IsStatic | See model API |
| MoveFrame | TODO |
| TODO | |
| ProcessMsg | TODO |
| RelativeAngularAccel | TODO |
| RelativeAngularVel | TODO |
| RelativeForce | TODO |
| RelativeLinearAccel | TODO |
| RelativeLinearVel | TODO |
| RelativePose | TODO |
| RelativeTorque | TODO |
| RelativeWindLinearVel | TODO |
| SDFPoseRelativeToParent | TODO |
| SDFSemanticPose | TODO |
| SetAngularDamping | TODO |
| SetAngularVel | TODO |
| SetAnimation | TODO |
| SetAutoDisable | TODO |
| SetCanonicalLink | TODO |
| SetCollideMode | TODO |
| SetEnabled | TODO |
| SetForce | TODO |
| SetGravityMode | TODO |
| SetInertial | TODO |
| SetInitialRelativePose | TODO |
| SetKinematic | TODO |
| SetLaserRetro | TODO |
| SetLinearDamping | TODO |
| SetLinearVel | TODO |
| SetLinkStatic | TODO |
| SetName | TODO |
| SetPublishData | TODO |
| SetRelativePose | TODO |
| SetSaveable | Not supported |
| SetScale | TODO |
| SetSelected | Selection is client-specific, not porting |
| SetSelfCollide | TODO |
| SetState | TODO |
| SetStatic | TODO |
| SetTorque | TODO |
| SetVisualPose | See visual API |
| SetWindEnabled | TODO |
| SetWindMode | TODO |
| SetWorldPose | TODO |
| SetWorldTwist | TODO |
| StopAnimation | TODO |
| TypeStr | gz::sim::entityTypeStr |
| URI | TODO |
| UpdateParameters | TODO |
| VisualPose | See visual API |
| WindMode | gz::sim::Link::WindMode |
| WorldAngularAccel | TODO |
| WorldAngularMomentum | TODO |
| WorldAngularVel | gz::sim::Link::WorldAngularVelocity |
| WorldCoGLinearVel | TODO |
| WorldCoGPose | TODO |
| WorldForce | TODO |
| WorldInertiaMatrix | gz::sim::Link::WorldInertialMatrix |
| WorldInertialPose | gz::sim::Link::WorldInertialPose |
| WorldLinearAccel | gz::sim::Link::WorldLinearAcceleration |
| WorldLinearVel | gz::sim::Link::WorldLinearVelocity |
| WorldPose | gz::sim::Link::WorldPose |
| WorldTorque | TODO |
| WorldWindLinearVel | TODO |
Read family
These APIs deal with reading information related to child / parent relationships.
The main difference in these APIs across Gazebo generations is that on classic, they deal with shared pointers to entities, while on Ignition, they deal with entity IDs.
| Classic | Ignition |
|---|---|
| BatteryCount | Use this system: gz::sim::systems::LinearBatteryPlugin |
| FindAllConnectedLinksHelper | TODO |
| GetByName | Use type-specific gz::sim::Link::*ByName |
| GetChild | Use type-specific gz::sim::Link::*ByName |
| GetChildCollision | gz::sim::Link::CollisionByName |
| GetChildCount | Use type-specific gz::sim::Link::*Count |
| GetChildJoint | TODO |
| GetChildJointsLinks | See joint API |
| GetChildLink | Not supported |
| GetCollision | gz::sim::Link::CollisionByName |
| GetCollisions | gz::sim::Link::Collisions |
| GetModel | gz::sim::Link::ParentModel |
| GetParent | gz::sim::EntiyComponentManager::ParentEntity |
| GetParentId | gz::sim::EntiyComponentManager::ParentEntity |
| GetParentJoints | TODO |
| GetParentJointsLinks | See joint API |
| GetParentModel | gz::sim::Link::ParentModel |
| GetSensorCount | gz::sim::Link::SensorCount |
| GetVisualMessage | See visual API |
| GetWorld | gz::sim::worldEntity |
| VisualId | gz::sim::Link::VisualByName |
| Visuals | gz::sim::Link::Visuals |
Write family
These functions deal with modifying the entity tree, attaching children to new parents.
| Classic | Ignition |
|---|---|
| AddChild | TODO |
| AddChildJoint | TODO |
| AddParentJoint | TODO |
| AttachStaticLink | TODO |
| AttachStaticModel | TODO |
| CreateJoint | TODO |
| CreateLink | TODO |
| DetachAllStaticModels | TODO |
| DetachStaticLink | TODO |
| DetachStaticModel | TODO |
| RemoveChild | TODO |
| RemoveChildJoint | TODO |
| RemoveChildren | TODO |
| RemoveCollision | TODO |
| RemoveJoint | TODO |
| RemoveParentJoint | TODO |
| SetCanonicalLink | TODO |
| SetParent | TODO |
| SetWorld | TODO |
Lifecycle
These functions aren't related to the state of a link, but perform some processing related to the link's lifecycle, like initializing, updating or terminating it.
| Classic | Ignition |
|---|---|
| Fini | N/A |
| Init | N/A |
| Load | gz::sim::SdfEntityCreator::CreateEntities |
| LoadJoints | gz::sim::SdfEntityCreator::CreateEntities |
| LoadPlugins | TODO |
| Reset | TODO |
| ResetPhysicsStates | TODO |
| Update | Entities are updated by systems |
| UpdateMass | Entities are updated by systems |
| UpdateSurface | Entities are updated by systems |
| UpdateWind | Entities are updated by systems |
| OnPoseChange | TODO |
Others
Miscelaneous functions that don't fit the other categories. Most of them involve logic that should be performed from within a system.
| Classic | Ignition |
|---|---|
| GetNearestEntityBelow | Requires a system |
| PlaceOnEntity | Involves Requires a system |
| PlaceOnNearestEntityBelow | Requires a system |