FeatureDetectorUtility.cc
Go to the documentation of this file.
1 
37 #ifdef WIN32
38 #ifndef WIN32_LEAN_AND_MEAN
39 #define WIN32_LEAN_AND_MEAN 1
40 #endif
41 
42 #include <windows.h>
43 #include <winsock2.h>
44 #else
45 #include <unistd.h>
46 #include <arpa/inet.h> // htons
47 #endif
48 
49 #include <fstream>
50 #include <iomanip>
51 #include <iostream>
52 #include <limits>
53 #include <sstream>
54 #include <stdio.h>
55 #include <stdlib.h>
56 #include <signal.h>
57 #include <string.h>
58 #include <string>
59 #include <map>
60 #include <chrono>
61 #include <ctime>
62 
63 #include <getopt/getopt.h>
64 
66 #include <MultiSense/MultiSenseChannel.hh>
67 
69 
70 using namespace crl::multisense;
71 
72 namespace { // anonymous
73 
74 volatile bool doneG = false;
75 
76 volatile int affineCalib = 0;
77 volatile uint16_t affineCalCount0 = 0;
78 volatile bool affineCalCount0Set = false;
79 
80 struct featureDetectionTime
81 {
82  std::chrono::time_point<std::chrono::system_clock> imageTime;
83  std::chrono::time_point<std::chrono::system_clock> featureTime;
84 };
85 
86 struct UserData
87 {
88  Channel *channelP;
89  system::VersionInfo version;
90  system::DeviceInfo deviceInfo;
91  image::Calibration calibration;
92  std::map<int64_t, featureDetectionTime> elapsedTime;
93  uint16_t observerStatus;
94  uint16_t observerNum;
95  uint16_t observerIndex;
96  int16_t observerDy;
97  int16_t observerTheta;
98  uint16_t affineCalCount;
99 };
100 
101 void usage(const char *programNameP)
102 {
103  std::cerr << "USAGE: " << programNameP << " [<options>]" << std::endl;
104  std::cerr << "Where <options> are:" << std::endl;
105  std::cerr << "\t-a <current_address> : CURRENT IPV4 address (default=10.66.171.21)" << std::endl;
106  std::cerr << "\t-m <mtu> : MTU to set the camera to (default=1500)" << std::endl;
107  std::cerr << "\t-r <head_id> : remote head ID (default=0)" << std::endl;
108  std::cerr << "\t-c : Perform affine calibration (from scratch, discard previous affine calibration)" << std::endl;
109  std::cerr << "\t-i : Perform affine calibration (incremental, keep previous affine calibration)" << std::endl;
110  exit(1);
111 }
112 
113 #ifdef WIN32
114 BOOL WINAPI signalHandler(DWORD dwCtrlType)
115 {
116  CRL_UNUSED (dwCtrlType);
117  doneG = true;
118  return TRUE;
119 }
120 #else
121 void signalHandler(int sig)
122 {
123  (void) sig;
124  doneG = true;
125 }
126 #endif
127 
128 RemoteHeadChannel getRemoteHeadIdFromString(const std::string &head_str)
129 {
130  if (head_str == "VPB")
131  {
132  return Remote_Head_VPB;
133  }
134  else if (head_str == "0")
135  {
136  return Remote_Head_0;
137  }
138  else if (head_str == "1")
139  {
140  return Remote_Head_1;
141  }
142  else if (head_str == "2")
143  {
144  return Remote_Head_2;
145  }
146  else if (head_str == "3")
147  {
148  return Remote_Head_3;
149  }
150 
151  fprintf(stderr, "Error: Unrecognized remote head\n");
152  fprintf(stderr, "Please use one of the following:\n");
153  fprintf(stderr, "\tVPB\n");
154  fprintf(stderr, "\t0'\n");
155  fprintf(stderr, "\t1\n");
156  fprintf(stderr, "\t2\n");
157  fprintf(stderr, "\t3\n");
158  exit(EXIT_FAILURE);
159 }
160 
161 system::DeviceMode getOperatingMode(const std::vector<system::DeviceMode> &modes)
162 {
163  //
164  // Get the full resolution image
165 
166  system::DeviceMode best_mode(0, 0, 0, -1);
167  for (size_t i = 0 ; i < modes.size() ; ++i)
168  {
169  const system::DeviceMode &mode = modes[i];
170  if (mode.width >= best_mode.width && mode.height >= best_mode.height && mode.disparities >= best_mode.disparities) {
171  best_mode = mode;
172  }
173  }
174 
175  //
176  // Target 1/4 of the full res setting. Check to see if there is a setting with a larger number of disparities
177 
178  system::DeviceMode target_mode(best_mode.width / 2, best_mode.height / 2, 0, best_mode.disparities);
179 
180  for (size_t i = 0 ; i < modes.size() ; ++i)
181  {
182  const system::DeviceMode &mode = modes[i];
183  if (mode.width == target_mode.width && mode.height == target_mode.height && mode.disparities >= target_mode.disparities) {
184  target_mode = mode;
185  }
186  }
187 
188  //
189  // The camera does not support our targeted 1/4 res setting
190 
191  if (target_mode.supportedDataSources == 0) {
192  return best_mode;
193  }
194 
195  return target_mode;
196 }
197 
198 
199 std::string writeMatrix(const float* data, size_t width, size_t height)
200 {
201  std::stringstream ss;
202  ss << std::fixed << std::setprecision(6);
203 
204  for (size_t h = 0 ; h < height ; ++h) {
205  for (size_t w = 0 ; w < width ; ++w) {
206  ss << data[w + width * h] << ",";
207  }
208  }
209 
210  return ss.str();
211 }
212 
213 std::string assembledInfoString(const image::Header& header,
214  const system::DeviceInfo& info,
215  const system::VersionInfo& version,
216  const image::Calibration& calibration)
217 {
218  std::stringstream ss;
219 
224 
225  ss << "SN," << info.serialNumber << ",";
226  ss << "HWRev," << info.hardwareRevision << ",";
227  ss << "APIVersion," << version.apiVersion << ",";
228  ss << "FirmwareVersion," << version.sensorFirmwareVersion << ",";
229  ss << "timeSec," << header.timeSeconds << ",";
230  ss << "timeMiroSec," << header.timeMicroSeconds << ",";
231  ss << "exposure," << header.exposure << ",";
232  ss << "gain," << header.gain << ",";
233  ss << "fps," << header.framesPerSecond << ",";
234  ss << "leftM," << writeMatrix(&calibration.left.M[0][0], 3, 3);
235  ss << "leftD," << writeMatrix(calibration.left.D, 8, 1);
236  ss << "leftR," << writeMatrix(&calibration.left.R[0][0], 3, 3);
237  ss << "leftP," << writeMatrix(&calibration.left.P[0][0], 4, 3);
238  ss << "rightM," << writeMatrix(&calibration.right.M[0][0], 3, 3);
239  ss << "rightD," << writeMatrix(calibration.right.D, 8, 1);
240  ss << "rightR," << writeMatrix(&calibration.right.R[0][0], 3, 3);
241  ss << "rightP," << writeMatrix(&calibration.right.P[0][0], 4, 3);
242  if (hasAuxCamera) {
243  ss << "auxM," << writeMatrix(&calibration.aux.M[0][0], 3, 3);
244  ss << "auxD," << writeMatrix(calibration.aux.D, 8, 1);
245  ss << "auxR," << writeMatrix(&calibration.aux.R[0][0], 3, 3);
246  ss << "auxP," << writeMatrix(&calibration.aux.P[0][0], 4, 3);
247  }
248 
249  return ss.str();
250 }
251 
252 bool savePgm(const std::string& fileName,
253  uint32_t width,
254  uint32_t height,
255  uint32_t bitsPerPixel,
256  const std::string& comment,
257  const void *dataP)
258 {
259  std::ofstream outputStream(fileName.c_str(), std::ios::binary | std::ios::out);
260 
261  if (false == outputStream.good()) {
262  std::cerr << "Failed to open \"" << fileName << "\"" << std::endl;
263  return false;
264  }
265 
266  const uint32_t imageSize = height * width;
267 
268  switch(bitsPerPixel) {
269  case 8:
270  {
271 
272  outputStream << "P5\n"
273  << "#" << comment << "\n"
274  << width << " " << height << "\n"
275  << 0xFF << "\n";
276 
277  outputStream.write(reinterpret_cast<const char*>(dataP), imageSize);
278 
279  break;
280  }
281  case 16:
282  {
283  outputStream << "P5\n"
284  << "#" << comment << "\n"
285  << width << " " << height << "\n"
286  << 0xFFFF << "\n";
287 
288  const uint16_t *imageP = reinterpret_cast<const uint16_t*>(dataP);
289 
290  for (uint32_t i=0; i<imageSize; ++i) {
291  uint16_t o = htons(imageP[i]);
292  outputStream.write(reinterpret_cast<const char*>(&o), sizeof(uint16_t));
293  }
294 
295  break;
296  }
297  }
298 
299  outputStream.close();
300  return true;
301 }
302 
303 bool savePgm(const std::string& fileName,
304  const image::Header& header,
305  const system::DeviceInfo& info,
306  const system::VersionInfo& version,
307  const image::Calibration& calibration)
308 {
309  const std::string comment = assembledInfoString(header, info, version, calibration);
310 
311  return savePgm(fileName,
312  header.width,
313  header.height,
314  header.bitsPerPixel,
315  comment,
316  header.imageDataP);
317 }
318 
319 void imageCallback(const image::Header& header,
320  void *userDataP)
321 {
322  UserData *userData = reinterpret_cast<UserData*>(userDataP);
323 
324  static int64_t lastFrameId = -1;
325 
326  if (-1 == lastFrameId)
327  {
328  savePgm("test.pgm",
329  header,
330  userData->deviceInfo,
331  userData->version,
332  userData->calibration);
333  }
334 
335  if (header.source == Source_Luma_Left) {
336 
337  auto it = userData->elapsedTime.find(header.frameId);
338  if (it == userData->elapsedTime.end()) {
339  featureDetectionTime t;
340  t.imageTime = std::chrono::system_clock::now();
341  userData->elapsedTime.insert(std::pair<int64_t, featureDetectionTime>(header.frameId, t));
342  }
343  else
344  {
345  it->second.imageTime = std::chrono::system_clock::now();
346  std::cout <<" Image received after feature: " << header.frameId
347  <<" Delta: "
348  << std::chrono::duration_cast<std::chrono::milliseconds>(it->second.featureTime - it->second.imageTime).count()
349  << "ms\n";
350  userData->elapsedTime.erase(it);
351  }
352 
353  }
354  lastFrameId = header.frameId;
355 
356  image::Histogram histogram;
357 
358  if (Status_Ok != userData->channelP->getImageHistogram(header.frameId, histogram))
359  std::cerr << "failed to get histogram for frame " << header.frameId << std::endl;
360 }
361 
362 
363 const char *observerStatus(uint16_t x)
364 {
365  switch(x)
366  {
367  case 0: return "IDLE";
368  case 10: return "NOT ENOUGH MATCH";
369  case 11: return "SVD FAILED";
370  case 12: return "BAD DISTRIBUTION";
371  case 13: return "IDLE 0";
372  case 14: return "IDLE 1";
373  case 15: return "IDLE 01";
374  case 0xffff: return "IN PROGRESS";
375  }
376  return "unknown";
377 }
378 
379 void featureDetectorCallback(const secondary_app::Header& header,
380  void *userDataP)
381 {
382  feature_detector::Header fHeader;
383  UserData *userData = reinterpret_cast<UserData*>(userDataP);
384  void * buffer = userData->channelP->reserveCallbackBuffer();
386 
387  if (s != Status_Ok)
388  {
389  fprintf(stderr, "%s Error Secondary App Data extraction failed\n", __func__ );
390  userData->channelP->releaseCallbackBuffer(buffer);
391  return;
392  }
393 
394 
395  userData->channelP->releaseCallbackBuffer(buffer);
396 
397  if(affineCalib)
398  {
399  if(affineCalCount0Set)
400  {
401  std::cout << "\033[H";
402  std::cout << "Frame: " << fHeader.frameId << " \n";
403  std::cout << "Motion X: " << fHeader.averageXMotion << " \n";
404  std::cout << "Motion Y: " << fHeader.averageYMotion << " \n";
405  std::cout << "Number of features: " << fHeader.numFeatures << " \n";
406  std::cout << "Number of descriptors: " << fHeader.numDescriptors << " \n";
407  std::cout << "Octave Width: " << fHeader.octaveWidth << " \n";
408  std::cout << "Octave Height: " << fHeader.octaveHeight << " \n";
409  std::cout << "timeSeconds: " << fHeader.timeSeconds << " \n";
410  std::cout << "timeNanoSeconds: " << fHeader.timeNanoSeconds << " \n";
411  std::cout << "ptpNanoSeconds: " << fHeader.ptpNanoSeconds << " \n";
412 
413  if(fHeader.observerStatus==0xffff)
414  {
415  std::cout << "observerStatus: " << observerStatus(fHeader.observerStatus) << " \n";
416  std::cout << "observerIndex: " << fHeader.observerIndex << " \n";
417  std::cout << "observerNum: " << fHeader.observerNum << " \n";
418  std::cout << "observerDy: " << fHeader.observerDy * 0.001 << " \n";
419  std::cout << "observerTheta: " << fHeader.observerTheta * 0.001 << " \n";
420  std::cout << "affineCalCount: " << fHeader.affineCalCount << " \n";
421  userData->observerStatus = fHeader.observerStatus;
422  userData->observerIndex = fHeader.observerIndex;
423  userData->observerNum = fHeader.observerNum;
424  userData->observerDy = fHeader.observerDy;
425  userData->observerTheta = fHeader.observerTheta;
426  userData->affineCalCount = fHeader.affineCalCount;
427  }
428  else if(fHeader.observerStatus==0)
429  {
430  std::cout << "observerStatus: IDLE ";
431  }
432  else if(fHeader.observerStatus==9)
433  {
434  std::cout << "observerStatus: INITIALIZING " << fHeader.observerNum << " \n";
435  }
436  else
437  {
438  if(userData->observerStatus==0xffff)
439  {
440  std::cout << "observerStatus: " << observerStatus(userData->observerStatus) << " (" << observerStatus(fHeader.observerStatus) << ") \n";
441  std::cout << "observerIndex: " << userData->observerIndex << " \n";
442  std::cout << "observerNum: " << userData->observerNum << " \n";
443  std::cout << "observerDy: " << userData->observerDy * 0.001 << " \n";
444  std::cout << "observerTheta: " << userData->observerTheta * 0.001 << " \n";
445  std::cout << "affineCalCount: " << userData->affineCalCount << "\n";
446  }
447  }
448 
449  if(affineCalCount0 != fHeader.affineCalCount)
450  {
451  doneG = true;
452  std::cout << std::endl << "affine calibration is finished" << std::endl << std::endl;
453  }
454  }
455  else
456  {
457  affineCalCount0 = fHeader.affineCalCount;
458  affineCalCount0Set = true;
459  std::cout << "\033[2J\033[H";
460  }
461  }
462  else
463  {
466  {
467  auto it = userData->elapsedTime.find(fHeader.frameId);
468  if (it == userData->elapsedTime.end()) {
469  std::cout << "Unexpected result, image not yet received for frame: " << fHeader.frameId << "\n";
470  featureDetectionTime t;
471  t.featureTime = std::chrono::system_clock::now();
472  userData->elapsedTime.insert(std::pair<int64_t, featureDetectionTime>(fHeader.frameId, t));
473  }
474  else
475  {
476  it->second.featureTime = std::chrono::system_clock::now();
477  std::cout << "Feature received after image " << fHeader.frameId
478  << " Delta: "
479  << std::chrono::duration_cast<std::chrono::milliseconds>(it->second.featureTime - it->second.imageTime).count()
480  << "ms\n";
481  userData->elapsedTime.erase(it);
482  }
483  }
484 
485  std::cout << "Source: " << fHeader.source << " \n";
486  std::cout << "Frame: " << fHeader.frameId << " \n";
487  std::cout << "Motion X: " << fHeader.averageXMotion << " \n";
488  std::cout << "Motion Y: " << fHeader.averageYMotion << " \n";
489  std::cout << "Number of features: " << fHeader.numFeatures << " \n";
490  std::cout << "Number of descriptors: " << fHeader.numDescriptors << " \n";
491  std::cout << "Octave Width: " << fHeader.octaveWidth << " \n";
492  std::cout << "Octave Height: " << fHeader.octaveHeight << " \n";
493  std::cout << "timeSeconds: " << fHeader.timeSeconds << " \n";
494  std::cout << "timeNanoSeconds: " << fHeader.timeNanoSeconds << " \n";
495  std::cout << "ptpNanoSeconds: " << fHeader.ptpNanoSeconds << " \n";
496 
497  std::cout << "observerStatus: " << fHeader.observerStatus << " \n";
498  std::cout << "observerIndex: " << fHeader.observerIndex << " \n";
499  std::cout << "observerNum: " << fHeader.observerNum << " \n";
500  std::cout << "observerDy: " << fHeader.observerDy * 0.001 << " \n";
501  std::cout << "observerTheta: " << fHeader.observerTheta * 0.001 << " \n";
502  std::cout << "affineCalCount: " << fHeader.affineCalCount << "\n";
503  }
504 }
505 
506 } // anonymous
507 
508 int main(int argc,
509  char **argvPP)
510 {
511  std::string currentAddress = "10.66.171.21";
512  int32_t mtu = 0;
514 
515 #if WIN32
516  SetConsoleCtrlHandler (signalHandler, TRUE);
517 #else
518  signal(SIGINT, signalHandler);
519 #endif
520 
521  //
522  // Parse args
523 
524  int opt;
525 
526  while(-1 != (opt = getopt(argc, argvPP, "a:m:r:ci")))
527  switch(opt) {
528  case 'a': currentAddress = std::string(optarg); break;
529  case 'm': mtu = atoi(optarg); break;
530  case 'r': head_id = getRemoteHeadIdFromString(optarg); break;
531  case 'c': affineCalib = 1; break;
532  case 'i': affineCalib = 2; break;
533  default: usage(*argvPP); break;
534  }
535 
536  //
537  // Initialize communications.
538 
539  Channel *channelP = Channel::Create(currentAddress, head_id);
540  if (NULL == channelP) {
541  std::cerr << "Failed to establish communications with \"" << currentAddress << "\"" << std::endl;
542  return -1;
543  }
544 
545  //
546  // Query version
547 
548  Status status;
550  VersionType version;
551  std::vector<system::DeviceMode> deviceModes;
552  system::DeviceMode operatingMode;
553  image::Calibration calibration;
554  system::DeviceInfo info;
555  UserData userData;
556  bool quarter_res = false;
557 
558  userData.observerStatus=0;
559 
560  status = channelP->getSensorVersion(version);
561  status = channelP->getVersionInfo(v);
562 
563  if (Status_Ok != status) {
564  std::cerr << "Failed to query sensor version: " << Channel::statusString(status) << std::endl;
565  goto clean_out;
566  }
567 
568  std::cout << "API build date : " << v.apiBuildDate << "\n";
569  std::cout << "API version : 0x" << std::hex << std::setw(4) << std::setfill('0') << v.apiVersion << "\n";
570  std::cout << "Firmware build date : " << v.sensorFirmwareBuildDate << "\n";
571  std::cout << "Firmware version : 0x" << std::hex << std::setw(4) << std::setfill('0') << v.sensorFirmwareVersion << "\n";
572  std::cout << "Hardware version : 0x" << std::hex << v.sensorHardwareVersion << "\n";
573  std::cout << "Hardware magic : 0x" << std::hex << v.sensorHardwareMagic << "\n";
574  std::cout << "FPGA DNA : 0x" << std::hex << v.sensorFpgaDna << "\n";
575  std::cout << std::dec;
576 
577  status = channelP->getDeviceModes(deviceModes);
578  if (Status_Ok != status) {
579  std::cerr << "Failed to get device modes: " << Channel::statusString(status) << std::endl;
580  goto clean_out;
581  }
582 
583  operatingMode = getOperatingMode(deviceModes);
584 
585  //
586  // Change framerate
587 
588  {
589  image::Config cfg;
590 
591  status = channelP->getImageConfig(cfg);
592  if (Status_Ok != status) {
593  std::cerr << "Failed to get image config: " << Channel::statusString(status) << std::endl;
594  goto clean_out;
595  } else {
596  if(affineCalib)
597  {
598  operatingMode.width = 1920;
599  operatingMode.height = 1200;
600  operatingMode.disparities = 256;
601  std::cout << "Affine calibration uses full-res" << std::endl;
602  }
603 
604  std::cout << "Setting resolution to: " << operatingMode.width << "x" <<
605  operatingMode.height << "x" <<
606  operatingMode.disparities << std::endl;
607 
608  cfg.setResolution(operatingMode.width, operatingMode.height);
609  cfg.setDisparities(operatingMode.disparities);
610  if (operatingMode.width == 960) {
611  quarter_res = true;
612  cfg.setFps(15.0);
613  }
614  else
615  {
616  cfg.setFps(5.0);
617  }
618 
619  status = channelP->setImageConfig(cfg);
620  if (Status_Ok != status) {
621  std::cerr << "Failed to configure sensor: " << Channel::statusString(status) << std::endl;
622  goto clean_out;
623  }
624  }
625  }
626 
627  {
628 
630  status = channelP->getRegisteredApps(s);
631  if (Status_Ok != status)
632  {
633  std::cerr << "Error failed to get registered apps\n";
634  return -2;
635  }
636 
637  status = channelP->secondaryAppActivate(s.apps[0].appName);
638  if (Status_Ok != status)
639  {
640  std::cerr << "Error failed to activate app " << s.apps[0].appName;
641  return -2;
642  }
643 
644  fprintf(stderr, "%s got registered app: %s activated\n", __func__, s.apps[0].appName.c_str() );
645 
647 
648  if (quarter_res)
649  fcfg.setNumberOfFeatures(1500);
650  else
651  fcfg.setNumberOfFeatures(5000);
652  fcfg.setGrouping(true);
653  fcfg.setMotion(1);
654 
655  uint32_t fd_opts = 0; // USE HLS
656  if(affineCalib)
657  {
659  if(affineCalib>1)
660  {
662  }
663  }
664  fcfg.setOptions(fd_opts);
665 
666  status = channelP->setSecondaryAppConfig(fcfg);
667  if (Status_Ok != status)
668  {
669  std::cerr << "Error failed to set featureDetectorConfig apps\n";
670  return -2;
671  }
672 
673  std::cout << "Successfully Configured Feature Detector\n";
674 
675 
676  status = channelP->getSecondaryAppConfig(fcfg);
677  if (Status_Ok != status) {
678  std::cerr << "Failed to get feature detector config: " << Channel::statusString(status) << std::endl;
679  goto clean_out;
680  }
681 
682  std::cout << "Current feature detector settings: "
683  << fcfg.numberOfFeatures() << " : "
684  << fcfg.grouping() << " : "
685  << fcfg.motion() << " : "
686  << fcfg.options() << "\n";
687  }
688 
689  //
690  // Change MTU
691 
692  if (mtu >= 1500)
693  status = channelP->setMtu(mtu);
694  else
695  status = channelP->setBestMtu();
696  if (Status_Ok != status) {
697  std::cerr << "Failed to set MTU: " << Channel::statusString(status) << std::endl;
698  goto clean_out;
699  }
700 
701  //
702  // Change trigger source
703 
704  status = channelP->setTriggerSource(Trigger_Internal);
705  if (Status_Ok != status) {
706  std::cerr << "Failed to set trigger source: " << Channel::statusString(status) << std::endl;
707  goto clean_out;
708  }
709 
710  //
711  // Get image Calibration
712 
713  status = channelP->getImageCalibration(calibration);
714  if (Status_Ok != status) {
715  std::cerr << "Failed to get image calibration: " << Channel::statusString(status) << std::endl;
716  goto clean_out;
717  }
718 
719  //
720  // Get device info
721 
722  status = channelP->getDeviceInfo(info);
723  if (Status_Ok != status) {
724  std::cerr << "Failed to get device info: " << Channel::statusString(status) << std::endl;
725  goto clean_out;
726  }
727 
728  userData.channelP = channelP;
729  userData.version = v;
730  userData.deviceInfo = info;
731  userData.calibration = calibration;
732 
733  //
734  // Add callbacks
735 
736  if(!affineCalib)
737  {
738  channelP->addIsolatedCallback(imageCallback, Source_All, &userData);
739  }
740  channelP->addIsolatedCallback(featureDetectorCallback, &userData);
741 
742  //
743  // Start streaming
744 
745 
746  if(!affineCalib)
747  {
748  status = channelP->startStreams((operatingMode.supportedDataSources & Source_Luma_Left) |
749  (operatingMode.supportedDataSources & Source_Luma_Right) |
751  }
752  else
753  {
755  }
756 
757 
758  if (Status_Ok != status) {
759  std::cerr << "Failed to start streams: " << Channel::statusString(status) << std::endl;
760  goto clean_out;
761  }
762 
763  while(!doneG)
764  {
765  system::StatusMessage statusMessage;
766  status = channelP->getDeviceStatus(statusMessage);
767 
768  // if (Status_Ok == status) {
769  // std::cout << "Uptime: " << statusMessage.uptime << ", " <<
770  // "SystemOk: " << statusMessage.systemOk << ", " <<
771  // "FPGA Temp: " << statusMessage.fpgaTemperature << ", " <<
772  // "Left Imager Temp: " << statusMessage.leftImagerTemperature << ", " <<
773  // "Right Imager Temp: " << statusMessage.rightImagerTemperature << ", " <<
774  // "Input Voltage: " << statusMessage.inputVoltage << ", " <<
775  // "Input Current: " << statusMessage.inputCurrent << ", " <<
776  // "FPGA Power: " << statusMessage.fpgaPower << ", " <<
777  // "Logic Power: " << statusMessage.logicPower << ", " <<
778  // "Imager Power: " << statusMessage.imagerPower << std::endl;
779  // }
780 
781  usleep(1000000);
782  }
783 
784  status = channelP->stopStreams(Source_All);
785  if (Status_Ok != status)
786  {
787  std::cerr << "Failed to stop streams: " << Channel::statusString(status) << std::endl;
788  }
789 
790 clean_out:
791 
792  Channel::Destroy(channelP);
793  return 0;
794 }
usage
static void usage()
Definition: FirmwareUpdateUtility.cc:51
crl::multisense::system::VersionInfo::sensorFirmwareBuildDate
std::string sensorFirmwareBuildDate
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3168
feature_detector::Source_Feature_Left
static CRL_CONSTEXPR DataSource Source_Feature_Left
Definition: FeatureDetectorUtilities.hh:50
crl::multisense::Status_Ok
static CRL_CONSTEXPR Status Status_Ok
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:99
feature_detector::secondaryAppDataExtract
Status secondaryAppDataExtract(feature_detector::Header &header, const secondary_app::Header &orig)
Definition: FeatureDetectorUtilities.hh:227
feature_detector::Header::octaveWidth
uint16_t octaveWidth
Definition: FeatureDetectorUtilities.hh:184
crl::multisense::Channel::getDeviceInfo
virtual Status getDeviceInfo(system::DeviceInfo &info)=0
feature_detector::Header::source
DataSource source
Definition: FeatureDetectorUtilities.hh:179
crl::multisense::system::VersionInfo::sensorHardwareVersion
uint64_t sensorHardwareVersion
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3173
feature_detector::Header
Definition: FeatureDetectorUtilities.hh:175
crl::multisense::system::DeviceMode::supportedDataSources
DataSource supportedDataSources
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3098
feature_detector::Header::timeSeconds
uint32_t timeSeconds
Definition: FeatureDetectorUtilities.hh:181
crl::multisense::Remote_Head_0
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_0
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:214
crl::multisense::VersionType
uint32_t VersionType
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:88
crl::multisense::system::DeviceMode::width
uint32_t width
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3094
main
int main(int argc, char **argvPP)
Definition: FeatureDetectorUtility.cc:508
getopt.h
getopt
int getopt(int argc, char **argv, char *opts)
Definition: getopt.c:31
crl::multisense::system::DeviceMode::disparities
int32_t disparities
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3100
feature_detector::Header::ptpNanoSeconds
int64_t ptpNanoSeconds
Definition: FeatureDetectorUtilities.hh:183
crl::multisense::image::Config::setDisparities
void setDisparities(uint32_t d)
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:823
crl::multisense::Channel::Destroy
static void Destroy(Channel *instanceP)
Definition: Legacy/details/channel.cc:863
feature_detector::Header::numFeatures
uint16_t numFeatures
Definition: FeatureDetectorUtilities.hh:191
CRL_UNUSED
#define CRL_UNUSED(var)
Definition: Legacy/include/MultiSense/details/utility/Portability.hh:44
crl::multisense::Source_Luma_Left
static CRL_CONSTEXPR DataSource Source_Luma_Left
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:121
crl::multisense::Remote_Head_VPB
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_VPB
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:212
crl::multisense::image::Calibration::Data::P
float P[3][4]
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1927
feature_detector::Header::affineCalCount
uint16_t affineCalCount
Definition: FeatureDetectorUtilities.hh:198
crl::multisense::Channel::getImageCalibration
virtual Status getImageCalibration(image::Calibration &c)=0
feature_detector::FeatureDetectorConfig::grouping
bool grouping() const
Definition: FeatureDetectorUtilities.hh:81
crl::multisense::system::DeviceMode
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3090
crl::multisense::image::Calibration::aux
Data aux
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1935
crl::multisense::image::Calibration::Data::M
float M[3][3]
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1920
crl::multisense::image::Calibration::left
Data left
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1931
crl::multisense::Channel::getSensorVersion
virtual Status getSensorVersion(VersionType &version)=0
feature_detector::FeatureDetectorConfig::setMotion
void setMotion(const uint32_t &m)
Definition: FeatureDetectorUtilities.hh:132
FeatureDetectorConfigParams::OPT_USE_OBSERVER
static CRL_CONSTEXPR uint32_t OPT_USE_OBSERVER
Definition: FeatureDetectorConfig.hh:53
feature_detector::FeatureDetectorConfig::numberOfFeatures
uint32_t numberOfFeatures() const
Definition: FeatureDetectorUtilities.hh:74
Portability.hh
crl::multisense::Remote_Head_3
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_3
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:220
crl::multisense::Channel::startStreams
virtual Status startStreams(DataSource mask)=0
crl::multisense::Channel::setMtu
virtual Status setMtu(int32_t mtu)=0
crl::multisense::Remote_Head_1
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_1
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:216
crl::multisense::Channel::getDeviceStatus
virtual Status getDeviceStatus(system::StatusMessage &status)=0
crl::multisense::system::VersionInfo::sensorHardwareMagic
uint64_t sensorHardwareMagic
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3175
crl::multisense::system::SecondaryAppRegisteredApps
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:4093
crl::multisense::Channel::secondaryAppActivate
virtual Status secondaryAppActivate(const std::string &name)=0
feature_detector::Header::observerStatus
uint16_t observerStatus
Definition: FeatureDetectorUtilities.hh:193
crl::multisense::system::SecondaryAppRegisteredApps::apps
std::vector< SecondaryAppRegisteredApp > apps
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:4095
crl::multisense::image::Config
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:797
io::savePgm
bool savePgm(const std::string &fileName, uint32_t width, uint32_t height, uint32_t bitsPerPixel, const std::string &comment, const void *dataP)
Definition: Io.hh:67
feature_detector::Source_Feature_Rectified_Left
static CRL_CONSTEXPR DataSource Source_Feature_Rectified_Left
Definition: FeatureDetectorUtilities.hh:53
feature_detector::FeatureDetectorConfig
Definition: FeatureDetectorUtilities.hh:62
FeatureDetectorConfigParams::OPT_OBSERVER_INCREMENTAL
static CRL_CONSTEXPR uint32_t OPT_OBSERVER_INCREMENTAL
Definition: FeatureDetectorConfig.hh:57
crl::multisense::system::VersionInfo::apiBuildDate
std::string apiBuildDate
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3163
feature_detector::Source_Feature_Right
static CRL_CONSTEXPR DataSource Source_Feature_Right
Definition: FeatureDetectorUtilities.hh:51
crl::multisense::image::Calibration::Data::D
float D[8]
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1923
crl::multisense::image::Histogram
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1992
crl::multisense::system::DeviceInfo::serialNumber
std::string serialNumber
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3295
writeMatrix
std::ostream & writeMatrix(std::ostream &stream, std::string const &name, uint32_t rows, uint32_t columns, T const *data)
Definition: CalibrationYaml.hh:45
crl::multisense::Channel::statusString
static const char * statusString(Status status)
Definition: Legacy/details/channel.cc:876
crl::multisense::system::DeviceInfo
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3245
crl::multisense::Source_All
static CRL_CONSTEXPR DataSource Source_All
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:118
crl::multisense::system::DeviceInfo::HARDWARE_REV_MULTISENSE_MONOCAM
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_MONOCAM
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3262
crl::multisense::system::DeviceInfo::hardwareRevision
uint32_t hardwareRevision
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3297
feature_detector::Header::octaveHeight
uint16_t octaveHeight
Definition: FeatureDetectorUtilities.hh:185
crl::multisense::Channel::setBestMtu
virtual Status setBestMtu()=0
crl::multisense::image::Calibration
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1910
crl::multisense::Source_Luma_Right
static CRL_CONSTEXPR DataSource Source_Luma_Right
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:122
FeatureDetectorUtilities.hh
crl::multisense::system::VersionInfo::apiVersion
VersionType apiVersion
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3165
crl::multisense::Trigger_Internal
static CRL_CONSTEXPR TriggerSource Trigger_Internal
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:275
crl::multisense::Channel::setSecondaryAppConfig
virtual Status setSecondaryAppConfig(system::SecondaryAppConfig &c)=0
crl::multisense::Channel::getRegisteredApps
virtual Status getRegisteredApps(system::SecondaryAppRegisteredApps &c)=0
crl::multisense::Channel::Create
static Channel * Create(const std::string &sensorAddress)
Definition: Legacy/details/channel.cc:817
crl::multisense::system::VersionInfo::sensorFirmwareVersion
VersionType sensorFirmwareVersion
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3170
crl::multisense::Channel::getImageConfig
virtual Status getImageConfig(image::Config &c)=0
feature_detector::FeatureDetectorConfig::setGrouping
void setGrouping(const bool &g)
Definition: FeatureDetectorUtilities.hh:121
crl::multisense::Channel::getVersionInfo
virtual Status getVersionInfo(system::VersionInfo &v)=0
feature_detector::Header::observerIndex
uint16_t observerIndex
Definition: FeatureDetectorUtilities.hh:195
feature_detector::Header::observerDy
int16_t observerDy
Definition: FeatureDetectorUtilities.hh:196
feature_detector::Header::observerTheta
int16_t observerTheta
Definition: FeatureDetectorUtilities.hh:197
crl::multisense::system::DeviceMode::height
uint32_t height
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3096
feature_detector::Header::averageYMotion
uint16_t averageYMotion
Definition: FeatureDetectorUtilities.hh:190
crl::multisense::secondary_app::Header
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3028
crl::multisense::Remote_Head_2
static CRL_CONSTEXPR RemoteHeadChannel Remote_Head_2
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:218
crl::multisense::system::DeviceInfo::HARDWARE_REV_MULTISENSE_C6S2_S27
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_C6S2_S27
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3258
crl::multisense::Status
int32_t Status
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:94
crl::multisense::system::DeviceInfo::HARDWARE_REV_MULTISENSE_KS21i
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_KS21i
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3268
feature_detector::Header::frameId
int64_t frameId
Definition: FeatureDetectorUtilities.hh:180
header
std_msgs::Header const * header(const M &m)
crl::multisense::system::VersionInfo
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3159
feature_detector::FeatureDetectorConfig::setNumberOfFeatures
void setNumberOfFeatures(const uint32_t &numberOfFeatures)
Definition: FeatureDetectorUtilities.hh:101
crl::multisense::system::VersionInfo::sensorFpgaDna
uint64_t sensorFpgaDna
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3177
crl::multisense::Channel
Definition: Legacy/include/MultiSense/MultiSenseChannel.hh:69
feature_detector::FeatureDetectorConfig::motion
bool motion() const
Definition: FeatureDetectorUtilities.hh:88
crl::multisense::image::Calibration::Data::R
float R[3][3]
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1925
feature_detector::Header::observerNum
uint16_t observerNum
Definition: FeatureDetectorUtilities.hh:194
feature_detector::Header::timeNanoSeconds
uint32_t timeNanoSeconds
Definition: FeatureDetectorUtilities.hh:182
crl::multisense::Channel::setTriggerSource
virtual Status setTriggerSource(TriggerSource s)=0
crl::multisense
Definition: Legacy/details/channel.cc:62
crl::multisense::Channel::getSecondaryAppConfig
virtual Status getSecondaryAppConfig(system::SecondaryAppConfig &c)=0
crl::multisense::Channel::getDeviceModes
virtual Status getDeviceModes(std::vector< system::DeviceMode > &m)=0
feature_detector::Header::averageXMotion
uint16_t averageXMotion
Definition: FeatureDetectorUtilities.hh:189
crl::multisense::Channel::addIsolatedCallback
virtual Status addIsolatedCallback(image::Callback callback, DataSource imageSourceMask, void *userDataP=NULL)=0
crl::multisense::system::DeviceInfo::HARDWARE_REV_MULTISENSE_S30
static CRL_CONSTEXPR uint32_t HARDWARE_REV_MULTISENSE_S30
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3259
crl::multisense::Channel::stopStreams
virtual Status stopStreams(DataSource mask)=0
optarg
char * optarg
Definition: getopt.c:29
FeatureDetectorConfigParams::OPT_AUTO_AFFINE_CAL
static CRL_CONSTEXPR uint32_t OPT_AUTO_AFFINE_CAL
Definition: FeatureDetectorConfig.hh:59
crl::multisense::image::Calibration::right
Data right
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:1933
crl::multisense::image::Config::setResolution
void setResolution(uint32_t w, uint32_t h)
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:811
crl::multisense::image::Config::setFps
void setFps(float f)
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:852
crl::multisense::RemoteHeadChannel
int16_t RemoteHeadChannel
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:210
feature_detector::Header::numDescriptors
uint16_t numDescriptors
Definition: FeatureDetectorUtilities.hh:192
feature_detector::FeatureDetectorConfig::setOptions
void setOptions(const uint32_t &opt)
Definition: FeatureDetectorUtilities.hh:136
feature_detector::FeatureDetectorConfig::options
uint32_t options() const
Definition: FeatureDetectorUtilities.hh:90
crl::multisense::system::StatusMessage
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:3496
crl::multisense::image::Header
Definition: Legacy/include/MultiSense/MultiSenseTypes.hh:460
crl::multisense::Channel::setImageConfig
virtual Status setImageConfig(const image::Config &c)=0


multisense_lib
Author(s):
autogenerated on Thu Apr 17 2025 02:49:08