# AutoQuad

Scratch area for the third year project in EEE on autonomous indoor quad navigation.

## Contents

## Plan overview

## Papers

### General

Someone should do a parse of http://www.informatik.uni-trier.de/~ley/db/conf/icra/icra2012.html (plus 2011, etc) for relevant papers, some MAV stuff there.

### Plane segmentation

Real-Time Plane Segmentation using RGB-D Cameras

The PCL fast plane segmentation is based on this paper. Current plan is to reuse the integral image calculation for local normal finding.

An idea is to use DBSCAN to perform the clustering which is not that well described in the paper.

Extra stuff: KD-tree construction with GPUs - Although we should try to just use kd trees from PCL.

### SLAM

- A fully autonomous quad with all processing on board File:Autonomous Multi-Floor Indoor Navigation with a Computationally Constrained MAV.pdf. Excellent starting point on SLAM, and many of its reference seem good, especially [16] and [17]
- A paper on Plane slam, some detail on data association (basically mahalanobis distance approach) [1]
- Related theory [2]

Extra stuff:

- paper on a novel approach to the plane data association: [3]
- These guys use something different than a EKF: a hybrid. "hybrid ﬁlter that uses an IMU-driven EKF process model with pseudo-measurements computed from Gaussian Particle Filter (GPF) laser measurement updates" [4]

## EKF's

Extra stuff: use quaternions for rotation state

## Unfiltered

[http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5980095 Autonomous Obstacle Avoidance and Maneuvering on a Vision-Guided MAV Using On-Board Processing] - seems very relevant at a glance, will revisit later

http://groups.csail.mit.edu/rrg/papers/jfr-mav-11.pdf

## Visual Studio tips

Use PCL 1.6 from the web, update cmakelists to https://dl.dropboxusercontent.com/u/48184712/CMakeLists.txt ,and install drivers from https://dl.dropboxusercontent.com/u/48184712/V1049_0430.iso

## kdtree code repository

vector<int> regionQuery(pcl::KdTree kdPoints, int currentPoint, double radius) { vector<int> k_indicies; vector<float> k_sqr_distances; pcl::KdPoints<pcl::Normal>::radiusSearch(currentPoint, radius, k_indicies, k_sqr_distances); return k_indicies; } void DBSCAN (pcl::PointCloud<pcl::Normal> mynormals, double radius, int minPoints){ vector<int> NeighborPts; pcl::KdTree kdPoints; pcl::IndicesConstPtr ind = pcl::IndicesConstPtr(); kdPoints.setInputCloud(*myNormals, ind); int sizeOfData = mynormals.size(); bool Visited[sizeOfData]; for(int i = 0; i<sizeOfData; i++){ Visited[i]=false; } vector<int> currentCluster; vector<vector<int>> clusters; int clusterInd = 0; for(i = 0; i<sizeOfData; i++){ if(Visited[i]=false){ Visited[i] = true; NeighborPts = regionQuery(kdPoints, i, radius); if(NeighborPts.size()<minPoints){ //nothing here could call it noise explicitly } else{ expandCluster(i,NeighborPts,currentCluster,radius,minPoints,KdPoints,Visited); clusters.push_back(currentCluster); clusterInd++; } } } } void expandCluster(int inputInd, vector<int> NeighborPts,vector<int> currentCluster,double radius, int minPoints, pcl::KdTree kdPoints,bool Visited[sizeOfData]){ currentCluster.push_back(inputInd); vector<int> secondNeighborPts; for(int j = 0; j < NeighborPts.size(); j++){ if(Visited[neighborPts[j]]=false){ Visited[neighborPts[j]]=true; secondNeighborPts = regoinQuery(KdPoints,NeighborPts[j],radius); if(secondNeighborPts.size()>=minPoints){ //take the union of neighborPts and secondneighborPts } } //if neighborPts[j] has yet to be added to a cluster add it to this one } }