<div dir="ltr"><p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif">Murray,</span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif">     One approach is to take the theta value
from the IMU instead of calculating it from the encoders, and then adding the
heading error to the summing node of the negative feedback loop. </span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif">Taking the theta value form the IMU:</span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:10pt;font-family:"Courier New";color:black">/* accumulate total rotation around our center */</span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:10pt;font-family:"Courier New";color:black">/*theta += (left_inches - right_inches) / WHEEL_BASE; */</span></p><p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:10pt;font-family:"Courier New";color:black"><br></span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:10pt;font-family:"Courier New";color:black">/* replace theta value with IMU yaw value */</span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:10pt;font-family:"Courier New";color:black">theta = read_IMU_yaw();  /*
make sure that the units and orientation are correct */</span></p><p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:10pt;font-family:"Courier New";color:black"><br></span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:10pt;font-family:"Courier New";color:black">/* and clip the rotation to plus or minus 360 degrees */</span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:10pt;font-family:"Courier New";color:black">theta -= (float)((int)(theta/TWOPI))*TWOPI;</span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif">Now the theta value is from the IMU and should show the
impact of your rug/floor disturbance. </span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif">The next part is to add the heading error (heading error =
heading target – theta) to the input summing node of your negative feedback
loop. The heading error is zero when you are going in the right direction,
elsewise it will have either a negative or positive value. It will be summed in
with your reference value (desired speed in this case) and the -feedback value
(PID error). If you view it in terms of your PID error, it is like you are
changing the reference value. </span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif">I hope this helps.</span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif"> </span></p>

<p class="MsoNormal" style="margin:0in;line-height:normal;font-size:11pt;font-family:Calibri,sans-serif"><span style="font-size:12pt;font-family:Arial,sans-serif">Regards,</span></p>

<span style="font-size:12pt;line-height:107%;font-family:Arial,sans-serif">Doug P</span>    <br></div><div dir="ltr"><br><div><pre style="color:rgb(0,0,0)"><br></pre><pre style="color:rgb(0,0,0)"><br></pre><pre style="color:rgb(0,0,0)"> </pre><pre style="color:rgb(0,0,0)"><br></pre><pre style="color:rgb(0,0,0)"><br></pre></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Jan 22, 2021 at 5:04 PM Murray Altheim via DPRGlist <<a href="mailto:dprglist@lists.dprg.org" target="_blank">dprglist@lists.dprg.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Good afternoon,<br>
<br>
Part of building a second robot (named the KD01, with "D" for differential)<br>
using much of the same hardware and software as my original KR01 was to<br>
simplify development of the basic motor control, navigation and odometry.<br>
<br>
I just finished debugging the hardware and software of the OSEPP motor<br>
encoders (the oscilloscope worked wonders) and now I've got the KD01 able<br>
to drive in a PID-controlled straight line, velocity set by a potentiometer.<br>
<br>
Simple stuff.<br>
<br>
While taking it on a tour of my lounge its port side wheel goes from<br>
hardwood floor onto the big bump of a rug, the starboard wheel remaining<br>
on wood floor. Once on the rug the PID controllers keep it in a straight<br>
line (yay!) but that bump causes the robot to turn towards the<br>
wheel hitting the bump, so that its heading shifts by say, 30 degrees to<br>
port.<br>
<br>
What I'd like to do is have the IMU keep the robot on a straight line, or<br>
at least recover its heading once it has stabilised. I'm not looking for<br>
someone to hold my hand, but a gentle push in the right direction, maybe<br>
a link, an algorithm (or even C/C++/Python code, which I rewrite or port)<br>
would be enormously helpful.<br>
<br>
I'd not need or want to use absolute orientation (compass) for this as the<br>
robot is running indoors (and yes, that's a different subject altogether<br>
that we've discussed previously). My guess is to use either the gyroscope<br>
and/or the accelerometer, seems more likely the former than latter, dunno.<br>
I'm at a bit of a loss as to where to start... though David Anderson does<br>
have a very helpful page at:<br>
<br>
   <a href="http://seattlerobotics.org/encoder/200610/Article3/IMU%20Odometry,%20by%20David%20Anderson.htm" rel="noreferrer" target="_blank">http://seattlerobotics.org/encoder/200610/Article3/IMU%20Odometry,%20by%20David%20Anderson.htm</a><br>
<br>
David outlines either using A. Magnetic Compass; B. Rate Gyro; C. Gyro-<br>
corrected Magnetic Compass; or D. 3-Axis Gyro-Corrected 3-Axis Magnetometer.<br>
Since we'll assume the magnetometer is not reliable indoors, the gyro or<br>
accelerometer will have to suffice. The paper referenced for B. (describing<br>
"gyrodometry) is a bit past my ability to understand with formulae like<br>
<br>
    μ′=m(u′) +K∗(u′,U)[K∗(U,U) +σ2∗I]−1(Z−m(U))<br>
<br>
and in essence doesn't sound quite like a solution anyway as it refers to<br>
use of "deep learning"; I don't think we'd need that for basic navigation.<br>
Basically I'm thinking there must be a way to take the (relatively simple)<br>
3D coordinates coming from the gyro or accelerometer and use that to note<br>
the axis shift when the robot hits the edge of the rug. Or something like<br>
that.<br>
<br>
I'm guessing some of you guys eat this kind of thing for breakfast, but<br>
for me it's a bit indigestible.<br>
<br>
Thanks very much in advance,<br>
<br>
Murray<br>
<br>
...........................................................................<br>
Murray Altheim <murray18 at altheim dot com>                       = =  ===<br>
<a href="http://www.altheim.com/murray/" rel="noreferrer" target="_blank">http://www.altheim.com/murray/</a>                                     ===  ===<br>
                                                                    = =  ===<br>
     In the evening<br>
     The rice leaves in the garden<br>
     Rustle in the autumn wind<br>
     That blows through my reed hut.<br>
            -- Minamoto no Tsunenobu<br>
<br>
_______________________________________________<br>
DPRGlist mailing list<br>
<a href="mailto:DPRGlist@lists.dprg.org" target="_blank">DPRGlist@lists.dprg.org</a><br>
<a href="http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org" rel="noreferrer" target="_blank">http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org</a><br>
</blockquote></div>