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 <mitkClaronInterface.h>
00019 #include <string>
00020 #include <MTC.h>
00021 #include <math.h>
00022 #include <mitkVector.h>
00023
00024 mitk::ClaronInterface::ClaronInterface()
00025 {
00026 isTracking = false;
00027 sprintf(calibrationDir,"No calibration dir set yet");
00028 sprintf(markerDir,"No marker dir set yet");
00029 }
00030
00031 mitk::ClaronInterface::~ClaronInterface()
00032 {
00033
00034 }
00035
00036 void mitk::ClaronInterface::Initialize(std::string calibrationDir, std::string toolFilesDir)
00037 {
00038 sprintf(this->calibrationDir, calibrationDir.c_str());
00039 sprintf(this->markerDir,toolFilesDir.c_str());
00040 this->IdentifiedMarkers = 0;
00041 this->PoseXf = 0;
00042 this->CurrCamera = 0;
00043 this->IdentifyingCamera = 0;
00044 }
00045
00046
00047 bool mitk::ClaronInterface::StartTracking()
00048 {
00049 isTracking = false;
00050 MTC( Cameras_AttachAvailableCameras(calibrationDir) );
00051 if (Cameras_Count() < 1)
00052 {
00053 printf("No camera found!\n");
00054 return false;
00055 }
00056
00057 try
00058 {
00059
00060 MTC(Cameras_HistogramEqualizeImagesSet(true));
00061 MTC( Cameras_ItemGet(0, &CurrCamera) );
00062
00063
00064 MTC( Markers_LoadTemplates(markerDir) );
00065 printf("Loaded %d marker templates\n",Markers_TemplatesCount());
00066
00067
00068 for (int i=0; i<20; i++)
00069 {
00070 MTC( Cameras_GrabFrame(NULL) );
00071 MTC( Markers_ProcessFrame(NULL) );
00072 }
00073
00074
00075 IdentifiedMarkers = Collection_New();
00076 PoseXf = Xform3D_New();
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 }
00088 catch(...)
00089 {
00090 Cameras_Detach();
00091 printf(" Error while connecting MicronTracker!\n -------------------------------");
00092 return false;
00093 }
00094
00095 isTracking = true;
00096 return true;
00097 }
00098
00099 bool mitk::ClaronInterface::StopTracking()
00100 {
00101 if (isTracking)
00102 {
00103
00104 Collection_Free(IdentifiedMarkers);
00105 Xform3D_Free(PoseXf);
00106
00107
00108 Cameras_Detach();
00109
00110
00111 isTracking = false;
00112 return true;
00113 }
00114 else
00115 {
00116 return false;
00117 }
00118 }
00119
00120 std::vector<mitk::claronToolHandle> mitk::ClaronInterface::GetAllActiveTools()
00121 {
00122
00123 std::vector<claronToolHandle> returnValue;
00124
00125
00126
00127
00128
00129 MTC( Markers_IdentifiedMarkersGet(NULL, IdentifiedMarkers) );
00130
00131
00132 for (int j=1; j<=Collection_Count(IdentifiedMarkers); j++)
00133 {
00134
00135
00136 mtHandle Marker = Collection_Int(IdentifiedMarkers, j);
00137 returnValue.push_back(Marker);
00138 }
00139 return returnValue;
00140 }
00141
00142 void mitk::ClaronInterface::GrabFrame()
00143 {
00144 MTC( Cameras_GrabFrame(NULL) );
00145 MTC( Markers_ProcessFrame(NULL) );
00146 }
00147
00148 std::vector<double> mitk::ClaronInterface::GetTipPosition(mitk::claronToolHandle c)
00149 {
00150 std::vector<double> returnValue;
00151 double Position[3];
00152 mtHandle t2m = Xform3D_New();
00153 mtHandle t2c = Xform3D_New();
00154 mtHandle m2c = Xform3D_New();
00155
00156
00157 MTC( Marker_Marker2CameraXfGet (c, CurrCamera, m2c, &IdentifyingCamera) );
00158
00159 MTC( Marker_Tooltip2MarkerXfGet (c, t2m ));
00160
00161 MTC(Xform3D_Concatenate(t2m,m2c,t2c));
00162
00163
00164 MTC( Xform3D_ShiftGet(t2c, Position) );
00165
00166
00167
00168 returnValue.push_back(-Position[0]);
00169 returnValue.push_back(-Position[1]);
00170 returnValue.push_back(Position[2]);
00171
00172 return returnValue;
00173 }
00174
00175 std::vector<double> mitk::ClaronInterface::GetPosition(claronToolHandle c)
00176 {
00177 std::vector<double> returnValue;
00178 double Position[3];
00179 MTC( Marker_Marker2CameraXfGet (c, CurrCamera, PoseXf, &IdentifyingCamera) );
00180 MTC( Xform3D_ShiftGet(PoseXf, Position) );
00181
00182
00183
00184 returnValue.push_back(-Position[0]);
00185 returnValue.push_back(-Position[1]);
00186 returnValue.push_back(Position[2]);
00187
00188 return returnValue;
00189 }
00190
00191
00192 std::vector<double> mitk::ClaronInterface::GetTipQuaternions(claronToolHandle c)
00193 {
00194 std::vector<double> returnValue;
00195
00196 mtHandle t2m = Xform3D_New();
00197 mtHandle t2c = Xform3D_New();
00198 mtHandle m2c = Xform3D_New();
00199
00200
00201 MTC( Marker_Marker2CameraXfGet (c, CurrCamera, m2c, &IdentifyingCamera) );
00202
00203 MTC( Marker_Tooltip2MarkerXfGet (c, t2m ));
00204
00205 MTC(Xform3D_Concatenate(t2m,m2c,t2c));
00206
00207
00208 double Quarternions[4];
00209 MTC( Xform3D_RotQuaternionsGet(t2c, Quarternions) );
00210 mitk::Quaternion claronQuaternion;
00211
00212
00213 claronQuaternion[3] = Quarternions[0];
00214 claronQuaternion[0] = Quarternions[1];
00215 claronQuaternion[1] = Quarternions[2];
00216 claronQuaternion[2] = Quarternions[3];
00217
00218
00219
00220 mitk::Quaternion minusNinetyDegreeY;
00221 minusNinetyDegreeY[3] = sqrt(2.0)/2.0;
00222 minusNinetyDegreeY[0] = 0;
00223 minusNinetyDegreeY[1] = -1.0/(sqrt(2.0));
00224 minusNinetyDegreeY[2] = 0;
00225
00226
00227 mitk::Quaternion erg = (minusNinetyDegreeY*claronQuaternion);
00228
00229 returnValue.push_back(erg[3]);
00230 returnValue.push_back(erg[0]);
00231 returnValue.push_back(erg[1]);
00232 returnValue.push_back(erg[2]);
00233
00234 return returnValue;
00235 }
00236
00237 std::vector<double> mitk::ClaronInterface::GetQuaternions(claronToolHandle c)
00238 {
00239 std::vector<double> returnValue;
00240
00241 double Quarternions[4];
00242 MTC( Marker_Marker2CameraXfGet (c, CurrCamera, PoseXf, &IdentifyingCamera) );
00243 MTC( Xform3D_RotQuaternionsGet(PoseXf, Quarternions) );
00244
00245
00246 mitk::Quaternion claronQuaternion;
00247
00248
00249 claronQuaternion[3] = Quarternions[0];
00250 claronQuaternion[0] = Quarternions[1];
00251 claronQuaternion[1] = Quarternions[2];
00252 claronQuaternion[2] = Quarternions[3];
00253
00254
00255
00256 mitk::Quaternion minusNinetyDegreeY;
00257 minusNinetyDegreeY[3] = sqrt(2.0)/2.0;
00258 minusNinetyDegreeY[0] = 0;
00259 minusNinetyDegreeY[1] = -1.0/(sqrt(2.0));
00260 minusNinetyDegreeY[2] = 0;
00261
00262
00263 mitk::Quaternion erg = (minusNinetyDegreeY*claronQuaternion);
00264
00265 returnValue.push_back(erg[3]);
00266 returnValue.push_back(erg[0]);
00267 returnValue.push_back(erg[1]);
00268 returnValue.push_back(erg[2]);
00269
00270 return returnValue;
00271 }
00272
00273
00274
00275 const char* mitk::ClaronInterface::GetName(claronToolHandle c)
00276 {
00277 char MarkerName[MT_MAX_STRING_LENGTH];
00278 MTC( Marker_NameGet(c, MarkerName, MT_MAX_STRING_LENGTH, 0) );
00279 std::string* returnValue = new std::string(MarkerName);
00280 return returnValue->c_str();
00281 }
00282
00283 bool mitk::ClaronInterface::IsTracking()
00284 {
00285 return this->isTracking;
00286 }
00287
00288 bool mitk::ClaronInterface::IsMicronTrackerInstalled()
00289 {
00290 return true;
00291 }