line_following
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
line_following [2025/02/20 12:31] – [Special Section - Wall Following with PID Control] arim | line_following [2025/02/20 12:44] (current) – [Special Section - Wall Following with PID Control] arim | ||
---|---|---|---|
Line 207: | Line 207: | ||
===== Special Section - Wall Following with PID Control | ===== Special Section - Wall Following with PID Control | ||
- | Code: | + | Code: {{ : |
\\ Video: [[https:// | \\ Video: [[https:// | ||
\\ {{ : | \\ {{ : | ||
Line 220: | Line 220: | ||
// | // | ||
- | fileName = "wf_[125.001.75].csv"; | + | fileName = "wf_pid.csv"; |
- | result = CreateFile(fileName, | + | result = CreateFile(fileName, |
| | ||
//Overwrite existing file | //Overwrite existing file | ||
- | while (result == LDR_FILEEXISTS) { | + | while (result == LDR_FILEEXISTS) { //if the file already exists |
- | CloseFile(fileHandle); | + | CloseFile(fileHandle); |
- | DeleteFile(fileName); | + | DeleteFile(fileName); |
- | result = CreateFile(fileName, | + | result = CreateFile(fileName, |
} | } | ||
| | ||
//Write column headers | //Write column headers | ||
- | fileHeader = " | + | fileHeader = " |
- | WriteLnString(fileHandle, | + | WriteLnString(fileHandle, |
| | ||
//Convert data to string and write to file | //Convert data to string and write to file | ||
- | strIteration = FormatNum(" | + | strIteration = FormatNum(" |
strxWall = FormatNum(" | strxWall = FormatNum(" | ||
text = StrCat(strIteration, | text = StrCat(strIteration, | ||
| | ||
result = WriteLnString(fileHandle, | result = WriteLnString(fileHandle, | ||
- | if(result == LDR_EOFEXPECTED) CloseFile(fileHandle); | + | if(result == LDR_EOFEXPECTED) CloseFile(fileHandle); //if EOF(End of File) error occurs, close the file |
+ | \\ | ||
+ | |||
+ | \\ **- Wall Following with PID** | ||
+ | \\ Refer to this example for the PID gain values, but adjust them to best suit your Domabot. | ||
+ | |||
+ | //Variable initializations --------------------------------------------------- | ||
+ | xWall = 0; // | ||
+ | dWall = 10; //Desired distance from wall [cm] | ||
+ | wKp = 1.25; //Wall P gain e.g. (PID) = [1.5, 0.005, 30.0] | ||
+ | wKi = 0.001; | ||
+ | wKd = 7.5; //Wall D gain | ||
+ | |||
+ | // | ||
+ | wE = xWall - dWall; | ||
+ | wEInt +=wE; | ||
+ | wEDot = wE - wEPrev; | ||
+ | wCorr = (wKp * wE) + (wKi * wEInt) + (wKd * wEDot); | ||
+ | |||
+ | //(1A) Check for motor staturation i.e. resulting wCorr forces | ||
+ | //motor getting > 2*speedBase (if speedBase > 50, this means >100) | ||
+ | if(wCorr > 0 && wCorr > speedBase) { | ||
+ | wCorr = speedBase; | ||
+ | //So Motor C speed min will be 0 | ||
+ | }; | ||
+ | if(wCorr < 0 && wCorr < -speedBase) { | ||
+ | wCorr = -speedBase; | ||
+ | //So Motor C speed min will be 0 | ||
+ | }; | ||
+ | //(1B) If PID gains all zero, then wCorr = 0 so do bang-bang | ||
+ | if(wCorr == 0 && xWall < dWall) { | ||
+ | wCorr = -speedBase; | ||
+ | }; | ||
+ | if(wCorr == 0 && xWall >= dWall) { | ||
+ | wCorr = speedBase; | ||
+ | }; | ||
+ | |||
+ | // | ||
+ | speedA = speedBase + wCorr; | ||
+ | speedC = speedBase - wCorr; | ||
+ | OnFwd(OUT_C, | ||
+ | OnFwd(OUT_A, | ||
+ | |||
+ | //(3) update wall errors for next derivative calculation | ||
+ | wEPrev = wE; |
line_following.1740083492.txt.gz · Last modified: by arim