Ringo keeps a memory of his X and Y location

Discussion where advanced users can discuss improvements to Ringo's background functions and underlying code. Your help appreciated!
Richard
Posts: 1
Joined: Thu Sep 17, 2015 8:20 pm

Ringo keeps a memory of his X and Y location

Postby Richard » Sun Sep 20, 2015 8:51 pm

My favourite chapter is ‘Using Ringo’s Navigation’.
Can anybody tell me the commands I should be looking for?
It seems clear to me how Ringo’s heading is determined. But not how Ringo can calculate the X Y offset with information from the accelerometer. Ringo may rotate to return back to an earlier heading. I would like it to make it return to an earlier position. Any pointers to get me started? Appreciated. Thanks.

DustinSoodak
Posts: 6
Joined: Sat Aug 08, 2015 11:16 pm

Re: Ringo keeps a memory of his X and Y location

Postby DustinSoodak » Wed Sep 23, 2015 12:03 am

NavigationXY() keeps track of x & y position. It has inputs GyroSensitivity and AccelSensitivity (100 and 800 are good values for most environments) which are used to determine if it is moving (global variable IsStationary). Kevin pointed out that this might be confusing so he is writing a function to encapsulate it.

Here's an example of how to use it:
NavigationBegin();//Ringo defined to be at {0,0} with heading 0 degrees.
ResumeNavigation();
while(1){
NavigationXY(100,800);//or use new function to be released in next update
degr=PresentHeading();//in degrees
x=GetPositionX();//in mm
y=GetPositionY();//see Navigation.h for more navigation query functions
}

The y-axis faces directly away from you and the x-axis is to the right (just like in any math textbook). 0 degrees is along the y-axis, 90 degrees is along the x-axis, and -90 degrees (or 270 if you got there by turning clockwise) is along the negative x-axis. The exact position is defined to be the center point between the wheels (the accelerometer is 30mm in front of this, between the headlights/eyes, but this offset is automatically compensated for so can be ignored).

If you were to turn the robot 90 degrees to the right (clockwise) and push it 100mm away from you then GetPositionX() and GetPositionY() will give a position of {0,100} and PresentHeading() will be 90 degrees. The acceleration for the z-axis (in mm/s^2) and rotation for the other 2 gyro axes (in degrees/s) can be queried but NavigationXY() doesn't do any additional calculations for them.

One thing that NavigationXY() does NOT compensate for is tipping forwards & backwards. Since gravity produces an acceleration much larger than the wheels can manage, this can produce a big effect for even 1 degree of tilt. Therefore, you may want to adjust the motor heights by carefully sliding them along their clips so that they barely touch the ground. There are other effects such as the vibrations produced by the motors themselves (also quite large though random so mostly cancels out), but we've found that you can still get as little as 10% error over a few seconds of movement.

Hope this helps,
Dustin Soodak

p.s. I wrote a version which looked at the gyro to compensate for tilt but found that the x-axis has too much drift for this to be useful without additional signal processing. You could probably also compensate for long-term error in velocity by looking at the robot's raw x-axis acceleration as it turns, but I haven't written any code for this yet.


Who is online

Users browsing this forum: No registered users and 2 guests