DTrackSDK  v2.9.0
example_communicating.cpp
1 /* DTrackSDK in C++: example_communicating.cpp
2  *
3  * C++ example using DTrackSDK to control DTrack2/DTRACK3 Controller.
4  *
5  * Copyright (c) 2005-2023 Advanced Realtime Tracking GmbH & Co. KG
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright
11  * notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  * notice, this list of conditions and the following disclaimer in the
14  * documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of copyright holder nor the names of its contributors
16  * may be used to endorse or promote products derived from this software
17  * without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  * Purpose:
31  * - example with DTrack2/DTRACK3 remote commands:
32  * starts measurement, collects some frames and stops measurement again
33  * - for DTrackSDK v2.9.0 (or newer)
34  */
35 
36 #include "DTrackSDK.hpp"
37 
38 #include <iostream>
39 #include <sstream>
40 #include <iomanip>
41 
42 // global DTrackSDK
43 static DTrackSDK* dt = NULL;
44 
45 // prototypes
46 static void output_to_console();
47 static bool data_error_to_console();
48 static void messages_to_console();
49 
50 
54 int main( int argc, char** argv )
55 {
56  if ( argc != 3 )
57  {
58  std::cout << "Usage: example_communicating <server host> <data port>" << std::endl;
59  return -1;
60  }
61 
62  std::istringstream portstream( argv[ 2 ] );
63  unsigned short port;
64  portstream >> port; // data port
65 
66  if ( portstream.fail() )
67  {
68  std::cout << "invalid port '" << argv[ 2 ] << "'" << std::endl;
69  return -2;
70  }
71 
72  // initialization:
73 
74  dt = new DTrackSDK( (const char *)argv[ 1 ], port );
75 
76  if ( ! dt->isDataInterfaceValid() || ! dt->isCommandInterfaceValid() )
77  {
78  std::cout << "DTrackSDK init error" << std::endl;
79  delete dt;
80  return -3;
81  }
82  std::cout << "connected to ATC '" << argv[ 1 ] << "', listening at local data port " << dt->getDataPort() << std::endl;
83 
84 // dt->setCommandTimeoutUS( 30000000 ); // NOTE: change here timeout for exchanging commands, if necessary
85 // dt->setDataTimeoutUS( 3000000 ); // NOTE: change here timeout for receiving tracking data, if necessary
86 // dt->setDataBufferSize( 100000 ); // NOTE: change here buffer size for receiving tracking data, if necessary
87 
88  if ( ! dt->isCommandInterfaceFullAccess() ) // ensure full access for DTrack2/DTRACK3 commands
89  {
90  std::cout << "Full access to ATC required!" << std::endl; // maybe DTrack2/3 frontend is still connected to ATC
91  data_error_to_console();
92  messages_to_console();
93  delete dt;
94  return -10;
95  }
96 
97  // request some settings:
98 
99  std::string par;
100  bool isOk = dt->getParam( "config", "active_config", par ); // ask active configuration, just for example
101  if ( ! isOk )
102  {
103  std::cout << "Reading parameter failed!" << std::endl;
104  data_error_to_console();
105  messages_to_console();
106  delete dt;
107  return -10;
108  }
109  std::cout << " active configuration: '" << par << "'" << std::endl;
110 
111  // measurement:
112 
113  if ( ! dt->startMeasurement() ) // start measurement
114  {
115  std::cout << "Measurement start failed!" << std::endl;
116  data_error_to_console();
117  messages_to_console();
118  delete dt;
119  return -4;
120  }
121 
122  int count = 0;
123  while ( count++ < 1000 ) // collect 1000 frames
124  {
125  if ( dt->receive() )
126  {
127  output_to_console();
128  }
129  else
130  {
131  data_error_to_console();
132  messages_to_console();
133  }
134 
135  if ( count % 100 == 1 )
136  messages_to_console();
137  }
138 
139  dt->stopMeasurement(); // stop measurement
140  messages_to_console();
141 
142  delete dt; // clean up
143  return 0;
144 }
145 
146 
150 static void output_to_console()
151 {
152  std::cout.precision( 3 );
153  std::cout.setf( std::ios::fixed, std::ios::floatfield );
154 
155  std::cout << std::endl << "frame " << dt->getFrameCounter() << " ts " << dt->getTimeStamp()
156  << " ets " << dt->getTimeStampSec() << "." << std::setfill( '0' ) << std::setw( 6 ) << dt->getTimeStampUsec()
157  << " lat " << dt->getLatencyUsec()
158  << std::endl;
159 
160  std::cout << " nbod " << dt->getNumBody() << " nfly " << dt->getNumFlyStick()
161  << " nmea " << dt->getNumMeaTool() << " nmearef " << dt->getNumMeaRef()
162  << " nhand " << dt->getNumHand() << " nmar " << dt->getNumMarker()
163  << " nhuman " << dt->getNumHuman() << " ninertial " << dt->getNumInertial()
164  << " status " << ( dt->isStatusAvailable() ? "yes" : "no" )
165  << std::endl;
166 
167  // Standard bodies:
168  for ( int i = 0; i < dt->getNumBody(); i++ )
169  {
170  const DTrackBody* body = dt->getBody( i );
171  if ( body == NULL )
172  {
173  std::cout << "DTrackSDK fatal error: invalid body id " << i << std::endl;
174  break;
175  }
176 
177  if ( ! body->isTracked() )
178  {
179  std::cout << "bod " << body->id << " not tracked" << std::endl;
180  }
181  else
182  {
183  std::cout << "bod " << body->id << " qu " << body->quality
184  << " loc " << body->loc[ 0 ] << " " << body->loc[ 1 ] << " " << body->loc[ 2 ]
185  << " rot " << body->rot[ 0 ] << " " << body->rot[ 1 ] << " " << body->rot[ 2 ]
186  << " " << body->rot[ 3 ] << " " << body->rot[ 4 ] << " " << body->rot[ 5 ]
187  << " " << body->rot[ 6 ] << " " << body->rot[ 7 ] << " " << body->rot[ 8 ]
188  << std::endl;
189 
190  DTrackQuaternion quat = body->getQuaternion();
191  std::cout << "bod " << body->id << " quatw " << quat.w
192  << " quatxyz " << quat.x << " " << quat.y << " " << quat.z << std::endl;
193  }
194  }
195 
196  // A.R.T. Flysticks:
197  for ( int i = 0; i < dt->getNumFlyStick(); i++ )
198  {
199  const DTrackFlyStick* flystick = dt->getFlyStick( i );
200  if ( flystick == NULL )
201  {
202  std::cout << "DTrackSDK fatal error: invalid Flystick id " << i << std::endl;
203  break;
204  }
205 
206  if ( ! flystick->isTracked() )
207  {
208  std::cout << "fly " << flystick->id << " not tracked" << std::endl;
209  }
210  else
211  {
212  std::cout << "flystick " << flystick->id << " qu " << flystick->quality
213  << " loc " << flystick->loc[ 0 ] << " " << flystick->loc[ 1 ] << " " << flystick->loc[ 2 ]
214  << " rot " << flystick->rot[ 0 ] << " " << flystick->rot[ 1 ] << " " << flystick->rot[ 2 ]
215  << " " << flystick->rot[ 3 ] << " " << flystick->rot[ 4 ] << " " << flystick->rot[ 5 ]
216  << " " << flystick->rot[ 6 ] << " " << flystick->rot[ 7 ] << " " << flystick->rot[ 8 ]
217  << std::endl;
218  }
219 
220  std::cout << " btn";
221  for ( int j = 0; j < flystick->num_button; j++ )
222  {
223  std::cout << " " << flystick->button[ j ];
224  }
225  std::cout << " joy";
226  for ( int j = 0; j < flystick->num_joystick; j++ )
227  {
228  std::cout << " " << flystick->joystick[ j ];
229  }
230  std::cout << std::endl;
231  }
232 
233  // Measurement tools:
234  for ( int i = 0; i < dt->getNumMeaTool(); i++ )
235  {
236  const DTrackMeaTool* meatool = dt->getMeaTool( i );
237  if ( meatool == NULL )
238  {
239  std::cout << "DTrackSDK fatal error: invalid Measurement tool id " << i << std::endl;
240  break;
241  }
242 
243  if ( ! meatool->isTracked() )
244  {
245  std::cout << "mea " << meatool->id << " not tracked" << std::endl;
246  }
247  else
248  {
249  std::cout << "mea " << meatool->id << " qu " << meatool->quality
250  << " loc " << meatool->loc[ 0 ] << " " << meatool->loc[ 1 ] << " " << meatool->loc[ 2 ]
251  << " rot " << meatool->rot[ 0 ] << " " << meatool->rot[ 1 ] << " " << meatool->rot[ 2 ]
252  << " " << meatool->rot[ 3 ] << " " << meatool->rot[ 4 ] << " " << meatool->rot[ 5 ]
253  << " " << meatool->rot[ 6 ] << " " << meatool->rot[ 7 ] << " " << meatool->rot[ 8 ]
254  << std::endl;
255  }
256 
257  if ( meatool->tipradius > 0.0 )
258  {
259  std::cout << " radius " << meatool->tipradius << std::endl;
260  }
261 
262  if ( meatool->num_button > 0 )
263  {
264  std::cout << " btn";
265  for ( int j = 0; j < meatool->num_button; j++ )
266  {
267  std::cout << " " << meatool->button[ j ];
268  }
269  std::cout << std::endl;
270  }
271  }
272 
273  // Measurement references:
274  for ( int i = 0; i < dt->getNumMeaRef(); i++ )
275  {
276  const DTrackMeaRef* mearef = dt->getMeaRef( i );
277  if ( mearef == NULL )
278  {
279  std::cout << "DTrackSDK fatal error: invalid Measurement reference id " << i << std::endl;
280  break;
281  }
282 
283  if ( ! mearef->isTracked() )
284  {
285  std::cout << "mearef " << mearef->id << " not tracked" << std::endl;
286  }
287  else
288  {
289  std::cout << "mearef " << mearef->id << " qu " << mearef->quality
290  << " loc " << mearef->loc[ 0 ] << " " << mearef->loc[ 1 ] << " " << mearef->loc[ 2 ]
291  << " rot " << mearef->rot[ 0 ] << " " << mearef->rot[ 1 ] << " " << mearef->rot[ 2 ]
292  << " " << mearef->rot[ 3 ] << " " << mearef->rot[ 4 ] << " " << mearef->rot[ 5 ]
293  << " " << mearef->rot[ 6 ] << " " << mearef->rot[ 7 ] << " " << mearef->rot[ 8 ]
294  << std::endl;
295  }
296  }
297 
298  // Single markers:
299  for ( int i = 0; i < dt->getNumMarker(); i++ )
300  {
301  const DTrackMarker* marker = dt->getMarker( i );
302  if ( marker == NULL )
303  {
304  std::cout << "DTrackSDK fatal error: invalid marker index " << i << std::endl;
305  break;
306  }
307 
308  std::cout << "mar " << marker->id << " qu " << marker->quality
309  << " loc " << marker->loc[ 0 ] << " " << marker->loc[ 1 ] << " " << marker->loc[ 2 ]
310  << std::endl;
311  }
312 
313  // A.R.T. FINGERTRACKING hands:
314  for ( int i = 0; i < dt->getNumHand(); i++ )
315  {
316  const DTrackHand* hand = dt->getHand( i );
317  if ( hand == NULL )
318  {
319  std::cout << "DTrackSDK fatal error: invalid FINGERTRACKING id " << i << std::endl;
320  break;
321  }
322 
323  if ( ! hand->isTracked() )
324  {
325  std::cout << "hand " << hand->id << " not tracked" << std::endl;
326  }
327  else
328  {
329  std::cout << "hand " << hand->id << " qu " << hand->quality
330  << " lr " << ( ( hand->lr == 0 ) ? "left" : "right") << " nf " << hand->nfinger
331  << " loc " << hand->loc[ 0 ] << " " << hand->loc[ 1 ] << " " << hand->loc[ 2 ]
332  << " rot " << hand->rot[ 0 ] << " " << hand->rot[ 1 ] << " " << hand->rot[ 2 ]
333  << " " << hand->rot[ 3 ] << " " << hand->rot[ 4 ] << " " << hand->rot[ 5 ]
334  << " " << hand->rot[ 6 ] << " " << hand->rot[ 7 ] << " " << hand->rot[ 8 ]
335  << std::endl;
336 
337  for ( int j = 0; j < hand->nfinger; j++ )
338  {
339  std::cout << " fi " << j
340  << " loc " << hand->finger[ j ].loc[ 0 ] << " " << hand->finger[ j ].loc[ 1 ] << " " << hand->finger[ j ].loc[ 2 ]
341  << " rot " << hand->finger[ j ].rot[ 0 ] << " " << hand->finger[ j ].rot[ 1 ] << " " << hand->finger[ j ].rot[ 2 ]
342  << " " << hand->finger[ j ].rot[ 3 ] << " " << hand->finger[ j ].rot[ 4 ] << " " << hand->finger[ j ].rot[ 5 ]
343  << " " << hand->finger[ j ].rot[ 6 ] << " " << hand->finger[ j ].rot[ 7 ] << " " << hand->finger[ j ].rot[ 8 ]
344  << std::endl;
345  std::cout << " fi " << j
346  << " tip " << hand->finger[ j ].radiustip
347  << " pha " << hand->finger[ j ].lengthphalanx[ 0 ] << " " << hand->finger[ j ].lengthphalanx[ 1 ]
348  << " " << hand->finger[ j ].lengthphalanx[ 2 ]
349  << " ang " << hand->finger[ j ].anglephalanx[ 0 ] << " " << hand->finger[ j ].anglephalanx[ 1 ]
350  << std::endl;
351  }
352  }
353  }
354 
355  // A.R.T human models:
356  if ( dt->getNumHuman() < 1 )
357  {
358  std::cout << "no human model data" << std::endl;
359  }
360 
361  for ( int i = 0; i < dt->getNumHuman(); i++ )
362  {
363  const DTrackHuman* human = dt->getHuman( i );
364  if ( human == NULL )
365  {
366  std::cout << "DTrackSDK fatal error: invalid human model id " << i << std::endl;
367  break;
368  }
369 
370  if ( ! human->isTracked() )
371  {
372  std::cout << "human " << human->id << " not tracked" << std::endl;
373  }
374  else
375  {
376  std::cout << "human " << human->id << " num joints " << human->num_joints << std::endl;
377  for ( int j = 0; j < human->num_joints; j++ )
378  {
379  if ( ! human->joint[ j ].isTracked() )
380  {
381  std::cout << "joint " << human->joint[ j ].id << " not tracked" << std::endl;
382  }
383  else
384  {
385  std::cout << "joint " << human->joint[ j ].id << " qu " << human->joint[j].quality
386  << " loc " << human->joint[ j ].loc[ 0 ] << " " << human->joint[j].loc[ 1 ] << " " << human->joint[ j ].loc[ 2 ]
387  << " rot " << human->joint[ j ].rot[ 0 ] << " " << human->joint[j].rot[ 1 ] << " " << human->joint[ j ].rot[ 2 ]
388  << " " << human->joint[ j ].rot[ 3 ] << " " << human->joint[j].rot[ 4 ] << " " << human->joint[ j ].rot[ 5 ]
389  << " " << human->joint[ j ].rot[ 6 ] << " " << human->joint[j].rot[ 7 ] << " " << human->joint[ j ].rot[ 8 ]
390  << std::endl;
391  }
392  }
393  }
394  std::cout << std::endl;
395  }
396 
397  // Hybrid bodies:
398  if ( dt->getNumInertial() < 1 )
399  {
400  std::cout << "no inertial body data" << std::endl;
401  }
402 
403  for ( int i = 0; i < dt->getNumInertial(); i++ )
404  {
405  const DTrackInertial* inertial = dt->getInertial( i );
406  if ( inertial == NULL )
407  {
408  std::cout << "DTrackSDK fatal error: invalid hybrid body id " << i << std::endl;
409  break;
410  }
411 
412  std::cout << " inertial body " << inertial->id << " st " << inertial->st << " error " << inertial->error << std::endl;
413  if ( inertial->isTracked() )
414  {
415  std::cout << " loc " << inertial->loc[ 0 ] << " " << inertial->loc[ 1 ] << " " << inertial->loc[ 2 ]
416  << " rot " << inertial->rot[ 0 ] << " " << inertial->rot[ 1 ] << " " << inertial->rot[ 2 ]
417  << " " << inertial->rot[ 3 ] << " " << inertial->rot[ 4 ] << " " << inertial->rot[ 5 ]
418  << " " << inertial->rot[ 6 ] << " " << inertial->rot[ 7 ] << " " << inertial->rot[ 8 ]
419  << std::endl;
420  }
421  }
422 
423  // System status:
424  if ( ! dt->isStatusAvailable() )
425  {
426  std::cout << "no system status data" << std::endl;
427  }
428  else
429  {
430  const DTrackStatus* status = dt->getStatus();
431  if ( status == NULL )
432  {
433  std::cout << "DTrackSDK fatal error: invalid system status" << std::endl;
434  }
435  else
436  {
437  // general status values
438  std::cout << "status gen nc " << status->numCameras
439  << " nb " << status->numTrackedBodies << " nm " << status->numTrackedMarkers << std::endl;
440 
441  // message statistics
442  std::cout << "status msg nce " << status->numCameraErrorMessages << " ncw " << status->numCameraWarningMessages
443  << " noe " << status->numOtherErrorMessages << " now " << status->numOtherWarningMessages
444  << " ni " << status->numInfoMessages << std::endl;
445 
446  // camera status values
447  for ( int i = 0; i < status->numCameras; i++ )
448  {
449  std::cout << "status cam " << status->cameraStatus[ i ].idCamera
450  << " ns " << status->cameraStatus[ i ].numReflections
451  << " nu " << status->cameraStatus[ i ].numReflectionsUsed
452  << " mi " << status->cameraStatus[ i ].maxIntensity << std::endl;
453  }
454  }
455  }
456 }
457 
458 
464 static bool data_error_to_console()
465 {
466  bool ret = true;
467 
468  if ( dt->getLastDataError() != DTrackSDK::ERR_NONE )
469  {
471  {
472  std::cout << "--- timeout while waiting for tracking data" << std::endl;
473  }
474  else if ( dt->getLastDataError() == DTrackSDK::ERR_NET )
475  {
476  std::cout << "--- error while receiving tracking data" << std::endl;
477  }
478  else if ( dt->getLastDataError() == DTrackSDK::ERR_PARSE )
479  {
480  std::cout << "--- error while parsing tracking data" << std::endl;
481  }
482 
483  ret = false;
484  }
485 
487  {
489  {
490  std::cout << "--- timeout while waiting for Controller command" << std::endl;
491  }
492  else if ( dt->getLastServerError() == DTrackSDK::ERR_NET )
493  {
494  std::cout << "--- error while receiving Controller command" << std::endl;
495  }
496  else if ( dt->getLastServerError() == DTrackSDK::ERR_PARSE )
497  {
498  std::cout << "--- error while parsing Controller command" << std::endl;
499  }
500 
501  ret = false;
502  }
503 
504  return ret;
505 }
506 
507 
511 static void messages_to_console()
512 {
513  while ( dt->getMessage() )
514  {
515  std::cout << "ATC message: \"" << dt->getMessageStatus() << "\" \"" << dt->getMessageMsg() << "\"" << std::endl;
516  }
517 }
518 
double getTimeStamp() const
Get timestamp since midnight.
int getNumFlyStick() const
Get number of calibrated Flysticks.
double loc[3]
Location (in [mm])
const DTrackFlyStick * getFlyStick(int id) const
Get Flystick data.
const DTrackMeaTool * getMeaTool(int id) const
Get Measurement Tool data.
int getNumBody() const
Get number of calibrated standard bodies (as far as known).
bool receive()
Receive and process one tracking data packet.
Definition: DTrackSDK.cpp:441
bool isStatusAvailable() const
Returns if system status data is available.
double rot[9]
Rotation matrix (column-wise)
double loc[3]
Location (in [mm])
unsigned short getDataPort() const
Get UDP data port where tracking data is received.
Definition: DTrackSDK.cpp:321
int numOtherWarningMessages
Number of other warning messages (since booting)
int lr
Left (0) or right (1) hand.
bool isCommandInterfaceFullAccess()
Returns if TCP connection has full access for DTrack2/DTRACK3 commands.
Definition: DTrackSDK.cpp:341
double loc[3]
Location (in [mm])
double loc[3]
Location (in [mm])
Single marker data (3DOF).
double x
Quaternion component x.
double quality
Quality (0.0 <= qu <= 1.0, no tracking if -1.0)
int getNumHand() const
Get number of calibrated A.R.T. FINGERTRACKING hands (as far as known).
A.R.T. Flystick data (6DOF + buttons).
Hybrid (optical-inertial) body data (6DOF).
double error
Drift error estimate (only during inertial tracking, in [deg])
bool isTracked() const
Returns if joint is currently tracked.
std::vector< DTrackCameraStatus > cameraStatus
Camera status.
double quality
Quality of joint (0.0 <= qu <= 1.0, no tracking if -1.0)
Measurement Tool data (6DOF + buttons).
A.R.T. FINGERTRACKING hand data (6DOF + fingers).
int numInfoMessages
Number of info messages (since booting)
int numTrackedBodies
Number of currently tracked 6DOF bodies.
const DTrackBody * getBody(int id) const
Get standard body data.
bool isTracked() const
Returns if Measurement Tool reference is currently tracked.
struct DTrackSDK_Datatypes::DTrackHuman::DTrackJoint joint[DTRACKSDK_HUMAN_MAX_JOINTS]
Joint data.
double y
Quaternion component y.
int nfinger
Number of fingers (maximum 5)
double quality
Quality (0.0 <= qu <= 1.0, no tracking if -1.0)
double rot[9]
Rotation matrix of outermost phalanx (column-wise)
double loc[3]
Location of tip (in [mm])
int id
ID number (starting with 0)
double quality
Quality (0.0 <= qu <= 1.0, no tracking if -1.0)
const DTrackMeaRef * getMeaRef(int id) const
Get Measurement Tool reference data.
bool getParam(const std::string &category, const std::string &name, std::string &value)
Get DTrack2/DTRACK3 parameter.
Definition: DTrackSDK.cpp:826
DTrack SDK main class derived from DTrackParser.
Definition: DTrackSDK.hpp:77
int id
ID number (starting with 1)
const DTrackMarker * getMarker(int index) const
Get single marker data.
unsigned int getLatencyUsec() const
Get latency (delay between exposure and sending UDP data in Controller).
int getNumMeaRef() const
Get number of calibrated Measurement Tool references.
double anglephalanx[2]
Angle between phalanxes (order: outermost, innermost; in [deg])
int st
State of hybrid body (0: not tracked, 1: inertial tracking, 2: optical tracking, 3: inertial and opti...
bool isTracked() const
Returns if body is currently tracked.
std::string getMessageStatus() const
Get status of last DTrack2/DTRACK3 event message.
Definition: DTrackSDK.cpp:949
double tipradius
Radius of tip (in [mm]) if applicable.
double rot[9]
Rotation matrix (column-wise)
int numCameraWarningMessages
Number of camera-related warning messages (since booting)
int id
ID number of joint (starting with 0)
int numOtherErrorMessages
Number of other error messages (since booting)
double lengthphalanx[3]
Length of phalanxes (order: outermost, middle, innermost; in [mm])
int getNumMarker() const
Get number of tracked single markers.
double loc[3]
Location of joint (in [mm])
unsigned int getFrameCounter() const
Get frame counter.
double rot[9]
Rotation matrix (column-wise)
unsigned int getTimeStampUsec() const
Get timestamp since Unix epoch (1970-01-01 00:00:00), microseconds.
int id
ID number (starting with 0)
const DTrackHuman * getHuman(int id) const
Get ART-Human model data.
int id
ID number (starting with 0)
Errors getLastServerError() const
Get last error at exchanging commands with Controller (command transmission).
Definition: DTrackSDK.cpp:558
bool isCommandInterfaceValid() const
Returns if TCP connection for DTrack2/DTRACK3 commands is active.
Definition: DTrackSDK.cpp:330
double quality
Quality (0.0 <= qu <= 1.0, no tracking if -1.0)
double quality
Quality (0.0 <= qu <= 1.0, no tracking if -1.0)
unsigned int getTimeStampSec() const
Get timestamp since Unix epoch (1970-01-01 00:00:00), seconds.
double loc[3]
Location of back of the hand (in [mm])
std::string getMessageMsg() const
Get message text of last DTrack2/DTRACK3 event message.
Definition: DTrackSDK.cpp:958
const DTrackHand * getHand(int id) const
Get A.R.T. FINGERTRACKING hand data.
double quality
Quality (0.0 <= qu <= 1.0)
int num_joystick
Number of joystick values.
Timeout occured.
Definition: DTrackSDK.hpp:93
int id
ID number (starting with 0)
int id
ID number (starting with 0)
Error while parsing command.
Definition: DTrackSDK.hpp:95
bool isDataInterfaceValid() const
Returns if UDP socket is open to receive tracking data on local machine.
Definition: DTrackSDK.cpp:310
double rot[9]
Rotation matrix of joint (column-wise) in relation to room coordinate system.
bool getMessage()
Get DTrack2/DTRACK3 event message from the Controller.
Definition: DTrackSDK.cpp:864
const DTrackInertial * getInertial(int id) const
Get hybrid (optical-inertial) data.
Errors getLastDataError() const
Get last error at receiving tracking data (data transmission).
Definition: DTrackSDK.cpp:549
int numCameraErrorMessages
Number of camera-related error messages (since booting)
int getNumInertial() const
Get number of calibrated hybrid (optical-inertial) bodies.
int button[DTRACKSDK_FLYSTICK_MAX_BUTTON]
Button state (1 pressed, 0 not pressed): 0 front, 1..n-1 right to left.
bool stopMeasurement()
Stop measurement.
Definition: DTrackSDK.cpp:615
bool startMeasurement()
Start measurement.
Definition: DTrackSDK.cpp:595
const DTrackStatus * getStatus() const
Get system status data.
bool isTracked() const
Returns if human model is currently tracked.
double rot[9]
Rotation matrix of back of the hand (column-wise)
Measurement Tool reference data (6DOF).
double w
Quaternion component w.
double z
Quaternion component z.
bool isTracked() const
Returns if Measurement Tool is currently tracked.
double rot[9]
Rotation matrix (column-wise)
struct DTrackSDK_Datatypes::DTrackHand::DTrackFinger finger[DTRACKSDK_HAND_MAX_FINGER]
Finger data (order: thumb, index finger, middle finger, ...)
DTrackQuaternion getQuaternion() const
Returns rotation as quaternion.
bool isTracked() const
Returns if Flystick is currently tracked.
int button[DTRACKSDK_MEATOOL_MAX_BUTTON]
Button state (1 pressed, 0 not pressed): 0 point measurement state.
double rot[9]
Rotation matrix (column-wise)
int getNumHuman() const
Get number of calibrated ART-Human models.
bool isTracked() const
Returns if hand is currently tracked.
Network error.
Definition: DTrackSDK.hpp:94
int numTrackedMarkers
Number of currently found additional 3DOF markers.
double loc[3]
Location (in [mm])
Standard body data (6DOF).
double loc[3]
Location (in [mm])
double joystick[DTRACKSDK_FLYSTICK_MAX_JOYSTICK]
Joystick value (-1.0 <= joystick <= 1.0); 0 horizontal, 1 vertical.
bool isTracked() const
Returns if body is currently tracked.
int id
ID number (starting with 0)
int id
ID number of human model (starting with 0)
ART-Human model (joints (6DOF) including optional Fingertracking).
int getNumMeaTool() const
Get number of calibrated Measurement Tools.