The programming challenge for the 2013 Sack Attack game was attempted by team 1508 LancerBots fully autonomous robot. It uses gyro information to generate a navigation solution and then automatically sequences through several way points to solve the route sequences. Unfortunately as mentioned in earlier posts, the gyro drift causes heading corruption which then causes sacks to by slightly missed. One possible solution I am proposing is to use line sensors to update the gyro.
Figure 1 shows the geometry and formulas required to accomplish the update for a special case when the line is parallel to the truth x axis. The coordinates used by 1508 were specifically chosen so all lines were parallel to either the x or y axis. This simplifies the update equations.
Simply put… when a line sensor event occurs, note the position error with respect to the line (using the Nav coordinates) and divide it by the range from the origin. This ratio is the gyro drift error in radians.
Errors in the update equation can stem from errors in the Nav initial condition (<.25 in, 1 deg heading) , encoder scaling (typically <1%) , encoder resolution(< .03 in) , line location measurements (<.25 in), line tape width (<.5 in) and Navigation solution numerical errors (sampling, round off).
The dominant error is the encoder scaling which can add up when the encoder has moved several hundred inches. Lines can also be use to update the Nav position solution so that these errors remain less than 1% distance from the field origin and not the total distance traveled by an encoder. This error translates to about .6 deg of heading error from a gyro update. So we should not expect much better than that from our updates.
General Case: Lines skew to the coordinate axes
To complete this note, lets consider a more general line that is described by
c = a*x + b*y
where a,b and c are constants and again x and y are truth coordinates. Now we have three unknowns (x,y and delta) and three equations:
x’ = x*cos(delta) + y*sin(delta)
y’ = -x*sin(delta) + y*cos(delta)
c = a*x + b*y
First we solve for x and y from the first two equations which is a simple inverse:
x = x’*cos(delta) – y’*sin(delta)
y = x’*sin(delta) + y’*cos(delta)
Make the small angle substitution gives
x = x’ – y’*delta
y = x’*delta + y’
Now substitute x and y into the line equation
c = a*(x’ – y’*delta) + b*(x’*delta + y’)
Now solve for delta
c -a*x’ – b*y’ = (b*x’ – a*y’)* delta
delta = (c -a*x’ – b*y’ )/(b*x’ – a*y’)
Check the special case above : y = c, a = 0, b = 1
delta = (y – y’)/(x’) : checks ok