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 #include "TrackAlgorithm.h"
00026 #include <boost/bind.hpp>
00027 #include <boost/thread.hpp>
00028 extern volatile bool g_stopall;
00029
00030
00031
00032 using namespace cop;
00033
00034
00035
00036
00037
00038 TrackAlgorithm::TrackAlgorithm (PerceptionPrimitive& sig, Evaluator* eval, Algorithm<std::vector<RelPose*> > *alg,
00039 ImageInputSystem* imageSys) :
00040 m_Running(true),
00041 m_alg(alg),
00042 m_curPrim(sig),
00043 m_imageSys( imageSys),
00044 m_eval(eval)
00045 {
00046 m_trackingThread = new boost::thread( boost::bind(&TrackAlgorithm::threadfunc, this));
00047 }
00048
00049
00050 TrackAlgorithm::~TrackAlgorithm ( )
00051 {
00052
00053 m_Running = false;
00054 if(m_trackingThread != NULL)
00055 m_trackingThread->join();
00056 delete m_trackingThread;
00057 m_curPrim.SetTerminated();
00058
00059
00060 }
00061
00062
00063
00064
00065
00066
00067
00068 void TrackAlgorithm::threadfunc()
00069 {
00070 bool resultReceived = false;
00071 Signature& object = *m_curPrim.GetSignature();
00072 RelPose* lastKnownPose = object.GetObjectPose();
00073 if(lastKnownPose == NULL)
00074 lastKnownPose = RelPoseFactory::FRelPoseWorld();
00075 std::vector<Sensor*> sensors = m_imageSys->GetBestSensor(*lastKnownPose);
00076 while(m_Running && !g_stopall)
00077 {
00078 int numOfObjects = 1;
00079 try
00080 {
00081
00082 #ifdef _DEBUG
00083 printf("Algorithm for track: %s (%p)\n",m_alg != NULL ? m_alg->GetName().c_str() : "NoName", m_alg );
00084 #endif
00085 if(m_alg != NULL)
00086 {
00087
00088 double qualityMeasure = 0.0;
00089 boost::xtime t0, t1;
00090 boost::xtime_get(&t0, boost::TIME_UTC);
00091 std::vector<RelPose*> pose = m_alg->Perform(sensors, lastKnownPose, object, numOfObjects, qualityMeasure);
00092 boost::xtime_get(&t1, boost::TIME_UTC);
00093 unsigned long time = ((1000000000 * (t1.sec - t0.sec))+(t1.nsec - t0.nsec));
00094 #ifdef _DEBUG
00095 printf("Calc time: %ld ns\n", time);
00096 #endif
00097 if(pose.size() > 0)
00098 {
00099 pose[0]->m_qualityMeasure = qualityMeasure;
00100 RelPose*& pose_curr = object.GetObjectPose();
00101 if(pose_curr != NULL && pose_curr->m_uniqueID != ID_WORLD && resultReceived)
00102 {
00103 RelPose* temp = pose[0];
00104 printf("temp id: %ld", pose[0]->m_uniqueID);
00105
00106 pose[0] = RelPoseFactory::FRelPose(pose_curr, temp->m_parentID, temp->GetMatrix(0), temp->GetCovarianceMatrix());
00107 pose[0]->m_qualityMeasure = qualityMeasure;
00108
00109 }
00110 object.SetPose(pose[0]);
00111 printf("Sent %ld\n", pose[0]->m_uniqueID);
00112 if(!resultReceived)
00113 {
00114 m_curPrim.AddResult(m_alg, m_eval, object.m_ID, qualityMeasure, time);
00115 resultReceived = true;
00116 }
00117 }
00118 else
00119 {
00120 object.SetPose(NULL);
00121 }
00122 }
00123 }
00124 catch(char const* message)
00125 {
00126 printf("Error in Locate: %s\n", message);
00127 }
00129 lastKnownPose = object.GetObjectPose();
00131 sensors[0]->WaitForNewData();
00132 }
00133 }
00134
00135 XMLTag* TrackAlgorithm::Save()
00136 {
00137 return NULL;
00138 }
00139