Can someone tell me who I can talk to if I find an issue or bug in the WPI library code?

The issue is in PIDController.cpp line 117 (in the version that has been released to the public). How can I get latest version of this file?

I have details of the issue, along with the fix here

http://www.termstech.com/articles/PID_Kalman.html

But in short the symptom is a case where if the error is too large it is possible that the total error will cease to move in the opposite direction causing the robot to lock up. The fix I offer will address this case.

Can you post your proposed change to WPILib here? I’m interested to see how you implemented it and what assumptions you made.

Ok here is the fix:

//Note: here is the original code, which is correct but incomplete;

//if (((m_totalError + m_error) * m_I < m_maximumOutput) && ((m_totalError + m_error) * m_I > m_minimumOutput))

// m_totalError += m_error;

double TotalErrorCheck=(m_totalError + m_error) * m_I;

if (TotalErrorCheck < m_maximumOutput)

{

…if (TotalErrorCheck > m_minimumOutput)

…m_totalError += m_error;

…else //less than the minimum output

…{

…//accumulate by an error which would equal the minimum output

…double MinError=(m_minimumOutput - ( m_I * m_totalError)) / m_I;

…m_totalError += MinError;

…}

}

else //greater than the maximum output

{

…//accumulate by an error which would equal the maximum output

…double MaxError=(m_maximumOutput - ( m_I * m_totalError)) / m_I;

…m_totalError += MaxError;

}

This number run (of the robot moving using encoders) tells the story:

Check this http://www.termstech.com/articles/PID110901_1.txt

for complete number run

RV -0.040647 dzk=1 y=4.037800 p=-0.106089 e=0.000000 d=0.106089 cs=156.624764

RV -0.041011 dzk=1 y=4.037800 p=-0.164875 e=0.000000 d=0.164875 cs=155.246980

RV -0.041390 dzk=1 y=4.037800 p=-0.224818 e=0.000000 d=0.224818 cs=153.388493

RV -0.041762 dzk=1 y=4.037800 p=-0.281590 e=0.000000 d=0.281590 cs=151.078999

RV -0.042159 dzk=1 y=4.037800 p=-0.339745 e=0.000000 d=0.339745 cs=148.302881

RV -0.042555 dzk=1 y=4.037800 p=-0.394746 e=0.000000 d=0.394746 cs=145.089912

RV -0.042976 dzk=1 y=4.037800 p=-0.449805 e=0.000000 d=0.449805 cs=141.436411

RV -0.043426 dzk=1 y=4.037800 p=-0.504680 e=0.000000 d=0.504680 cs=137.344099

RV -0.043912 dzk=1 y=4.037800 p=-0.559629 e=0.000000 d=0.559629 cs=132.812116

RV -0.044461 dzk=1 y=4.037800 p=-0.617131 e=0.000000 d=0.617131 cs=127.817566

RV -0.045068 dzk=1 y=4.037800 p=-0.674717 e=0.000000 d=0.674717 cs=122.362240

RV -0.045724 dzk=1 y=4.037800 p=-0.729541 e=0.000000 d=0.729541 cs=116.471092

RV -0.046475 dzk=1 y=4.037800 p=-0.785583 e=0.000000 d=0.785583 cs=110.130384

RV -0.047354 dzk=1 y=4.037800 p=-0.843600 e=0.000000 d=0.843600 cs=103.323566

RV -0.048349 dzk=1 y=4.037800 p=-0.898565 e=0.000000 d=0.898565 cs=96.080081

RV -0.049589 dzk=1 y=4.037800 p=-0.959747 e=0.000000 d=0.959747 cs=88.340925

RV -0.051123 dzk=1 y=4.037800 p=-1.023518 e=0.000000 d=1.023518 cs=80.089011

RV -0.000181 dzk=0 y=4.037800 p=-1.078485 e=0.000000 d=1.078485 cs=71.406161

RV -0.000254 dzk=0 y=4.037800 p=-1.137607 e=0.000000 d=1.137607 cs=62.246183

RV -0.000368 dzk=0 y=4.037800 p=-1.193409 e=0.000000 d=1.193409 cs=52.643109

RV -0.000562 dzk=0 y=4.037800 p=-1.248351 e=0.000000 d=1.248351 cs=42.601356

RV -0.000940 dzk=0 y=4.037800 p=-1.306309 e=0.000000 d=1.306309 cs=32.092931

RV -0.001805 dzk=0 y=4.037800 p=-1.363300 e=0.000000 d=1.363300 cs=21.129539

RV -0.004537 dzk=0 y=4.037800 p=-1.423268 e=0.000000 d=1.423268 cs=9.683424

RV -0.023463 dzk=0 y=4.037800 p=-1.483272 e=0.000000 d=1.483272 cs=9.623420

RV -0.025549 dzk=0 y=4.037800 p=-1.538204 e=0.000000 d=1.538204 cs=9.568488

RV -0.027726 dzk=0 y=4.037800 p=-1.593264 e=0.000000 d=1.593264 cs=9.513428

RV -0.030380 dzk=0 y=4.037800 p=-1.658186 e=0.000000 d=1.658186 cs=9.448506

RV -0.032875 dzk=0 y=4.037800 p=-1.713146 e=0.000000 d=1.713146 cs=9.393546

RV -0.035743 dzk=0 y=4.037800 p=-1.775916 e=0.000000 d=1.775916 cs=9.330776

RV -0.038595 dzk=0 y=4.037800 p=-1.833086 e=0.000000 d=1.833086 cs=9.273606

RV -0.041451 dzk=0 y=4.037800 p=-1.888056 e=0.000000 d=1.888056 cs=9.218636

RV -0.044703 dzk=0 y=4.037800 p=-1.949114 e=-0.000581 d=1.948532 cs=9.158160

RV -0.048075 dzk=0 y=4.037793 p=-2.008029 e=-0.000581 d=2.007448 cs=9.099244

RV -0.051399 dzk=0 y=4.037787 p=-2.062929 e=-0.000581 d=2.062347 cs=9.044345

RV -0.055096 dzk=0 y=4.037780 p=-2.122942 e=-0.001017 d=2.121925 cs=8.984767

RV -0.058758 dzk=0 y=4.037768 p=-2.177911 e=-0.010360 d=2.167551 cs=8.939142

Key:

RV- thie is the applied voltage

dsk- dead zone skip (ignore this one for now)

y- the distance traveled

p- the desired velocity

e- the actual velocity (velocity is in meters per second)

d- the current error difference between the velocities

c- calibrated scaler or the actual PID result

The last variable cs= is the PID where I *was* set high to 8, and my range *was* high on positive end and could go down to 0.364500. This is the value presented for the final voltage by division, so the higher the number the lower the voltage would be. What happened in this run is that I accumulated enough error which caused the if check to fail and then cs was stuck to 9.x applying 0.05 voltage (which is not enough to move). The assumption is that the total error can still occur and stay within the bounds of the range specified, and this number could dwindle back down to 0.364500. So I started with the equation (TE + ERR) * I = maxoutput, and solved for ERR. The result is that total error could continue to dwindle and stay within the specified range. I hope this makes sense… this took me the entire day to work out, and I checked the math to ensure it submits the correct value.

The place to submit bugs and patches is the WPILIB tracker http://firstforge.wpi.edu/sf/tracker/do/listTrackers/projects.wpilib/tracker. You’ll need to create a firstforge account.

Thanks so much… I have added a case with a reference to this link.

The fix has been applied. Yay.