vrpn 07.35
Virtual Reality Peripheral Network
 
Loading...
Searching...
No Matches
vrpn_Tracker_DTrack.h
Go to the documentation of this file.
1// vrpn_Tracker_DTrack.h
2//
3// Advanced Realtime Tracking GmbH's (http://www.ar-tracking.de) DTrack/DTrack2 client
4//
5// developed by David Nahon for Virtools VR Pack (http://www.virtools.com)
6// (07/20/2004) improved by Advanced Realtime Tracking GmbH (http://www.ar-tracking.de)
7// (07/02/2007, 06/29/2009) upgraded by Advanced Realtime Tracking GmbH to support new devices
8// (08/25/2010) a correction added by Advanced Realtime Tracking GmbH
9// (12/01/2010) support of 3dof objects added by Advanced Realtime Tracking GmbH
10
11#ifndef VRPN_TRACKER_DTRACK_H
12#define VRPN_TRACKER_DTRACK_H
13
14#include "vrpn_Configure.h" // for VRPN_API
15#include "vrpn_Shared.h" // for timeval
16
18// There is a problem with linking on SGI related to the use of standard
19// libraries.
20#ifndef sgi
21
22#include <stdio.h> // for NULL
23#include <vector> // for vector
24
25#include "vrpn_Analog.h" // for vrpn_Analog
26#include "vrpn_Button.h" // for vrpn_Button_Filter
27#include "vrpn_Tracker.h" // for vrpn_Tracker
28
29
30// --------------------------------------------------------------------------
31// Data types:
32
33// Standard marker data (3DOF):
34
35typedef struct{
36 int id; // id number (starting with 0)
37 float loc[3]; // location (in mm)
39
40// Standard body data (6DOF):
41// - currently not tracked bodies are getting a quality of -1
42
43typedef struct{
44 int id; // id number (starting with 0)
45 float quality; // quality (0 <= qu <= 1, no tracking if -1)
46
47 float loc[3]; // location (in mm)
48 float rot[9]; // rotation matrix (column-wise)
50
51// A.R.T. Flystick data (6DOF + buttons):
52// - currently not tracked bodies are getting a quality of -1
53// - note the maximum number of buttons and joystick values
54
55#define vrpn_DTRACK_FLYSTICK_MAX_BUTTON 16 // maximum number of buttons
56#define vrpn_DTRACK_FLYSTICK_MAX_JOYSTICK 8 // maximum number of joystick values
57
58typedef struct{
59 int id; // id number (starting with 0)
60 float quality; // quality (0 <= qu <= 1, no tracking if -1)
61
62 int num_button; // number of buttons
63 int button[vrpn_DTRACK_FLYSTICK_MAX_BUTTON]; // button state (1 pressed, 0 not pressed)
64 // (0 front, 1..n-1 right to left)
65 int num_joystick; // number of joystick values
66 float joystick[vrpn_DTRACK_FLYSTICK_MAX_JOYSTICK]; // joystick value (-1 <= joystick <= 1)
67 // (0 horizontal, 1 vertical)
68
69 float loc[3]; // location (in mm)
70 float rot[9]; // rotation matrix (column-wise)
72
73
74// --------------------------------------------------------------------------
75// VRPN class:
76
78{
79
80 public:
81
82#ifdef _WIN32
83 typedef SOCKET socket_type;
84#else
85 typedef int socket_type;
86#endif
87
88// Constructor:
89// name (i): device name
90// c (i): vrpn_Connection
91// dtrackPort (i): DTrack UDP port
92// timeToReachJoy (i): time needed to reach the maximum value of the joystick
93// fixNbody, fixNflystick (i): fixed numbers of DTrack bodies and Flysticks (-1 if not wanted)
94// fixId (i): renumbering of targets; must have exact (fixNbody + fixNflystick) elements (NULL if not wanted)
95// act3DOFout (i): activate 3dof marker output if present
96// actTracing (i): activate trace output
97
98 vrpn_Tracker_DTrack(const char *name, vrpn_Connection *c,
99 int dtrackPort, float timeToReachJoy = 0.f,
100 int fixNbody = -1, int fixNflystick = -1, int* fixId = NULL,
101 bool act3DOFout = false, bool actTracing = false);
102
104
108
109 virtual void mainloop();
110
111
112 private:
113
114 // general:
115
116 struct timeval tim_first; // timestamp of first frame
117 struct timeval tim_last; // timestamp of current frame
118
119 bool tracing; // activate debug output
120 unsigned int tracing_frames; // frame counter for debug output
121
122 // DTrack data:
123
124 bool use_fix_numbering; // use fixed numbers of standard bodies and Flysticks
125
126 int fix_nbody; // fixed number of standard bodies
127 int fix_nflystick; // fixed number of Flysticks
128
129 std::vector<int> fix_idbody; // fixed vrpn standard body IDs
130 std::vector<int> fix_idflystick; // fixed vrpn Flystick IDs
131
132 bool warning_nbodycal; // already warned cause of missing '6dcal' data
133
134 // preparing data for VRPN:
135 // these functions convert DTrack data to vrpn data
136
137 std::vector<bool> joy_simulate; // simulate time varying floating values
138 std::vector<float> joy_last; // current value of 'joystick' channel (hor, ver)
139 float joy_incPerSec; // increase of 'joystick' channel (in 1/sec)
140
141 int dtrack2vrpn_marker(int id, const char* str_dtrack, int id_dtrack,
142 const float* loc, struct timeval timestamp);
143 int dtrack2vrpn_body(int id, const char* str_dtrack, int id_dtrack,
144 const float* loc, const float* rot, struct timeval timestamp);
145 int dtrack2vrpn_flystickbuttons(int id, int id_dtrack,
146 int num_but, const int* but, struct timeval timestamp);
147 int dtrack2vrpn_flystickanalogs(int id, int id_dtrack,
148 int num_ana, const float* ana, float dt, struct timeval timestamp);
149
150 // communicating with DTrack:
151 // these functions receive and parse data packets from DTrack
152
153 socket_type d_udpsock; // socket number for UDP
154 int d_udptimeout_us; // timeout for receiving UDP data
155
156 int d_udpbufsize; // size of UDP buffer
157 char* d_udpbuf; // UDP buffer
158
159 unsigned int act_framecounter; // frame counter
160 double act_timestamp; // time stamp
161
162 bool output_3dof_marker; // 3dof marker output if available
163 int act_num_marker; // number of 3dof marker (due to '3d' line)
164 std::vector<vrpn_dtrack_marker_type> act_marker; // array containing 3dof marker data
165
166 int act_num_body; // number of calibrated standard bodies (due to '6d' line)
167 std::vector<vrpn_dtrack_body_type> act_body; // array containing standard body data
168 bool act_has_bodycal_format; // DTrack sent '6dcal' format
169 int act_num_bodycal; // number of calibrated standard bodies (due to '6dcal' line)
170
171 int act_num_flystick; // number of calibrated Flysticks
172 std::vector<vrpn_dtrack_flystick_type> act_flystick; // array containing Flystick data
173 bool act_has_old_flystick_format; // DTrack uses old Flystick format
174
175 int d_lasterror; // last receive error
176
177 bool dtrack_init(int udpport);
178 bool dtrack_exit(void);
179
180 bool dtrack_receive(void);
181};
182
183#endif
184
185#endif
186
vrpn_Analog(const char *name, vrpn_Connection *c=NULL)
Definition vrpn_Analog.C:14
struct timeval timestamp
Definition vrpn_Analog.h:41
virtual void mainloop()=0
Called once through each main loop iteration to handle updates. Remote object mainloop() should call ...
vrpn_Button_Filter(const char *, vrpn_Connection *c=NULL)
Generic connection class not specific to the transport mechanism.
vrpn_Tracker_DTrack(const char *name, vrpn_Connection *c, int dtrackPort, float timeToReachJoy=0.f, int fixNbody=-1, int fixNflystick=-1, int *fixId=NULL, bool act3DOFout=false, bool actTracing=false)
vrpn_Tracker(const char *name, vrpn_Connection *c=NULL, const char *tracker_cfg_file_name=NULL)
int button[vrpn_DTRACK_FLYSTICK_MAX_BUTTON]
float joystick[vrpn_DTRACK_FLYSTICK_MAX_JOYSTICK]
#define VRPN_API
#define SOCKET
Definition vrpn_Shared.h:52
#define vrpn_DTRACK_FLYSTICK_MAX_BUTTON
#define vrpn_DTRACK_FLYSTICK_MAX_JOYSTICK
class VRPN_API vrpn_Connection