1 \chapter{Experiment
1: Original Movement Behavior
}
4 The concepts described in the previous chapter are now used to set up a test
5 series with the purpose to measure the error in the Roomba's movement and
6 to improve its accuracy.
8 In the first experiment, the Roomba's original movement behavior was
9 measured to get an overview of the errors that occur while moving, and to
10 establish a pool of data for correction approaches to work on later.
11 There was no error correction involved (apart from any possible error
12 correction the Roomba itself implements in its underlying logic, and which is
13 not known to anyone except iRobot). To achieve this, the Wiselib Roomba Control
14 is used to access the Roomba over the
\ac{ROI
}\index{Roomba Open Interface
}.
17 \label{sec:exp1:setup
}
20 \includegraphics[width=
0.45\textwidth]{./images/IMAGE_00079.jpg
}
21 \caption{Roomba with netbook
\label{fig:roombasetup
}}
25 \includegraphics[width=
0.6\textwidth]{./images/IMAGE_00148.jpg
}
26 \caption{Measuring turn angles with laser pointer
\label{fig:laserpointer
}}
29 The test equipment consisted of a small x86 netbook
\index{netbook
} which was
30 mounted on an iRobot Roomba~
530\index{Roomba
} robot, as seen in
31 Figure~
\ref{fig:roombasetup
}. The netbook controlled the Roomba over a
32 \acs{USB
}-to-serial converter plugged into the
\ac{ROI
}\index{Roomba
33 Open Interface
} port on the Roomba, and hosted as the environment for
34 executing the Wiselib
\index{Wiselib
} code.
36 In this experiment, the Roomba started and stopped with the full velocity the
37 movement was executed with; so there was (ideally speaking) an infinite
38 acceleration and deceleration at the start and the end of the movement. As
39 mentioned before, due to limitations in the
\ac{ROI
}\index{Roomba Open
40 Interface
} it is only possible to explicitly start and stop the Roomba's
41 movements at different times, so the Wiselib's implementation of the Roomba
42 control code first starts the Roomba's movement, keeps track of the turned angle
43 and covered distance, and then stops the Roomba if these values exceed the
46 The tests were done in two atomic drive modes: letting the Roomba walk a
47 specific straight distance with a specific velocity in its viewing direction and
48 letting it turn on the spot with a specific velocity about a specific angle.
49 Each of the two modes was carried out on two different floor types
\index{floor
50 type
}, a laminated floor and a carpet floor, to see if the movement behavior
51 significantly depended on the floor type. The side brush was removed, since the
52 Roomba tends to turn slightly towards the left when driving straight on a
53 carpet floor. Without the side brush, this was not the case.
55 The actual traveled distance of the straight drive tests were determined using
56 a measuring tape with an accuracy of
1~mm. Only the distance in the Roomba's
57 original viewing direction was considered, as it turned out that the offset
58 perpendicular to the viewing direction and a possible shift in orientation were
59 too small to be measured precisely.
61 The actual turn angles of the turn tests were determined using a
62 \acs{ISO
}/
\acs{DIN
}~A0 sheet of paper with a printed polar coordinate system in
63 which a circular hole was cut in the center to let the Roomba's wheels touch the
64 floor. The sheet was fixed on the floor, and the Roomba was aligned in the
65 center of the paper. A laser pointer
\index{laser pointer
} attached to the Roomba
66 pointed to the current orientation on the paper, as shown in
67 Fig.~
\ref{fig:laserpointer
}. The accuracy for these tests was
1~degree.
69 After the initial setup, the application
\prog{roomba
\_test} (see
70 section~
\ref{sec:impl:measuring
}) was started on the netbook for half-automatic
71 testing. It used a predefined array of nominal distances, angles and velocities
72 and for each pair of distance (for straight drive tests) or angle (for turn
73 tests) and velocity it used the Wiselib implementation to move the Roomba. Then
74 it asked the user to input the measured distance or angle the Roomba had moved
75 and repeated the process until each combination of distance/angle and velocity
76 was used. The nominal and input values were written to a log file, as well as
77 the floor type, the Roomba ID, the
\ac{SVN
} revision the program was built
78 from, the battery status
\index{battery status
}, and other internal
79 implementation-specific values.
81 For the straight drive tests, the arrays with predefined values were:\\
82 \begin{tabular
}{@
{}ll@
{}}
83 Distances: &
20,
50,
100,
200,
500,
1000,
2000 and
4000~mm \\
84 Velocities: &
20,
50,
70,
100,
150,
200,
300 and
400~mm/s
87 For the turn tests, the arrays with predefined values were: \\
88 \begin{tabular
}{@
{}ll@
{}}
89 Turn angles: &
\phantom{0}5,
15,
30,
45,
90,
120,
180,
360,
530 and
720~degree\\
90 Velocities: &
20,
50,
70,
100,
150,
200,
300 and
400~mm/s
93 According to the implementation of the Wiselib Roomba control, the velocities
94 were given in mm/s and referred to the distance the wheels traveled when the
95 Roomba turned on the spot, which was a circle of
230~mm in diameter.
99 The following graphs show the difference from the measured value to the input
100 value for driving or turning with different velocities. Positive values mean
101 that the Roomba had turned too much or traveled more than the target value,
102 negative values mean that the Roomba had turned or traveled less. The
103 plots show multiple test runs; given are the minimum, the maximum and the
104 arithmetic mean
\index{arithmetic mean
} of all results for a data point.
106 \todo{clearpage, cleardoublepage?
}
109 \includegraphics[width=
\textwidth]{images/iz250flur_drive_data.pdf
}
110 \caption{Original behavior on laminated floor, straight drive movements
111 \label{fig:orig:lam:drive
}}
115 \includegraphics[width=
\textwidth]{images/iz250flur_turn_data.pdf
}
116 \caption{Original behavior on laminated floor, turn movements
117 \label{fig:orig:lam:turn
}}
121 \includegraphics[width=
\textwidth]{images/seminarraum_drive_data.pdf
}
122 \caption{Original behavior on carpet floor, straight drive movements
123 \label{fig:orig:carpet:drive
}}
127 \includegraphics[width=
\textwidth]{images/seminarraum_turn_data.pdf
}
128 \caption{Original behavior on carpet floor, turn movements
129 \label{fig:orig:carpet:turn
}}
132 Figure~
\ref{fig:orig:lam:drive
} shows that the error becomes greater with
133 increasing input distance when driving straight on the laminated floor, however,
134 in Figure~
\ref{fig:orig:carpet:drive
} we see the opposite effect on the carpet
135 floor, the error decreases with greater input distance. This could happen due to
136 imprecise measurement of distances in either the Roomba's sensors or the Wiselib
137 implementation that controls the Roomba, or both, adding up over the time the
138 movement continues. Also slippage of the wheels on the laminated floor could be
139 possible, as well as slowdown through the carpet floor, explaining why the error
140 increases on the laminated floor, but decreases into negative values on the
141 carpet floor when the distance grows.
143 On the other hand, rising the velocity always seems to cause the
144 error to increase. This illustrates the effect of accumulating errors which
145 represents the crucial drawback of dead reckoning
\index{dead reckoning
}.
147 The same effects also apply for turn tests. Additionally, there could be errors
148 resulting from false assumptions about the Roomba's wheel base
\index{wheel
149 base
}, resulting in bogus calculations of the circle the Roomba's wheels
150 describe while turning, and therefore leading to false results.
152 In the following, two approaches to correct errors and improve the accuracy of
153 the movement are presented.