Module: PIDController

template<typename MeasuredPositionMsgPayload, typename MeasuredVelocityMsgPayload, typename OutputMsgPayload, typename DesiredPositionMsgPayload = MeasuredPositionMsgPayload, typename DesiredVelocityMsgPayload = MeasuredVelocityMsgPayload>
class PIDController : public StatefulSysModel
#include <PIDController.h>

Generic PID controller.

This templated class implements a proportional-integral-derivative (PID) controller for use in MuJoCo-based simulations. It reads measured and desired position/velocity messages, computes the control output, and writes it to an output message. The controller supports custom payload types for measured and desired states, as well as output.

The controller requires the relevant input messages to be linked if the corresponding gain (Kp or Kd) is non-zero. Throws a runtime error if a required message is not linked.

Template Parameters:
  • MeasuredPositionMsgPayload – Type of measured position message payload.

  • MeasuredVelocityMsgPayload – Type of measured velocity message payload.

  • OutputMsgPayload – Type of output message payload.

  • DesiredPositionMsgPayload – Type of desired position message payload (defaults to measured).

  • DesiredVelocityMsgPayload – Type of desired velocity message payload (defaults to measured).

Public Functions

virtual ~PIDController() = default

Virtual destructor for safe inheritance.

inline double getProportionalGain() const

Get the proportional gain.

inline void setProportionalGain(double value)

Set the proportional gain.

inline double getDerivativeGain() const

Get the derivative gain.

inline void setDerivativeGain(double value)

Set the derivative gain.

inline double getIntegralGain() const

Get the integral gain.

inline void setIntegralGain(double value)

Set the integral gain.

inline double getIntegralError()

Get the current integral error state.

Returns:

The integral error value.

inline void setIntegralError(double val)

Set the integral error state.

Parameters:

val – Value to set.

inline virtual void registerStates(DynParamRegisterer registerer) override

Register the integral error state with the state engine.

Parameters:

registerer – State registration helper.

inline void UpdateState(uint64_t CurrentSimNanos) override

Update the controller state and compute the control output.

Reads the measured and desired position/velocity messages, computes the control output using the PID formula, and writes the result to the output message. Throws a runtime error if required messages are not linked when Kp or Kd are non-zero.

Parameters:

CurrentSimNanos – Current simulation time in nanoseconds.

Public Members

ReadFunctor<MeasuredPositionMsgPayload> measuredPosInMsg

Input message functor for measured position.

ReadFunctor<DesiredPositionMsgPayload> desiredPosInMsg

Input message functor for desired position.

ReadFunctor<MeasuredVelocityMsgPayload> measuredVelInMsg

Input message functor for measured velocity.

ReadFunctor<DesiredVelocityMsgPayload> desiredVelInMsg

Input message functor for desired velocity.

Message<OutputMsgPayload> outputOutMsg

Output message for control value.

BSKLogger bskLogger

BSK Logging.

Protected Functions

virtual double readMeasuredPosition(const MeasuredPositionMsgPayload &i) const = 0

Read the measured position from the input payload.

Parameters:

i – Measured position message payload.

Returns:

The measured position value.

virtual double readMeasuredVelocity(const MeasuredVelocityMsgPayload &i) const = 0

Read the measured velocity from the input payload.

Parameters:

i – Measured velocity message payload.

Returns:

The measured velocity value.

inline virtual double readDesiredPosition(const DesiredPositionMsgPayload &i) const

Read the desired position from the input payload. Defaults to using the read method readMeasuredPosition.

Parameters:

i – Desired position message payload.

Returns:

The desired position value.

inline virtual double readDesiredVelocity(const DesiredVelocityMsgPayload &i) const

Read the desired velocity from the input payload. Defaults to using the read method readMeasuredVelocity.

Parameters:

i – Desired velocity message payload.

Returns:

The desired velocity value.

virtual void writeOutput(OutputMsgPayload &o, double val) = 0

Write the computed output value to the output payload.

Parameters:
  • o – Output message payload.

  • val – Value to write.

Protected Attributes

StateData *integralErrorState = nullptr

State data for the integral error term.

double Kp = 0

Proportional gain.

double Kd = 0

Derivative gain.

double Ki = 0

Integral gain.