From Imperial College Robotics Society
Revision as of 16:54, 25 April 2013 by Je310 (Talk | contribs)

Jump to: navigation, search

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

Plan overview

Click here



Someone should do a parse of (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.


Extra stuff:

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


Extra stuff: use quaternions for rotation state


[ Autonomous Obstacle Avoidance and Maneuvering on a Vision-Guided MAV Using On-Board Processing] - seems very relevant at a glance, will revisit later

Visual Studio tips

Use PCL 1.6 from the web, update cmakelists to ,and install drivers from

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 }