277 lines
11 KiB
Text
277 lines
11 KiB
Text
|
%%This is a very basic article template.
|
||
|
%%There is just one section and two subsections.
|
||
|
\documentclass{article}
|
||
|
|
||
|
\title{Documentation 2DGridder}
|
||
|
\author{Uwe Hebbelmann, Sebastian Stock, Andre Schemschat}
|
||
|
\date{28.02.2008}
|
||
|
|
||
|
\begin{document}
|
||
|
\maketitle{}
|
||
|
|
||
|
\section{}
|
||
|
\subsection{About}
|
||
|
The program was written to convert three dimensional scans to two dimensional
|
||
|
maps. The scanparser processes the scan in five steps. First, the scans are read
|
||
|
using the scanparser based on the $scan_ io$ libraries. \newline
|
||
|
Afterwards the scans are transformated using the transformationmatrix out of
|
||
|
the frame-files. Within this step the y-correction and the min/max-Distance
|
||
|
filter are applied.\newline
|
||
|
The next step convertes each scan to a scanGrid. The scanGrid ist divided into
|
||
|
cells, which are resolution cm in size. Each cell contains the probability of
|
||
|
it beeing free. During the process more filters (like taking the spotradius of
|
||
|
the laser into consideration) are applied.\newline
|
||
|
If the grids are converted,
|
||
|
each grid can be written to disk using a gridWriter (by default its the ppmWriter.
|
||
|
If you want to change that, just change the 2DGridder.cc) and then added to
|
||
|
the parcelmanager.\newline
|
||
|
The parcelmanager takes care of dividing the grid
|
||
|
into the corresponding parcels, creating new parcels if neccessary and saving/loading
|
||
|
them. If all scans are converted and added, the parcelmanager can write the
|
||
|
entire world (based on all created parcels) into a single 2dm file (see
|
||
|
formats), which can be viewed with the MapViewer. Furthermore it can export the
|
||
|
map as a huge grid (which takes a lot of memory!). This is especially needed
|
||
|
for the hough-method, but it also comes in handy for writing the map as a pgm
|
||
|
file.
|
||
|
The last step is to create polygon-maps out of the 2D-Map. The algorithm is
|
||
|
based on houghes.
|
||
|
|
||
|
\subsection{Resume-function}
|
||
|
The programm creates parcels during runtime. These parcels store the
|
||
|
information at a given position of possibly several scans. These parcels
|
||
|
are managed using parcelinfos and parcel-files. Each time the program quits,
|
||
|
it saves the created parcelinfos to a file called parcelinfo.conf.
|
||
|
|
||
|
This file contains the name of the parcel and the offset. If the resume-flag
|
||
|
is set, the program tries to load the old parcelinfo file and reads the
|
||
|
information of already created parcels. New scans now access the same parcels
|
||
|
as old scans, which means, that they are added to the same worldmap.
|
||
|
|
||
|
This may be used, to iterativly call the 2DGridder with scans and add each
|
||
|
scan to the same worldmap, which is usefull for speeding up the process
|
||
|
( because the memory used by the scan is completly freed) or add new created
|
||
|
scans to an already processed batch of scans.
|
||
|
|
||
|
If the flag is set to true however and the parameters do not match (e.g.
|
||
|
parcelsize, resolution etc), the behavior will most certainly result in
|
||
|
an error.
|
||
|
|
||
|
|
||
|
This feature isn't yet fully tested and my contain bugs.
|
||
|
|
||
|
|
||
|
\section{Parameters}
|
||
|
|
||
|
\subsection{Usage}
|
||
|
The following text will give a short explanation the parameters used in the
|
||
|
2DGridder. Nearly all parameters are optional, the only parameter that is
|
||
|
required is scandir. \newline
|
||
|
Below there are a few samples how to invoke the programm using different
|
||
|
settings.
|
||
|
\newline
|
||
|
{\bf ./2DGridder ~/scans/terrainScan} \newline
|
||
|
This would process all Scans in the given folder with the standard arguments
|
||
|
(so the scantype must be uos, otherwise it will fail). However this might not
|
||
|
bring the best results.
|
||
|
\newline
|
||
|
\newline
|
||
|
{\bf ./2DGridder -fold -s1 -e3 -r1 -w dat/duj} \newline
|
||
|
This would process the scans one to three in the old scan format in the folder
|
||
|
./dat/duj with a resolution of one cell per cm without waypoints.
|
||
|
|
||
|
\subsection{scandir}
|
||
|
{\bf Default: \ None} \newline
|
||
|
{\bf Flag: \ None} \newline
|
||
|
The flag specifies the folder in which the programm searchs for the scans. The
|
||
|
structur of the folder needs to be according to the scantype (see flag
|
||
|
scantype), in order to successfully read the scandata and the frames
|
||
|
information.
|
||
|
|
||
|
\subsection{outputdir}
|
||
|
{\bf Default: \ './parcels'} \newline
|
||
|
{\bf Flag: \ -o Path} \newline
|
||
|
The outputdirectory specifies the folder where the worldmap, the viewpoints
|
||
|
and the polygon-file are saved to. The folder needs to exist, otherwise an
|
||
|
error is printed.
|
||
|
|
||
|
\subsection{start}
|
||
|
{\bf Default: \ 0} \newline
|
||
|
{\bf Flag: \ -s Nr} \newline
|
||
|
Start specifies the first scan to be read. By setting start and end, the range
|
||
|
of processed scan can be limited.
|
||
|
If startscan is smaller than the first scan available (e.g. -s0 but the first
|
||
|
scan starts with 1) an error will be printed
|
||
|
|
||
|
\subsection{end}
|
||
|
{\bf Default: \ -1} \newline
|
||
|
{\bf Flag: \ -e Nr} \newline
|
||
|
End specifies the last scan to be read. Similiar to start, it can reduce the
|
||
|
range of scans to process.
|
||
|
If the default value is used, all scans after start are processed, until no
|
||
|
more scans are found
|
||
|
|
||
|
\subsection{maxDistance}
|
||
|
{\bf Default: \ 2500} \newline
|
||
|
{\bf Flag: \ -m Nr} \newline
|
||
|
The range of the laser is often limited, so all scans above a specified
|
||
|
distance are insecure. To avoid this, all found points further than
|
||
|
maxDistance are not processed.
|
||
|
MaxDistance is given in cm, which means the default is 25 meters.
|
||
|
|
||
|
\subsection{minDistance}
|
||
|
{\bf Default: \ -1} \newline
|
||
|
{\bf Flag: \ -M nr} \newline
|
||
|
Similar to maxDistance, but ignoring Scans closer than the specified
|
||
|
distance. Per default the minimal distance is ignored.
|
||
|
|
||
|
|
||
|
\subsection{readInitial}
|
||
|
{\bf Default: false} \newline
|
||
|
{\bf Flag: \ -t} \newline
|
||
|
Read a file containing a initial transformation matrix.
|
||
|
|
||
|
|
||
|
\subsection{scantype}
|
||
|
{\bf Default: \ uos} \newline
|
||
|
{\bf Flag: \ -f {uos, uos_map, uos_frames, uos_map_frames, old, rts, rts_map, ifp, riegl, zahn, ply}} \newline
|
||
|
The scantype specifies the format of the scan to read. If the format does not
|
||
|
match the format of the scans to read, the process will fail (undetermined
|
||
|
abort)
|
||
|
|
||
|
\subsection{correctYAxis}
|
||
|
{\bf Default: \ false} \newline
|
||
|
{\bf Flag: \ -y} \newline
|
||
|
If set to true, the origin of all scans will be transformed to start at a
|
||
|
z-offset of 0. If you encounter problems with partial scans not getting into
|
||
|
the worldmap, try settings this flag and adjust the min- and maxRelevantHeight
|
||
|
a bit. (So no scans are left out, because they are ignored because of incorrect
|
||
|
scanvalues)
|
||
|
|
||
|
\subsection{maxRelevantHeigth}
|
||
|
{\bf Default: \ 50} \newline
|
||
|
{\bf Flag: \ -M Nr} \newline
|
||
|
Specifies the maximum height which is relevant for the robotor. All found
|
||
|
points with y-coordinates above this value are not processed.
|
||
|
The unit is cm, so the default is 0.5 meters.
|
||
|
|
||
|
|
||
|
\subsection{minRelevantHeight}
|
||
|
{\bf Default: \ 2} \newline
|
||
|
{\bf Flag: \ -m Nr} \newline
|
||
|
Specifies the minimum height which is relevant for the map. All points with an y-coordinate below this value are not processed.
|
||
|
This parameter is useful for eliminating interferences from the floor in front of the roboter;
|
||
|
|
||
|
\subsection{resolution}
|
||
|
{\bf Default: \ 10} \newline
|
||
|
{\bf Flag: -r} \newline
|
||
|
The resolution specifies the scale of the grid. The minimum resolution is 1, which means, that each cm is represented by one cell. The default is 10, which means that 10 cm of scandata is aggregated to one cell.
|
||
|
The lower the resolution the higher the size of each grid and the longer it takes to convert the scan and the more memory is needed
|
||
|
|
||
|
\subsection{createWaypoints}
|
||
|
{\bf Default: \ true} \newline
|
||
|
{\bf Flag: \ -w} \newline
|
||
|
If this flag is set, then waypoints will NOT be created. If the flag ist not set,
|
||
|
then the process will create for each found and relevant
|
||
|
(see minRelevant / maxRelevantHeight or maxDistance) point
|
||
|
free points on the direct line from the viewpoint of the roboter and the point.
|
||
|
|
||
|
|
||
|
\subsection{createNeighbours}
|
||
|
{\bf Default: \ true} \newline
|
||
|
{\bf Flag: \ -n} \newline
|
||
|
If this flag is set, then neighbours will NOT be created. If the flag is not set,
|
||
|
than the process will check how far away the found point is and create neighbours
|
||
|
based on the spotradius of the laser.
|
||
|
|
||
|
|
||
|
\subsection{parcelWidth}
|
||
|
{\bf Default: \ 100} \newline
|
||
|
{\bf Flag: \ -p Nr} \newline
|
||
|
The parcelwidth specifies the width of the parcels of the map. The finer the
|
||
|
scale is, the more often the parcels are written and read from the disk, but
|
||
|
the worldmap will be smaller (since there are not as much useless information
|
||
|
in the world-file).
|
||
|
|
||
|
\subsection{parcelHeight}
|
||
|
{\bf Default: \ 100} \newline
|
||
|
{\bf Flag: -P Nr} \newline
|
||
|
See parcelWidth.
|
||
|
|
||
|
\subsection{writeWorld}
|
||
|
{\bf Default: \ true} \newline
|
||
|
{\bf Flag: \ -d} \newline
|
||
|
If this flag is set, the world-file will NOT be created. By default the value is true, so all parcels are merged to one world-file. The world-file is written in the worldformat, which can be read by the MapViewer.
|
||
|
|
||
|
\subsection{writeGrids}
|
||
|
{\bf Default: \ false} \newline
|
||
|
{\bf Flag: \ -g} \newline
|
||
|
By default the value is false, so the single grid files are not written. If set
|
||
|
to true, each converted scan is written as a ppm-file to the disk.
|
||
|
|
||
|
\subsection{writeLines}
|
||
|
{\bf Default: \ false} \newline
|
||
|
{\bf Flag: \ -l} \newline
|
||
|
By default the value is false, so lines are not created. If the parameter is
|
||
|
set to true, the programm tries to extrapolate polygonlines out of the
|
||
|
worldmap using the hough-matrix.
|
||
|
This may take, dependend on the size of the map, very long.
|
||
|
|
||
|
\subsection{spotradius}
|
||
|
{\bf Default: \ 15} \newline
|
||
|
{\bf Flag: \ -a Nr} \newline
|
||
|
The spotradius is the deflection-factor of the laser on longer ranges. The
|
||
|
value given relates to the deflection at 30 meter (3000 cm), so the default
|
||
|
results in a factor of 1/200. The method to calculate the probability of
|
||
|
neighbours for each point is based on the deflection.
|
||
|
|
||
|
\subsection{count}
|
||
|
{\bf Default: \ 50} \newline
|
||
|
{\bf Flag: \ -c Nr} \newline
|
||
|
This flag specifies how many scans are loaded, process and added to the worldmap
|
||
|
until they are freed. Since the loaded scans and grids are not needed after
|
||
|
they are processed, they can be freed. This is achieved by processing count
|
||
|
scans in a row, and then freeing the not needed data.
|
||
|
|
||
|
\subsection{resume}
|
||
|
{\bf Default: false} \newline
|
||
|
{\bf Flag: \ -R} \newline
|
||
|
If this flag is set, the programm will load the parcels it has created
|
||
|
during the last run. See Resume-function for more information.
|
||
|
|
||
|
\section{formats}
|
||
|
This section is about the formats which can be written using the
|
||
|
2DGridder. For most formats it is only a short description, because most of
|
||
|
them are plain simple.
|
||
|
|
||
|
\subsection{PPM}
|
||
|
The ppm is a greyscale-picture format which is quite simple. It only needs the
|
||
|
size of the image and a value for each pixel. For more information, try google.
|
||
|
|
||
|
\subsection{gnuplot}
|
||
|
The gnuplot files are used to visualize the data in gnuplot (and maybe other
|
||
|
tools). The information is written as $x z value$ with value beeing -1 for no
|
||
|
information or $\in[0,1]$, each point a line.
|
||
|
|
||
|
\subsection{world (2dm)}
|
||
|
The worldformat is used to transport data between the 2Dgridder and the
|
||
|
MapViewer. The first line is the Version of the file. Mostly this is 1. The
|
||
|
second line specifies the resolution used in the grid. The third line specifies
|
||
|
the minimal and maximal found x and z values, in the order of $minX maxX minZ
|
||
|
maxZ$. The next line contains the position of the roboter during the first
|
||
|
scan (x and z coordinate). The rest of the file is similar to the gnuplot
|
||
|
format, which means $x z value$.
|
||
|
|
||
|
\subsection{Viewpoints}
|
||
|
The viewpoint-file contains a list of coordinates at which the roboter has
|
||
|
taken the scans. Each line contains a x and z value standing for the position.
|
||
|
|
||
|
\subsection{parcel}
|
||
|
The parcelformat is used to store the information of the parcels during
|
||
|
runtime. The parcels are stored as binary, so they can be stored and loaded
|
||
|
faster
|
||
|
|
||
|
\subsection{bor}
|
||
|
The bor-format is used to store the polygion-files created out of the map.
|
||
|
|
||
|
\end{document}
|