BulletSim: initial implementation of a PID motor. Not hooked up yet.
parent
cf89e29ac3
commit
7b84bcfbb8
|
@ -117,12 +117,12 @@ public class BSVMotor : BSMotor
|
|||
|
||||
// A form of stepping that does not take the time quantum into account.
|
||||
// The caller must do the right thing later.
|
||||
public Vector3 Step()
|
||||
public virtual Vector3 Step()
|
||||
{
|
||||
return Step(1f);
|
||||
}
|
||||
|
||||
public Vector3 Step(float timeStep)
|
||||
public virtual Vector3 Step(float timeStep)
|
||||
{
|
||||
Vector3 returnCurrent = Vector3.Zero;
|
||||
if (!CurrentValue.ApproxEquals(TargetValue, 0.01f))
|
||||
|
@ -204,17 +204,49 @@ public class BSFMotor : BSMotor
|
|||
public void SetTarget(float target)
|
||||
{
|
||||
}
|
||||
public float Step(float timeStep)
|
||||
public virtual float Step(float timeStep)
|
||||
{
|
||||
return 0f;
|
||||
}
|
||||
}
|
||||
public class BSPIDMotor : BSMotor
|
||||
|
||||
// Proportional, Integral, Derivitive Motor
|
||||
// Good description at http://www.answers.com/topic/pid-controller . Includes processes for choosing p, i and d factors.
|
||||
public class BSPIDVMotor : BSVMotor
|
||||
{
|
||||
// TODO: write and use this one
|
||||
public BSPIDMotor(string useName)
|
||||
public Vector3 pFactor { get; set; } // Amount of direct correction of an error (sometimes called 'proportional gain')
|
||||
public Vector3 iFactor { get; set; } //
|
||||
public Vector3 dFactor { get; set; }
|
||||
|
||||
Vector3 IntegralFactor { get; set; }
|
||||
Vector3 LastError { get; set; }
|
||||
|
||||
public BSPIDVMotor(string useName)
|
||||
: base(useName)
|
||||
{
|
||||
// larger makes more overshoot, smaller means converge quicker. Range of 0.1 to 10.
|
||||
pFactor = new Vector3(1.00f, 1.00f, 1.00f);
|
||||
iFactor = new Vector3(1.00f, 1.00f, 1.00f);
|
||||
dFactor = new Vector3(1.00f, 1.00f, 1.00f);
|
||||
}
|
||||
|
||||
public override Vector3 Step(float timeStep)
|
||||
{
|
||||
// How far are we from where we should be
|
||||
Vector3 error = TargetValue - CurrentValue;
|
||||
|
||||
// Add up the error so we can integrate over the accumulated errors
|
||||
IntegralFactor += error * timeStep;
|
||||
|
||||
// A simple derivitive is the rate of change from the last error.
|
||||
Vector3 derivFactor = (error - LastError) * timeStep;
|
||||
LastError = error;
|
||||
|
||||
// Proportion Integral Derivitive
|
||||
// Correction = proportionOfPresentError + accumulationOfPastError + rateOfChangeOfError
|
||||
Vector3 ret = error * pFactor + IntegralFactor * iFactor + derivFactor * dFactor;
|
||||
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue