Dynamixel  2.9.5
RoadNarrows Robotics Dynamixel Package
DynaPidSpeed Class Reference

Speed PID class. More...

#include <DynaPidSpeed.h>

Inheritance diagram for DynaPidSpeed:
DynaPid

Public Member Functions

 DynaPidSpeed (double fKp=SpeedPidKpDft, double fKi=SpeedPidKiDft, double fKd=SpeedPidKdDft, double fWi=DynaPid::WiSumErrDft)
 Default constructor. More...
 
 DynaPidSpeed (const DynaPidSpeed &src)
 Copy constructor.
 
virtual ~DynaPidSpeed ()
 Default destructor.
 
virtual void SetServoParams (int nMode, int nSpeedMin, int nSpeedMax, int nOdModulo)
 Set servo paramaters required for speed PID. More...
 
virtual void SetStartingPos (uint_t uStartPos)
 Set speed PID starting positions. More...
 
virtual double CalcDpDt (uint_t uCurPos, uint_t uPrevPos, double dt)
 Convert the current and previous positions measured over delta time to dp/dt. More...
 
virtual double CalcDpDt (int nCurPos, int nPrevPos, double dt)
 Convert the current and previous positions measured over delta time to dp/dt. More...
 
virtual void SpecifySetPoint (double fDpDt, bool bUnwind=false)
 Specify the setpoint. More...
 
virtual double Control (uint_t uCurPos, double dt)
 Apply PID control. More...
 
DynaPidSpeedoperator= (const DynaPidSpeed &rhs)
 Assignment operator. More...
 
- Public Member Functions inherited from DynaPid
 DynaPid (double fKp=PidKpDft, double fKi=PidKiDft, double fKd=PidKdDft, double fWi=WiSumErrDft)
 Default constructor. More...
 
 DynaPid (const DynaPid &src)
 Copy constructor.
 
virtual ~DynaPid ()
 Default destructor.
 
virtual void SetConstants (double fKp, double fKi, double fKd)
 Set PID constants. More...
 
double GetKp () const
 Get PID proportional constant. More...
 
double GetKi () const
 Get PID integral constant. More...
 
double GetKd () const
 Get PID derivative constant. More...
 
double GetSP () const
 Get PID setpoint. More...
 
double GetCV () const
 Get PID control variable. More...
 
double GetOutput () const
 Get PID output. More...
 
double GetError () const
 Get current error. More...
 
virtual void InitControl ()
 Initialize the PID control variables.
 
virtual double Control (double fPV, double dt)
 Apply PID control. More...
 
DynaPidoperator= (const DynaPid &rhs)
 Assignment operator. More...
 

Static Public Attributes

static const double SpeedPidKpDft = 0.5
 default Kp constant
 
static const double SpeedPidKiDft = 1.0
 default Ki constant
 
static const double SpeedPidKdDft = 0.1
 default Kd constant
 
- Static Public Attributes inherited from DynaPid
static const double PidKpDft = 0.5
 default Kp constant
 
static const double PidKiDft = 1.0
 default Ki constant
 
static const double PidKdDft = 0.1
 default Kd constant
 
static const double WiSumErrDft = 0.1
 default sum error weight
 

Protected Member Functions

virtual double toPV (uint_t uCurPos, double dt)
 Save current position and convert to dp/dt process variable. More...
 
virtual double toOutput ()
 Convert control variable to raw servo speed. More...
 
- Protected Member Functions inherited from DynaPid
virtual double error (double fPV)
 Calculate error from setpoint and current process variable value. More...
 
virtual double toOutput (double fCV)
 Convert control variable to application-specific output value. More...
 

Protected Attributes

int m_nPos [2]
 servo current (0) and previous (1) positions
 
int m_nMode
 servo mode
 
int m_nSpeedMin
 servo minimum raw value
 
int m_nSpeedMax
 servo maximum raw value
 
int m_nOdModulo
 servo odometer rollover modulo
 
- Protected Attributes inherited from DynaPid
double m_fSP
 setpoint
 
double m_fPV
 process variable
 
double m_fKp
 proportional constant
 
double m_fKi
 integral constant
 
double m_fKd
 derivative constant
 
double m_fWi
 weighted sum of errors moving average constant
 
bool m_bHasPrev
 has previous error
 
double m_fErrPrev
 previous error
 
double m_fErr
 error
 
double m_fErrSum
 sum of errors
 
double m_fCV
 control variable value
 
double m_fOutput
 control variable output (could be same as CV)
 

Detailed Description

Speed PID class.

Definition at line 76 of file DynaPidSpeed.h.

Constructor & Destructor Documentation

DynaPidSpeed::DynaPidSpeed ( double  fKp = SpeedPidKpDft,
double  fKi = SpeedPidKiDft,
double  fKd = SpeedPidKdDft,
double  fWi = DynaPid::WiSumErrDft 
)
inline

Default constructor.

Parameters
fKpSpeed PID proportional constant.
fKiSpeed PID integral constant.
fKdSpeed PID derivative constant.
fWiSpeed PID integral sum of errors weight constant.

Definition at line 91 of file DynaPidSpeed.h.

References DYNA_MODE_SERVO, DYNA_POS_MODULO, DYNA_SPEED_MAX_CTL, and DYNA_SPEED_MIN_CTL.

94  :
95  DynaPid(fKp, fKi, fKd, fWi)
96  {
99  SetStartingPos(0);
100  }
#define DYNA_SPEED_MIN_CTL
mininum raw speed with control
Definition: Dynamixel.h:263
#define DYNA_MODE_SERVO
servo mode with limited rotation
Definition: Dynamixel.h:170
virtual void SetServoParams(int nMode, int nSpeedMin, int nSpeedMax, int nOdModulo)
Set servo paramaters required for speed PID.
Definition: DynaPidSpeed.h:126
#define DYNA_SPEED_MAX_CTL
maxinum raw speed with control
Definition: Dynamixel.h:264
#define DYNA_POS_MODULO
servo position modulo [0-max]
Definition: Dynamixel.h:246
virtual void SetStartingPos(uint_t uStartPos)
Set speed PID starting positions.
Definition: DynaPidSpeed.h:142
DynaPid(double fKp=PidKpDft, double fKi=PidKiDft, double fKd=PidKdDft, double fWi=WiSumErrDft)
Default constructor.
Definition: DynaPid.h:120

Member Function Documentation

virtual double DynaPidSpeed::CalcDpDt ( uint_t  uCurPos,
uint_t  uPrevPos,
double  dt 
)
inlinevirtual

Convert the current and previous positions measured over delta time to dp/dt.

Since there are two solutions to delta position for servos in continuous mode, the smallest delta is taken. This assumes that the position sampling rate is fast enough not to cause ambiguity.

Parameters
nCurPosCurrent servo position.
nPrevPosCurrent servo position.
dtDelta time between previous and current positions (seconds).
Returns
dp/dt.

Definition at line 162 of file DynaPidSpeed.h.

163  {
164  return CalcDpDt((int)uCurPos, (int)uPrevPos, dt);
165  }
virtual double CalcDpDt(uint_t uCurPos, uint_t uPrevPos, double dt)
Convert the current and previous positions measured over delta time to dp/dt.
Definition: DynaPidSpeed.h:162
double DynaPidSpeed::CalcDpDt ( int  nCurPos,
int  nPrevPos,
double  dt 
)
virtual

Convert the current and previous positions measured over delta time to dp/dt.

Since there are two solutions to delta position for servos in continuous mode, the smallest delta is taken. This assumes that the position sampling rate is fast enough not to cause ambiguity.

Parameters
nCurPosCurrent servo position.
nPrevPosCurrent servo position.
dtDelta time between previous and current positions (seconds).
Returns
dp/dt.

Definition at line 101 of file DynaPidSpeed.cxx.

References DYNA_MODE_CONTINUOUS, and iabs().

102 {
103  int nDp; // delta position
104  double fDpDt; // dp/dt where dp = delta raw position, dt = delta time
105 
106  nDp = nCurPos - nPrevPos;
107 
108  //
109  // The two positions straddle the roll-over point.
110  //
111  if( (m_nMode == DYNA_MODE_CONTINUOUS) && (iabs(nDp) > m_nOdModulo/2) )
112  {
113  if( nDp < 0 )
114  {
115  nDp = m_nOdModulo + nDp;
116  }
117  else
118  {
119  nDp = nDp - m_nOdModulo;
120  }
121  }
122 
123  if( dt > 0.0 )
124  {
125  fDpDt = ((double)(nDp))/dt;
126  }
127  else
128  {
129  fDpDt = 0.0;
130  }
131 
132  return fDpDt;
133 }
INLINE_IN_H int iabs(int a)
Return absolute value of a.
Definition: DynaOlio.h:91
int m_nOdModulo
servo odometer rollover modulo
Definition: DynaPidSpeed.h:233
int m_nMode
servo mode
Definition: DynaPidSpeed.h:230
#define DYNA_MODE_CONTINUOUS
continuous mode with/without position
Definition: Dynamixel.h:171
virtual double DynaPidSpeed::Control ( uint_t  uCurPos,
double  dt 
)
inlinevirtual

Apply PID control.

Parameters
uCurPosCurrent servo position.
dtDelta time (seconds).
Returns
Output servo raw speed.

Definition at line 205 of file DynaPidSpeed.h.

References DynaPid::Control().

206  {
207  return DynaPid::Control(toPV(uCurPos, dt), dt);
208  }
virtual double Control(double fPV, double dt)
Apply PID control.
Definition: DynaPid.cxx:83
virtual double toPV(uint_t uCurPos, double dt)
Save current position and convert to dp/dt process variable.
Definition: DynaPidSpeed.h:242
DynaPidSpeed& DynaPidSpeed::operator= ( const DynaPidSpeed rhs)
inline

Assignment operator.

Parameters
rhsRight hand side object.
Returns
Returns *this.

Definition at line 217 of file DynaPidSpeed.h.

References DynaPid::m_fKd, DynaPid::m_fKi, DynaPid::m_fKp, DynaPid::m_fWi, m_nMode, m_nOdModulo, m_nPos, m_nSpeedMax, and m_nSpeedMin.

218  {
219  m_fWi = rhs.m_fWi;
220  SetConstants(rhs.m_fKp, rhs.m_fKi, rhs.m_fKd);
222  rhs.m_nOdModulo);
223  SetStartingPos(rhs.m_nPos[0]);
224  InitControl();
225  return *this;
226  }
virtual void InitControl()
Initialize the PID control variables.
Definition: DynaPid.h:204
double m_fKd
derivative constant
Definition: DynaPid.h:258
int m_nSpeedMin
servo minimum raw value
Definition: DynaPidSpeed.h:231
virtual void SetConstants(double fKp, double fKi, double fKd)
Set PID constants.
Definition: DynaPid.h:152
virtual void SetServoParams(int nMode, int nSpeedMin, int nSpeedMax, int nOdModulo)
Set servo paramaters required for speed PID.
Definition: DynaPidSpeed.h:126
int m_nOdModulo
servo odometer rollover modulo
Definition: DynaPidSpeed.h:233
double m_fKp
proportional constant
Definition: DynaPid.h:256
int m_nMode
servo mode
Definition: DynaPidSpeed.h:230
virtual void SetStartingPos(uint_t uStartPos)
Set speed PID starting positions.
Definition: DynaPidSpeed.h:142
double m_fWi
weighted sum of errors moving average constant
Definition: DynaPid.h:259
int m_nPos[2]
servo current (0) and previous (1) positions
Definition: DynaPidSpeed.h:229
int m_nSpeedMax
servo maximum raw value
Definition: DynaPidSpeed.h:232
double m_fKi
integral constant
Definition: DynaPid.h:257
virtual void DynaPidSpeed::SetServoParams ( int  nMode,
int  nSpeedMin,
int  nSpeedMax,
int  nOdModulo 
)
inlinevirtual

Set servo paramaters required for speed PID.

Parameters
nModeServo mode. (See Dynamixel Operational Modes).
nSpeedMinServo minimum raw speed.
nSpeedMaxServo maximum raw speed.
nOdModuloOdometer roll-over modulo.

Definition at line 126 of file DynaPidSpeed.h.

130  {
131  m_nMode = nMode;
132  m_nSpeedMin = nSpeedMin;
133  m_nSpeedMax = nSpeedMax;
134  m_nOdModulo = nOdModulo;
135  }
int m_nSpeedMin
servo minimum raw value
Definition: DynaPidSpeed.h:231
int m_nOdModulo
servo odometer rollover modulo
Definition: DynaPidSpeed.h:233
int m_nMode
servo mode
Definition: DynaPidSpeed.h:230
int m_nSpeedMax
servo maximum raw value
Definition: DynaPidSpeed.h:232
virtual void DynaPidSpeed::SetStartingPos ( uint_t  uStartPos)
inlinevirtual

Set speed PID starting positions.

Parameters
uStartPosStarting servo position.

Definition at line 142 of file DynaPidSpeed.h.

143  {
144  m_nPos[0] = (int)uStartPos;
145  m_nPos[1] = (int)uStartPos;
146  }
int m_nPos[2]
servo current (0) and previous (1) positions
Definition: DynaPidSpeed.h:229
void DynaPidSpeed::SpecifySetPoint ( double  fDpDt,
bool  bUnwind = false 
)
virtual

Specify the setpoint.

The PID can also be reset. This PID technique is used when a new setpoint causes the PID to behave badly, normally through integral windup. The reset: o Zeros accumulated sum of errors.

Parameters
fDpDtSpeed dp/dt where dp = delta position, dt = delta time.
bUnwindDo [not] reset controller integral sum of errors term

Reimplemented from DynaPid.

Definition at line 96 of file DynaPidSpeed.cxx.

References DynaPid::SpecifySetPoint().

97 {
98  DynaPid::SpecifySetPoint(fDpDt, bUnwind);
99 }
virtual void SpecifySetPoint(double fSP, bool bUnwind=false)
Specify the setpoint.
Definition: DynaPid.cxx:71
double DynaPidSpeed::toOutput ( )
protectedvirtual

Convert control variable to raw servo speed.

Returns
Output.

Definition at line 135 of file DynaPidSpeed.cxx.

136 {
137  if( m_fCV < (double)m_nSpeedMin )
138  {
139  return (double)m_nSpeedMin;
140  }
141  else if( m_fCV > (double)m_nSpeedMax )
142  {
143  return (double)m_nSpeedMax;
144  }
145  else
146  {
147  return m_fCV;
148  }
149 }
int m_nSpeedMin
servo minimum raw value
Definition: DynaPidSpeed.h:231
int m_nSpeedMax
servo maximum raw value
Definition: DynaPidSpeed.h:232
double m_fCV
control variable value
Definition: DynaPid.h:264
virtual double DynaPidSpeed::toPV ( uint_t  uCurPos,
double  dt 
)
inlineprotectedvirtual

Save current position and convert to dp/dt process variable.

Parameters
uCurPosCurrent servo position.
dtDelta time between previous and current positions (seconds).
Returns
Process variable (PV).

Definition at line 242 of file DynaPidSpeed.h.

243  {
244  // age
245  m_nPos[1] = m_nPos[0];
246  m_nPos[0] = (int)uCurPos;
247 
248  return CalcDpDt(m_nPos[0], m_nPos[1], dt);
249  }
virtual double CalcDpDt(uint_t uCurPos, uint_t uPrevPos, double dt)
Convert the current and previous positions measured over delta time to dp/dt.
Definition: DynaPidSpeed.h:162
int m_nPos[2]
servo current (0) and previous (1) positions
Definition: DynaPidSpeed.h:229

The documentation for this class was generated from the following files: