RflySimSDK v3.05
RflySimSDK说明文档
载入中...
搜索中...
未找到
rfly_vrpn.h
1#pragma once
2
3#include ".\vrpn\vrpn_Tracker.h"
4#include ".\vrpn\vrpn_Connection.h"
5#include <string>
6#include <vector>
7#include "rfly_quat.h"
8
9#if defined (_DLL)
10#pragma comment(lib,"vrpn.lib")
11#pragma comment(lib,"quat.lib")
12#else
13#pragma comment(lib,"vrpn_mt.lib")
14#pragma comment(lib,"quat_mt.lib")
15#endif
16
17typedef std::shared_ptr<vrpn_Connection> ConnectionPtr;
18typedef std::shared_ptr<vrpn_Tracker_Remote> TrackerRemotePtr;
19
21{
22public:
23 bool has_data = false;
24 bool has_pos = false;
25 bool has_vel = false;
26 bool has_acc = false;
27
28 vrpn_TRACKERCB vrpn_pose;
29 vrpn_TRACKERVELCB vrpn_vel;
30 vrpn_TRACKERACCCB vrpn_acc;
31
32 std::string tracker_name;
33
34 // typedef std::shared_ptr<VrpnTrackerRfly> Ptr;
35
36 void CreateTracker(std::string tracker_name, ConnectionPtr connection){
37 tracker_remote_ = std::make_shared<vrpn_Tracker_Remote>(tracker_name.c_str(), connection.get());
38
39 init(tracker_name);
40 }
41
43 {
44 for(int i=0;i<3;i++){
45 vrpn_pose.pos[i]=0;
46 vrpn_pose.quat[i]=0;
47 vrpn_vel.vel[i]=0;
48 vrpn_vel.vel_quat[i]=0;
49 vrpn_acc.acc[i]=0;
50 vrpn_acc.acc_quat[i]=0;
51 }
52 vrpn_pose.quat[3]=1;
53 vrpn_vel.vel_quat[3]=1;
54 vrpn_vel.vel_quat_dt=0;
55 vrpn_acc.acc_quat[3]=1;
56 vrpn_acc.acc_quat_dt=0;
57 vrpn_pose.msg_time.tv_sec=0;
58 vrpn_pose.msg_time.tv_usec=0;
59 vrpn_vel.msg_time.tv_sec=0;
60 vrpn_vel.msg_time.tv_usec=0;
61 vrpn_acc.msg_time.tv_sec=0;
62 vrpn_acc.msg_time.tv_usec=0;
63 }
64
66 {
67 std::cout << "Destroying tracker " << std::endl;
68 tracker_remote_->unregister_change_handler(this, &VrpnTrackerRfly::handle_pose);
69 tracker_remote_->unregister_change_handler(this, &VrpnTrackerRfly::handle_twist);
70 tracker_remote_->unregister_change_handler(this, &VrpnTrackerRfly::handle_accel);
71 }
72
73 void output(double y[30])
74 {
75 tracker_remote_->mainloop();
76
77 // y0 -> Time stamp sec for pos msg
78 // y1 -> Time stamp usec for pos msg
79 // t_pos_msg = y0 + y1 / 1000000.0
80 // y2-y4 -> Pos_x,Pos_y,Pos_z in ned, unit m
81 // y5-y8 -> Quat (w,x,y,z) for vehicle attitude
82 // y9 -> Time stamp sec for vel msg
83 // y10 -> Time stamp usec for vel msg
84 // t_vel_msg = y9 + y10 / 1000000.0
85 // y11-y13 -> vel_x,vel_y,vel_z in ned, unit m/s
86 // y14 -> Time stamp sec for acc msg
87 // y15 -> Time stamp usec for acc msg
88 // y16-y18 -> acc_x,acc_y,acc_z in ned, unit m/s^2
89 // y19-y21 -> Euler (roll pitch yaw) ang from vehicle Quat
90 // y22 -> tracker->has_data, is there any vrpn message received.
91 // y23 -> tracker->has_pos, is the vrpn pos message received.
92 // 24-29 -> reserve for future use
93
94 // !!! Translate Z-UP to Z-Down
95 y[0] = vrpn_pose.msg_time.tv_sec;
96 y[1] = vrpn_pose.msg_time.tv_usec;
97 for (int j = 0; j<3; j++)
98 y[j+2] = vrpn_pose.pos[j];
99 y[3] = -y[3];
100 y[4] = -y[4];
101
102 // Coordinate Transformation for y,z axis
103 y[5]=vrpn_pose.quat[3]; //w
104 y[6]=vrpn_pose.quat[0]; //x
105 y[7]=-vrpn_pose.quat[1]; //y
106 y[8]=-vrpn_pose.quat[2]; //z
107
108
109 y[9] = vrpn_vel.msg_time.tv_sec;
110 y[10] = vrpn_vel.msg_time.tv_usec;
111 for (int j = 0; j<3; j++)
112 y[j+11] = vrpn_vel.vel[j];
113 y[12] = -y[12];
114 y[13] = -y[13];
115
116 y[14] = vrpn_acc.msg_time.tv_sec;
117 y[15] = vrpn_acc.msg_time.tv_usec;
118 for (int j = 0; j<3; j++)
119 y[j+16] = vrpn_acc.acc[j];
120 y[17] = -y[17];
121 y[18] = -y[18];
122
123 double yawPitchRoll[3];
124 q_to_euler(yawPitchRoll, vrpn_pose.quat);
125 y[19] = yawPitchRoll[2]; // Roll
126 y[20] = -yawPitchRoll[1]; // pitch
127 y[21] = -yawPitchRoll[0]; // yaw
128 y[22] = has_data;
129 y[23] = has_pos;
130 }
131
132private:
133 TrackerRemotePtr tracker_remote_;
134
135 void init(std::string tracker_name)
136 {
137 std::cout << "Creating new tracker " << tracker_name << std::endl;
138
139 tracker_remote_->register_change_handler(this, &VrpnTrackerRfly::handle_pose);
140 tracker_remote_->register_change_handler(this, &VrpnTrackerRfly::handle_twist);
141 tracker_remote_->register_change_handler(this, &VrpnTrackerRfly::handle_accel);
142 tracker_remote_->shutup = true;
143
144 this->tracker_name = tracker_name;
145 }
146
147 static void VRPN_CALLBACK handle_pose(void *userData, const vrpn_TRACKERCB tracker_pose)
148 {
149 VrpnTrackerRfly *tracker = static_cast<VrpnTrackerRfly *>(userData);
150
151 memcpy(&tracker->vrpn_pose, &tracker_pose, sizeof(tracker_pose));
152 tracker->has_pos = true;
153 tracker->has_data = true;
154 // std::cout <<"Name:"<<tracker->tracker_name<<"\tx: "<< tracker->pose[1] << "\ty: " << tracker->pose[2] << std::endl;
155 }
156
157 static void VRPN_CALLBACK handle_twist(void *userData, const vrpn_TRACKERVELCB tracker_twist)
158 {
159 VrpnTrackerRfly *tracker = static_cast<VrpnTrackerRfly *>(userData);
160
161 memcpy(&tracker->vrpn_vel, &tracker_twist, sizeof(tracker_twist));
162 tracker->has_vel = true;
163 tracker->has_data = true;
164 }
165
166 static void VRPN_CALLBACK handle_accel(void *userData, const vrpn_TRACKERACCCB tracker_accel)
167 {
168 VrpnTrackerRfly *tracker = static_cast<VrpnTrackerRfly *>(userData);
169
170 memcpy(&tracker->vrpn_acc, &tracker_accel, sizeof(tracker_accel));
171 tracker->has_acc = true;
172 tracker->has_data = true;
173 }
174
175};
176
178{
179public:
180 // typedef std::shared_ptr<VrpnConnectionRfly> Ptr;
181
186 {
187
188 }
189
193 void mainloop()
194 {
195 connection_->mainloop();
196 if (!connection_->doing_okay())
197 {
198 std::cout << "VRPN connection is not 'doing okay'" << std::endl;
199 }
200 }
201
202 void CreateConnect(std::string host,int port=3883){
203 host_ = host + ":"+std::to_string(port);
204 std::cout << "Connecting to VRPN server at host:" << host_ << std::endl;
205 connection_ = std::shared_ptr<vrpn_Connection>(vrpn_get_connection_by_name(host_.c_str()));
206 std::cout << "Connection established" << std::endl;
207 }
208
209 std::string host_;
210
214 ConnectionPtr connection_;
215};
定义 rfly_vrpn.h:178
ConnectionPtr connection_
定义 rfly_vrpn.h:214
VrpnConnectionRfly()
定义 rfly_vrpn.h:185
void mainloop()
定义 rfly_vrpn.h:193
定义 rfly_vrpn.h:21
定义 vrpn_Tracker.h:333
定义 vrpn_Tracker.h:306
定义 vrpn_Tracker.h:319