Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00039 #include <ar_track_alvar/filter/medianFilter.h>
00040
00041 namespace ar_track_alvar
00042 {
00043 using namespace alvar;
00044
00045 MedianFilter::MedianFilter(int n){
00046 median_n = n;
00047 median_ind = 0;
00048 median_init = false;
00049 median_poses = new Pose[median_n];
00050 }
00051
00052 void MedianFilter::addPose(const Pose &new_pose){
00053 median_poses[median_ind] = new_pose;
00054 median_ind = (median_ind+1) % median_n;
00055 }
00056
00057 void MedianFilter::getMedian(Pose &ret_pose){
00058 if(!median_init){
00059 if(median_ind == median_n-1)
00060 median_init = true;
00061 ret_pose = median_poses[median_ind-1];
00062 }
00063
00064 else{
00065 double min_dist = 0;
00066 int min_ind = 0;
00067 for(int i=0; i<median_n; i++){
00068 double total_dist = 0;
00069 for(int j=0; j<median_n; j++){
00070 total_dist += pow(median_poses[i].translation[0] - median_poses[j].translation[0], 2);
00071 total_dist += pow(median_poses[i].translation[1] - median_poses[j].translation[1], 2);
00072 total_dist += pow(median_poses[i].translation[2] - median_poses[j].translation[2], 2);
00073 total_dist += pow(median_poses[i].quaternion[0] - median_poses[j].quaternion[0], 2);
00074 total_dist += pow(median_poses[i].quaternion[1] - median_poses[j].quaternion[1], 2);
00075 total_dist += pow(median_poses[i].quaternion[2] - median_poses[j].quaternion[2], 2);
00076 total_dist += pow(median_poses[i].quaternion[3] - median_poses[j].quaternion[3], 2);
00077 }
00078 if(i==0) min_dist = total_dist;
00079 else{
00080 if(total_dist < min_dist){
00081 min_dist = total_dist;
00082 min_ind = i;
00083 }
00084 }
00085 }
00086 ret_pose = median_poses[min_ind];
00087 }
00088 }
00089
00090 }