sick_generic_parser.cpp
Go to the documentation of this file.
1 
65 #ifdef _MSC_VER
66 #pragma warning(disable: 4267)
67 #endif
68 
69 //#define _CRT_SECURE_NO_WARNINGS
70 #define _USE_MATH_DEFINES
71 
72 #include <math.h>
75 
76 namespace sick_scan_xd
77 {
78  using namespace std;
79 
86  void ScannerBasicParam::setScannerName(std::string _s)
87  {
88  scannerName = _s;
89  }
90 
98  {
99  return (scannerName);
100  }
101 
105  bool ScannerBasicParam::isOneOfScannerNames(const std::vector<std::string>& scanner_names) const
106  {
107  for(int n = 0; n < scanner_names.size(); n++)
108  {
109  if (getScannerName().compare(scanner_names[n]) == 0)
110  return true;
111  }
112  return false;
113  }
114 
115 
123  {
124  numberOfLayers = _layerNum;
125  }
126 
134  {
135  return (numberOfLayers);
136 
137  }
138 
146  {
147  numberOfShots = _shots;
148  }
149 
157  {
158  return (numberOfShots);
159  }
160 
168  {
169  this->numberOfMaximumEchos = _maxEchos;
170  }
171 
172 
180  {
181  return (numberOfMaximumEchos);
182  }
183 
191  {
192  currentParamSet = _ptr;
193  }
194 
195 
202  {
203  angleDegressResolution = _res;
204  }
205 
212  {
213  return (angleDegressResolution);
214  }
215 
222  {
223  expectedFrequency = _freq;
224  }
225 
233  {
234  return (expectedFrequency);
235  }
236 
237 
244  {
245  this->elevationDegreeResolution = _elevRes;
246  }
247 
248 
255  {
256  return (this->elevationDegreeResolution);
257  }
258 
265  {
266  this->useBinaryProtocol = _useBinary;
267  }
268 
270  {
271  return this->imuEnabled;
272  }
273  void ScannerBasicParam::setImuEnabled(bool _imuEnabled)
274  {
275  this->imuEnabled = _imuEnabled;
276  }
283  {
284  deviceRadarType = _radar_type;
285  }
286 
293  {
294  return (deviceRadarType != NO_RADAR);
295  }
296 
298  {
299  return deviceRadarType;
300  }
301 
307 {
308  return (getDeviceIsRadar() && trackingModeSupported);
309 }
310 void ScannerBasicParam::setTrackingModeSupported(bool _trackingModeSupported)
311 {
312  trackingModeSupported = _trackingModeSupported;
313 }
314 
315 
321  void ScannerBasicParam::setScanMirroredAndShifted(bool _scannMirroredAndShifted)
322  {
323  scanMirroredAndShifted = _scannMirroredAndShifted;
324  }
325 
332  {
333  return (scanMirroredAndShifted);
334  }
335 
342  {
343  return (this->useBinaryProtocol);
344  }
345 
351  void ScannerBasicParam::setIntensityResolutionIs16Bit(bool _IntensityResolutionIs16Bit)
352  {
353  this->IntensityResolutionIs16Bit = _IntensityResolutionIs16Bit;
354  }
355 
362  {
363  return (IntensityResolutionIs16Bit);
364  }
365 
371  void ScannerBasicParam::setUseSafetyPasWD(bool _useSafetyPasWD)
372  {
373  this->useSafetyPasWD = _useSafetyPasWD;
374  }
375 
382  {
383  return (useSafetyPasWD);
384  }
385 
387  {
388  return this->useEvalFields;
389  }
390 
392  {
393  this->useEvalFields = _useEvalFields;
394  }
395 
397  {
398  return this->maxEvalFields;
399  }
400 
401  void ScannerBasicParam::setMaxEvalFields(int _maxEvalFields)
402  {
403  this->maxEvalFields = _maxEvalFields;
404  }
405 
406  void ScannerBasicParam::setRectEvalFieldAngleRefPointOffsetRad(float _rectFieldAngleRefPointOffsetRad)
407  {
408  this->rectFieldAngleRefPointOffsetRad = _rectFieldAngleRefPointOffsetRad;
409  }
410 
412  {
413  return this->rectFieldAngleRefPointOffsetRad;
414  }
415 
416  void ScannerBasicParam::setUseScancfgList (bool _useScancfgList )
417  {
418  this->useScancfgList = _useScancfgList;
419  }
421  {
422  return this->useScancfgList;
423  }
424 
425  void ScannerBasicParam::setUseWriteOutputRanges(bool _useWriteOutputRanges)
426  {
427  this->useWriteOutputRanges = _useWriteOutputRanges;
428  }
429 
431  {
432  return this->useWriteOutputRanges;
433  }
434 
435  void ScannerBasicParam::setWaitForReady(bool _waitForReady)
436  {
437  this->waitForReady = _waitForReady;
438  }
440  {
441  return this->waitForReady;
442  }
443 
444  void ScannerBasicParam::setFREchoFilterAvailable(bool _frEchoFilterAvailable)
445  {
446  this->frEchoFilterAvailable = _frEchoFilterAvailable;
447  }
448 
450  {
451  return this->frEchoFilterAvailable;
452  }
453 
454  void ScannerBasicParam::setScandatacfgAzimuthTableSupported(bool _scandatacfgAzimuthTableSupported)
455  {
456  this->scandatacfgAzimuthTableSupported = _scandatacfgAzimuthTableSupported;
457  }
458 
460  {
461  return this->scandatacfgAzimuthTableSupported;
462  }
463 
464 
470  : numberOfLayers(0), numberOfShots(0), numberOfMaximumEchos(0), elevationDegreeResolution(0), angleDegressResolution(0), expectedFrequency(0),
471  useBinaryProtocol(false), IntensityResolutionIs16Bit(false), deviceRadarType(NO_RADAR), useSafetyPasWD(false), encoderMode(0),
472  CartographerCompatibility(false), scanMirroredAndShifted(false), useEvalFields(EVAL_FIELD_UNSUPPORTED), maxEvalFields(0), rectFieldAngleRefPointOffsetRad(0),
473  imuEnabled (false), scanAngleShift(0), useScancfgList(false), useWriteOutputRanges(false)
474  {
475  this->elevationDegreeResolution = 0.0;
476  this->setUseBinaryProtocol(false);
477  }
478 
484  void ScannerBasicParam::setEncoderMode(int8_t _encoderMode)
485  {
486  this->encoderMode = _encoderMode;
487  }
488 
496  {
497  return (encoderMode);
498  }
499 
500  void ScannerBasicParam::setScanAngleShift(double _scanAngleShift)
501  {
502  this->scanAngleShift = _scanAngleShift;
503  }
504 
506  {
507  return this->scanAngleShift;
508  }
509 
515  SickGenericParser::SickGenericParser(std::string _scanType) :
516  AbstractParser(),
517  override_range_min_((float) 0.05),
518  override_range_max_((float) 100.0),
519  override_time_increment_((float) -1.0)
520  {
521  setScannerType(_scanType);
533  allowedScannerNames.push_back(SICK_SCANNER_RMS_XXXX_NAME); // Radar scanner
543  basicParams.resize(allowedScannerNames.size()); // resize to number of supported scanner types
544  for (int i = 0; i <
545  (int) basicParams.size(); i++) // set specific parameter for each scanner type - scanner type is identified by name
546  {
547  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
548  basicParams[i].setTrackingModeSupported(false); // Default
549  basicParams[i].setScannerName(allowedScannerNames[i]); // set scanner type for this parameter object
550  basicParams[i].setScandatacfgAzimuthTableSupported(false);
551 
552  if (basicParams[i].getScannerName().compare(SICK_SCANNER_MRS_1XXX_NAME) ==
553  0) // MRS1000 - 4 layer, 1101 shots per scan
554  {
555  basicParams[i].setNumberOfMaximumEchos(3);
556  basicParams[i].setNumberOfLayers(4);
557  basicParams[i].setNumberOfShots(1101);
558  basicParams[i].setAngularDegreeResolution(0.25);
559  basicParams[i].setElevationDegreeResolution(2.5); // in [degree]
560  basicParams[i].setExpectedFrequency(50.0);
561  basicParams[i].setUseBinaryProtocol(true);
562  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
563  basicParams[i].setTrackingModeSupported(false); // Default
564  basicParams[i].setUseSafetyPasWD(false); // Default
565  basicParams[i].setEncoderMode(-1); // Default
566  basicParams[i].setImuEnabled(true);// Activate Imu for MRS1000
567  basicParams[i].setScanAngleShift(-M_PI/2);
568  basicParams[i].setScanMirroredAndShifted(false);
569  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
570  basicParams[i].setMaxEvalFields(0);
571  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
572  basicParams[i].setUseScancfgList(false);
573  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
574  basicParams[i].setWaitForReady(true);
575  basicParams[i].setFREchoFilterAvailable(true);
576  basicParams[i].setScandatacfgAzimuthTableSupported(true);
577  }
578  if (basicParams[i].getScannerName().compare(SICK_SCANNER_LMS_1XXX_NAME) ==
579  0) // LMS1000 - 4 layer, 1101 shots per scan
580  {
581  basicParams[i].setNumberOfMaximumEchos(3);
582  basicParams[i].setNumberOfLayers(4);
583  basicParams[i].setNumberOfShots(1101);
584  basicParams[i].setAngularDegreeResolution(1.00); // 0.25° wurde nicht unterstuetzt. (SFA 4)
585  basicParams[i].setElevationDegreeResolution(0.0); // in [degree]
586  basicParams[i].setExpectedFrequency(50.0);
587  basicParams[i].setUseBinaryProtocol(true);
588  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
589  basicParams[i].setTrackingModeSupported(false); // Default
590  basicParams[i].setUseSafetyPasWD(false); // Default
591  basicParams[i].setEncoderMode(-1); // Default
592  basicParams[i].setImuEnabled(false);// Default
593  basicParams[i].setScanAngleShift(-M_PI/2);
594  basicParams[i].setScanMirroredAndShifted(false);
595  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
596  basicParams[i].setMaxEvalFields(0);
597  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
598  basicParams[i].setUseScancfgList(false);
599  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
600  basicParams[i].setWaitForReady(true);
601  basicParams[i].setFREchoFilterAvailable(false);
602  basicParams[i].setScandatacfgAzimuthTableSupported(true);
603  }
604  if (basicParams[i].getScannerName().compare(SICK_SCANNER_TIM_240_NAME) ==
605  0) // TIM_5xx - 1 Layer, max. 811 shots per scan
606  {
607  basicParams[i].setNumberOfMaximumEchos(1);
608  basicParams[i].setNumberOfLayers(1);
609  basicParams[i].setNumberOfShots(241); // [-120 deg, 120 deg]
610  basicParams[i].setAngularDegreeResolution(1.00000);
611  basicParams[i].setExpectedFrequency(15.0);
612  basicParams[i].setUseBinaryProtocol(true);
613  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
614  basicParams[i].setTrackingModeSupported(false); // Default
615  basicParams[i].setUseSafetyPasWD(false); // Default
616  basicParams[i].setEncoderMode(-1); // Default
617  basicParams[i].setImuEnabled(false);// Default
618  basicParams[i].setScanAngleShift(0);
619  basicParams[i].setScanMirroredAndShifted(false);
620  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
621  basicParams[i].setMaxEvalFields(0);
622  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
623  basicParams[i].setUseScancfgList(false);
624  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
625  basicParams[i].setWaitForReady(false);
626  basicParams[i].setFREchoFilterAvailable(false);
627  basicParams[i].setScandatacfgAzimuthTableSupported(false);
628  }
629  if (basicParams[i].getScannerName().compare(SICK_SCANNER_TIM_5XX_NAME) ==
630  0) // TIM_5xx - 1 Layer, max. 811 shots per scan
631  {
632  basicParams[i].setNumberOfMaximumEchos(1);
633  basicParams[i].setNumberOfLayers(1);
634  basicParams[i].setNumberOfShots(811);
635  basicParams[i].setAngularDegreeResolution(0.3333);
636  basicParams[i].setExpectedFrequency(15.0);
637  basicParams[i].setUseBinaryProtocol(true);
638  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
639  basicParams[i].setTrackingModeSupported(false); // Default
640  basicParams[i].setUseSafetyPasWD(false); // Default
641  basicParams[i].setEncoderMode(-1); // Default
642  basicParams[i].setImuEnabled(false);// Default
643  basicParams[i].setScanAngleShift(-M_PI/2);
644  basicParams[i].setScanMirroredAndShifted(false);
645  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
646  basicParams[i].setMaxEvalFields(0);
647  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
648  basicParams[i].setUseScancfgList(false);
649  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
650  basicParams[i].setWaitForReady(false);
651  basicParams[i].setFREchoFilterAvailable(false);
652  basicParams[i].setScandatacfgAzimuthTableSupported(false);
653  }
654  if (basicParams[i].getScannerName().compare(SICK_SCANNER_LMS_4XXX_NAME) == 0) // LMS_4xxx - 1 Layer, 600 Hz
655  {
656  basicParams[i].setNumberOfMaximumEchos(1);
657  basicParams[i].setNumberOfLayers(1);
658  basicParams[i].setNumberOfShots(841);//
659  basicParams[i].setAngularDegreeResolution(0.0833);//
660  basicParams[i].setExpectedFrequency(600.0);
661  basicParams[i].setUseBinaryProtocol(true);
662  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
663  basicParams[i].setTrackingModeSupported(false); // Default
664  basicParams[i].setUseSafetyPasWD(false); // Default
665  basicParams[i].setEncoderMode(-1); // Default
666  basicParams[i].setImuEnabled(false);// Default
667  basicParams[i].setScanAngleShift(-M_PI/2);
668  basicParams[i].setScanMirroredAndShifted(false);
669  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
670  basicParams[i].setMaxEvalFields(0);
671  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
672  basicParams[i].setUseScancfgList(false);
673  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
674  basicParams[i].setWaitForReady(false);
675  basicParams[i].setFREchoFilterAvailable(false);
676  basicParams[i].setScandatacfgAzimuthTableSupported(false);
677  }
678  if (basicParams[i].getScannerName().compare(SICK_SCANNER_TIM_7XX_NAME) == 0) // TIM_7xx - 1 Layer Scanner
679  {
680  basicParams[i].setNumberOfMaximumEchos(1);
681  basicParams[i].setNumberOfLayers(1);
682  basicParams[i].setNumberOfShots(811);
683  basicParams[i].setAngularDegreeResolution(0.3333);
684  basicParams[i].setExpectedFrequency(15.0);
685  basicParams[i].setUseBinaryProtocol(true);
686  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
687  basicParams[i].setTrackingModeSupported(false); // Default
688  basicParams[i].setUseSafetyPasWD(false); // Default
689  basicParams[i].setEncoderMode(-1); // Default
690  basicParams[i].setImuEnabled(false);// Default
691  basicParams[i].setScanAngleShift(-M_PI/2);
692  basicParams[i].setScanMirroredAndShifted(false);
693  basicParams[i].setUseEvalFields(USE_EVAL_FIELD_TIM7XX_LOGIC);
694  basicParams[i].setMaxEvalFields(48);
695  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
696  basicParams[i].setUseScancfgList(false);
697  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
698  basicParams[i].setWaitForReady(false);
699  basicParams[i].setFREchoFilterAvailable(false);
700  basicParams[i].setScandatacfgAzimuthTableSupported(false);
701  }
702  if (basicParams[i].getScannerName().compare(SICK_SCANNER_TIM_7XXS_NAME) == 0) // TIM_7xxS - 1 layer Safety Scanner
703  {
704  basicParams[i].setNumberOfMaximumEchos(1);
705  basicParams[i].setNumberOfLayers(1);
706  basicParams[i].setNumberOfShots(811);
707  basicParams[i].setAngularDegreeResolution(0.3333);
708  basicParams[i].setExpectedFrequency(15.0);
709  basicParams[i].setUseBinaryProtocol(true);
710  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
711  basicParams[i].setTrackingModeSupported(false); // Default
712  basicParams[i].setUseSafetyPasWD(true); // Safety scanner
713  basicParams[i].setEncoderMode(-1); // Default
714  basicParams[i].setImuEnabled(false);// Default
715  basicParams[i].setScanAngleShift(-M_PI/2);
716  basicParams[i].setScanMirroredAndShifted(false);
717  basicParams[i].setUseEvalFields(USE_EVAL_FIELD_TIM7XX_LOGIC);
718  basicParams[i].setMaxEvalFields(48);
719  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
720  basicParams[i].setUseScancfgList(false);
721  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
722  basicParams[i].setWaitForReady(false);
723  basicParams[i].setFREchoFilterAvailable(false);
724  basicParams[i].setScandatacfgAzimuthTableSupported(false);
725  }
726  if (basicParams[i].getScannerName().compare(SICK_SCANNER_LMS_5XX_NAME) == 0) // LMS_5xx - 1 Layer
727  {
728  basicParams[i].setNumberOfMaximumEchos(5); // (1) LMS sends up to 5 echos
729  basicParams[i].setNumberOfLayers(1);
730  basicParams[i].setNumberOfShots(381);
731  basicParams[i].setAngularDegreeResolution(0.5);
732  basicParams[i].setExpectedFrequency(15.0);
733  basicParams[i].setUseBinaryProtocol(true);
734  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
735  basicParams[i].setTrackingModeSupported(false); // Default
736  basicParams[i].setUseSafetyPasWD(false); // Default
737  basicParams[i].setEncoderMode(-1); // Default
738  basicParams[i].setImuEnabled(false);// Default
739  basicParams[i].setScanAngleShift(-M_PI/2);
740  basicParams[i].setScanMirroredAndShifted(false);
741  basicParams[i].setUseEvalFields(USE_EVAL_FIELD_LMS5XX_LOGIC);
742  basicParams[i].setMaxEvalFields(30);
743  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
744  basicParams[i].setUseScancfgList(false);
745  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
746  basicParams[i].setWaitForReady(false);
747  basicParams[i].setFREchoFilterAvailable(true); // LMS uses echo filter settings to configure number of echos: "sWN FREchoFilter N" with N=0: first echo, N=1: all echos, N=2: last echo
748  basicParams[i].setScandatacfgAzimuthTableSupported(false);
749  }
750  if (basicParams[i].getScannerName().compare(SICK_SCANNER_LMS_1XX_NAME) == 0) // LMS_1xx - 1 Layer
751  {
752  basicParams[i].setNumberOfMaximumEchos(1);
753  basicParams[i].setNumberOfLayers(1);
754  basicParams[i].setNumberOfShots(1081);
755  basicParams[i].setAngularDegreeResolution(0.5);
756  basicParams[i].setExpectedFrequency(25.0);
757  basicParams[i].setUseBinaryProtocol(true);
758  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
759  basicParams[i].setTrackingModeSupported(false); // Default
760  basicParams[i].setUseSafetyPasWD(false); // Default
761  basicParams[i].setEncoderMode(-1); // Default
762  basicParams[i].setImuEnabled(false);// Default
763  basicParams[i].setScanAngleShift(-M_PI/2);
764  basicParams[i].setScanMirroredAndShifted(false);
765  basicParams[i].setUseEvalFields(USE_EVAL_FIELD_LMS5XX_LOGIC);
766  basicParams[i].setMaxEvalFields(30);
767  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad((float)(-45 * M_PI / 180.0));
768  basicParams[i].setUseScancfgList(false);
769  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
770  basicParams[i].setWaitForReady(true); // changed from false to true, see comment in sick_lms1xx.launch
771  basicParams[i].setFREchoFilterAvailable(false);
772  basicParams[i].setScandatacfgAzimuthTableSupported(false);
773  }
774  if (basicParams[i].getScannerName().compare(SICK_SCANNER_LRS_36x0_NAME) == 0) //
775  {
776  basicParams[i].setNumberOfMaximumEchos(1);
777  basicParams[i].setNumberOfLayers(1);
778  basicParams[i].setNumberOfShots(7200);
779  basicParams[i].setAngularDegreeResolution(0.25); // (0.5);
780  basicParams[i].setExpectedFrequency(8.0); // (15.0);
781  basicParams[i].setUseBinaryProtocol(true);
782  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
783  basicParams[i].setTrackingModeSupported(false); // Default
784  basicParams[i].setUseSafetyPasWD(false); // Default
785  basicParams[i].setEncoderMode(-1); // Default
786  basicParams[i].setImuEnabled(false);// Default
787  basicParams[i].setScanAngleShift(+M_PI/2); // (+M_PI/2);
788  basicParams[i].setScanMirroredAndShifted(true); // (true);
789  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);// TODO Check this
790  basicParams[i].setMaxEvalFields(30);
791  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
792  basicParams[i].setUseScancfgList(true);
793  basicParams[i].setUseWriteOutputRanges(false); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
794  basicParams[i].setWaitForReady(true);
795  basicParams[i].setFREchoFilterAvailable(false);
796  basicParams[i].setScandatacfgAzimuthTableSupported(false);
797  }
798  if (basicParams[i].getScannerName().compare(SICK_SCANNER_LRS_36x1_NAME) == 0) //
799  {
800  basicParams[i].setNumberOfMaximumEchos(1);
801  basicParams[i].setNumberOfLayers(1);
802  basicParams[i].setNumberOfShots(7200);
803  basicParams[i].setAngularDegreeResolution(0.5);
804  basicParams[i].setExpectedFrequency(15.0);
805  basicParams[i].setUseBinaryProtocol(true);
806  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
807  basicParams[i].setTrackingModeSupported(false); // Default
808  basicParams[i].setUseSafetyPasWD(false); // Default
809  basicParams[i].setEncoderMode(-1); // Default
810  basicParams[i].setImuEnabled(false);// Default
811  basicParams[i].setScanAngleShift(-M_PI);
812  basicParams[i].setScanMirroredAndShifted(false);
813  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);// TODO Check this
814  basicParams[i].setMaxEvalFields(30);
815  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
816  basicParams[i].setUseScancfgList(true);
817  basicParams[i].setUseWriteOutputRanges(false); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
818  basicParams[i].setWaitForReady(true);
819  basicParams[i].setFREchoFilterAvailable(false);
820  basicParams[i].setScandatacfgAzimuthTableSupported(false);
821  }
822  if (basicParams[i].getScannerName().compare(SICK_SCANNER_MRS_6XXX_NAME) == 0) //
823  {
824  basicParams[i].setNumberOfMaximumEchos(5);
825  basicParams[i].setNumberOfLayers(24);
826  basicParams[i].setNumberOfShots(925);
827  basicParams[i].setAngularDegreeResolution(0.13);
828  basicParams[i].setElevationDegreeResolution(1.25); // in [degree]
829  basicParams[i].setExpectedFrequency(50.0);
830  basicParams[i].setUseBinaryProtocol(true);
831  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
832  basicParams[i].setTrackingModeSupported(false); // Default
833  basicParams[i].setUseSafetyPasWD(false); // Default
834  basicParams[i].setEncoderMode(-1); // Default
835  basicParams[i].setImuEnabled(false);// Default
836  basicParams[i].setScanAngleShift(-M_PI/2);
837  basicParams[i].setScanMirroredAndShifted(false);
838  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
839  basicParams[i].setMaxEvalFields(0);
840  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
841  basicParams[i].setUseScancfgList(false);
842  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
843  basicParams[i].setWaitForReady(false);
844  basicParams[i].setFREchoFilterAvailable(true);
845  basicParams[i].setScandatacfgAzimuthTableSupported(false);
846  }
847  if (basicParams[i].getScannerName().compare(SICK_SCANNER_LRS_4XXX_NAME) == 0) // LRS_4XXX - 1 Layer
848  {
849  basicParams[i].setNumberOfMaximumEchos(1);
850  basicParams[i].setNumberOfLayers(1);
851  basicParams[i].setNumberOfShots(7201);
852  basicParams[i].setAngularDegreeResolution(0.05);
853  basicParams[i].setExpectedFrequency(12.5);
854  basicParams[i].setUseBinaryProtocol(true);
855  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
856  basicParams[i].setTrackingModeSupported(false); // Default
857  basicParams[i].setUseSafetyPasWD(false); // Default
858  basicParams[i].setEncoderMode(-1); // Default
859  basicParams[i].setImuEnabled(false);// Default
860  basicParams[i].setScanAngleShift(0);
861  basicParams[i].setScanMirroredAndShifted(false);
862  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
863  basicParams[i].setMaxEvalFields(0);
864  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
865  basicParams[i].setUseScancfgList(true); // false // LRS4000 sets scan rate and angular resolution set by "sMN mCLsetscancfglist <mode>"
866  basicParams[i].setUseWriteOutputRanges(true); // false // LRS4000 sets the scan configuration by both "sMN mCLsetscancfglist <mode>" AND "sWN LMPoutputRange" (default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry)
867  basicParams[i].setWaitForReady(false);
868  basicParams[i].setFREchoFilterAvailable(true); // (false) // LRS4XXX uses echo filter settings to configure 1 echo, use filter_echos = 0 (first echo) for LRS4xxx
869  basicParams[i].setScandatacfgAzimuthTableSupported(false);
870  }
871  if (basicParams[i].getScannerName().compare(SICK_SCANNER_RMS_XXXX_NAME) == 0) // Radar
872  {
873  basicParams[i].setNumberOfMaximumEchos(1);
874  basicParams[i].setNumberOfLayers(0); // for radar scanner
875  basicParams[i].setNumberOfShots(65);
876  basicParams[i].setAngularDegreeResolution(0.00);
877  basicParams[i].setElevationDegreeResolution(0.00); // in [degree]
878  basicParams[i].setExpectedFrequency(0.00);
879  basicParams[i].setUseBinaryProtocol(false); // use ASCII-Protocol
880  basicParams[i].setDeviceIsRadar(RADAR_3D); // Default: Device is a 3D radar (RMS-1xxx switched to 1D radar after device type query)
881  basicParams[i].setTrackingModeSupported(true); // Default: tracking mode enabled (not supported by RMS-1xxx, disabled for RMS-1 after device type query)
882  basicParams[i].setUseSafetyPasWD(false); // Default
883  basicParams[i].setEncoderMode(-1); // Default
884  basicParams[i].setImuEnabled(false);// Default
885  basicParams[i].setScanAngleShift(0);
886  basicParams[i].setScanMirroredAndShifted(false);
887  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
888  basicParams[i].setMaxEvalFields(0);
889  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
890  basicParams[i].setUseScancfgList(false);
891  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
892  basicParams[i].setWaitForReady(false);
893  basicParams[i].setFREchoFilterAvailable(false);
894  basicParams[i].setScandatacfgAzimuthTableSupported(false);
895  }
896  if (basicParams[i].getScannerName().compare(SICK_SCANNER_NAV_31X_NAME) == 0) // Nav 3xx
897  {
898  basicParams[i].setNumberOfMaximumEchos(1);
899  basicParams[i].setNumberOfLayers(1);
900  basicParams[i].setNumberOfShots(2880);
901  basicParams[i].setAngularDegreeResolution(0.750);
902  basicParams[i].setExpectedFrequency(55.0);
903  basicParams[i].setUseBinaryProtocol(true);
904  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
905  basicParams[i].setTrackingModeSupported(false); // Default
906  basicParams[i].setUseSafetyPasWD(false); // Default
907  basicParams[i].setEncoderMode(-1); // Default
908  basicParams[i].setImuEnabled(false);// Default
909  basicParams[i].setScanAngleShift(0);
910  basicParams[i].setScanMirroredAndShifted(true);
911  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
912  basicParams[i].setMaxEvalFields(0);
913  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
914  basicParams[i].setUseScancfgList(true);
915  basicParams[i].setUseWriteOutputRanges(false); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
916  basicParams[i].setWaitForReady(true);
917  basicParams[i].setFREchoFilterAvailable(false);
918  basicParams[i].setScandatacfgAzimuthTableSupported(false);
919  }
920  if (basicParams[i].getScannerName().compare(SICK_SCANNER_NAV_350_NAME) == 0)
921  {
922  basicParams[i].setNumberOfMaximumEchos(1);
923  basicParams[i].setNumberOfLayers(1);
924  basicParams[i].setNumberOfShots(1440);
925  basicParams[i].setAngularDegreeResolution(0.250);
926  basicParams[i].setExpectedFrequency(8.0);
927  basicParams[i].setUseBinaryProtocol(true);
928  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false);
929  basicParams[i].setTrackingModeSupported(false);
930  basicParams[i].setUseSafetyPasWD(false);
931  basicParams[i].setEncoderMode(-1);
932  basicParams[i].setImuEnabled(false);
933  basicParams[i].setScanAngleShift(-M_PI);
934  basicParams[i].setScanMirroredAndShifted(true);
935  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
936  basicParams[i].setMaxEvalFields(0);
937  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
938  basicParams[i].setUseScancfgList(true);
939  basicParams[i].setUseWriteOutputRanges(false); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
940  basicParams[i].setWaitForReady(false);
941  basicParams[i].setFREchoFilterAvailable(false);
942  basicParams[i].setScandatacfgAzimuthTableSupported(false);
943  }
944  if (basicParams[i].getScannerName().compare(SICK_SCANNER_OEM_15XX_NAME) == 0) // OEM 15xx
945  {
946  basicParams[i].setNumberOfMaximumEchos(1);
947  basicParams[i].setNumberOfLayers(1);
948  basicParams[i].setNumberOfShots(2880);
949  basicParams[i].setAngularDegreeResolution(0.25); // (0.750);
950  basicParams[i].setExpectedFrequency(8.0); // (55.0);
951  basicParams[i].setUseBinaryProtocol(true);
952  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
953  basicParams[i].setTrackingModeSupported(false); // Default
954  basicParams[i].setUseSafetyPasWD(false); // Default
955  basicParams[i].setEncoderMode(-1); // Default
956  basicParams[i].setImuEnabled(false);// Default
957  basicParams[i].setScanAngleShift(0); // (0);
958  basicParams[i].setScanMirroredAndShifted(true); // (false);
959  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
960  basicParams[i].setMaxEvalFields(0);
961  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
962  basicParams[i].setUseScancfgList(true);
963  basicParams[i].setUseWriteOutputRanges(false); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
964  basicParams[i].setWaitForReady(true);
965  basicParams[i].setFREchoFilterAvailable(false);
966  basicParams[i].setScandatacfgAzimuthTableSupported(false);
967  }
968  if (basicParams[i].getScannerName().compare(SICK_SCANNER_NAV_2XX_NAME) == 0) // NAV_2xx - 1 Layer
969  {
970  basicParams[i].setNumberOfMaximumEchos(1);
971  basicParams[i].setNumberOfLayers(1);
972  basicParams[i].setNumberOfShots(1081);
973  basicParams[i].setAngularDegreeResolution(0.5);
974  basicParams[i].setExpectedFrequency(25.0);
975  basicParams[i].setUseBinaryProtocol(true);
976  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
977  basicParams[i].setTrackingModeSupported(false); // Default
978  basicParams[i].setUseSafetyPasWD(false); // Default
979  basicParams[i].setEncoderMode(-1); // Default
980  basicParams[i].setImuEnabled(false);// Default
981  basicParams[i].setScanAngleShift(0);
982  basicParams[i].setScanMirroredAndShifted(false);
983  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
984  basicParams[i].setMaxEvalFields(0);
985  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
986  basicParams[i].setUseScancfgList(false);
987  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
988  basicParams[i].setWaitForReady(false);
989  basicParams[i].setFREchoFilterAvailable(false);
990  basicParams[i].setScandatacfgAzimuthTableSupported(false);
991  }
992  if (basicParams[i].getScannerName().compare(SICK_SCANNER_TIM_4XX_NAME) == 0) // TiM433 and TiM443
993  {
994  basicParams[i].setNumberOfMaximumEchos(1);
995  basicParams[i].setNumberOfLayers(1);
996  basicParams[i].setNumberOfShots(721);
997  basicParams[i].setAngularDegreeResolution(0.33333333333);
998  basicParams[i].setExpectedFrequency(15.0);
999  basicParams[i].setUseBinaryProtocol(true);
1000  basicParams[i].setDeviceIsRadar(NO_RADAR); // (false); // Default
1001  basicParams[i].setTrackingModeSupported(false); // Default
1002  basicParams[i].setUseSafetyPasWD(false); // Default
1003  basicParams[i].setEncoderMode(-1); // Default
1004  basicParams[i].setImuEnabled(false);// Default
1005  basicParams[i].setScanAngleShift(-M_PI/2);
1006  basicParams[i].setScanMirroredAndShifted(false);
1007  basicParams[i].setUseEvalFields(EVAL_FIELD_UNSUPPORTED);
1008  basicParams[i].setMaxEvalFields(0);
1009  basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
1010  basicParams[i].setUseScancfgList(false);
1011  basicParams[i].setUseWriteOutputRanges(true); // default: use "sWN LMPoutputRange" if scan configuration not set by ScanCfgList-entry
1012  basicParams[i].setWaitForReady(false);
1013  basicParams[i].setFREchoFilterAvailable(false);
1014  basicParams[i].setScandatacfgAzimuthTableSupported(false);
1015  }
1016  if (basicParams[i].getScannerName().compare(SICK_SCANNER_SCANSEGMENT_XD_NAME) == 0
1017  || basicParams[i].getScannerName().compare(SICK_SCANNER_PICOSCAN_NAME) == 0)
1018  {
1019  // SCANSEGMENT_XD (Multiscan 136, picoscan150) handled by msgpack_converter and msgpack_exporter
1020  }
1021  }
1022 
1023  int scannerIdx = lookUpForAllowedScanner(scannerType);
1024 
1025  if (scannerIdx == -1) // find index of parameter set - derived from scanner type name
1026  {
1027  ROS_ERROR("Scanner not supported.\n");
1028  throw new std::string("scanner type " + scannerType + " not supported.");
1029  }
1030  else
1031  {
1032  currentParamSet = &(basicParams[scannerIdx]);
1033  }
1034  }
1035 
1041  {
1042  return (currentParamSet);
1043  }
1044 
1050  int SickGenericParser::lookUpForAllowedScanner(std::string scannerName)
1051  {
1052  int iRet = -1;
1053  for (int i = 0; i < (int) allowedScannerNames.size(); i++)
1054  {
1055  if (allowedScannerNames[i].compare(scannerName) == 0)
1056  {
1057  return (i);
1058  }
1059  }
1060 
1061  return (iRet);
1062  }
1063 
1069  {
1070  }
1071 
1085  int SickGenericParser::checkForDistAndRSSI(std::vector<char *> &fields, int expected_number_of_data, int &distNum,
1086  int &rssiNum, std::vector<float> &distVal, std::vector<float> &rssiVal,
1087  int &distMask)
1088  {
1089  int iRet = ExitSuccess;
1090  distNum = 0;
1091  rssiNum = 0;
1092  int baseOffset = 20;
1093 
1094  distMask = 0;
1095  // More in depth checks: check data length and RSSI availability
1096  // 25: Number of data (<= 10F)
1097  unsigned short int number_of_data = 0;
1098  if (strstr(fields[baseOffset], "DIST") != fields[baseOffset]) // First initial check
1099  {
1100  ROS_WARN_STREAM("Field 20 of received data does not start with DIST (is: " << std::string(fields[20]) << ". Unexpected data, ignoring scan\n");
1101  return ExitError;
1102  }
1103 
1104  int offset = 20;
1105  do
1106  {
1107  bool distFnd = false;
1108  bool rssiFnd = false;
1109  if (strlen(fields[offset]) == 5)
1110  {
1111  if (strstr(fields[offset], "DIST") == fields[offset])
1112  {
1113  distFnd = true;
1114  distNum++;
1115  int distId = -1;
1116  if (1 == sscanf(fields[offset], "DIST%d", &distId))
1117  {
1118  distMask |= (1 << (distId - 1)); // set bit regarding to id
1119  }
1120  }
1121  if (strstr(fields[offset], "RSSI") == fields[offset])
1122  {
1123  rssiNum++;
1124  rssiFnd = true;
1125  }
1126  }
1127  if (rssiFnd || distFnd)
1128  {
1129  offset += 5;
1130  if (offset >= (int) fields.size())
1131  {
1132  ROS_WARN("Missing RSSI or DIST data");
1133  return ExitError;
1134  }
1135  number_of_data = 0;
1136  sscanf(fields[offset], "%hx", &number_of_data);
1137  if (number_of_data != expected_number_of_data)
1138  {
1139  ROS_WARN("number of dist or rssi values mismatching.");
1140  return ExitError;
1141  }
1142  offset++;
1143  // Here is the first value
1144  for (int i = 0; i < number_of_data; i++)
1145  {
1146  if (distFnd)
1147  {
1148  unsigned short iRange;
1149  float range;
1150  sscanf(fields[offset + i], "%hx", &iRange);
1151  range = iRange / 1000.0f;
1152  distVal.push_back(range);
1153  }
1154  else
1155  {
1156  unsigned short iRSSI;
1157  sscanf(fields[offset + i], "%hx", &iRSSI);
1158  rssiVal.push_back((float) iRSSI);
1159  }
1160  }
1161  offset += number_of_data;
1162  }
1163  else
1164  {
1165  offset++; // necessary????
1166  }
1167  } while (offset < (int) fields.size());
1168 
1169  return (iRet);
1170  }
1171 
1172 
1173  bool SickGenericParser::checkScanTiming(float time_increment, float scan_time, float angle_increment, float tol)
1174  {
1175  if (this->getCurrentParamPtr()->getNumberOfLayers() > 1)
1176  {
1177  return true;
1178  }
1179 
1180  float expected_time_increment = (float)
1181  fabs(this->getCurrentParamPtr()->getNumberOfLayers() * scan_time * angle_increment / (2.0 * M_PI));//If the direction of rotation is reversed, i.e. negative angle increment, a negative scan time results. This does not makes sense, therefore the absolute value is calculated.
1182  if (fabs(expected_time_increment - time_increment) > 0.00001)
1183  {
1184 #if defined __ROS_VERSION && __ROS_VERSION == 1
1185  ROS_WARN_THROTTLE(60,
1186  "The time_increment, scan_time and angle_increment values reported by the scanner are inconsistent! "
1187  "Expected time_increment: %.9f, reported time_increment: %.9f "
1188  "(time_increment=%.9f, scan_time=%.9f, angle_increment=%.9f). "
1189  "Check angle shift settings. Perhaps you should set the parameter time_increment to the expected value. This message will print every 60 seconds.",
1190  expected_time_increment, time_increment, time_increment, scan_time, angle_increment*180.0/M_PI);
1191 #else
1192  static rosTime last_message_time(0);
1193  if ((rosTimeNow() - last_message_time) > rosDurationFromSec(60))
1194  {
1195  last_message_time = rosTimeNow();
1197  "The time_increment, scan_time and angle_increment values reported by the scanner are inconsistent! "
1198  << "Expected time_increment: " << expected_time_increment << ", reported time_increment:" << time_increment << " "
1199  << "(time_increment=" << time_increment << ", scan_time=" << scan_time << ", angle_increment=" << (angle_increment * 180.0 / M_PI) << "). "
1200  << "Check angle shift settings. Perhaps you should set the parameter time_increment to the expected value. This message will print every 60 seconds.");
1201  }
1202 #endif
1203  return false;
1204  }
1205  // ROS_DEBUG_STREAM("SickGenericParser::checkScanTiming(time_increment=" << time_increment << ", scan_time=" << scan_time << ", angle_increment=" << (angle_increment*180.0/M_PI)
1206  // << "): expected_time_increment=" << expected_time_increment);
1207  return true;
1208  };
1209 
1210 
1221  int SickGenericParser::parse_datagram(char *datagram, size_t datagram_length, SickScanConfig &config,
1222  ros_sensor_msgs::LaserScan &msg, int &numEchos, int &echoMask)
1223  {
1224  // echoMask introduced to get a workaround for cfg bug using MRS1104
1225  bool dumpData = false;
1226  int verboseLevel = 0; // for low level debugging only
1227 
1228  int HEADER_FIELDS = 32;
1229  char *cur_field;
1230  size_t count;
1231  int scannerIdx = lookUpForAllowedScanner(getScannerType());
1232 
1233  // Reserve sufficient space
1234  std::vector<char *> fields;
1235  fields.reserve(datagram_length / 2);
1236 
1237  // ----- only for debug output
1238  std::vector<char> datagram_copy_vec;
1239  datagram_copy_vec.resize(datagram_length + 1); // to avoid using malloc. destructor frees allocated mem.
1240  char *datagram_copy = &(datagram_copy_vec[0]);
1241 
1242  if (verboseLevel > 0)
1243  {
1244  sick_scan_xd::SickScanCommon::dumpDatagramForDebugging((unsigned char *)datagram, datagram_length, true);
1245  }
1246 
1247  strncpy(datagram_copy, datagram, datagram_length); // datagram will be changed by strtok
1248  datagram_copy[datagram_length] = 0;
1249 
1250  // ----- tokenize
1251  count = 0;
1252  cur_field = strtok(datagram, " ");
1253 
1254  while (cur_field != NULL)
1255  {
1256  fields.push_back(cur_field);
1257  //std::cout << cur_field << std::endl;
1258  cur_field = strtok(NULL, " ");
1259  }
1260 
1261  //std::cout << fields[27] << std::endl;
1262 
1263  count = fields.size();
1264 
1265 
1266  if (verboseLevel > 0)
1267  {
1268  sick_scan_xd::SickScanCommon::dumpDatagramForDebugging((unsigned char *)fields.data(), fields.size(), true);
1269  }
1270 
1271  // Validate header. Total number of tokens is highly unreliable as this may
1272  // change when you change the scanning range or the device name using SOPAS ET
1273  // tool. The header remains stable, however.
1274  if (count < HEADER_FIELDS)
1275  {
1276  ROS_WARN_STREAM("received less fields than minimum fields (actual: " << (int)count << ", minimum: " << (int)HEADER_FIELDS << "), ignoring scan\n");
1277  ROS_WARN_STREAM("are you using the correct node? (124 --> sick_tim310_1130000m01, > 33 --> sick_tim551_2050001, 580 --> sick_tim310s01, 592 --> sick_tim310)\n");
1278  // ROS_DEBUG("received message was: %s", datagram_copy);
1279  return ExitError;
1280  }
1281 
1282  if (basicParams[scannerIdx].getNumberOfLayers() == 1)
1283  {
1284  if (strcmp(fields[15], "0"))
1285  {
1286  ROS_WARN_STREAM("Field 15 of received data is not equal to 0 (" << std::string(fields[15]) << "). Unexpected data, ignoring scan\n");
1287  return ExitError;
1288  }
1289  }
1290  else // fields[15] enthält keine "0"
1291  {
1292 
1293  //other layers are here on alternate values
1294  // ROS_WARN("Field 15 of received data is not equal to 0 (%s). Unexpected data, ignoring scan", fields[15]);
1295  // return ExitError;
1296  }
1297  if (strcmp(fields[20], "DIST1"))
1298  {
1299  ROS_WARN_STREAM("Field 20 of received data is not equal to DIST1i (" << std::string(fields[20]) << "). Unexpected data, ignoring scan\n");
1300  return ExitError;
1301  }
1302 
1303  // More in depth checks: check data length and RSSI availability
1304  // 25: Number of data (<= 10F)
1305  unsigned short int number_of_data = 0;
1306  sscanf(fields[25], "%hx", &number_of_data);
1307 
1308  int numOfExpectedShots = basicParams[scannerIdx].getNumberOfShots();
1309  if (number_of_data < 1 || number_of_data > numOfExpectedShots)
1310  {
1311  ROS_WARN_STREAM("Data length is outside acceptable range 1-" << numOfExpectedShots << " (" << number_of_data << "). Ignoring scan");
1312  return ExitError;
1313  }
1314  if (count < HEADER_FIELDS + number_of_data)
1315  {
1316  ROS_WARN_STREAM("Less fields than expected for " << number_of_data << " data points (" << count << "). Ignoring scan");
1317  return ExitError;
1318  }
1319  ROS_DEBUG_STREAM("Number of data: " << number_of_data);
1320 
1321  // Calculate offset of field that contains indicator of whether or not RSSI data is included
1322  size_t rssi_idx = 26 + number_of_data;
1323  bool rssi = false;
1324  if (strcmp(fields[rssi_idx], "RSSI1") == 0)
1325  {
1326  rssi = true;
1327  }
1328  unsigned short int number_of_rssi_data = 0;
1329  if (rssi)
1330  {
1331  sscanf(fields[rssi_idx + 5], "%hx", &number_of_rssi_data);
1332 
1333  // Number of RSSI data should be equal to number of data
1334  if (number_of_rssi_data != number_of_data)
1335  {
1336  ROS_WARN_STREAM("Number of RSSI data is lower than number of range data (" << number_of_data << " vs " << number_of_rssi_data << ")");
1337  return ExitError;
1338  }
1339 
1340  // Check if the total length is still appropriate.
1341  // RSSI data size = number of RSSI readings + 6 fields describing the data
1342  if (count < HEADER_FIELDS + number_of_data + number_of_rssi_data + 6)
1343  {
1344  ROS_WARN_STREAM("Less fields than expected for " << number_of_data << " data points (" << count << "). Ignoring scan");
1345  return ExitError;
1346  }
1347 
1348  if (strcmp(fields[rssi_idx], "RSSI1"))
1349  {
1350  ROS_WARN_STREAM("Field " << rssi_idx + 1 << " of received data is not equal to RSSI1 (" << fields[rssi_idx + 1] << "). Unexpected data, ignoring scan");
1351  }
1352  }
1353 
1354  short layer = 0;
1355  if (basicParams[scannerIdx].getNumberOfLayers() > 1)
1356  {
1357  sscanf(fields[15], "%hx", &layer);
1358  ROS_HEADER_SEQ(msg.header, layer);
1359  }
1360  // ----- read fields into msg
1361  msg.header.frame_id = config.frame_id;
1362  // evtl. debug stream benutzen
1363  // ROS_DEBUG("publishing with frame_id %s", config.frame_id.c_str());
1364 
1365  rosTime start_time = rosTimeNow(); // will be adjusted in the end
1366 
1367 
1368  /*
1369 
1370  */
1371  // <STX> (\x02)
1372  // 0: Type of command (SN)
1373  // 1: Command (LMDscandata)
1374  // 2: Firmware version number (1)
1375  // 3: Device number (1)
1376  // 4: Serial number (eg. B96518)
1377  // 5 + 6: Device Status (0 0 = ok, 0 1 = error)
1378  // 7: Telegram counter (eg. 99)
1379  // 8: Scan counter (eg. 9A)
1380  // 9: Time since startup (eg. 13C8E59)
1381  // 10: Time of transmission (eg. 13C9CBE)
1382  // 11 + 12: Input status (0 0), active fieldset
1383  // 13 + 14: Output status (8 0)
1384  // 15: Reserved Byte A (0)
1385 
1386  // 16: Scanning Frequency (5DC)
1387  unsigned short scanning_freq = -1;
1388  sscanf(fields[16], "%hx", &scanning_freq);
1389  msg.scan_time = 1.0f / (scanning_freq / 100.0f);
1390  // ROS_DEBUG("hex: %s, scanning_freq: %d, scan_time: %f", fields[16], scanning_freq, msg.scan_time);
1391 
1392  // 17: Measurement Frequency (36)
1393  unsigned short measurement_freq = -1;
1394  sscanf(fields[17], "%hx", &measurement_freq);
1395  msg.time_increment = 1.0f / (measurement_freq * 100.0f);
1396  if (override_time_increment_ > 0.0)
1397  {
1398  // Some lasers may report incorrect measurement frequency
1399  msg.time_increment = override_time_increment_;
1400  }
1401  // ROS_DEBUG("measurement_freq: %d, time_increment: %f", measurement_freq, msg.time_increment);
1402 
1403  // 18: Number of encoders (0)
1404  // 19: Number of 16 bit channels (1)
1405  // 20: Measured data contents (DIST1)
1406 
1407  // 21: Scaling factor (3F800000)
1408  // ignored for now (is always 1.0):
1409  // unsigned int scaling_factor_int = -1;
1410  // sscanf(fields[21], "%x", &scaling_factor_int);
1411  //
1412  // float scaling_factor = reinterpret_cast<float&>(scaling_factor_int);
1413  // // ROS_DEBUG("hex: %s, scaling_factor_int: %d, scaling_factor: %f", fields[21], scaling_factor_int, scaling_factor);
1414 
1415  // 22: Scaling offset (00000000) -- always 0
1416  // 23: Starting angle (FFF92230)
1417  int starting_angle = -1;
1418  sscanf(fields[23], "%x", &starting_angle);
1419  msg.angle_min = (float)((starting_angle / 10000.0) / 180.0 * M_PI - M_PI / 2);
1420  // ROS_DEBUG("starting_angle: %d, angle_min: %f", starting_angle, msg.angle_min);
1421 
1422  // 24: Angular step width (2710)
1423  unsigned short angular_step_width = -1;
1424  sscanf(fields[24], "%hx", &angular_step_width);
1425  msg.angle_increment = (angular_step_width / 10000.0) / 180.0 * M_PI;
1426  msg.angle_max = (float)(msg.angle_min + (number_of_data - 1) * msg.angle_increment);
1427 
1428  // 25: Number of data (<= 10F)
1429  // This is already determined above in number_of_data
1430  int index_min = 0;
1431 
1432 #if 1 // neuer Ansatz
1433  int distNum = 0;
1434  int rssiNum = 0;
1435 
1436 
1437  checkForDistAndRSSI(fields, number_of_data, distNum, rssiNum, msg.ranges, msg.intensities, echoMask);
1438  if (config.intensity)
1439  {
1440  if (rssiNum > 0)
1441  {
1442 
1443  }
1444  else
1445  {
1446  ROS_WARN("Intensity parameter is enabled, but the scanner is not configured to send RSSI values! ");
1447  }
1448  }
1449  numEchos = distNum;
1450 #endif
1451  // 26 + n: RSSI data included
1452  // IF RSSI not included:
1453  // 26 + n + 1 .. 26 + n + 3 = unknown (but seems to be [0, 1, B] always)
1454  // 26 + n + 4 .. count - 4 = device label
1455  // count - 3 .. count - 1 = unknown (but seems to be 0 always)
1456  // <ETX> (\x03)
1457 
1458  msg.range_min = override_range_min_;
1459  msg.range_max = override_range_max_;
1460 
1461  if (basicParams[scannerIdx].getNumberOfLayers() > 1)
1462  {
1463  char szDummy[255] = {0};
1464  sprintf(szDummy, "%s_%+04d", config.frame_id.c_str(), layer); // msg.header.seq := layer
1465  msg.header.frame_id = szDummy;
1466  }
1467  // ----- adjust start time
1468  // - last scan point = now ==> first scan point = now - number_of_data * time increment
1469 #ifndef _MSC_VER // TIMING in Simulation not correct
1470  double duration_sec = number_of_data * msg.time_increment
1471  + index_min * msg.time_increment // shift forward to time of first published scan point
1472  + config.time_offset; // add time offset (to account for USB latency etc.)
1473  msg.header.stamp = start_time - rosDurationFromSec(duration_sec); // rosDuration().fromSec(number_of_data * msg.time_increment);
1474 
1475 #endif
1476  // ----- consistency check
1477 
1478  this->checkScanTiming(msg.time_increment, msg.scan_time, msg.angle_increment, 0.00001f);
1479  return ExitSuccess;
1480  }
1481 
1482 
1489  {
1491  }
1492 
1499  {
1500  override_range_max_ = max;
1501  }
1502 
1503 
1510  {
1511  return (override_range_max_);
1512  }
1513 
1520  {
1521  return (override_range_min_);
1522  }
1523 
1528  {
1529  m_range_filter_handling = range_filter_handling;
1530  }
1531 
1536  {
1537  return m_range_filter_handling;
1538  }
1539 
1546  {
1547  override_time_increment_ = time;
1548  }
1549 
1556  {
1557  return override_time_increment_;
1558  }
1559 
1566  void SickGenericParser::setScannerType(std::string _scannerType)
1567  {
1568  scannerType = _scannerType;
1569  }
1570 
1577  {
1578  return (scannerType);
1579 
1580  }
1581 
1582 } /* namespace sick_scan_xd */
sick_scan_xd::NO_RADAR
@ NO_RADAR
Definition: sick_generic_parser.h:104
sick_scan_xd::SickGenericParser::parse_datagram
virtual int parse_datagram(char *datagram, size_t datagram_length, SickScanConfig &config, ros_sensor_msgs::LaserScan &msg, int &numEchos, int &echoMask)
Parsing Ascii datagram.
Definition: sick_generic_parser.cpp:1221
sick_scan_xd::ScannerBasicParam::setAngularDegreeResolution
void setAngularDegreeResolution(double _res)
Set angular resolution in degrees.
Definition: sick_generic_parser.cpp:201
sick_scan_xd::ScannerBasicParam::getUseBinaryProtocol
bool getUseBinaryProtocol(void)
flag to decide between usage of ASCII-sopas or BINARY-sopas
Definition: sick_generic_parser.cpp:341
sick_scan_xd::RADAR_3D
@ RADAR_3D
Definition: sick_generic_parser.h:106
sick_scan_xd::ScannerBasicParam::getWaitForReady
bool getWaitForReady()
Definition: sick_generic_parser.cpp:439
min
int min(int a, int b)
sick_scan_xd::ScannerBasicParam::setElevationDegreeResolution
void setElevationDegreeResolution(double _elevRes)
set angular resolution in VERTICAL direction for multilayer scanner
Definition: sick_generic_parser.cpp:243
msg
msg
NULL
#define NULL
sick_scan_xd::ScannerBasicParam::getUseScancfgList
bool getUseScancfgList()
Definition: sick_generic_parser.cpp:420
sick_scan_xd::ScannerBasicParam::setUseEvalFields
void setUseEvalFields(EVAL_FIELD_SUPPORT _useEvalFields)
Definition: sick_generic_parser.cpp:391
sick_scan_xd::ScannerBasicParam::encoderMode
int8_t encoderMode
Definition: sick_generic_parser.h:224
sick_scan_xd::ScannerBasicParam::getNumberOfLayers
int getNumberOfLayers(void)
Getting number of scanner layers.
Definition: sick_generic_parser.cpp:133
sick_scan_xd::SickGenericParser::set_range_max
void set_range_max(float max)
Setting maximum range.
Definition: sick_generic_parser.cpp:1498
sick_scan_xd::ScannerBasicParam::setScanAngleShift
void setScanAngleShift(double _scanAngleShift)
Definition: sick_generic_parser.cpp:500
sick_scan_xd::ScannerBasicParam::setMaxEvalFields
void setMaxEvalFields(int _maxEvalFields)
Definition: sick_generic_parser.cpp:401
ROS_WARN_THROTTLE
#define ROS_WARN_THROTTLE(rate,...)
Definition: macros_generated.h:175
SICK_SCANNER_NAV_350_NAME
#define SICK_SCANNER_NAV_350_NAME
Definition: sick_generic_parser.h:75
sick_scan_xd::ScannerBasicParam::setImuEnabled
void setImuEnabled(bool _imuEnabled)
Definition: sick_generic_parser.cpp:273
sick_scan_xd::ScannerBasicParam::setIntensityResolutionIs16Bit
void setIntensityResolutionIs16Bit(bool _IntensityResolutionIs16Bit)
Set the RSSI Value length.
Definition: sick_generic_parser.cpp:351
sick_scan_xd::ScannerBasicParam::getExpectedFrequency
double getExpectedFrequency(void)
get expected scan frequency
Definition: sick_generic_parser.cpp:232
sick_scan_xd::ScannerBasicParam::getScannerName
std::string getScannerName(void) const
Getting name (type) of scanner.
Definition: sick_generic_parser.cpp:97
sick_scan_xd::ScannerBasicParam::setRectEvalFieldAngleRefPointOffsetRad
void setRectEvalFieldAngleRefPointOffsetRad(float _rectFieldAngleRefPointOffsetRad)
Definition: sick_generic_parser.cpp:406
sick_scan_xd::ScannerBasicParam::getNumberOfShots
int getNumberOfShots(void)
Get number of shots per scan.
Definition: sick_generic_parser.cpp:156
SICK_SCANNER_LMS_1XX_NAME
#define SICK_SCANNER_LMS_1XX_NAME
Definition: sick_generic_parser.h:70
sick_scan_xd::ScannerBasicParam::setTrackingModeSupported
void setTrackingModeSupported(bool _trackingModeSupported)
Definition: sick_generic_parser.cpp:310
sick_scan_xd::SickGenericParser::setScannerType
void setScannerType(std::string s)
setting scannertype
Definition: sick_generic_parser.cpp:1566
sick_scan_xd::SickGenericParser::checkScanTiming
bool checkScanTiming(float time_increment, float scan_time, float angle_increment, float tol)
Definition: sick_generic_parser.cpp:1173
sick_scan_xd::ScannerBasicParam::setDeviceIsRadar
void setDeviceIsRadar(RADAR_TYPE_ENUM _radar_type)
flag to mark the device as radar (instead of laser scanner)
Definition: sick_generic_parser.cpp:282
ROS_WARN
#define ROS_WARN(...)
Definition: sick_scan_logging.h:122
sick_scan_xd::SickGenericParser::set_time_increment
void set_time_increment(float time)
setting time increment between shots
Definition: sick_generic_parser.cpp:1545
SICK_SCANNER_OEM_15XX_NAME
#define SICK_SCANNER_OEM_15XX_NAME
Definition: sick_generic_parser.h:81
sick_scan_xd
Definition: abstract_parser.cpp:65
sick_scan_common.h
sick_scan_xd::ScannerBasicParam::getElevationDegreeResolution
double getElevationDegreeResolution(void)
get angular resolution in VERTICAL direction for multilayer scanner
Definition: sick_generic_parser.cpp:254
sick_ros_wrapper.h
ROS_HEADER_SEQ
#define ROS_HEADER_SEQ(msgheader, value)
Definition: sick_ros_wrapper.h:162
sick_scan_xd::ScannerBasicParam::getEncoderMode
int8_t getEncoderMode()
Getter-Method for encoder mode.
Definition: sick_generic_parser.cpp:495
sick_scan_xd::ScannerBasicParam::setScannerName
void setScannerName(std::string _s)
Setting name (type) of scanner.
Definition: sick_generic_parser.cpp:86
SICK_SCANNER_TIM_7XX_NAME
#define SICK_SCANNER_TIM_7XX_NAME
Definition: sick_generic_parser.h:67
sick_scan_xd::SickGenericParser::checkForDistAndRSSI
int checkForDistAndRSSI(std::vector< char * > &fields, int expected_number_of_data, int &distNum, int &rssiNum, std::vector< float > &distVal, std::vector< float > &rssiVal, int &distMask)
check for DIST and RSSI-entries in the datagram. Helper routine for parser
Definition: sick_generic_parser.cpp:1085
sick_scan_xd::ScannerBasicParam::setNumberOfMaximumEchos
void setNumberOfMaximumEchos(int _maxEchos)
Set number of maximum echoes for this laser scanner type.
Definition: sick_generic_parser.cpp:167
sick_scan_xd::ScannerBasicParam::setUseScancfgList
void setUseScancfgList(bool _useScancfgList)
Definition: sick_generic_parser.cpp:416
sensor_msgs::LaserScan
::sensor_msgs::LaserScan_< std::allocator< void > > LaserScan
Definition: LaserScan.h:94
sick_scan_xd::SickGenericParser::override_range_max_
float override_range_max_
Definition: sick_generic_parser.h:283
ROS_WARN_STREAM
#define ROS_WARN_STREAM(args)
Definition: sick_scan_logging.h:123
sick_scan_xd::ScannerBasicParam::getScanAngleShift
double getScanAngleShift()
Definition: sick_generic_parser.cpp:505
sick_scan_xd::SickScanConfig
Definition: sick_ros_wrapper.h:512
sick_scan_xd::ScannerBasicParam::setNumberOfLayers
void setNumberOfLayers(int _layerNum)
Setting number of scanner layers (depending of scanner type/family)
Definition: sick_generic_parser.cpp:122
sick_scan_xd::ScannerBasicParam::scanAngleShift
double scanAngleShift
Definition: sick_generic_parser.h:218
sick_scan_xd::ScannerBasicParam::setUseBinaryProtocol
void setUseBinaryProtocol(bool _useBinary)
flag to decide between usage of ASCII-sopas or BINARY-sopas
Definition: sick_generic_parser.cpp:264
sick_scan_xd::ScannerBasicParam::setScandatacfgAzimuthTableSupported
void setScandatacfgAzimuthTableSupported(bool _scandatacfgAzimuthTableSupported)
Definition: sick_generic_parser.cpp:454
sick_scan_xd::SickGenericParser::~SickGenericParser
virtual ~SickGenericParser()
Destructor of parser.
Definition: sick_generic_parser.cpp:1068
sick_scan_xd::SickGenericParser::setCurrentParamPtr
void setCurrentParamPtr(ScannerBasicParam *_ptr)
Set pointer to corresponding parameter object to the parser.
Definition: sick_generic_parser.cpp:190
sick_scan_xd::ScannerBasicParam::getUseWriteOutputRanges
bool getUseWriteOutputRanges()
Definition: sick_generic_parser.cpp:430
sick_scan_xd::EVAL_FIELD_SUPPORT
EVAL_FIELD_SUPPORT
Definition: sick_generic_parser.h:93
sick_scan_xd::SickGenericParser::SickGenericParser
SickGenericParser(std::string scannerType)
Construction of parser object.
Definition: sick_generic_parser.cpp:515
sick_scan_xd::ScannerBasicParam::getNumberOfMaximumEchos
int getNumberOfMaximumEchos(void)
Get number of maximum echoes for this laser scanner type.
Definition: sick_generic_parser.cpp:179
sick_scan_xd::ScannerBasicParam::getAngularDegreeResolution
double getAngularDegreeResolution(void)
Get angular resolution in degress.
Definition: sick_generic_parser.cpp:211
sick_scan_xd::SickGenericParser::override_range_min_
float override_range_min_
Definition: sick_generic_parser.h:283
SICK_SCANNER_LRS_36x0_NAME
#define SICK_SCANNER_LRS_36x0_NAME
Definition: sick_generic_parser.h:79
SICK_SCANNER_LMS_1XXX_NAME
#define SICK_SCANNER_LMS_1XXX_NAME
Definition: sick_generic_parser.h:63
SICK_SCANNER_NAV_31X_NAME
#define SICK_SCANNER_NAV_31X_NAME
Definition: sick_generic_parser.h:74
sick_scan_xd::SickScanCommon::dumpDatagramForDebugging
static bool dumpDatagramForDebugging(unsigned char *buffer, int bufLen, bool isBinary=true)
Definition: sick_scan_common.cpp:4233
sick_scan_xd::SickGenericParser::getCurrentParamPtr
ScannerBasicParam * getCurrentParamPtr()
Gets Pointer to parameter object.
Definition: sick_generic_parser.cpp:1040
sick_scan_xd::ExitSuccess
@ ExitSuccess
Definition: abstract_parser.h:46
sick_scan_xd::SickGenericParser::scannerType
std::string scannerType
Definition: sick_generic_parser.h:285
ROS_DEBUG_STREAM
#define ROS_DEBUG_STREAM(args)
Definition: sick_scan_logging.h:113
sick_scan_xd::SickGenericParser::allowedScannerNames
std::vector< std::string > allowedScannerNames
Definition: sick_generic_parser.h:286
sick_scan_xd::SickGenericParser::get_time_increment
float get_time_increment(void)
getting time increment between shots
Definition: sick_generic_parser.cpp:1555
sick_scan_xd::ScannerBasicParam::setScanMirroredAndShifted
void setScanMirroredAndShifted(bool _scanMirroredAndShifted)
flag to mark mirroring of rotation direction
Definition: sick_generic_parser.cpp:321
sick_scan_xd::ScannerBasicParam::setWaitForReady
void setWaitForReady(bool _waitForReady)
Definition: sick_generic_parser.cpp:435
sick_scan_xd::ScannerBasicParam::isOneOfScannerNames
bool isOneOfScannerNames(const std::vector< std::string > &scanner_names) const
Returns true, if the scanner name (type) is found int a given list of scanner names.
Definition: sick_generic_parser.cpp:105
SICK_SCANNER_LMS_4XXX_NAME
#define SICK_SCANNER_LMS_4XXX_NAME
Definition: sick_generic_parser.h:72
sick_scan_xd::ScannerBasicParam::getFREchoFilterAvailable
bool getFREchoFilterAvailable(void)
Definition: sick_generic_parser.cpp:449
sick_scan_xd::SickGenericParser::set_range_min
void set_range_min(float min)
Setting minimum range.
Definition: sick_generic_parser.cpp:1488
sick_scan_xd::ScannerBasicParam::setNumberOfShots
void setNumberOfShots(int _shots)
Set number of shots per scan.
Definition: sick_generic_parser.cpp:145
sick_scan_xd::USE_EVAL_FIELD_LMS5XX_LOGIC
@ USE_EVAL_FIELD_LMS5XX_LOGIC
Definition: sick_generic_parser.h:97
sick_scan_xd::ScannerBasicParam::setUseWriteOutputRanges
void setUseWriteOutputRanges(bool _useWriteOutputRanges)
Definition: sick_generic_parser.cpp:425
sick_scan_xd::ScannerBasicParam::getScanMirroredAndShifted
bool getScanMirroredAndShifted()
flag to mark mirroring of rotation direction
Definition: sick_generic_parser.cpp:331
sick_scan_xd::ScannerBasicParam::ScannerBasicParam
ScannerBasicParam()
Construction of parameter object.
Definition: sick_generic_parser.cpp:469
rosTimeNow
rosTime rosTimeNow(void)
Definition: sick_ros_wrapper.h:173
sick_scan_xd::SickGenericParser::currentParamSet
ScannerBasicParam * currentParamSet
Definition: sick_generic_parser.h:288
SICK_SCANNER_MRS_1XXX_NAME
#define SICK_SCANNER_MRS_1XXX_NAME
Definition: sick_generic_parser.h:64
SICK_SCANNER_TIM_7XXS_NAME
#define SICK_SCANNER_TIM_7XXS_NAME
Definition: sick_generic_parser.h:68
SICK_SCANNER_LRS_36x1_NAME
#define SICK_SCANNER_LRS_36x1_NAME
Definition: sick_generic_parser.h:80
ros::Time
sick_scan_xd::SickGenericParser::getScannerType
std::string getScannerType(void)
getting scannertype
Definition: sick_generic_parser.cpp:1576
sick_scan_xd::ScannerBasicParam::getIntensityResolutionIs16Bit
bool getIntensityResolutionIs16Bit(void)
Get the RSSI Value length.
Definition: sick_generic_parser.cpp:361
sick_scan_xd::SickGenericParser::lookUpForAllowedScanner
int lookUpForAllowedScanner(std::string scannerName)
checks the given scannerName/scannerType of validity
Definition: sick_generic_parser.cpp:1050
ROS_ERROR
#define ROS_ERROR(...)
Definition: sick_scan_logging.h:127
sick_scan_xd::ScannerBasicParam::setFREchoFilterAvailable
void setFREchoFilterAvailable(bool _frEchoFilterAvailable)
Definition: sick_generic_parser.cpp:444
std
sick_scan_xd::RADAR_TYPE_ENUM
RADAR_TYPE_ENUM
Definition: sick_generic_parser.h:102
sick_scan_xd::SickGenericParser::get_range_max
float get_range_max(void)
Getting maximum range.
Definition: sick_generic_parser.cpp:1509
sick_scan_xd::ScannerBasicParam::getUseEvalFields
EVAL_FIELD_SUPPORT getUseEvalFields()
Definition: sick_generic_parser.cpp:386
sick_scan_xd::AbstractParser
Definition: abstract_parser.h:51
sick_scan_xd::ScannerBasicParam::setExpectedFrequency
void setExpectedFrequency(double _freq)
set expected scan frequency
Definition: sick_generic_parser.cpp:221
SICK_SCANNER_LRS_4XXX_NAME
#define SICK_SCANNER_LRS_4XXX_NAME
Definition: sick_generic_parser.h:78
sick_scan_xd::SickGenericParser::basicParams
std::vector< ScannerBasicParam > basicParams
Definition: sick_generic_parser.h:287
sick_scan_xd::ScannerBasicParam::getTrackingModeSupported
bool getTrackingModeSupported(void)
set/get flag to mark the radar device supports selection of tracking modes. By default,...
Definition: sick_generic_parser.cpp:306
sick_scan_xd::SickGenericParser::m_range_filter_handling
RangeFilterResultHandling m_range_filter_handling
Definition: sick_generic_parser.h:289
sick_scan_xd::ScannerBasicParam::setEncoderMode
void setEncoderMode(int8_t _EncoderMode)
Prama for encoder mode.
Definition: sick_generic_parser.cpp:484
sick_scan_xd::SickGenericParser::get_range_min
float get_range_min(void)
Getting minimum range.
Definition: sick_generic_parser.cpp:1519
sick_scan_xd::ScannerBasicParam::getScandatacfgAzimuthTableSupported
bool getScandatacfgAzimuthTableSupported(void) const
Definition: sick_generic_parser.cpp:459
rosDurationFromSec
rosDuration rosDurationFromSec(double seconds)
Definition: sick_ros_wrapper.h:211
sick_scan_xd::ScannerBasicParam::getImuEnabled
bool getImuEnabled()
Definition: sick_generic_parser.cpp:269
sick_scan_xd::ScannerBasicParam::elevationDegreeResolution
double elevationDegreeResolution
Definition: sick_generic_parser.h:215
SICK_SCANNER_NAV_2XX_NAME
#define SICK_SCANNER_NAV_2XX_NAME
Definition: sick_generic_parser.h:76
sick_scan_xd::EVAL_FIELD_UNSUPPORTED
@ EVAL_FIELD_UNSUPPORTED
Definition: sick_generic_parser.h:95
SICK_SCANNER_LMS_5XX_NAME
#define SICK_SCANNER_LMS_5XX_NAME
Definition: sick_generic_parser.h:69
sick_scan_xd::SickGenericParser::set_range_filter_config
void set_range_filter_config(RangeFilterResultHandling range_filter_handling)
Set range filter handling (range filter deactivated, drop, set to nan, etc.pp.)
Definition: sick_generic_parser.cpp:1527
sick_scan_xd::RangeFilterResultHandling
enum sick_scan_xd::RangeFilterResultHandlingEnum RangeFilterResultHandling
sick_scan_xd::ScannerBasicParam::getDeviceIsRadar
bool getDeviceIsRadar(void)
flag to mark the device as radar (instead of laser scanner)
Definition: sick_generic_parser.cpp:292
sick_scan_xd::ScannerBasicParam
Definition: sick_generic_parser.h:110
SICK_SCANNER_SCANSEGMENT_XD_NAME
#define SICK_SCANNER_SCANSEGMENT_XD_NAME
Definition: sick_generic_parser.h:82
config
config
SICK_SCANNER_TIM_5XX_NAME
#define SICK_SCANNER_TIM_5XX_NAME
Definition: sick_generic_parser.h:66
sick_scan_xd::ScannerBasicParam::setUseSafetyPasWD
void setUseSafetyPasWD(bool _useSafetyPasWD)
flag to mark the device uses the safety scanner password
Definition: sick_generic_parser.cpp:371
sick_scan_xd::ScannerBasicParam::getMaxEvalFields
int getMaxEvalFields(void)
Definition: sick_generic_parser.cpp:396
sick_scan_xd::ScannerBasicParam::getRectEvalFieldAngleRefPointOffsetRad
float getRectEvalFieldAngleRefPointOffsetRad(void)
Definition: sick_generic_parser.cpp:411
SICK_SCANNER_RMS_XXXX_NAME
#define SICK_SCANNER_RMS_XXXX_NAME
Definition: sick_generic_parser.h:73
sick_scan_xd::SickGenericParser::get_range_filter_config
RangeFilterResultHandling get_range_filter_config(void) const
Get range filter handling (range filter deactivated, drop, set to nan, etc.pp.)
Definition: sick_generic_parser.cpp:1535
sick_scan_xd::ScannerBasicParam::getUseSafetyPasWD
bool getUseSafetyPasWD()
flag to mark the device uses the safety scanner password \reutrn Bool true for safety password false ...
Definition: sick_generic_parser.cpp:381
sick_scan_xd::USE_EVAL_FIELD_TIM7XX_LOGIC
@ USE_EVAL_FIELD_TIM7XX_LOGIC
Definition: sick_generic_parser.h:96
sick_scan_xd::ExitError
@ ExitError
Definition: abstract_parser.h:47
sick_scan_xd::SickGenericParser::override_time_increment_
float override_time_increment_
Definition: sick_generic_parser.h:284
SICK_SCANNER_PICOSCAN_NAME
#define SICK_SCANNER_PICOSCAN_NAME
Definition: sick_generic_parser.h:83
SICK_SCANNER_TIM_240_NAME
#define SICK_SCANNER_TIM_240_NAME
Definition: sick_generic_parser.h:65
sick_scan_xd::ScannerBasicParam::getDeviceRadarType
RADAR_TYPE_ENUM getDeviceRadarType(void)
Definition: sick_generic_parser.cpp:297
SICK_SCANNER_MRS_6XXX_NAME
#define SICK_SCANNER_MRS_6XXX_NAME
Definition: sick_generic_parser.h:71
SICK_SCANNER_TIM_4XX_NAME
#define SICK_SCANNER_TIM_4XX_NAME
Definition: sick_generic_parser.h:77


sick_scan_xd
Author(s): Michael Lehning , Jochen Sprickerhof , Martin Günther
autogenerated on Fri Oct 25 2024 02:47:10