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 #include "mitkClaronTrackingDevice.h"
00019 #include "mitkClaronTool.h"
00020 #include "mitkIGTConfig.h"
00021 #include "mitkTimeStamp.h"
00022 #include <itksys/SystemTools.hxx>
00023 #include <iostream>
00024 #include <itkMutexLockHolder.h>
00025
00026 typedef itk::MutexLockHolder<itk::FastMutexLock> MutexLockHolder;
00027
00028
00029 mitk::ClaronTrackingDevice::ClaronTrackingDevice(): mitk::TrackingDevice()
00030 {
00031
00032 this->m_Type = ClaronMicron;
00033
00034 this->m_MultiThreader = itk::MultiThreader::New();
00035 m_ThreadID = 0;
00036
00037 m_Device = mitk::ClaronInterface::New();
00038
00039 if (m_Device->IsMicronTrackerInstalled())
00040 {
00041 #ifdef MITK_MICRON_TRACKER_TEMP_DIR
00042 m_ToolfilesDir = std::string(MITK_MICRON_TRACKER_TEMP_DIR);
00043 #endif
00044 #ifdef MITK_MICRON_TRACKER_CALIBRATION_DIR
00045 m_CalibrationDir = std::string(MITK_MICRON_TRACKER_CALIBRATION_DIR);
00046 #endif
00047 }
00048 else
00049 {
00050 m_ToolfilesDir = "Error - No Microntracker installed";
00051 m_CalibrationDir = "Error - No Microntracker installed";
00052 }
00053
00054 m_Device->Initialize(m_CalibrationDir, m_ToolfilesDir);
00055 }
00056
00057
00058 mitk::ClaronTrackingDevice::~ClaronTrackingDevice()
00059 {
00060 }
00061
00062
00063 mitk::TrackingTool* mitk::ClaronTrackingDevice::AddTool( const char* toolName, const char* fileName )
00064 {
00065 mitk::ClaronTool::Pointer t = mitk::ClaronTool::New();
00066 if (t->LoadFile(fileName) == false)
00067 return NULL;
00068 t->SetToolName(toolName);
00069 if (this->InternalAddTool(t) == false)
00070 return NULL;
00071 return t.GetPointer();
00072 }
00073
00074
00075 bool mitk::ClaronTrackingDevice::InternalAddTool(ClaronTool::Pointer tool)
00076 {
00077 m_AllTools.push_back(tool);
00078 return true;
00079 }
00080
00081
00082 std::vector<mitk::ClaronTool::Pointer> mitk::ClaronTrackingDevice::DetectTools()
00083 {
00084 std::vector<mitk::ClaronTool::Pointer> returnValue;
00085 std::vector<claronToolHandle> allHandles = m_Device->GetAllActiveTools();
00086 for (std::vector<claronToolHandle>::iterator iter = allHandles.begin(); iter != allHandles.end(); ++iter)
00087 {
00088 ClaronTool::Pointer newTool = ClaronTool::New();
00089 newTool->SetToolName(m_Device->GetName(*iter));
00090 newTool->SetCalibrationName(m_Device->GetName(*iter));
00091 newTool->SetToolHandle(*iter);
00092 returnValue.push_back(newTool);
00093 }
00094 return returnValue;
00095 }
00096
00097
00098 bool mitk::ClaronTrackingDevice::StartTracking()
00099 {
00100
00101
00102 if (!m_Device->IsMicronTrackerInstalled())
00103 return false;
00104
00105
00106
00107 itksys::SystemTools::RemoveADirectory(m_ToolfilesDir.c_str());
00108 itksys::SystemTools::MakeDirectory(m_ToolfilesDir.c_str());
00109
00110
00111 for (unsigned int i=0; i<m_AllTools.size(); i++)
00112 {
00113 itksys::SystemTools::CopyAFile(m_AllTools[i]->GetFile().c_str(), m_ToolfilesDir.c_str());
00114 }
00115 this->SetState(Tracking);
00116 this->m_StopTrackingMutex->Lock();
00117 this->m_StopTracking = false;
00118 this->m_StopTrackingMutex->Unlock();
00119
00120
00121 m_Device->StopTracking();
00122 m_Device->Initialize(m_CalibrationDir,m_ToolfilesDir);
00123
00124 m_TrackingFinishedMutex->Unlock();
00125
00126 if (m_Device->StartTracking())
00127 {
00128 mitk::TimeStamp::GetInstance()->Start(this);
00129 m_ThreadID = m_MultiThreader->SpawnThread(this->ThreadStartTracking, this);
00130 return true;
00131 }
00132 else
00133 {
00134 m_ErrorMessage = "Error while trying to start the device!";
00135 return false;
00136 }
00137 }
00138
00139
00140 bool mitk::ClaronTrackingDevice::StopTracking()
00141 {
00142 Superclass::StopTracking();
00143
00144 itksys::SystemTools::RemoveADirectory(m_ToolfilesDir.c_str());
00145 itksys::SystemTools::MakeDirectory(m_ToolfilesDir.c_str());
00146 return true;
00147 }
00148
00149
00150 unsigned int mitk::ClaronTrackingDevice::GetToolCount() const
00151 {
00152 return (unsigned int)this->m_AllTools.size();
00153 }
00154
00155
00156 mitk::TrackingTool* mitk::ClaronTrackingDevice::GetTool(unsigned int toolNumber) const
00157 {
00158 if ( toolNumber >= this->GetToolCount())
00159 return NULL;
00160 else
00161 return this->m_AllTools[toolNumber];
00162 }
00163
00164
00165 bool mitk::ClaronTrackingDevice::OpenConnection()
00166 {
00167 bool returnValue;
00168
00169 itksys::SystemTools::MakeDirectory(m_ToolfilesDir.c_str());
00170
00171 m_Device->Initialize(m_CalibrationDir,m_ToolfilesDir);
00172
00173 returnValue = m_Device->StartTracking();
00174
00175 if (returnValue)
00176 {
00177 this->SetState(Ready);
00178 }
00179 else
00180 {
00181
00182 if (m_Device.IsNull())
00183 {
00184 m_Device = mitk::ClaronInterface::New();
00185 m_Device->Initialize(m_CalibrationDir, m_ToolfilesDir);
00186 }
00187 m_Device->StopTracking();
00188 this->SetState(Setup);
00189 m_ErrorMessage = "Error while trying to open connection to the MicronTracker.";
00190 }
00191 return returnValue;
00192 }
00193
00194
00195 bool mitk::ClaronTrackingDevice::CloseConnection()
00196 {
00197 bool returnValue = true;
00198 if (this->GetState() == Setup)
00199 return true;
00200
00201 returnValue = m_Device->StopTracking();
00202
00203
00204 itksys::SystemTools::RemoveADirectory(m_ToolfilesDir.c_str());
00205
00206 this->SetState(Setup);
00207 return returnValue;
00208 }
00209
00210
00211 mitk::ClaronInterface* mitk::ClaronTrackingDevice::GetDevice()
00212 {
00213 return m_Device;
00214 }
00215
00216
00217 std::vector<mitk::ClaronTool::Pointer> mitk::ClaronTrackingDevice::GetAllTools()
00218 {
00219 return this->m_AllTools;
00220 }
00221
00222
00223 void mitk::ClaronTrackingDevice::TrackTools()
00224 {
00225 try
00226 {
00227
00228 MutexLockHolder trackingFinishedLockHolder(*m_TrackingFinishedMutex);
00229
00230 bool localStopTracking;
00231 this->m_StopTrackingMutex->Lock();
00232 localStopTracking = this->m_StopTracking;
00233 this->m_StopTrackingMutex->Unlock();
00234
00235 while ((this->GetState() == Tracking) && (localStopTracking == false))
00236 {
00237 this->GetDevice()->GrabFrame();
00238
00239 std::vector<mitk::ClaronTool::Pointer> detectedTools = this->DetectTools();
00240 std::vector<mitk::ClaronTool::Pointer> allTools = this->GetAllTools();
00241 std::vector<mitk::ClaronTool::Pointer>::iterator itAllTools;
00242 for(itAllTools = allTools.begin(); itAllTools != allTools.end(); itAllTools++)
00243 {
00244 mitk::ClaronTool::Pointer currentTool = *itAllTools;
00245
00246
00247 std::vector<mitk::ClaronTool::Pointer>::iterator itDetectedTools;
00248 bool foundTool = false;
00249 for(itDetectedTools = detectedTools.begin(); itDetectedTools != detectedTools.end(); itDetectedTools++)
00250 {
00251 mitk::ClaronTool::Pointer aktuDet = *itDetectedTools;
00252 std::string tempString(currentTool->GetCalibrationName());
00253 if (tempString.compare(aktuDet->GetCalibrationName())==0)
00254 {
00255 currentTool->SetToolHandle(aktuDet->GetToolHandle());
00256 foundTool = true;
00257 }
00258 }
00259 if (!foundTool)
00260 {
00261 currentTool->SetToolHandle(0);
00262 }
00263
00264 if (currentTool->GetToolHandle() != 0)
00265 {
00266 currentTool->SetDataValid(true);
00267
00268 std::vector<double> pos_vector = this->GetDevice()->GetTipPosition(currentTool->GetToolHandle());
00269
00270 mitk::Point3D pos;
00271 pos[0] = pos_vector[0];
00272 pos[1] = pos_vector[1];
00273 pos[2] = pos_vector[2];
00274 currentTool->SetPosition(pos);
00275
00276 std::vector<double> quat = this->GetDevice()->GetTipQuaternions(currentTool->GetToolHandle());
00277
00278 mitk::Quaternion orientation(quat[1], quat[2], quat[3], quat[0]);
00279 currentTool->SetOrientation(orientation);
00280 }
00281 else
00282 {
00283 mitk::Point3D origin;
00284 origin.Fill(0);
00285 currentTool->SetPosition(origin);
00286 currentTool->SetOrientation(mitk::Quaternion(0,0,0,0));
00287 currentTool->SetDataValid(false);
00288 }
00289 }
00290
00291 this->m_StopTrackingMutex->Lock();
00292 localStopTracking = m_StopTracking;
00293 this->m_StopTrackingMutex->Unlock();
00294 }
00295 }
00296 catch(...)
00297 {
00298 this->StopTracking();
00299 this->SetErrorMessage("Error while trying to track tools. Thread stopped.");
00300 }
00301 }
00302
00303
00304 bool mitk::ClaronTrackingDevice::IsMicronTrackerInstalled()
00305 {
00306 return this->m_Device->IsMicronTrackerInstalled();
00307 }
00308
00309
00310 ITK_THREAD_RETURN_TYPE mitk::ClaronTrackingDevice::ThreadStartTracking(void* pInfoStruct)
00311 {
00312
00313 struct itk::MultiThreader::ThreadInfoStruct * pInfo = (struct itk::MultiThreader::ThreadInfoStruct*)pInfoStruct;
00314 if (pInfo == NULL)
00315 {
00316 return ITK_THREAD_RETURN_VALUE;
00317 }
00318 if (pInfo->UserData == NULL)
00319 {
00320 return ITK_THREAD_RETURN_VALUE;
00321 }
00322 ClaronTrackingDevice *trackingDevice = (ClaronTrackingDevice*)pInfo->UserData;
00323
00324 if (trackingDevice != NULL)
00325 trackingDevice->TrackTools();
00326
00327 return ITK_THREAD_RETURN_VALUE;
00328 }