cgv
Loading...
Searching...
No Matches
vr_driver.cxx
1#include "vr_driver.h"
2#include <map>
3#include <iostream>
4
5namespace vr {
6 void vr_calibration_base::set_driver_calibration_matrix(vr_driver* driver, const float calibration_matrix[12]) const
7 {
8 driver->set_calibration_transformation(calibration_matrix);
9 }
16 std::map<void*, vr_kit*>& ref_vr_kit_map()
17 {
18 static std::map<void*, vr_kit*> vr_kit_map;
19 return vr_kit_map;
20 }
23 {
24 return tracking_reference_states[serial_nummer];
25 }
26
29 {
30 tracking_reference_states.clear();
31 }
32
35 {
36 for (auto& s : tracking_reference_states)
37 s.second.status = VRS_DETACHED;
38 }
39
42 {
43 std::fill(&calibration_matrix[0], &calibration_matrix[0] + 12, 0.0f);
44 calibration_matrix[0] = calibration_matrix[4] = calibration_matrix[8] = 1.0f;
45 use_calibration_matrix = false;
46 }
47
48
50 void vr_driver::put_calibration_transformation(float transformation_matrix[12]) const
51 {
52 std::copy(&calibration_matrix[0], &calibration_matrix[0] + 12, &transformation_matrix[0]);
53 }
55 void vr_driver::calibrate_pose(float (&pose)[12]) const
56 {
57 if (!use_calibration_matrix)
58 return;
59 float pos[3];
60 float ori[9];
61 int i;
62 for (i = 0; i < 3; ++i) {
63 pos[i] = calibration_matrix[9 + i];
64 for (int j = 0; j < 3; ++j) {
65 pos[i] += calibration_matrix[3 * j + i] * pose[9 + j];
66 ori[3 * j + i] = 0.0f;
67 for (int k = 0; k < 3; ++k)
68 ori[3 * j + i] += calibration_matrix[3 * k + i] * pose[3 * j + k];
69 }
70 }
71 for (i = 0; i < 3; ++i) {
72 pose[9 + i] = pos[i];
73 for (int j = 0; j < 3; ++j)
74 pose[3 * j + i] = ori[3 * j + i];
75 }
76 }
77
79 void vr_driver::set_calibration_transformation(const float new_transformation_matrix[12])
80 {
81 std::copy(&new_transformation_matrix[0], &new_transformation_matrix[0] + 12, &calibration_matrix[0]);
82 }
85 {
86 use_calibration_matrix = true;
87 }
90 {
91 use_calibration_matrix = false;
92 }
95 {
96 return use_calibration_matrix;
97 }
99 const std::map<std::string, vr_trackable_state>& vr_driver::get_tracking_reference_states() const
100 {
102 return tracking_reference_states;
103 calibrated_tracking_reference_states = tracking_reference_states;
104 for (auto& s : calibrated_tracking_reference_states)
105 if (s.second.status == VRS_TRACKED)
106 calibrate_pose(s.second.pose);
107 return calibrated_tracking_reference_states;
108 }
109
115
118 {
119
120 }
122 void vr_driver::put_x_direction(float* x_dir) const
123 {
124 x_dir[0] = 1;
125 x_dir[1] = x_dir[2] = 0;
126 }
128 void vr_driver::replace_vr_kit(void* handle, vr_kit* kit)
129 {
130 auto& kit_map = ref_vr_kit_map();
131 auto iter = kit_map.find(handle);
132 if (iter != kit_map.end())
133 iter->second = kit;
134 else
135 kit_map[handle] = kit;
136 }
138 void vr_driver::register_vr_kit(void* handle, vr_kit* kit)
139 {
140 auto& kit_map = ref_vr_kit_map();
141 auto iter = kit_map.find(handle);
142 if (iter != kit_map.end()) {
143 std::cerr << "WARNING: vr kit <" << kit->get_name() << "> recreated. Deleted copy <"
144 << iter->second->get_name() << "> might be still in use." << std::endl;
145 delete iter->second;
146 iter->second = kit;
147 }
148 else {
149 kit_map[handle] = kit;
150#ifdef _DEBUG
151 std::cout << "vr kit registered:\n" << kit->get_device_info() << std::endl;
152 std::cout << "tracking system:\n" << kit->get_driver()->get_tracking_system_info() << std::endl;
153#endif
154 }
155 if (kit->get_camera()) {
156 if (!kit->get_camera()->initialize())
157 std::cerr << "WARNING: could not initialize camera if vr kit <" << kit->get_name() << ">" << std::endl;
158 }
159 }
160 void vr_driver::set_index(unsigned _idx)
161 {
162 driver_index = _idx;
163 }
164
166 std::vector<vr_driver*>& ref_drivers()
167 {
168 static std::vector<vr_driver*> drivers;
169 return drivers;
170 }
171
174 {
175 vrd->set_index((unsigned)ref_drivers().size());
176 ref_drivers().push_back(vrd);
177 }
179 std::vector<vr_driver*>& get_vr_drivers()
180 {
181 return ref_drivers();
182 }
183
185 std::vector<void*> scan_vr_kits()
186 {
187 std::vector<void*> kit_handles;
188 for (auto driver_ptr : ref_drivers()) {
189 auto new_ids = driver_ptr->scan_vr_kits();
190 kit_handles.insert(kit_handles.end(), new_ids.begin(), new_ids.end());
191 }
192 return kit_handles;
193 }
195 vr_kit* replace_by_index(int vr_kit_index, vr_kit* new_kit_ptr)
196 {
197 vr_kit* kit_ptr = 0;
198 for (auto driver_ptr : ref_drivers())
199 if ((kit_ptr = driver_ptr->replace_by_index(vr_kit_index, new_kit_ptr)))
200 break;
201 return kit_ptr;
202 }
204 bool replace_by_pointer(vr_kit* old_kit_ptr, vr_kit* new_kit_ptr)
205 {
206 for (auto driver_ptr : ref_drivers())
207 if (driver_ptr->replace_by_pointer(old_kit_ptr, new_kit_ptr))
208 return true;
209 return false;
210 }
212 vr_kit* get_vr_kit(void* handle)
213 {
214 auto iter = ref_vr_kit_map().find(handle);
215 if (iter == ref_vr_kit_map().end())
216 return NULL;
217 return iter->second;
218 }
220 bool unregister_vr_kit(void* handle, vr_kit* vr_kit_ptr)
221 {
222 auto iter = ref_vr_kit_map().find(handle);
223 if (iter == ref_vr_kit_map().end())
224 return false;
225 if (iter->second != vr_kit_ptr)
226 return false;
227 ref_vr_kit_map().erase(handle);
228 return true;
229 }
230}
void set_driver_calibration_matrix(vr_driver *driver, const float calibration_matrix[12]) const
single point of write access to calibration transformation of vr drivers
Definition vr_driver.cxx:6
vr_calibration_base()
nothing to be done in contructor
Definition vr_driver.cxx:11
bool initialize()
initialization is typically called the c
Definition vr_camera.cxx:18
interface class for vr drivers.
Definition vr_driver.h:57
void set_index(unsigned _idx)
write access to driver index is restricted to the register_driver() function
void clear_tracking_reference_states()
remove all tracking reference states
Definition vr_driver.cxx:28
void mark_tracking_references_as_untracked()
mark all tracking reference states as untracked
Definition vr_driver.cxx:34
void set_calibration_transformation(const float new_transformation_matrix[12])
write access to calibration transformation is reserved to classes derived from vr_calibration_base
Definition vr_driver.cxx:79
void calibrate_pose(float(&pose)[12]) const
in case calibration matrix is enabled, transform given pose in place
Definition vr_driver.cxx:55
void put_calibration_transformation(float transformation_matrix[12]) const
read access to calibration transformation stored as 3x4-matrix
Definition vr_driver.cxx:50
vr_tracking_system_info tracking_system_info
store tracking system info to be filled by driver implementations
Definition vr_driver.h:78
virtual const std::map< std::string, vr_trackable_state > & get_tracking_reference_states() const
provide read only access to tracking reference states
Definition vr_driver.cxx:99
bool is_calibration_transformation_enabled() const
check whether calibration transformation is enabled; false after construction and typically set to tr...
Definition vr_driver.cxx:94
void replace_vr_kit(void *handle, vr_kit *kit)
call this method during replacement of vr kits. In case vr kit handle had been registered before it i...
void register_vr_kit(void *handle, vr_kit *kit)
call this method during scanning of vr kits. In case vr kit handle had been registered before,...
vr_trackable_state & ref_tracking_reference_state(const std::string &serial_nummer)
provide reference to tracking reference states
Definition vr_driver.cxx:22
virtual const vr_tracking_system_info & get_tracking_system_info() const
provide information on tracking system
vr_driver()
protected constructor
Definition vr_driver.cxx:41
virtual ~vr_driver()
declare destructor virtual to ensure it being called also for derived classes
void enable_calibration_transformation()
enable use of calibration transformation
Definition vr_driver.cxx:84
void put_x_direction(float *x_dir) const
put a 3d x direction into passed array
void disable_calibration_transformation()
disable use of calibration transformation
Definition vr_driver.cxx:89
a vr kit is composed of headset, two controllers, and two trackers, where all devices can be attached...
Definition vr_kit.h:69
vr_camera * get_camera() const
return camera or nullptr if not available
Definition vr_kit.cxx:52
const vr_kit_info & get_device_info() const
return information on the currently attached devices
Definition vr_kit.cxx:117
const vr_driver * get_driver() const
return driver
Definition vr_kit.cxx:48
const std::string & get_name() const
return name of vr_kit
Definition vr_kit.cxx:54
the vr namespace for virtual reality support
std::vector< vr_driver * > & ref_drivers()
return registered drivers
vr_kit * get_vr_kit(void *handle)
query a pointer to a vr kit by its device handle, function can return null pointer in case that no vr...
bool unregister_vr_kit(void *handle, vr_kit *vr_kit_ptr)
unregister a previously registered vr kit by handle and pointer
std::vector< vr_driver * > & get_vr_drivers()
return a vector with all registered vr drivers
void register_driver(vr_driver *vrd)
register a new driver
std::map< void *, vr_kit * > & ref_vr_kit_map()
access to vr_kit map singleton
Definition vr_driver.cxx:16
std::vector< void * > scan_vr_kits()
iterate all registered vr drivers to scan for vr kits and return vector of vr kit handles
@ VRS_TRACKED
trackable is connected and tracked
Definition vr_state.h:88
@ VRS_DETACHED
trackable is not reachable via wireless
Definition vr_state.h:86
bool replace_by_pointer(vr_kit *old_kit_ptr, vr_kit *new_kit_ptr)
scan vr kits and if one with given pointer exists, replace it by passed kit; return whether replaceme...
vr_kit * replace_by_index(int vr_kit_index, vr_kit *new_kit_ptr)
scan vr kits and if one of given index exists replace it by passed kit and return index to replaced k...
a trackable knows whether it is tracked and its 6d pose stored as 3x4 matrix in column major format
Definition vr_state.h:94
information provided for tracking system
Definition vr_info.h:176
defines the class vr::vr_driver class and gives access to the driver registry with the functions vr::...