21.01.2015 Views

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 ...

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!