Gazebo | Ignition | Community
Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

How do I use ODE's ERP feature correctly to model an elastic joint?

I am modelling elastic links via revolute joints that act as torsion springs.

It works well for few joints (< 4 spring-joints in series) and small loads, but once I add more joints or apply larger forces, my robot sort of "explodes. Most commonly, all the links will snap to the world origin as soon as I start the physics simulation. Sometimes the simulation crashed while attempting to set [Inf Inf Inf . . .] as a pose. I suspect some numerical instability going on.

For that reason I began looking into ODE's ERP feature, as well as <implicit_spring_damper> within SDF, since this tutorial mentions it as a more numerically stable method of modelling springs and dampers. Looking into ODE, I found this entry on how to go about that.

Setting the aforementioned tag, as well as specifying <erp> and <cfm> in the joints does indeed produce more stable results. The joints however behave very differently now, seemingly having 6 DoF, allowing rotations about axes that should be constrained.

This opens up quite a few questions:

  • What exactly does <implicit_spring_damper> achieve?
  • What significance do the values inside my <axis> tag have when using <implicit_spring_damper> (including<damping> and <spring_stiffness>, which are also being implicitly specified va <erp> and <cfm>) ?
    • How can I model a 1 DOF revolute joint with spring and damper via this method?
    • What do <erp> and <cfm> within a joint do without <implicit_spring_damper>?
    • What is the purpose of the global ERP and CFM values (set in Gazebo's GUI)?

How do I use ODE's ERP feature correctly to model an elastic joint?

I am modelling elastic links via revolute joints that act as torsion springs.

It works well for few joints (< 4 spring-joints in series) and small loads, but once I add more joints or apply larger forces, my robot sort of "explodes. Most commonly, all the links will snap to the world origin as soon as I start the physics simulation. Sometimes the simulation crashed while attempting to set [Inf Inf Inf . . .] as a pose. I suspect some numerical instability going on.

For that reason I began looking into ODE's ERP feature, as well as <implicit_spring_damper> within SDF, since this tutorial mentions it as a more numerically stable method of modelling springs and dampers. Looking into ODE, I found this entry on how to go about that.

Setting the aforementioned tag, as well as specifying <erp> and <cfm> in the joints does indeed produce more stable results. The joints however behave very differently now, seemingly having 6 DoF, allowing rotations about axes that should be constrained.

This opens up quite a few questions:

  • What exactly does <implicit_spring_damper> achieve?
  • What significance do the values inside my <axis> tag have when using <implicit_spring_damper> (including<damping> and <spring_stiffness>, which are also being implicitly specified va <erp> and <cfm>) ?
    • How can I model a 1 DOF revolute joint with spring and damper via this method?
    • What do <erp> and <cfm> within a joint do without <implicit_spring_damper>?
    • What is the purpose of the global ERP and CFM values (set in Gazebo's GUI)?

How do I use ODE's ERP feature correctly to model an elastic joint?

I am modelling elastic links via revolute joints that act as torsion springs.

It works well for few joints (< 4 spring-joints in series) and small loads, but once I add more joints or apply larger forces, my robot sort of "explodes. "explodes". Most commonly, all the links will snap to the world origin as soon as I start the physics simulation. Sometimes the simulation crashed while attempting to set [Inf Inf Inf . . .] as a pose. I suspect some numerical instability going on.

For that reason I began looking into ODE's ERP feature, as well as <implicit_spring_damper> within SDF, since this tutorial mentions it as a more numerically stable method of modelling springs and dampers. Looking into ODE, I found this entry on how to go about that.

Setting the aforementioned tag, as well as specifying <erp> and <cfm> in the joints does indeed produce more stable results. The joints however behave very differently now, seemingly having 6 DoF, allowing rotations about axes that should be constrained.

This opens up quite a few questions:

  • What exactly does <implicit_spring_damper> achieve?
  • What significance do the values inside my <axis> tag have when using <implicit_spring_damper> (including<damping> and <spring_stiffness>, which are also being implicitly specified va <erp> and <cfm>) ?
  • How can I model a 1 DOF revolute joint with spring and damper via this method?
  • What do <erp> and <cfm> within a joint do without <implicit_spring_damper>?
  • What is the purpose of the global ERP and CFM values (set in Gazebo's GUI)?