-
Notifications
You must be signed in to change notification settings - Fork 264
/
stereo-lcmgl.cpp
151 lines (107 loc) · 3.53 KB
/
stereo-lcmgl.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
/*
* Draws stereo hits data to LCMGL
*
* Author: Amruth Venkatraman, <amruthv@mit.edu> 2013
*
*/
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include "../../LCM/lcmt_optotrak_quat.h"
#include "../../LCM/lcmt_stereo.h"
#include <bot_core/bot_core.h>
#include <bot_param/param_client.h>
#include <GL/gl.h>
#include <bot_lcmgl_client/lcmgl.h>
#include <bot_core/rotations.h>
#include <bot_frames/bot_frames.h>
lcm_t * lcm;
bot_lcmgl_t* lcmgl;
lcmt_stereo_subscription_t *stereo_sub;
//Global bot frames
BotFrames *botFrames;
static void usage(void)
{
fprintf(stderr, "usage: optotrak-lcmgl optotrak-quat-channel-name lcmgl-channel-name\n");
fprintf(stderr, " optotrak-quat-channel-name : LCM channel name with optotrak QUAT messages\n");
fprintf(stderr, " lcmgl-channel-name : LCM channel to publish LCMGL messages on\n");
fprintf(stderr, " example:\n");
fprintf(stderr, " ./optotrak-lcmgl wingeron_x_quat wingeron_x_lcmgl\n");
fprintf(stderr, " reads optotrak LCM messages and draws the position using LCMGL\n");
}
void sighandler(int dum)
{
printf("\nClosing... ");
lcmt_stereo_unsubscribe(lcm, stereo_sub);
lcm_destroy (lcm);
printf("done.\n");
exit(0);
}
int64_t getTimestampNow()
{
struct timeval thisTime;
gettimeofday(&thisTime, NULL);
return (thisTime.tv_sec * 1000000.0) + (float)thisTime.tv_usec + 0.5;
}
void stereo_handler(const lcm_recv_buf_t *rbuf, const char* channel, const lcmt_stereo *msg, void *user)
{
bot_lcmgl_push_matrix(lcmgl);
bot_lcmgl_point_size(lcmgl, 10.5f);
BotTrans toOpenCv;
bot_frames_get_trans(botFrames, "opencvFrame", "local", &toOpenCv);
int numHits = msg -> number_of_points;
//printf("numHits: %d \n", numHits);
for (int i=0; i< numHits; i++) {
double originalCoords[3];
//Get coordinate of the location of the obstacle
originalCoords[0] = msg -> x[i];
originalCoords[1] = msg -> y[i];
originalCoords[2] = -msg -> z[i];
double transPoint[3];
bot_trans_apply_vec(&toOpenCv,originalCoords, transPoint);
//Draw the point
//printf("x: %f, y: %f, z: %f \n", transPoint[0], transPoint[1], transPoint[2]);
bot_lcmgl_begin(lcmgl, GL_POINTS);
bot_lcmgl_color3f(lcmgl,0,0,255);
bot_lcmgl_vertex3f(lcmgl, transPoint[0], transPoint[1], transPoint[2]);
bot_lcmgl_end(lcmgl);
}
//Finish writing to LCMGL
bot_lcmgl_pop_matrix(lcmgl);
bot_lcmgl_switch_buffer(lcmgl);
}
int main(int argc,char** argv)
{
char *channelStereo = NULL;
char *channelLcmGl = NULL;
if (argc!=3) {
usage();
exit(0);
}
channelStereo = argv[1];
channelLcmGl = argv[2];
lcm = lcm_create ("udpm://239.255.76.67:7667?ttl=0");
if (!lcm)
{
fprintf(stderr, "lcm_create failed. Quitting.\n");
return 1;
}
signal(SIGINT,sighandler);
lcmgl = bot_lcmgl_init(lcm, channelLcmGl);
stereo_sub = lcmt_stereo_subscribe(lcm, channelStereo, &stereo_handler, NULL);
//init frames
BotParam *param = bot_param_new_from_server(lcm, 0);
botFrames = bot_frames_new(lcm, param);
printf("Receiving:\nStereo LCM: %s\nPublishing LCM:\n\tLCMGL: %s\n", channelStereo, channelLcmGl);
while (true)
{
// read the LCM channel
lcm_handle (lcm);
}
return 0;
}