Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
DCData.cpp
1 /*
2 This file is part of the BIAS library (Basic ImageAlgorithmS).
3 
4 Copyright (C) 2003, 2004 (see file CONTACTS for details)
5  Multimediale Systeme der Informationsverarbeitung
6  Institut fuer Informatik
7  Christian-Albrechts-Universitaet Kiel
8 
9 
10 BIAS is free software; you can redistribute it and/or modify
11 it under the terms of the GNU Lesser General Public License as published by
12 the Free Software Foundation; either version 2.1 of the License, or
13 (at your option) any later version.
14 
15 BIAS is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU Lesser General Public License for more details.
19 
20 You should have received a copy of the GNU Lesser General Public License
21 along with BIAS; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 */
24 
25 
26 #include "DCData.hh"
27 #include <Base/Debug/Error.hh>
28 #include <string>
29 #include <cmath>
30 
31 // for gcc 4.7
32 #ifndef WIN32
33 #include <unistd.h>
34 #endif
35 
36 #include <Base/Common/W32Compat.hh>
37 
38 using namespace BIAS;
39 using namespace std;
40 
41 //////////////////////////////////////////////////////////////////////////
42 // DC_ptu
43 /////////////////////////////////////////////////////////////////////////
44 
46 {
47  PanPos = TiltPos = 0.0;
49 }
50 
51 DC_ptu::DC_ptu(const DC_ptu& ptu) : Debug()
52 {
53  PanPos = ptu.PanPos ;
54  TiltPos = ptu.TiltPos ;
55  TimeStamp = ptu.TimeStamp ;
58 }
59 
61 {
62 }
63 
64 void DC_ptu::Set(double panpos, double tiltpos, unsigned long int timestamp,
65  unsigned long startts, unsigned long stopts)
66 {
67  PanPos = panpos;
68  TiltPos = tiltpos;
69  TimeStamp = timestamp;
70  StartReadTimeStamp=startts;
71  StopReadTimeStamp=stopts;
72 }
73 
74 void DC_ptu::WriteBinary(char *data)
75 {
76 #ifdef BIAS_DEBUG
77  if (!data) {
78  BIASERR("data is NULL");
79  BIASASSERT(false);
80  }
81 #endif
82  /* char *d=data;
83  (*((double *)d)++)=PanPos;
84  (*((double *)d)++)=TiltPos;
85  (*((unsigned long *)d)++)=TimeStamp;
86  (*((unsigned long *)d)++)=StartReadTimeStamp;
87  (*((unsigned long *)d)++)=StopReadTimeStamp;*/
88  double *d = (double*)data;
89  d[0] = PanPos;
90  d[1] = TiltPos;
91  unsigned long *l = (unsigned long *)(d+2);
92  l[0] = TimeStamp;
93  l[1] = StartReadTimeStamp;
94  l[3] = StopReadTimeStamp;
95 }
96 
97 void DC_ptu::ReadBinary(char *data)
98 {
99  /*char *d=data;
100  PanPos=(*((double *)d)++);
101  TiltPos=(*((double *)d)++);
102  TimeStamp=(*((unsigned long *)d)++);
103  StartReadTimeStamp=(*((unsigned long *)d)++);
104  StopReadTimeStamp=(*((unsigned long *)d)++);*/
105  double *d = (double *)data;
106  PanPos = d[0];
107  TiltPos = d[1];
108  unsigned long *l = (unsigned long *)(d+2);
109  TimeStamp = l[0];
110  StartReadTimeStamp = l[1];
111  StopReadTimeStamp = l[2];
112 }
113 
114 istream& BIAS::operator>>(istream& is, DC_ptu& ptu)
115 {
116  string tmp;
117  // char header[512];
118  //is.getline(header, 512, '\n');
119  //if (strcmp(header, "#[PTU Data]")==0){
120  is >> tmp >> ptu.PanPos >> tmp;
121  is >> tmp;
122  if (tmp=="#TiltPos="){
123  is >> ptu.TiltPos >> tmp;
124  is >> tmp >> ptu.TimeStamp;
126  } else if (tmp=="#ImageTimeStamp="){
127  is >> ptu.TimeStamp;
128  is >> tmp >> ptu.TiltPos >> tmp;
129  is >> tmp >> ptu.StartReadTimeStamp;
130  is >> tmp >> ptu.StopReadTimeStamp;
131  }
132  // cerr << ptu << endl;
133  //} else {
134  // BIASERR("unable to read ptu data, invalid header " << tmp);
135  //}
136  if (!is) {
137  BIASERR("error reading ptu meta data from ascii stream");
138  biassleep(1);
139  }
140  return is;
141 }
142 
143 ostream& BIAS::operator<<(ostream& os, const DC_ptu& ptu)
144 {
145  //#ifdef BIAS_DEBUG
146  streambuf *OutBuf_=cout.rdbuf(), *OsBuf_= os.rdbuf(),
147  *ErrBuf_=cerr.rdbuf();
148 
149  if (OutBuf_==OsBuf_ || ErrBuf_==OsBuf_){ // cout or cerr
150  //if (OutBuf_==OsBuf_) cerr << "os == cout\n";
151  //if (ErrBuf_==OsBuf_) cerr << "os == cerr\n";
152 
153  os << "PTU:\tpan: "<<ptu.PanPos<<"\ttilt: "<<ptu.TiltPos
154  << "\ttime: "<<ptu.TimeStamp<<"\tStartReadTime: "
155  <<ptu.StartReadTimeStamp<<"\tStopReadTime: "<<ptu.StopReadTimeStamp;
156  } else {
157  //#endif
158  os << "#PanPos= "<<ptu.PanPos<<" #[rad]"<<endl
159  << "#ImageTimeStamp= "<<ptu.TimeStamp<<endl
160  << "#TiltPos= "<<ptu.TiltPos<<" #[rad]"<<endl
161  << "#PTUStartReadTimeStamp= "<<ptu.StartReadTimeStamp<<endl
162  << "#PTUStopReadTimeStamp= "<<ptu.StopReadTimeStamp;
163  //#ifdef BIAS_DEBUG
164  }
165  //#endif
166  return os;
167 }
168 
169 //////////////////////////////////////////////////////////////////////////
170 // DC_inertial
171 /////////////////////////////////////////////////////////////////////////
172 
174 {
175  Yaw = YawRateRaw = YawRateOffset = 0.0;
176  SteeringAngle = Pitch = Speed = 0.0;
180  ArtFlags = 0;
182  Gear = VehicleFlags = 0;
183 }
184 
186 {
187  Yaw = inert.Yaw;
188  YawRateRaw = inert.YawRateRaw;
189  YawRateOffset = inert.YawRateOffset;
190  SteeringAngle = inert.SteeringAngle;
191  Pitch = inert.Pitch;
192  Speed = inert.Speed;
195  TempomatLever = inert.TempomatLever;
196  BlinkLever = inert.BlinkLever;
201  ArtFlags = inert.ArtFlags;
203  EngineSpeed = inert.EngineSpeed;
204  Gear = inert.Gear;
205  VehicleFlags = inert.VehicleFlags;
206 }
207 
209 {
210 }
211 
212 void DC_inertial::Set(double yaw, double yawrateraw, double yawrateoffset,
213  double speed, double steeringangle)
214 {
215  Yaw = yaw;
216  YawRateRaw = yawrateraw;
217  YawRateOffset = yawrateoffset;
218  Speed = speed;
219  SteeringAngle = steeringangle;
220 }
221 
222 istream& BIAS::operator>>(istream& is, DC_inertial& inert)
223 {
224  string tmp;
225  // char header[512];
226  //is.getline(header, 512, '\n');
227  // cerr << header << endl;
228  //if (strcmp(header, "#[Inertial Sensor]")==0){
229  is >> tmp >> inert.Yaw;
230  is >> tmp >> inert.YawRateRaw;
231  is >> tmp >> inert.YawRateOffset;
232  is >> tmp >> inert.SteeringAngle;
233  is >> tmp >> inert.Pitch;
234  is >> tmp >> inert.Speed;
235  is >> tmp >> inert.LongAcceleration;
236  is >> tmp >> inert.LatAcceleration;
237  is >> tmp >> inert.TempomatLever;
238  is >> tmp >> inert.BlinkLever;
239  is >> tmp >> inert.SteeringWheelLever;
240  is >> tmp >> inert.ArtLeadVehicleDistance;
241  is >> tmp >> inert.ArtLeadVehicleVelocity;
242  is >> tmp >> inert.ArtSollVelocity;
243  is >> tmp >> inert.ArtFlags;
244  is >> tmp >> inert.AcceleratorPedal;
245  is >> tmp >> inert.EngineSpeed;
246  is >> tmp >> inert.Gear;
247  is >> tmp >> inert.VehicleFlags;
248 
249  //cerr << inert << endl;
250  //} else {
251  // BIASERR("unable to read inertial sensor data, invalid header "
252  // <<tmp);
253  //}
254  if (!is) {
255  BIASERR("error reading inertial meta data from ascii stream");
256  biassleep(1);
257  }
258  return is;
259 }
260 
261 ostream& BIAS::operator<<(ostream& os, const DC_inertial& inert)
262 {
263  //#ifdef BIAS_DEBUG
264  streambuf *OutBuf_=cout.rdbuf(), *OsBuf_= os.rdbuf(),
265  *ErrBuf_=cerr.rdbuf();
266 
267  if (OutBuf_==OsBuf_ || ErrBuf_==OsBuf_){ // cout or cerr
268  os << "INERT: "
269  <<" Speed: "<<inert.Speed
270  <<" StAng: "<<inert.SteeringAngle
271  <<" Yaw: "<<inert.Yaw;
272  //<<" YawRateRaw: "<<inert.YawRateRaw
273  //<<" YawRateOffset: "<<inert.YawRateOffset
274  //<<" LongAccel: "<<inert.LongAcceleration;
275  } else {
276  //#endif
277  os //<< "#[Inertial Sensor]"<<endl
278  << "#Yaw= "<<inert.Yaw<<endl
279  << "#YawRateRaw= "<<inert.YawRateRaw<<endl
280  << "#YawRateOffset= "<<inert.YawRateOffset<<endl
281  << "#SteeringAngle= "<<inert.SteeringAngle<<endl
282  << "#Pitch= "<<inert.Pitch<<endl
283  << "#Speed= "<<inert.Speed<<endl
284  << "#LongAcceleration= "<<inert.LongAcceleration<<endl
285  << "#LatAcceleration= "<<inert.LatAcceleration<<endl
286  << "#TempomatLever= "<<inert.TempomatLever<<endl
287  << "#BlinkLever= "<<inert.BlinkLever<<endl
288  << "#SteeringWheelLever= "<<inert.SteeringWheelLever<<endl
289  << "#ArtLeadVehicleDistance= "<<inert.ArtLeadVehicleDistance<<endl
290  << "#ArtLeadVehicleVelocity= "<<inert.ArtLeadVehicleVelocity<<endl
291  << "#ArtSollVelocity= "<<inert.ArtSollVelocity<<endl
292  << "#ArtFlags= "<<inert.ArtFlags<<endl
293  << "#AcceleratorPedal= "<<inert.AcceleratorPedal<<endl
294  << "#EngineSpeed= "<<inert.EngineSpeed<<endl
295  << "#Gear= "<<inert.Gear<<endl
296  << "#VehicleFlags= "<<inert.VehicleFlags;
297  //#ifdef BIAS_DEBUG
298  }
299  //#endif
300  return os;
301 }
302 
303 void DC_inertial::WriteBinary(char *data)
304 {
305 #ifdef BIAS_DEBUG
306  if (!data) {
307  BIASERR("data is NULL");
308  BIASASSERT(false);
309  }
310 #endif
311  /*char *d = data;
312  (*((double *)d)++)=Yaw;
313  (*((double *)d)++)=YawRateRaw;
314  (*((double *)d)++)=YawRateOffset;
315  (*((double *)d)++)=SteeringAngle;
316  (*((double *)d)++)=Pitch;
317  (*((double *)d)++)=Speed;
318  (*((double *)d)++)=LongAcceleration;
319  (*((double *)d)++)=LatAcceleration;
320  (*((int *)d)++)=TempomatLever;
321  (*((int *)d)++)=BlinkLever;
322  (*((int *)d)++)=SteeringWheelLever;
323  (*((double *)d)++)=ArtLeadVehicleDistance;
324  (*((double *)d)++)=ArtLeadVehicleVelocity;
325  (*((double *)d)++)=ArtSollVelocity;
326  (*((int *)d)++)=ArtFlags;
327  (*((double *)d)++)=AcceleratorPedal;
328  (*((double *)d)++)=EngineSpeed;
329  (*((int *)d)++)=Gear;
330  (*((int *)d)++)=VehicleFlags;*/
331  double *d = (double *)data;
332  d[0] = Yaw;
333  d[1] = YawRateRaw;
334  d[2] = YawRateOffset;
335  d[3] = SteeringAngle;
336  d[4] = Pitch;
337  d[5] = Speed;
338  d[6] = LongAcceleration;
339  d[7] = LatAcceleration;
340  int *i = (int *)(d+8);
341  i[0] = TempomatLever;
342  i[1] = BlinkLever;
343  i[2] = SteeringWheelLever;
344  d = (double *)(i+3);
345  d[0] = ArtLeadVehicleDistance;
346  d[1] = ArtLeadVehicleVelocity;
347  d[2] = ArtSollVelocity;
348  i = (int *)(d+3);
349  i[0] = ArtFlags;
350  d = (double *)(i+1);
351  d[0] = AcceleratorPedal;
352  d[1] = EngineSpeed;
353  i = (int *)(d+2);
354  i[0] = Gear;
355  i[1] = VehicleFlags;
356 }
357 
358 void DC_inertial::ReadBinary(char *data)
359 {
360  /*char *d=data;
361  Yaw=(*((double *)d)++);
362  YawRateRaw=(*((double *)d)++);
363  YawRateOffset=(*((double *)d)++);
364  SteeringAngle=(*((double *)d)++);
365  Pitch=(*((double *)d)++);
366  Speed=(*((double *)d)++);
367  LongAcceleration=(*((double *)d)++);
368  LatAcceleration=(*((double *)d)++);
369  TempomatLever=(*((int *)d)++);
370  BlinkLever=(*((int *)d)++);
371  SteeringWheelLever=(*((int *)d)++);
372  ArtLeadVehicleDistance=(*((double *)d)++);
373  ArtLeadVehicleVelocity=(*((double *)d)++);
374  ArtSollVelocity=(*((double *)d)++);
375  ArtFlags=(*((int *)d)++);
376  AcceleratorPedal=(*((double *)d)++);
377  EngineSpeed=(*((double *)d)++);
378  Gear=(*((int *)d)++);
379  VehicleFlags=(*((int *)d)++);*/
380  double *d = (double *)data;
381  Yaw= d[0];
382  YawRateRaw= d[1];
383  YawRateOffset= d[2];
384  SteeringAngle= d[3];
385  Pitch= d[4];
386  Speed= d[5];
387  LongAcceleration= d[6];
388  LatAcceleration= d[7];
389  int *i = (int *)(d+8);
390  TempomatLever = i[0];
391  BlinkLever = i[1];
392  SteeringWheelLever = i[2];
393  d = (double *)(i+3);
396  ArtSollVelocity= d[2];
397  i = (int *)(d+3);
398  ArtFlags = i[0];
399  d = (double *)(i+1);
400  AcceleratorPedal= d[0];
401  EngineSpeed= d[1];
402  i = (int *)(d+2);
403  Gear = i[0];
404  VehicleFlags = i[1];
405 }
406 
407 //////////////////////////////////////////////////////////////////////////
408 // DC_GPS
409 /////////////////////////////////////////////////////////////////////////
410 
412 {
413  framenum=0;
416 }
417 
418 DC_GPS::DC_GPS(const DC_GPS& gps) : Debug()
419 {
420  framenum = gps.framenum ;
421  latPos = gps.latPos ;
422  longPos = gps.longPos ;
423  azimuth = gps.azimuth ;
424  offset = gps.offset ;
425  speed = gps.speed ;
426  gpsTime = gps.gpsTime ;
427  curvature = gps.curvature ;
429  mapIndex = gps.mapIndex ;
433 }
434 
436 {
437 }
438 
439 void DC_GPS::Set(int fnum, double lPos, double loPos, double az,
440  double sp, double distMap)
441 {
442  framenum=fnum;
443  latPos=lPos;
444  longPos=loPos;
445  azimuth=az;
446  speed=sp;
447  distanceToMap=distMap;
448 }
449 
450 istream& BIAS::operator>>(istream& is, DC_GPS& gps)
451 {
452  string tmp;
453  is >> tmp >> gps.framenum;
454  for (int i=0; i<12; i++) is >>tmp;
455  is >> gps.latPos ;
456  is >> gps.longPos ;
457  is >> gps.azimuth ;
458  is >> gps.offset ;
459  is >> gps.speed ;
460  is >> gps.gpsTime ;
461  is >> gps.curvature ;
462  is >> gps.clothoidParameter;
463  is >> gps.mapIndex ;
464  is >> gps.scaleFactorSpeed ;
465  is >> gps.yawRateOffset ;
466  is >> gps.distanceToMap ;
467  for (int i=0; i<9; i++) is >>tmp;
468  if (!is) {
469  BIASERR("error reading gps meta data from ascii stream");
470  biassleep(1);
471  }
472  return is;
473 }
474 
475 ostream& BIAS::operator<<(ostream& os, const DC_GPS& gps)
476 {
477  streambuf *OutBuf_=cout.rdbuf(), *OsBuf_= os.rdbuf(),
478  *ErrBuf_=cerr.rdbuf();
479 
480  if (OutBuf_==OsBuf_ || ErrBuf_==OsBuf_){ // cout or cerr
481  os << "GPS: framenum: "<<gps.framenum
482  <<" latPos: "<<setprecision(10)<<gps.latPos
483  <<" longPos: "<<setprecision(10)<<gps.longPos
484  <<" azimuth: "<<gps.azimuth
485  <<" speed: "<<setprecision(10)<<gps.speed
486  <<" distanceToMap: "<<setprecision(10)<<gps.distanceToMap;
487  } else {
488  os //<< "#[GPS Data]"<<endl
489  << "#framenum= "<<gps.framenum<<endl
490  << "#latPos longPos azimuth offset speed gpsTime curvature clothoidParameter mapIndex scaleFactorSpeed yawRateOffset distanceToMap "
491  << gps.framenum << "\t"
492  << gps.latPos << "\t"
493  << gps.longPos << "\t"
494  << gps.azimuth << "\t"
495  << gps.offset << "\t"
496  << gps.speed << "\t"
497  << gps.gpsTime << "\t"
498  << gps.curvature << "\t"
499  << gps.clothoidParameter<< "\t"
500  << gps.mapIndex << "\t"
501  << gps.scaleFactorSpeed << "\t"
502  << gps.yawRateOffset << "\t"
503  << gps.distanceToMap <<endl
504  << "#Traffic Point Map Size: 0"<<endl
505  << "#LanePointNo posX posZ curvature";
506  }
507  return os;
508 }
509 
510 void DC_GPS::WriteBinary(char *data)
511 {
512 #ifdef BIAS_DEBUG
513  if (!data) {
514  BIASERR("data is NULL");
515  BIASASSERT(false);
516  }
517 #endif
518  /*char *d=data;
519  (*((int*)d)++) =framenum ;
520  (*((double*)d)++)=latPos ;
521  (*((double*)d)++)=longPos ;
522  (*((double*)d)++)=azimuth ;
523  (*((double*)d)++)=offset ;
524  (*((double*)d)++)=speed ;
525  (*((double*)d)++)=gpsTime ;
526  (*((double*)d)++)=curvature ;
527  (*((double*)d)++)=clothoidParameter;
528  (*((double*)d)++)=mapIndex ;
529  (*((double*)d)++)=scaleFactorSpeed ;
530  (*((double*)d)++)=yawRateOffset ;
531  (*((double*)d)++)=distanceToMap ;*/
532  int *i = (int *)data;
533  i[0] =framenum ;
534  double *d = (double *)(i+1);
535  d[0] = latPos ;
536  d[1] = longPos ;
537  d[2] = azimuth ;
538  d[3] = offset ;
539  d[4] = speed ;
540  d[5] = gpsTime ;
541  d[6] = curvature ;
542  d[7] = clothoidParameter;
543  d[8] = mapIndex ;
544  d[9] = scaleFactorSpeed ;
545  d[10] = yawRateOffset ;
546  d[11] = distanceToMap ;
547 }
548 
549 void DC_GPS::ReadBinary(char *data)
550 {
551  int *i = (int *)data;
552  framenum = i[0];
553  double *d = (double *)(i+1);
554  latPos = d[0];
555  longPos = d[1];
556  azimuth = d[2];
557  offset = d[3];
558  speed = d[4];
559  gpsTime = d[5];
560  curvature = d[6];
561  clothoidParameter = d[7];
562  mapIndex = d[8];
563  scaleFactorSpeed = d[9];
564  yawRateOffset = d[10];
565  distanceToMap = d[11];
566 }
double latPos
Definition: DCData.hh:112
void Set(double yaw, double yawrateraw, double yawrateoffset, double speed, double steeringangle)
Definition: DCData.cpp:212
void WriteBinary(char *data)
Definition: DCData.cpp:74
double longPos
Definition: DCData.hh:113
int SteeringWheelLever
Definition: DCData.hh:85
double offset
Definition: DCData.hh:115
void ReadBinary(char *data)
Definition: DCData.cpp:549
double LatAcceleration
Definition: DCData.hh:84
unsigned int StartReadTimeStamp
Definition: DCData.hh:58
unsigned int StopReadTimeStamp
Definition: DCData.hh:58
double TiltPos
Definition: DCData.hh:57
void ReadBinary(char *data)
Definition: DCData.cpp:97
double Pitch
Definition: DCData.hh:82
void Set(int framenum, double latPos, double longPos, double azimuth, double speed, double distanceToMap)
Definition: DCData.cpp:439
double ArtSollVelocity
Definition: DCData.hh:86
double AcceleratorPedal
Definition: DCData.hh:88
double speed
Definition: DCData.hh:116
void WriteBinary(char *data)
Definition: DCData.cpp:510
double ArtLeadVehicleVelocity
Definition: DCData.hh:86
unsigned int TimeStamp
Definition: DCData.hh:58
int framenum
Definition: DCData.hh:111
double LongAcceleration
Definition: DCData.hh:84
double ArtLeadVehicleDistance
Definition: DCData.hh:86
double azimuth
Definition: DCData.hh:114
void ReadBinary(char *data)
Definition: DCData.cpp:358
void Set(double PanPos, double TiltPos, unsigned long int TimeStamp, unsigned long StartReadTimeStamp, unsigned long StopReadTimeStamp)
Definition: DCData.cpp:64
double YawRateRaw
Definition: DCData.hh:80
double PanPos
Definition: DCData.hh:57
double SteeringAngle
Definition: DCData.hh:81
double scaleFactorSpeed
Definition: DCData.hh:121
std::ostream & operator<<(std::ostream &os, const Array2D< T > &arg)
Definition: Array2D.hh:260
double mapIndex
Definition: DCData.hh:120
void WriteBinary(char *data)
Definition: DCData.cpp:303
double yawRateOffset
Definition: DCData.hh:122
double curvature
Definition: DCData.hh:118
double EngineSpeed
Definition: DCData.hh:88
double YawRateOffset
Definition: DCData.hh:80
double distanceToMap
Definition: DCData.hh:123
holds system time in milliseconds
Definition: TimeStamp.hh:45
double clothoidParameter
Definition: DCData.hh:119
double Speed
Definition: DCData.hh:83
double gpsTime
Definition: DCData.hh:117
BIASCommon_EXPORT std::istream & operator>>(std::istream &is, BIAS::TimeStamp &ts)
Standard input operator for TimeStamps.
Definition: TimeStamp.cpp:157