Multi Level Surface Mapping using Sparse Point Clouds - Student ...
Multi Level Surface Mapping using Sparse Point Clouds - Student ...
Multi Level Surface Mapping using Sparse Point Clouds - Student ...
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Autonomous Systems Lab<br />
Prof. Roland Siegwart<br />
Semester-Thesis<br />
<strong>Multi</strong> <strong>Level</strong> <strong>Surface</strong><br />
<strong>Mapping</strong> <strong>using</strong> <strong>Sparse</strong> <strong>Point</strong><br />
<strong>Clouds</strong><br />
Spring Term 2010<br />
Supervised by:<br />
Stephan Weiss<br />
Rudolph Triebel<br />
Author:<br />
Pascal Strupler
Contents<br />
Abstract<br />
Symbols<br />
iii<br />
v<br />
1 Introduction 1<br />
1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />
1.2 Goals and limitations . . . . . . . . . . . . . . . . . . . . . . . . . . . 1<br />
1.3 Methodology . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2<br />
2 Introduction to the MLS framework 3<br />
3 Adaptions and optimizations 7<br />
3.1 Median filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7<br />
3.2 Region growing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11<br />
3.3 Orphan points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13<br />
3.4 Pyramid artifacts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15<br />
3.5 Hole plastering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
4 Integration into ROS 23<br />
4.1 Module layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
4.2 MLS module usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24<br />
5 Simulation and testing 25<br />
5.1 Recorded data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
5.2 Artificial setups . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28<br />
6 Result discussion 31<br />
6.1 Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31<br />
6.2 Computational costs . . . . . . . . . . . . . . . . . . . . . . . . . . . 34<br />
6.3 Problems . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35<br />
6.4 Conclusion and outlook . . . . . . . . . . . . . . . . . . . . . . . . . 37<br />
Bibliography 39<br />
i
Abstract<br />
The sFly project at the Autonomous Systems Lab, ETH Zürich is all about quadrotors<br />
navigating and mapping urban environments. In order to perform the mapping<br />
task satisfactorily, we have to implement an appropriate mapping framework. A<br />
first goal of this semester thesis was to adapt a multi level surface framework (originally<br />
designed to work with laserscan data) to process inaccurate sparse pointclouds<br />
delivered by the quadrotors SLAM algorithm. In the beginning the originally provided<br />
MLS framework had to be optimized concerning outliers and sparsity. I<br />
therefore implemented three outlier rejection algorithms, including a multiple level<br />
median filter processing incoming pointclouds. In order to deplete the second issue<br />
of sparsity, a convenient hole plastering algorithm was also used. As a second goal<br />
we wanted to retain the benefit of the current quadrotors modular operating system<br />
ROS. Therefore the original MLS framework was integrated into a ROS package,<br />
providing a modular, universal mapping system also capable of doing sequential<br />
online mapping. As a result of this work, we are able to do online multiple level<br />
surface mapping. Even sparse pointclouds can deliver an impression of the environment<br />
while marking areas of high uncertainty. Latter areas could then be explored<br />
by flying closer in order to systematically map the environment.<br />
iii
Symbols<br />
Acronyms and Abbreviations<br />
ETH<br />
MLS<br />
ASL<br />
ROS<br />
SLAM<br />
sFly<br />
EMAV<br />
Eidgenössische Technische Hochschule<br />
<strong>Multi</strong> <strong>Level</strong> <strong>Surface</strong><br />
Autonomous Systems Lab, ETH Zürich<br />
Robotic Operating System<br />
Simultaneous localization and mapping<br />
Swarm Fly, a MAV project by a consortium including ETH Zürich<br />
European conference and competition of micro aerial vehicles<br />
v
Chapter 1<br />
Introduction<br />
1.1 Motivation<br />
At the sFly project at ETH Zürich the goal is to develop several small and safe<br />
quadrotors which can fly autonomously in urban environments and which can be<br />
used to assist humans in tasks like rescue and monitoring. The MAVs are stabilized<br />
by estimating the degrees of freedom <strong>using</strong> a downward mounted video camera. The<br />
estimation is taken from a visual SLAM (Simultaneous Localization And <strong>Mapping</strong>)<br />
framework. The SLAM task consists of several sub tasks such as detection of<br />
points of interest in the image, finding these points again in a next camera image<br />
and estimating the actual degrees of freedom out of these points. Besides from<br />
estimating the attitude of the quadrotor, we can also use the resulting pointcloud<br />
of the SLAM algorithm to map the environment. <strong>Mapping</strong> yields two key benefits:<br />
First of all we can generate a map for visualization of the environment. Second we<br />
can use the resulting mapping for path planning, which is essential when navigating<br />
the quadrotor through unknown terrain.<br />
Up until now both attitude estimation and mapping could be implemented. Preliminary<br />
work at ASL used elevation maps on the pointcloud to represent the topology<br />
of a mapped area. This has the drawback that underpassings cannot be modeled.<br />
To overcome this issue, the motivation of this work was to implement multi level<br />
surface (MLS) mapping as proposed in the paper <strong>Multi</strong>-<strong>Level</strong> <strong>Surface</strong> Maps for<br />
Outdoor Terrain <strong>Mapping</strong> and Loop Closing [1]. As a result, the sFly quadrotor<br />
could therefore get the possibility to fly through openings like windows or underpassings<br />
of bridges, which wouldn’t be possible with the current elevation map. An<br />
additional benefit of the proposed MLS map would be the better representation<br />
of vertical surfaces. Walls as an example could be modeled with vertical surface<br />
patches, which is not possible with an elevation map implementation. Here walls<br />
can only be approximated by inclined surface patches.<br />
Urban environments are based on highly multilevel structures like buildings, bridges<br />
or tunnels. Consequently the success of the sFly project relies on a working implementation<br />
of multi level surface mapping.<br />
1.2 Goals and limitations<br />
The MLS maps framework proposed in the paper [1] has already been implemented<br />
at the ASL of ETH Zürich. It was successfully used to do mapping and SLAM loop<br />
closing with pointclouds from a laserscan device. In the sFly project pointclouds<br />
are produced by finding correspondences of feature points among subsequent video<br />
1
Chapter 1. Introduction 2<br />
frames. Hence our pointclouds differ substantially from pointclouds generated by a<br />
laserscan device concerning density and accuracy.<br />
While laserscan devices have constant and relatively high resolution, cloud points<br />
extracted from the video feed of the quadrotor are irregular and generally sparse.<br />
This irregularity depends on several factors like the quality of the video feed, the<br />
way the environment is textured and composed, light conditions, the maximum<br />
number of processed feature points and so on.<br />
Another problem is the feature point correspondence. This matching is often wrong<br />
and leads to false coordinate values (mostly in z-direction) and therefore produces<br />
a lot of outliers in the resulting pointcloud.<br />
The first goal of this work was to implement algorithms to optimize the MLS framework<br />
for pointclouds with such imperfections mentioned before. As we will see later,<br />
rejecting outliers and dealing with the sparseness will be crucial for improving the<br />
quality of the resulting maps.<br />
The sFly quadrotors are running on an open-source, meta-operating system called<br />
ROS (Robot Operating System [3]). It provides services like hardware abstraction,<br />
low-level device control, implementation of commonly-used functionality, messagepassing<br />
between processes, and package management. Modules are then performing<br />
different tasks while also communicating among each other through topics or services.<br />
Hence another goal of this thesis was to create a ROS package of modules<br />
which can be used by the sFly project to convert generated pointclouds into multi<br />
level surface maps. The optimized MLS framework will then be included in this<br />
package to provide the necessary functions. The last objective was to have sequential,<br />
online mapping: The quadrotor constantly expands the pointcloud with new<br />
points while flying around. Batches of those new points have to be converted into<br />
small, partial MLS maps which then get added to the global MLS map. Of course<br />
it’s preferable to achieve this on some realtime basis.<br />
Due limited time, it wasn’t part of this thesis to study dynamic map updates. For<br />
example handling mapped cars which drive around and appear at another place<br />
over time. Only static environments were considered. It was also never planned to<br />
do actual live tests having a quadrotor flying around. Through the whole thesis I<br />
worked with pre-recorded data from the SLAM algorithm.<br />
1.3 Methodology<br />
This report is organized as follows: In the first chapter Introduction to the MLS<br />
framework on page 3 I will give a short introduction into the existing MLS framework<br />
used for laserscan data. I will point out the problems encountered by just processing<br />
inaccurate, sparse pointclouds from the quadrotor with this original framework.<br />
Then I optimized the framework by implementing some algorithms for outlier<br />
rejection and dealing with the sparseness of the pointcloud. These implementations<br />
and its parameter settings will be explained in detail in chapter Adaptions and optimizations<br />
on page 7. Afterwards I worked on integrating the framework into a<br />
ROS package in order to test sequential, online mapping and later have a simple solution<br />
to replace the sFly projects current mapping package. I described this work<br />
in chapter Integration into ROS on page 23. Finally I could simulate the whole<br />
mapping package with some recorded and artificial pointcloud data which is shown<br />
in chapter Simulation and testing on page 25. The result- and problem-discussion of<br />
this work as well as an outlook will be done in chapter Result discussion on page 31.
Chapter 2<br />
Introduction to the MLS<br />
framework<br />
There are different solutions for mapping in 3D environments. Until now, elevation<br />
maps were implemented for the sFly project. But this was never a definite solution.<br />
The problem with elevation maps is the constraint of having only one connected<br />
surface. Like that we can’t model any sort of underpassings like bridges, tunnels,<br />
balconies and so on. But those elements are very common in urban areas we would<br />
like to map and to do path planning in the future. Imagine for example a simple<br />
obstacle like a crane. If the quadrotor approaches from the top and maps the crane<br />
arm, the resulting surface would build an impassable wall from the ground up to<br />
the crane arm. Even if we would measure additional points of the ground below<br />
the crane, we’d had the choice of either discarding the ground, discarding the crane<br />
arm or connect ground points with crane points through several, almost vertical<br />
surfaces. Another disadvantage is the lack of vertical surfaces in elevation maps.<br />
Because of this limitation we wouldn’t be able to map walls and other vertical<br />
surfaces satisfactorily.<br />
Therefore we had to come up with another type of map which supports more than<br />
just one height-level of surfaces and is capable of modeling vertical walls. Grid based<br />
maps like 3D occupancy maps (like proposed in [2]) or multi-level surface maps are<br />
two of several possible choices. In 3D occupancy maps the whole space is partitioned<br />
into cubic 3D cells. Each of those cells indicates the probability of occupancy by<br />
some obstacle. The multi-level surface map described in [1] also partitions its space<br />
<strong>using</strong> a cell grid, but only in x and y direction. <strong>Surface</strong> patches in 3D space are<br />
then defined by the x and y coordinates of the cell and a continuous height value<br />
in z direction. In order to represent surface patches with a thickness (cuboids)<br />
an additional value for depth defines the surface patches thickness underneath it.<br />
Compared to 3D occupancy grids, this map design features two main advantages:<br />
We can save storage because we don’t have 3D cells with a value in empty spaces and<br />
we can represent several, vertically connected and occupied 3D grid cells by just two<br />
values - the upper end as z-value and the depth. Besides from that, MLS maps have<br />
a continuous z-space and can therefore map the environment more accurately in this<br />
direction. Solving the problems of elevation maps and having clear advantages over<br />
3D occupancy maps we decided to use the multi-level surface maps discussed in [1]<br />
for the sFly project.<br />
The whole MLS framework was already implemented by Rudolph Triebel and is<br />
working well on pointclouds generated by laser scanners. Directly processing pointclouds<br />
from the sFly SLAM algorithm with it however doesn’t work that well. In the<br />
image 2.2 you can see that the resulting map visualization of a recorded pointcloud<br />
3
Chapter 2. Introduction to the MLS framework 4<br />
(image 2.1) is quite poor. There is just too much gaps and unconnected triangle<br />
surface patches to recognize anything of the captured environment. This issue has<br />
mainly three reasons:<br />
1. <strong>Sparse</strong>ness of the pointcloud: The sFly SLAM algorithm can only extract<br />
feature points in distinct areas in the images like edges or corners with high<br />
contrast. Now depending on the image quality and the structure of the captured<br />
environment, there may be areas with no or only few extracted feature<br />
points, which leads to gaps and holes in the pointcloud. We also have a maximum<br />
number of extracted points per frame; hence as we fly away from the<br />
ground or objects, the number of extracted features per area decreases. Unlike<br />
the sFly SLAM a laserscan device always returns the same amount of<br />
measurement, which is often a lot higher than the number of tracked features<br />
in a camera image. Also the angle between measurements is constant and independent<br />
of the environment, which leads to a pointcloud with more evenly<br />
spread points.<br />
2. Outliers: When the sFly SLAM searches for correspondent feature points in<br />
subsequent frames, it can happen that this matching is wrong. As a consequence,<br />
the calculated distance of the point to the camera will be wrong. Due<br />
to the fact that the wide-angle camera of the quadrotor is mostly directed<br />
downwards during flight, this wrong value will affect the z-value of a point for<br />
the most part.<br />
3. Visualization: The map isn’t that sparse like it appears in image 2.2. As<br />
you can see in another representation of the map in image 2.3, there is a lot<br />
more data given. The cause of this lies in the visualization algorithm used<br />
by the framework. The polygon patches you can see in 2.2 are actually three<br />
connected neighboring surface patches. If there are less than three neighboring<br />
surface patches, nothing will be displayed in the resulting map.<br />
Therefore in the first part of my thesis, I extended the framework with several<br />
algorithms in order to reduce the first two issues. I implemented a median filter, an<br />
orphan point algorithm, and a pyramid artifacts algorithm for outlier rejection as<br />
well as a hole plastering algorithm to reduce sparseness of the map. Region growing<br />
is also implemented and was intended to identify planes for easier outlier rejection.<br />
In the end it wasn’t used because of the good performance of the median filter.<br />
These mentioned algorithms will be explained in detail in the next chapter.<br />
Figure 2.1: Given pointcloud
5<br />
Figure 2.2: Unoptimized surface map<br />
Figure 2.3: Unoptimized surface map, alternative visualization with the surface<br />
patches as black dots with its depths as orange lines
Chapter 2. Introduction to the MLS framework 6
Chapter 3<br />
Adaptions and optimizations<br />
3.1 Median filter<br />
One of the most important filters for outlier rejection is the non-linear median<br />
filter. It’s often used to reduce noise, while preserving edges. Like described in the<br />
previous chapter, the errors in the pointclouds from the sFly SLAM will be mostly<br />
in z-direction. In the image 3.1 we can see how a 1D pountcloud is affected by a<br />
median filter with a window width of 5. The window is iteratively slided over the<br />
original pointcloud on the left side of the image. At each position, the height value<br />
of the actual point and its two neighbors on each side are saved into an array. Next<br />
we sort the values and then assign the height value in the middle of the array to<br />
the current point. The result can be seen in the image 3.1 on the right. The planes<br />
contain less noise but edges are preserved.<br />
Figure 3.1: Principle of median filtering<br />
Now in our 3D pointcloud, this filter is a bit more complicated as we have to<br />
consider several planes on top of each other, but the main principle stays the same.<br />
A flowchart of the algorithm is shown in image 3.2. We cycle through all points in<br />
our pointcloud and consider neighbors inside a certain radius nbRadius. In this list<br />
of neighbors we only keep the closest points up to a certain number maxNb. On<br />
the other hand, if there are too few neighbors (less than minNb), we won’t consider<br />
this point for our map any longer - it’s quite certain that this is an outlier and<br />
the neighborhood is too sparse to do median filtering. Once the closest neighbors<br />
are found, we sort them according to their height values. Finally we can assign<br />
the value in the middle of the sorted array to the current point and save it into a<br />
new pointcloud. In the end, when we have processed all points, the resulting new<br />
pointcloud will be median filtered and ready to be converted into a MLS map. An<br />
overview of all parameters and its functions is given in table 3.1<br />
Next, we will see some examples of how good the median filter performs. In order to<br />
test the performance, I implemented a test module to synthesize pointclouds. This<br />
module is explained in detail in the chapter Simulation and testing on page 25. In<br />
7
Chapter 3. Adaptions and optimizations 8<br />
Figure 3.2: Flowchart median filtering<br />
the image 3.3 such an artificial pointcloud with 10% outliers is given. The resulting<br />
map without median filtering on the right of the image is quite noisy and the craggy.<br />
If we process this type of pointcloud by the MLS framework with an active median<br />
filter, the resulting map (image 3.4) looks much more promising. The planes are<br />
smoother and don’t have any sharp peaks. However edges stay sharp in contrast to<br />
linear filters like the gaussian.<br />
We can look at a second visualization of the map with surface patches just displayed<br />
as points and its depths by lines. The advantage of this visualization is more its<br />
completeness than the benefit of recognizing the environment with surfaces. All<br />
surface patches and depths are displayed here, while in the original visualization<br />
surface patches with less than two direct neighboring patches won’t show up. Especially<br />
outliers won’t be displayed although they are present in the map. Also the<br />
visualization of depths with polygons is hard and therefore often not complete. The<br />
image 3.5 shows a comparison of median filtering with this alternative visualization.<br />
The left map without median filtering shows a lot more outliers than the one on the
9 3.1. Median filter<br />
Type Variable Description<br />
double nbRadius Defines the maximum radius, in which neighbors<br />
of the current point are extracted.<br />
uint maxNb If the neighborhood inside nbradius contains more<br />
than maxnb points, we just get the maxnb closest<br />
ones.<br />
uint minNb If the neighborhood inside nbradius contains less<br />
than maxnb points, we assume the current point is<br />
an outlier an therefore won’t consider it for building<br />
the map.<br />
Table 3.1: Median filter parameters<br />
Figure 3.3: MLS map without median filtering<br />
right. There are also more and larger dephts produced without median filtering.<br />
Finally we can double the outliers (20%) to show, that the mapping still looks<br />
relatively good. The result is shown in the image 3.6.<br />
Figure 3.4: MLS map with median filtering
Chapter 3. Adaptions and optimizations 10<br />
Figure 3.5: MLS maps without median filtering on the left versus median filtering<br />
on the right<br />
Figure 3.6: Median filtering with double the amount of outliers
11 3.2. Region growing<br />
3.2 Region growing<br />
At the start it wasn’t sure if the median filter would perform good enough for<br />
multiple level pointclouds. Therefore I also implemented a region growing algorithm<br />
in order to identify planes as different regions. With these regions, it probably could<br />
be easier reject outliers to the nearest plane. However since the performance of the<br />
original median filtering was satisfying, I didn’t use the implemented region growing<br />
any further and therefore saved additionally required computing power.<br />
Still I will explain the principle of the algorithm in case future users of this framework<br />
like to use it. However due to visualization problems the algorithm couldn’t<br />
yet be tested and can’t be shown in an example. The corresponding flowchart is<br />
shown in image 3.7, a table of parameters in 3.2.<br />
The region growing algorithm works on the surface map. While iterating through<br />
all map cells and its containing surface patches we look for patches without a yes<br />
assigned region. Lets call this iteration the main loop. If such a patch is found, we<br />
push it onto a stack and also create a new current region. Now the algorithm enters<br />
a stack-loop where it pops a patch and compares the assigned region of that patch<br />
with the current region: If the patch wasn’t assigned a region yet (which is the<br />
case in the first loop iteration), it gets assigned to the current region. Additionally<br />
we also add all its directly neighboring surface patches in x and y direction within<br />
a certain height threshold heightThresh to the stack. Like that, we can let the<br />
region grow into new areas. If the patch has another region assigned, we replace<br />
the current region with that discovered former region and reassign all patches of<br />
the current region. This is basically region merging. with the last possibility of the<br />
popped patch having the same region assigned as the current one, we don’t have<br />
to do anything. Now we can again pop the next patch from the stack and compare<br />
again. If the stack is empty, we return into the main-loop and look for patches<br />
without any assigned region.<br />
Type Variable Description<br />
double heightThreshold Neighbors of a patch are extracted within +-<br />
heightThresh in z-direction<br />
Table 3.2: Region growing parameters
Chapter 3. Adaptions and optimizations 12<br />
Figure 3.7: Flowchart region growing
13 3.3. Orphan points<br />
3.3 Orphan points<br />
This simple algorithm is an addition to the outlier rejection, that was already done<br />
on the pointcloud by removing points which had to few neighbors inside a certain radius.<br />
The orphan point algorithm however is applied to the surface map. We simply<br />
iterate through all map cells and their surface patches and remove patches, which<br />
haven’t got any neighbors inside a certain box. The dimensions of this search-box<br />
are defined by the two parameters vertical and horizontal such that the dimensions<br />
are 2 · horizontal × 2 · horizontal × 2 · vertical (length x width x height).<br />
A corresponding flowchart is shown in image 3.8 and the parameters are listed in<br />
table 3.3.<br />
Figure 3.8: Flowchart orphan points algorithm<br />
In the following example, the first pointcloud displayed from the side in image 3.9 is<br />
processed by the MLS framework without orphan points rejection (in order to show<br />
the effect of the algorithm, median filtering is inactive in both examples). Of course<br />
those outlier-points which weren’t merged with other points to surface patches with<br />
depth are still present in the surface maps. With the orphan points algorithm
Chapter 3. Adaptions and optimizations 14<br />
Type Variable Description<br />
double horizontal Half the width of the surface patch search-box, in<br />
which the algorithm searches for neighbors.<br />
double vertical Half the width of the surface patch search-box, in<br />
which the algorithm searches for neighbors.<br />
int min x Restricts the algorithm to a certain sub map by<br />
setting a limit in the negative x direction.<br />
int max x Restricts the algorithm to a certain sub map by<br />
setting a limit in the positive x direction.<br />
int min y Restricts the algorithm to a certain sub map by<br />
setting a limit in the negative y direction.<br />
int max y Restricts the algorithm to a certain sub map by<br />
setting a limit in the positive y direction.<br />
Table 3.3: Parameters orphan points algorithm<br />
turned on, most of the outliers disappeared in the surface map (image 3.10). The<br />
search-box dimensions are shown in the illustration of the surface map by a red<br />
square. Don’t forget about the third dimensions - the surface patches which still<br />
look like outliers probably have another patch placed behind them.<br />
Figure 3.9: <strong>Point</strong>cloud and surface map structure without orphan points algorithm<br />
Figure 3.10: <strong>Point</strong>cloud and surface map structure with active orphan points algorithm
15 3.4. Pyramid artifacts<br />
3.4 Pyramid artifacts<br />
This algorithm is the last tweak I implemented to reject outliers. While testing<br />
I noticed some pyramid-like artifacts which were under some circumstances still<br />
present in the map (despite median filtering and the orphan points algorithm).<br />
Hence with this algorithm I tried to just address this local map issue and not to<br />
implement another global median filter. A flowchart is shown in image 3.11 and the<br />
parameters are listed in table 3.4.<br />
The principle of the pyramid artifact algorithm is quite simple: First we just look<br />
out for surface patches which have all 4 direct neighbors in ±x and ±y directions. If<br />
that’s the case, we compare the height difference of the current surface patch and the<br />
highest neighbor with the height difference of the highest and the lowest neighbor.<br />
If the first difference is larger than heightFactorThresh times the difference among<br />
the neighbors, the surface patch height gets adjusted. Currently the height of the<br />
current patch is thereby set to the same height of the highest neighbor.<br />
Figure 3.11: Flowchart pyramid artifacts algorithm
Chapter 3. Adaptions and optimizations 16<br />
Type Variable Description<br />
double heightFactorThresh The height-difference of a point with its highest<br />
neighbor has to be at least heightFactorThresh<br />
times larger than the difference between the highest<br />
and the lowest neighbor in order get adjusted.<br />
The neighborhood of a point is defined by its 4<br />
direct neighbors in ±x and ±y directions.<br />
int min x Restricts the algorithm to a certain sub map by<br />
setting a limit in the negative x direction.<br />
int max x Restricts the algorithm to a certain sub map by<br />
setting a limit in the positive x direction.<br />
int min y Restricts the algorithm to a certain sub map by<br />
setting a limit in the negative y direction.<br />
int max y Restricts the algorithm to a certain sub map by<br />
setting a limit in the positive y direction.<br />
Table 3.4: Parameters pyramid artifacts algorithm
17 3.4. Pyramid artifacts<br />
The following example in image 3.12 shows a surface map with such pyramid artifacts,<br />
not optimized by the algorithm. With the parameter heightFactorThresh set<br />
to 1.5 and the pyramid artifacts algorithm active, the resulting map is free of those<br />
flaws as can be seen in image 3.13. The algorithm really just address those specific<br />
structures - for example there are no affected edges or corners of the building<br />
structure.<br />
Figure 3.12: <strong>Surface</strong> map without pyramid artifacts algorithm<br />
Figure 3.13: <strong>Surface</strong> map with active pyramid artifacts algorithm
Chapter 3. Adaptions and optimizations 18<br />
3.5 Hole plastering<br />
While the former four algorithms were all about rejecting outliers, this algorithm<br />
addresses a different problem. Described in the chapter Introduction to the MLS<br />
framework on page 3, due to sparseness and visualization difficulties a map can<br />
contain a lot of gaps and holes. With this algorithm it’s possible to fill these gaps<br />
in two levels of precision. First the gaps, which are smaller than the quadrotor, can<br />
be closed unquestionable - the quadrotor couldn’t fly through anyway. We can also<br />
fill up larger gaps to get a feeling of the map. In order to justify this method, we<br />
mark all surface patches which where filled in, such that we can still return later<br />
and get a more detailed view of this region.<br />
To detect these gaps, the algorithm primarily iterates over all map cells and its surface<br />
patches. At each surface patch we then check immediate map cells in x direction<br />
for candidate surface patches. Candidate surface patches lie inside a certain height<br />
interval from the height of the starting patch. This interval on the other hand is<br />
calculated <strong>using</strong> the current gap distance and the two parameters heightThresh and<br />
heightClearance: Interval boundaries = Height of starting patch ± heightThresh ·<br />
gapDistance + heightClearance. An illustration in image 3.14 shows this search. If<br />
a surface patch is found inside this interval, it depends on gapDistance if we can<br />
close this gap. gapDistance has to be larger 1 (otherwise it isn’t a gap at all) and<br />
smaller equal the maxGap parameter. As soon as we found a gap fulfilling our<br />
requirements, we can close it by inserting new surface patches along a constant<br />
gradient. If the algorithm is on its second run to close larger gaps of width max-<br />
GapEnhanced, we also mark these inserted patches by setting FlagArtificial equal to<br />
1. Finally, the algorithm also checks for gaps in y direction. The resulting flowchart<br />
is shown in image 3.15 and the parameters are listed in the table 3.5.<br />
Figure 3.14: Hole plastering search principle
19 3.5. Hole plastering<br />
Figure 3.15: Flowchart hole plastering algorithm
Chapter 3. Adaptions and optimizations 20<br />
Type Variable Description<br />
double heightThresh Defines the maximum gradient of the with which<br />
the gap can be closed.<br />
double heightClearance Defines the minimum vertical clearance of the gap<br />
to close to other surface patches.<br />
double maxGap Defines the maximum gap width to be closed.<br />
double maxGapEnhanced Defines a larger, secondary gap width to be closed.<br />
However the surface patches, which fill these gaps<br />
are marked by setting the flag SetFlagArtificial to<br />
1<br />
int min x Restricts the algorithm to a certain sub map by<br />
setting a limit in the negative x direction.<br />
int max x Restricts the algorithm to a certain sub map by<br />
setting a limit in the positive x direction.<br />
int min y Restricts the algorithm to a certain sub map by<br />
setting a limit in the negative y direction.<br />
int max y Restricts the algorithm to a certain sub map by<br />
setting a limit in the positive y direction.<br />
Table 3.5: Parameters hole plastering algorithm
21 3.5. Hole plastering<br />
To show how the hole plastering algorithm performs, I generated a small pointcloud<br />
showing a part of a house and a ground. Both ground and house contain a hole of<br />
the size 0.7 × 0.7. The average distance from point to point is 0.1 (grid size). This<br />
pointcloud is shown in image 3.16.<br />
Figure 3.16: <strong>Point</strong>cloud for hole plastering tests<br />
Now we let this pointcloud be processed by our MLS framework with two different<br />
settings. Everything is identical except for the maxGap parameter: During the first<br />
run it’s set to 0.4, afterwards it’s increased to 0.7. The cell size of the surface map<br />
is 0.15 in both runs. The resulting maps can be seen in image 3.17. All inserted<br />
surface patches are marked with red dots. As one can see in both runs some small<br />
gaps, where only one surface patch was missing, are closed. In the second run, the<br />
maxGap parameter also allowed to fill up the large hole in the ground. But what<br />
about the hole in the wall of the house That’s a limitation of the hole plastering<br />
algorithm. As soon as several points in the pointcloud end up on top of each other<br />
in one MLS cell column, the MLS framework converts them into one surface patch<br />
with a depth. But hole plastering algorithm can only close gaps among surface<br />
patches, not depths. Therefore in none of the two runs this hole in the wall gets<br />
closed. This is surely an expandability of the algorithm.<br />
We can now push the algorithm to it’s limit and once again generate the pointcloud,<br />
but this time with an average point distance of 0.4 instead of 0.1. Like that we get<br />
a quite sparse pointcloud with 64 times less the amount of points compared to our<br />
first examples. The only setting changed for the hole plastering algorithm is the<br />
slightly increased maxGap parameter, now 0.75. The result in image 3.18 shows<br />
still a quite complete map, although a lot of surface patches were inserted. The<br />
shape of the roof however wasn’t reconstructed perfectly, the pointcloud is just too<br />
sparse to feature such shapes.
Chapter 3. Adaptions and optimizations 22<br />
Figure 3.17: Left: Holeplastering with maximum gap size of 0.4, right: Holeplastering<br />
with maximum gap size of 0.7<br />
Figure 3.18: Holeplastering with maximum gap size of 0.75, sparse pointcloud with<br />
4 times less points
Chapter 4<br />
Integration into ROS<br />
4.1 Module layout<br />
As already mentioned in the introduction, one of the goals was to integrate the MLS<br />
framework into a ROS module and making it work for sequential online mapping.<br />
Like that it’s easy, to add this mapping to the existing quadrotor project, which<br />
also runs on ROS modules. ROS modules consist of nodes communicating among<br />
each other or with nodes from other modules. There are basically two ways of<br />
communicating: First, a node can broadcast messages to so-called topics, which<br />
in turn can be read by other nodes. And second, there is also a request/reply<br />
communication by <strong>using</strong> ROS services. Further information is available on the<br />
ROS website [3].<br />
While in flight, the quadrotors SLAM algorithm extracts and processes feature<br />
points from the video stream. It also groups them locally and indexes these subpointclouds<br />
with keyframes. We decided to use these keyframe-groups to split the<br />
whole pointcloud and publish sub-pointcloud on-the-go to the MLS module. Of<br />
course the SLAM algorithm will accumulate keyframes independently of the work<br />
of our MLS module. Due to this unidirectional relation, we decided to use a topic<br />
for publishing keyframe-pointclouds online to our MLS module. As a message type<br />
for pointclouds, the common package geometry msgs is used. It supports publishing<br />
arrays of points (with each having a x, y and z value).<br />
Before ROS integration the optimized framework was tested <strong>using</strong> recorded pointclouds.<br />
We couldn’t do any live testing on the quadrotor, so I always had to rely<br />
on offline data. With ROS integration I wanted to simulate online, sequential<br />
mapping and therefore had to build another node which provided the MLS node<br />
periodically with data. In order to use the recorded offline data, a parser node<br />
(called PcParser) was implemented, which reads such an input file and continuously<br />
publishes keyframe pointclouds at certain time intervals. If the number of<br />
points grouped together to a keyframe pointcloud is too small, one can also set a<br />
minimum size for published pointclouds. Like that, keyframes are cumulated until<br />
the minimum point count is reached and then published. You can see the final<br />
ROS testing setup the image 4.1. More about testing will be explained in the next<br />
chapter simulation and testing [].<br />
Our central node, which is called MapBuild, will subscribe to this pointcloud topic<br />
and sequentially receive pointclouds published by the node PcParser. With every<br />
new received pointcloud a function processCloud is called to apply optimizations<br />
to it and finally attach it to a global map, maintained by MapBuild. The detailed<br />
sequence of action is as follows:<br />
1. The function processCloud is called as soon as MapBuild receives a new point-<br />
23
Chapter 4. Integration into ROS 24<br />
Figure 4.1: Diagram of ROS setup<br />
cloud from the topic.<br />
2. In processCloud, the pointcloud gets median filtered first (function MedianizeAll).<br />
3. A temporary surface map is generated from the pointcloud.<br />
4. The temporary surface map is added to the global surface map maintained by<br />
MapBuild.<br />
5. Orphan points are removed from the map (function RemoveOrphan<strong>Point</strong>s).<br />
This function is restricted to the area where the new pointcloud was inserted.<br />
6. Gaps and holes are filled up in the map with hole plastering (function Hole-<br />
Plastering). This function is also restricted to an expanded area where the<br />
new pointcloud was inserted. The expansion of the area is equal to the maximum<br />
gapsize to be closed.<br />
7. Pyramid artifacts are removed in the area where the pointcloud was inserted<br />
(function RemovePyramids).<br />
4.2 MLS module usage<br />
The modules are programed in such a way, that the most important parameters can<br />
be set in a so called launch file. Once the parameters are set, one can initiate the<br />
ROS core with the these parameters with by typing.<br />
\verb|roslaunch mlsmaps paramfile.launch|<br />
Afterwards we just have to start the nodes MapBuild with the command<br />
\verb|rosrun mlsmaps MapBuild|<br />
Like that the MLS module is ready to read pointclouds from the topic. The PcParser<br />
node, which parses recorded test pointclouds from files can then be launched with<br />
\verb|rosrun mlsmaps PcParser|<br />
For more information about ROS, visit its website on www.ros.org [3].
Chapter 5<br />
Simulation and testing<br />
Testing the MLS framework and the ROS module with pointclouds was essential<br />
during my thesis and also consumed a lot of time. During the whole time it wasn’t<br />
possible to perform real tests with a flying quadrotor and true live data. Therefore<br />
in the beginning I was given three pointclouds which were recorded during former<br />
flights. Later I additionally generated artificial maps for different scenarios. Prior<br />
to showing results in the next chapter, I will illustrate the used pointclouds in this<br />
chapter.<br />
5.1 Recorded data<br />
The first pointcloud I used contains a table and a floor (see image 5.1). In order to<br />
get that much points on indoor, plain surfaces, one had to lay newspapers all over<br />
the floor and table. Like that SLAM could detect more features and therefore draw<br />
more points, but there was still a lot of wrong correspondences as one can see in<br />
the pointcloud image: There are a lot of outliers above table and ground and also<br />
some individuals even further away and outside the captured image area. Because<br />
of these circumstances, I used this map in the beginning to test my optimization<br />
algorithms for outlier rejection.<br />
Figure 5.1: Table with floor pointcloud<br />
The second pointcloud was recorded during an EMAV competition. The floor in this<br />
case was from a gym and therefore it would have been also hard to get any feature<br />
points. As help, the organizers rolled out two bands for easier feature detection.<br />
The quadrotor had to fly along these bands and at the end also through a window<br />
as an obstacle passage. I used this map to optimize the hole plastering algorithm,<br />
25
Chapter 5. Simulation and testing 26<br />
since there were a lot of featureless areas between the bands and therefore gaps in<br />
the pointcloud (see image 5.2). It’s also interesting to see, what would happen to<br />
the window ledge at the end of the pointcloud.<br />
Figure 5.2: EMAV competition pointcloud with feature bands and window ledge<br />
The last and most important pointcloud resulted from a flight near Birmensdorf,<br />
ZH. Due to safety reasons, the quadrotor flew over a village-like but uninhabited<br />
environment. The captured area features a lot of landmarks like roads, houses (also<br />
destroyed ones), a creek and a bridge (see aerial image 5.3 of Google Maps). In<br />
the pointcloud shown in image 5.4, one can probably recognize partial sparseness -<br />
especially areas along the creek and the roofs of the houses contain almost no points.<br />
The lack of roofs are thereby mostly originated from bad video quality: They were<br />
overexposed and therefore white in the video, such that there was no chance of<br />
extracting any features. Besides from that points seem to be randomly distributed<br />
and there are also outliers. Overall it’s difficult for us to recognize landmarks in this<br />
pointcloud. I spent most of the time testing with this pointcloud, as it is the most<br />
complex and realistic setup for future sFly mapping goals in city-like environments.<br />
I will also show most of the test results with this map, as it features a lot of problems<br />
I address in this thesis.
27 5.1. Recorded data<br />
Figure 5.3: Birmensdorf aerial view<br />
Figure 5.4: Birmensdorf pointcloud with road, creek and houses
Chapter 5. Simulation and testing 28<br />
5.2 Artificial setups<br />
The three recorded pointclouds I was given were good for testing the optimizations<br />
for the existing MLS framework with real data. But there is one major drawback:<br />
None of them contains real multi level surface properties. In the first pointcloud<br />
with the table and the floor, the table is a little bit overlapping, but not much. In<br />
the other pointcloud sets there are no multiple levels at all. Therefore I decided<br />
to add a test mode to the PcParser node. In this test mode, an algorithm should<br />
assemble pointclouds by combining horizontal and vertical surfaces. The functions<br />
for generating these horizontal and vertical surfaces (functions addHorizontal and<br />
addVertical) offer a variety of parameter settings like position, size, orientation,<br />
grade and the gaussian distribution in horizontal and vertical direction for placing<br />
the points around its grid points. Latter parameter simulates simple noise from<br />
SLAM triangulation. Through global class parameters one can also set the grid size<br />
and the ratio of salt & pepper noise - meaning the chance of placing a point with<br />
5 times the normal gaussian displacement in z-direction. Like that we can simulate<br />
salt & pepper noise in z-direction, which was also noticed in the real, recorded<br />
pointclouds.<br />
The function Test<strong>Point</strong>Cloud can now assemble different pointcloud with these<br />
surfaces. Besides a parameter pcType to choose the type of the pointcloud, the<br />
function features an additional parameter addParam to set one crucial dimensional<br />
aspect of the pointcloud like the size of a gap or the height of a bridge. pcType can<br />
be set with the following numbers:<br />
1. A simple bridge - a horizontal surface situated over a valley of surfaces. addParam<br />
defines the height of the bridge.<br />
2. A more realistic bridge which additionally features walls and therefore has<br />
a more narrow underpassing (image 5.5). addParam defines the height of<br />
the bridge. This pointcloud was mostly used to test median filtering and<br />
visualization of an underpassing.<br />
3. Some ground and a part of the house. This pointcloud features a horizontal<br />
hole in the ground and a vertical one in the house wall (image 5.6). The<br />
diameters of the holes can be set with addParam. This map was used for<br />
testing the hole plastering algorithm and taking a look at the visualization of<br />
walls.<br />
4. Three planes, one of them tilted (image 5.7). This pointcloud was also used<br />
for median filtering tests.<br />
5. Three planes, one of them tilted. The planes are connected by walls.<br />
Figure 5.5: Complex bridge pointcloud
29 5.2. Artificial setups<br />
Figure 5.6: <strong>Point</strong>cloud of house and floor with holes<br />
Figure 5.7: <strong>Point</strong>cloud of three planes
Chapter 5. Simulation and testing 30
Chapter 6<br />
Result discussion<br />
In this last chapter, I will show the resulting MLS maps of the three given recorded<br />
pointcloud sets. I will also point out problems I’ve encountered and couldn’t yet<br />
be solved mostly due to lack of time. Finally a conclusion of my thesis and an<br />
interesting outlook will be given.<br />
6.1 Results<br />
We’ve already seen some partial multi level surface results for each of the implemented<br />
optimization algorithms. Now the most interesting part is to see how these<br />
optimizations perform together and transform the three recorded pointclouds into<br />
MLS maps. All three pointcloud sets were presented in the chapter Simulation and<br />
Testing on page 25. I’d like to start with the Birmensdorf set. Once again, one<br />
can take a look at the pointcloud which is illustrated in image 5.4 on page 27. In<br />
order to compare the improvements later, the MLS map which was created by the<br />
original MLS framework and is shown again in image 6.1. As you can see, there<br />
are a lot of randomly arranged polygon patches. There is no chance of someone<br />
recognizing anything in this map. We have to consider however, that the map contains<br />
more surface patches as one can see in the MLS map (like mentioned in the<br />
beginning, surface patches with less than two neighbors can’t be connected to a<br />
triangle polygon and therefore won’t be visible). The alternative visualization was<br />
shown in image 2.3, page 5.<br />
Figure 6.1: <strong>Surface</strong> map of Birmensdorf set without any optimizations<br />
If we now let the pointcloud be converted by our ROS MLS module, the result in<br />
image 6.2 looks better, but not yet satisfying. That’s because of the hole plastering<br />
algorithm which until now only fills up gaps smaller than out quadrotor. Since all<br />
measurements from the sFly SLAM algorithm are relative, we have to guess the<br />
31
Chapter 6. Result discussion 32<br />
quadrotors width by analyzing the map. In this Birmensdorf set, the quadrotor<br />
seems to be 0.15 wide - about the same size as the cells in the surface map. With<br />
maxGap set to 0.15, the hole plastering algorithm will therefore only close gaps of<br />
one cell size width. Now to still get a good feeling of how the environment looks<br />
like, the maxGapEnhanced parameter is set to 0.75 to also close gaps which are up<br />
to 5 cell sizes wide. This final result is shown in image 6.3.<br />
Figure 6.2: <strong>Surface</strong> map of Birmensdorf set with partial hole plastering<br />
Figure 6.3: <strong>Surface</strong> map of Birmensdorf set with all optimizations, viewed from two<br />
different perspectives<br />
In this final result we can see a lot of red points. Those points mark the surface<br />
patches, which were additionally inserted by the hole plastering algorithm since the<br />
last shown MLS map output. So all these patches were used to plaster holes and<br />
gaps which were larger than 0.15 and smaller equal 0.75. In the MLS framework,<br />
these surface patches are also marked for later use with a flag called FlagArtifical.<br />
With this marking we can always keep track of areas which were inserted unjustly.<br />
It’s possible, that those really are closed areas, but they could also be open. And<br />
based on the fact, that these closed gaps were larger than the quadrotor, it would
33 6.1. Results<br />
be able to fly through. Therefore we call these marked areas regions of uncertainty.<br />
The benefit of trying to close these large gaps is obvious: For the first time we<br />
are able to recognize the environment the quadrotor flew through. The green line<br />
represents the route of the quadrotor projected to the ground. Blue marks the<br />
depression of the creek, once interrupted by a bridge. And finally buildings (houses<br />
and ruins) are marked with orange color.<br />
As you compare the map with the aerial view shown in image 5.3 on page 27 you<br />
might notice, that the roofs of the houses are missing (except for the first house on<br />
the right after the curve). This is due to an overexposed video recording of these<br />
roof areas. I assume the sun was reflecting on them, such that the whole roofs<br />
appeared white in the image - impossible for the SLAM to extract features from<br />
these areas.<br />
Another pointcloud mentioned in the former chapter was the one recorded during<br />
the EMAV competition. We first take another look at the given pointcloud in the<br />
image 6.4 and 6.5. From the first perspective we can clearly see the feature bands<br />
which helped the SLAM algorithm to extract features on the homogeneous gym<br />
floor. There are almost no points between these bands and a lot of points were<br />
triangulated wrong and placed somewhere below the floor (only half of those are<br />
visible in the image). From the side one can recognize the window ledge on the<br />
right side.<br />
Figure 6.4: EMAV competition cloud<br />
Figure 6.5: EMAV competition cloud from the side<br />
The resulting MLS map of this recorded flight is displayed in the image 6.6. Once<br />
again the feature bands can be recognized as regions without red dots. Unfortunately<br />
there are also two major flaws in the middle and on the right, but considering<br />
the pointcloud, the result is still quite good. Even the window ledge is visible on<br />
the right.<br />
The third and last pointcloud contains a table and a floor. This pointcloud was<br />
shown in the last chapter in image 5.1 on page 25. The result illustrated in image 6.7
Chapter 6. Result discussion 34<br />
Figure 6.6: <strong>Surface</strong> map of EMAV competition<br />
looks fairly good except for a little flaw on the table. The table even overlaps a<br />
little bit with the floor plane, such that the benefit of a multi level surface map can<br />
be partially verified. There are also no red markers, meaning that there weren’t<br />
any gaps larger than the quadrotor (the quadrotor was assumed to be around 3 cell<br />
sizes wide).<br />
Figure 6.7: <strong>Surface</strong> map of table and floor<br />
6.2 Computational costs<br />
Besides from the result of the MLS maps another factor is also quite crucial for<br />
doing online mapping - the computational cost. I did some measurements of the<br />
computational time with the Birmensdorf pointcloud on a rather old laptop from<br />
2005. It features an Intel Pentium M 750 1.86 GHz prozessor and 2GB RAM. The<br />
goal was more to get a feeling, how computational costs relatively change against<br />
pointcloud size. The absolute result of the measurement is not that significant,<br />
since laptops are a lot faster nowadays. However one can still get a feeling of what<br />
seems to be possible with online mapping.<br />
The results of the test are shown in the diagram 6.8. From 10ms for a 20 point<br />
pointcloud up to 2 seconds for 400 points, the curve seems to follow an exponential<br />
curve progression. In order to find out the feasibility of online mapping, we have to<br />
know the size of the pointclouds published by the SLAM periodically. Lets again<br />
take the Birmensdorf example. Its pointcloud features about 3100 points. If we<br />
assume a mapping time of 1 minute for the whole area (which would be quite fast)<br />
and like to process a pointcloud every second, we would end up with an average<br />
pointcloud size of about 52 points every second. 52 points consume about 25ms on<br />
this relatively old laptop, which’s only 2.5% of the computational power. Therefore<br />
online mapping should be easy feasible, even if we are able to extract more features<br />
from of the video feed in the future.
35 6.3. Problems<br />
Figure 6.8: Diagram of computing time depending on pointcloud size<br />
Computing time against pointcloud size<br />
Average time in seconds<br />
2.5<br />
2<br />
1.5<br />
1<br />
0.5<br />
0<br />
0.01<br />
0.02<br />
0.03<br />
0.06<br />
0.07<br />
0.11<br />
0.15<br />
0.17<br />
0.21<br />
0.24<br />
0.61<br />
0.43<br />
20 40 60 80 100 120 140 160 180 200 240 280 320 360 400<br />
<strong>Point</strong>cloud size<br />
Average time<br />
1.37<br />
1.63<br />
2.06<br />
6.3 Problems<br />
There is also some problems I’ve encountered during my thesis. Most of them<br />
couldn’t be solved due to lack of time. To begin with, I will point out some issues,<br />
which are visible in the final Birmensdorf MLS map. One big problem concerns the<br />
sequential map building. In the launch file one has the possibility to set the minimum<br />
size of published pointclouds. The higher this number, the more keyframes<br />
have to be published together. Unfortunately the resulting map also changes its<br />
appearance with such different settings as you can see in image 6.9. Both times all<br />
the settings were identical except for the minimum size of published pointclouds -<br />
in the top map this was set to 300 points, in the lower 80 points. Major differences<br />
are encircled orange. This issue is probably due to the hole plastering algorithm,<br />
which doesn’t perform the same on map areas as a whole compared to the same<br />
map area pieced together from two pointclouds.<br />
Another problem, which also concerns the hole plastering algorithm, is its preference<br />
of processing direction. In the image 6.10 a gap near the bridge is somehow closed<br />
wrong for our impression. You can imagine, that if the order of gap search and<br />
processing direction in the code is swapped - x after y instead of y after x - this gap<br />
would have been closed differently - more along the bridge. Solving this problem<br />
is probably quite hard. Maybe it’s possible to try filling gaps in both directions<br />
and then choose the local result where the algorithm filled a higher gap. The<br />
consideration here is to prioritize higher situated gaps, because as potential obstacle,<br />
they are closer to the quadrotor and therefore more important.<br />
As already showed in the chapter of adaptions and optimizations, the hole plastering<br />
algorithm only works on surface planes and not on walls. But for walls (surface<br />
patches with depths) we’re basically addressing the same problem: As soon as<br />
depths representing a wall are too sparse, the visualization of the MLS framework<br />
isn’t able to draw polygons, such that even these existing depths won’t be visible<br />
in the MLS map. If there was a similar algorithm to close gaps in walls, it<br />
would most certainly improve mapping. I also think there is a lot of room for improvements<br />
concerning the visualization algorithm of the original MLS framework.<br />
The correspondence problem for connecting surface patches to polygons is hard but<br />
probably can be improved further. Especially the generation of wall surfaces is not<br />
yet satisfying.
Chapter 6. Result discussion 36<br />
Figure 6.9: Differences by just changing the package size of points processed at<br />
once. Top: 300 points, bottom: 80 points<br />
Figure 6.10: Differences by just changing the package size of points processed at<br />
once. Top: 300 points, bottom: 80 points
37 6.4. Conclusion and outlook<br />
6.4 Conclusion and outlook<br />
To conclude this thesis one can say that it basically worked to process sparse pointclouds<br />
from the sFly SLAM into multi level surface maps. We were able to reject<br />
many of the outliers efficiently and also could countervail the sparseness of the pointclouds<br />
by <strong>using</strong> a hole plastering algorithm. Closed gaps larger than the quadrotor<br />
are additionally marked as regions of uncertainty. Like that we get a feeling of<br />
the mapped environment and can also keep track of regions, where we have to fly<br />
over again and get more features. Despite the shown capability of processing MLS<br />
pointclouds, the framework couldn’t yet be tested with real recorded data featuring<br />
multiple level surfaces. Hence this is definitely a matter which has to be tested<br />
next. Furthermore as we saw in the last problem section, the hole plastering algorithm<br />
isn’t yet perfectly implemented. There are some implications when doing<br />
sequential online mapping which lead to slightly different MLS maps depending on<br />
the pointcloud sizes published by the SLAM algorithm. The cost of processing a<br />
pointcloud increases exponentially with its size, but with the actual rate of newly<br />
extracted features from the video feed, online mapping is easily feasible.<br />
As an outlook it can be said that it’s going to be interesting to do further quadrotor<br />
flight tests in terrain with multiple levels. Close flights to bridges and houses<br />
could give us more information on how well the MLS framework converts its inputs<br />
into MLS maps. With the feature of all uncertain regions marked, one could also<br />
implement an exploration mode for the quadrotor. First there would be a higher<br />
fly-over and next, the quadrotor could fly closer to the uncertain areas in order to<br />
get more features and complete the map. Thinking further ahead we could even<br />
implement adaptive cell sizes. The cell size is a central design criterion for the maps:<br />
Smaller cell sizes allow more detailed maps. But as a drawback, this also implies<br />
that less points from the pointcloud will be added per cell and therefore results in<br />
more empty cells and finally a sparse map. A larger cell size however decreases the<br />
level of detail while making the map denser. Like that one could get the idea of<br />
introducing local, adaptive cell sizes, depending on the local amount of points in<br />
the pointcloud.
Chapter 6. Result discussion 38
Bibliography<br />
[1] R. Triebel, P. Pfaff, W. Burgard: <strong>Multi</strong>-<strong>Level</strong> <strong>Surface</strong> Maps for Outdoor<br />
Terrain <strong>Mapping</strong> and Loop Closing. In Proc. of the IEEE/RSJ Int. Conf. on<br />
Intelligent Robots and Systems (IROS), 2006.<br />
[2] R. Zask, M.N. Dailey: Rapid 3D Visualization of Indoor Scenes Using 3D<br />
Occupancy Grid Isosurfaces, In Proceedings of ECTI-CON, 2009.<br />
[3] ROS.org community site for hosting ROS-related software. http://www.ros.org.<br />
39