AverageTF.cpp
Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2010, Thomas Ruehr <ruehr@cs.tum.edu>
00003  * All rights reserved.
00004  *
00005  * Redistribution and use in source and binary forms, with or without
00006  * modification, are permitted provided that the following conditions are met:
00007  *
00008  *     * Redistributions of source code must retain the above copyright
00009  *       notice, this list of conditions and the following disclaimer.
00010  *     * Redistributions in binary form must reproduce the above copyright
00011  *       notice, this list of conditions and the following disclaimer in the
00012  *       documentation and/or other materials provided with the distribution.
00013  *     * Neither the name of Willow Garage, Inc. nor the names of its
00014  *       contributors may be used to endorse or promote products derived from
00015  *       this software without specific prior written permission.
00016  *
00017  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
00018  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00019  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00020  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
00021  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
00022  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
00023  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
00024  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
00025  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
00026  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00027  * POSSIBILITY OF SUCH DAMAGE.
00028  */
00029 
00030 
00031 #include <ias_drawer_executive/AverageTF.h>
00032 
00033 tf::Stamped<tf::Pose> AverageTF::getMarkerTransform(const char tf_frame[], double numSamples)
00034 {
00035   tf::Stamped<tf::Pose> marker;
00036   tf::TransformListener listener;
00037   ros::NodeHandle node;
00038   ros::Rate rate(100.0);
00039   int count = 0;
00040 
00041   double lastTime = 0;
00042   tf::Stamped<tf::Pose> transSum;
00043   int i = 0;
00044   geometry_msgs::Quaternion rot[500];
00045   geometry_msgs::Vector3 trans[500];
00046 
00047   int numh = 0;
00048   int numv = 0;
00049 
00050 
00051   while (count < numSamples  && ros::ok()){
00052     tf::StampedTransform transform;
00053     try{
00054       listener.lookupTransform("/base_link", tf_frame,
00055                                ros::Time(0), transform);
00056     }
00057     catch (tf::TransformException ex){
00058       //ROS_ERROR("%s",ex.what());
00059     }
00060 
00061     double actTime = transform.stamp_.toSec();
00062 
00063     //ROS_INFO("I see a ARToolkit Marker. %f", transform.stamp_.toSec());
00064 
00065     if (actTime!=lastTime) {
00066       lastTime=actTime;
00067      // ROS_INFO("NEW MARKER POSITION %i" , count);
00068       marker.frame_id_ = transform.frame_id_;
00069       marker.setOrigin(transform.getOrigin());
00070       marker.setRotation(transform.getRotation());
00071       marker.stamp_ = transform.stamp_;
00072 
00073       transform.setRotation(transform.getRotation().normalize());
00074       trans[count].x = transform.getOrigin().x();
00075       trans[count].y = transform.getOrigin().y();
00076       trans[count].z = transform.getOrigin().z();
00077       rot[count].x = transform.getRotation().x();
00078       rot[count].y = transform.getRotation().y();
00079       rot[count].z = transform.getRotation().z();
00080       rot[count].w = transform.getRotation().w();
00081       count++;
00082 
00083       double meanZ = 0;
00084       for (i = 0; i < count; i++)
00085       meanZ += trans[i].z;
00086       meanZ /= (double)count;
00087 
00088       double deviation=0;
00089       for (i = 0; i < count; i++)
00090          deviation+= (trans[i].z - meanZ) * (trans[i].z - meanZ);
00091       deviation/= (double)count;
00092 
00093       printf("\a");
00094 
00095       ROS_INFO("new marker %i STD DEVIATION IN Z %f", count, sqrtf(deviation));
00096 
00097       ROS_INFO("CURRENT MARKER %f %f %f ",transform.getOrigin().x(), transform.getOrigin().y(), transform.getOrigin().z());
00098       ROS_INFO("CURRENT MARKER OR %f %f %f %f", transform.getRotation().x(), transform.getRotation().y(), transform.getRotation().z(), transform.getRotation().w());
00099 
00100 
00101       tf::Stamped<tf::Pose> decid;
00102       decid.frame_id_ = "none";
00103       decid.stamp_ = ros::Time();
00104       decid.setOrigin(btVector3(1,0,0));
00105       decid.setRotation(btQuaternion(0,0,0,1));
00106       btTransform classify = transform * decid;
00107 
00108       tf::Stamped<tf::Pose> decid2;
00109       decid2.frame_id_ = "none";
00110       decid2.stamp_ = ros::Time();
00111       decid2.setOrigin(btVector3(0,1,0));
00112       decid2.setRotation(btQuaternion(0,0,0,1));
00113 
00114       btTransform classify2 = transform * decid2;
00115 
00116       ROS_INFO("DECID :c  %f c1 %f m %f", classify.getOrigin().z(), classify2.getOrigin().z(), transform.getOrigin().z());
00117 
00118       if (classify.getOrigin().z() < classify2.getOrigin().z()) {
00119           numh++;
00120           ROS_INFO("HORIZONTAL %i", numh);
00121       } else {
00122           numv++;
00123           ROS_INFO("VERTICAL %i", numv);
00124       }
00125 
00126       //tf::Stamped<tf::Pose> rot;
00127       //rot.setRotation(btQuaternion(0,0,-M_PI/2));
00128 
00129       //btQuaternion myq(transform.getRotation().x(),transform.getRotation().y(),transform.getRotation().z(),transform.getRotation().w());
00130       //btQuaternion qy = myq * btQuaternion(0,M_PI / 2,0);;
00131       //ROS_INFO("ROT Y %f %f %f %f", qy.x(),qy.y(),qy.z(),qy.w());
00132 
00133      //btVector3 euler;
00134      //QuaternionToEuler(btQuaternion(rot[count].x,rot[count].y,rot[count].z,rot[count].w).normalize(), euler);
00135      //QuaternionToEuler(transform.getRotation().normalize(), euler);
00136 
00137      //ROS_INFO("EULER %f %f %f", euler.x(),euler.y(),euler.z());
00138     }
00139 
00140     rate.sleep();
00141   }
00142 
00143   //remove outliers
00144   double meanZ = 0;
00145   for (i = 0; i < numSamples; i++)
00146           meanZ += trans[i].z;
00147   meanZ /= numSamples;
00148 
00149   double deviation=0;
00150   for (i = 0; i < numSamples; i++)
00151           deviation+= (trans[i].z - meanZ) * (trans[i].z - meanZ);
00152   deviation /= numSamples;
00153 
00154   ROS_INFO("STD DEVIATION IN Z %f", sqrtf(deviation));
00155 
00156   geometry_msgs::Quaternion rotMean;
00157   geometry_msgs::Vector3 transMean;
00158 
00159   transMean.x = 0;
00160   transMean.y = 0;
00161   transMean.z = 0;
00162   rotMean.x = 0;
00163   rotMean.y = 0;
00164   rotMean.z = 0;
00165   rotMean.w = 0; // would otherwise be 1
00166 
00167   double numGoodSamples = 0;
00168   for (i = 0; i < numSamples; i++)
00169      if ((trans[i].z - meanZ) * (trans[i].z - meanZ) < deviation) {
00170                  transMean.x += trans[i].x;
00171                  transMean.y += trans[i].y;
00172                  transMean.z += trans[i].z;
00173                  rotMean.x += rot[i].x;
00174                  rotMean.y += rot[i].y;
00175                  rotMean.z += rot[i].z;
00176                  rotMean.w += rot[i].w;
00177                  numGoodSamples+=1;
00178           }
00179 
00180   ROS_INFO("Number of accepted samples %f", numGoodSamples);
00181 
00182   transMean.x /= numGoodSamples;
00183   transMean.y /= numGoodSamples;
00184   transMean.z /= numGoodSamples;
00185   rotMean.x /= numGoodSamples;
00186   rotMean.y /= numGoodSamples;
00187   rotMean.z /= numGoodSamples;
00188   rotMean.w /= numGoodSamples;
00189 
00190 
00191   if (numh > numv) {
00192      rotMean.x = -.711;
00193      rotMean.y = -.008;
00194      rotMean.z = .005;
00195      rotMean.w = .703;
00196   } else {
00197      rotMean.x = 0;
00198      rotMean.y = 0;
00199      rotMean.z = 0;
00200      rotMean.w = 1;
00201   }
00202 
00203   marker.setOrigin(btVector3(transMean.x,transMean.y,transMean.z));
00204   marker.setRotation(btQuaternion(rotMean.x,rotMean.y,rotMean.z,rotMean.w).normalize());
00205   return marker;
00206 }


ias_drawer_executive
Author(s): Thomas Ruehr
autogenerated on Mon Oct 6 2014 08:59:20