Pioneer 2 Operating System
Position Integration
Pioneer keeps track of its position and orientation based on dead-reckoning from wheel
motion, which is an internal coordinate position.
Registration between external and
internal coordinates deteriorates
rapidly with movement, due to
gearbox play, wheel imbalance
and slippage, and many other real-
world factors. You can rely on the
dead-reckoning ability of the robot
for just a short range—on the order
of several meters and one or two
revolutions, depending on the
surface. Carpets tend to be worse
than hard floors.
0
+90
+180
+270
+X
+Y
Front
Figure 21. Internal coordinate system for P2OS
Also, moving either too fast or too
slow tends to exacerbate the ab-
solute position errors. Accordingly,
consider the robot’s dead-reckon-
ing capability as a means of tying
together sensor readings taken over
a short period of time, not as a
method of keeping the robot on
course in a global map.
The orientation commands HEAD and DHEAD turn the robot with respect to its internal
dead-reckoned angle. On start-up, the robot is at the origin (0,0), pointing toward the
positive X-axis at 0 degrees. Absolute angles vary between 0 and 359. As the robot
moves, it will update this internal position based on dead-reckoning. The X,Y position is
always positive, and rolls over at about 3,000 millimeters. So, if the robot is at position
(400,2900) and moves 400 millimeters along the Y-axis and -600 millimeters along the X-
axis, its new position will be (2800,300).
You may reset the internal coordinates to 0,0,0 with the SETO P2OS command.
Sonar
When OPENed (see Opening the Servers—OPEN above), P2OS automatically begins firing
your robot’s sonar arrays in the predefined default sequence: 18, 916, 1724, and 25
32, one sonar per array simultaneously.20 P2OS also begins sending the sonar-ranging
results to the client via the server-information packet. Use the SONAR command to
enable (argument is "1") or disable (argument is "0") the sonar pinging. This is an all or
nothing command; you cannot disable a single array this way.
For example:
sfRobotComInt(sfCOMSONAR,0); /* Stop the pinging when not needed */
Use the sonar POLLING command to change the polling sequence of an array. Its
argument is a null-terminated string of up to 15 sonar numbers. Front sonar are
numbered \001 through \010 (octal), and the rear sonar are \011 through \100, for
38
20 See the next chapter for details on how to enable sonar arrays with p2oscf.