66 #pragma warning(disable: 4267)
70 #define _USE_MATH_DEFINES
107 for(
int n = 0; n < scanner_names.size(); n++)
109 if (getScannerName().compare(scanner_names[n]) == 0)
124 numberOfLayers = _layerNum;
135 return (numberOfLayers);
147 numberOfShots = _shots;
158 return (numberOfShots);
169 this->numberOfMaximumEchos = _maxEchos;
181 return (numberOfMaximumEchos);
192 currentParamSet = _ptr;
203 angleDegressResolution = _res;
213 return (angleDegressResolution);
223 expectedFrequency = _freq;
234 return (expectedFrequency);
245 this->elevationDegreeResolution = _elevRes;
256 return (this->elevationDegreeResolution);
266 this->useBinaryProtocol = _useBinary;
271 return this->imuEnabled;
275 this->imuEnabled = _imuEnabled;
284 deviceRadarType = _radar_type;
294 return (deviceRadarType !=
NO_RADAR);
299 return deviceRadarType;
308 return (getDeviceIsRadar() && trackingModeSupported);
312 trackingModeSupported = _trackingModeSupported;
323 scanMirroredAndShifted = _scannMirroredAndShifted;
333 return (scanMirroredAndShifted);
343 return (this->useBinaryProtocol);
353 this->IntensityResolutionIs16Bit = _IntensityResolutionIs16Bit;
363 return (IntensityResolutionIs16Bit);
373 this->useSafetyPasWD = _useSafetyPasWD;
383 return (useSafetyPasWD);
388 return this->useEvalFields;
393 this->useEvalFields = _useEvalFields;
398 return this->maxEvalFields;
403 this->maxEvalFields = _maxEvalFields;
408 this->rectFieldAngleRefPointOffsetRad = _rectFieldAngleRefPointOffsetRad;
413 return this->rectFieldAngleRefPointOffsetRad;
418 this->useScancfgList = _useScancfgList;
422 return this->useScancfgList;
427 this->useWriteOutputRanges = _useWriteOutputRanges;
432 return this->useWriteOutputRanges;
437 this->waitForReady = _waitForReady;
441 return this->waitForReady;
446 this->frEchoFilterAvailable = _frEchoFilterAvailable;
451 return this->frEchoFilterAvailable;
456 this->scandatacfgAzimuthTableSupported = _scandatacfgAzimuthTableSupported;
461 return this->scandatacfgAzimuthTableSupported;
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)
517 override_range_min_((float) 0.05),
518 override_range_max_((float) 100.0),
519 override_time_increment_((float) -1.0)
550 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
571 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
576 basicParams[i].setScandatacfgAzimuthTableSupported(
true);
597 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
602 basicParams[i].setScandatacfgAzimuthTableSupported(
true);
610 basicParams[i].setAngularDegreeResolution(1.00000);
622 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
627 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
647 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
652 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
671 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
676 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
695 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
700 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
719 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
724 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
743 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
748 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
767 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad((
float)(-45 * M_PI / 180.0));
772 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
791 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
796 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
815 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
820 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
840 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
845 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
864 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
869 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
889 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
894 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
913 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
918 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
937 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
942 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
961 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
966 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
985 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
990 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
997 basicParams[i].setAngularDegreeResolution(0.33333333333);
1009 basicParams[i].setRectEvalFieldAngleRefPointOffsetRad(0);
1014 basicParams[i].setScandatacfgAzimuthTableSupported(
false);
1025 if (scannerIdx == -1)
1028 throw new std::string(
"scanner type " +
scannerType +
" not supported.");
1086 int &rssiNum, std::vector<float> &distVal, std::vector<float> &rssiVal,
1092 int baseOffset = 20;
1097 unsigned short int number_of_data = 0;
1098 if (strstr(fields[baseOffset],
"DIST") != fields[baseOffset])
1100 ROS_WARN_STREAM(
"Field 20 of received data does not start with DIST (is: " << std::string(fields[20]) <<
". Unexpected data, ignoring scan\n");
1107 bool distFnd =
false;
1108 bool rssiFnd =
false;
1109 if (strlen(fields[offset]) == 5)
1111 if (strstr(fields[offset],
"DIST") == fields[offset])
1116 if (1 == sscanf(fields[offset],
"DIST%d", &distId))
1118 distMask |= (1 << (distId - 1));
1121 if (strstr(fields[offset],
"RSSI") == fields[offset])
1127 if (rssiFnd || distFnd)
1130 if (offset >= (
int) fields.size())
1132 ROS_WARN(
"Missing RSSI or DIST data");
1136 sscanf(fields[offset],
"%hx", &number_of_data);
1137 if (number_of_data != expected_number_of_data)
1139 ROS_WARN(
"number of dist or rssi values mismatching.");
1144 for (
int i = 0; i < number_of_data; i++)
1148 unsigned short iRange;
1150 sscanf(fields[offset + i],
"%hx", &iRange);
1151 range = iRange / 1000.0f;
1152 distVal.push_back(range);
1156 unsigned short iRSSI;
1157 sscanf(fields[offset + i],
"%hx", &iRSSI);
1158 rssiVal.push_back((
float) iRSSI);
1161 offset += number_of_data;
1167 }
while (offset < (
int) fields.size());
1180 float expected_time_increment = (float)
1182 if (fabs(expected_time_increment - time_increment) > 0.00001)
1184 #if defined __ROS_VERSION && __ROS_VERSION == 1
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);
1192 static rosTime last_message_time(0);
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.");
1225 bool dumpData =
false;
1226 int verboseLevel = 0;
1228 int HEADER_FIELDS = 32;
1234 std::vector<char *> fields;
1235 fields.reserve(datagram_length / 2);
1238 std::vector<char> datagram_copy_vec;
1239 datagram_copy_vec.resize(datagram_length + 1);
1240 char *datagram_copy = &(datagram_copy_vec[0]);
1242 if (verboseLevel > 0)
1247 strncpy(datagram_copy, datagram, datagram_length);
1248 datagram_copy[datagram_length] = 0;
1252 cur_field = strtok(datagram,
" ");
1254 while (cur_field !=
NULL)
1256 fields.push_back(cur_field);
1258 cur_field = strtok(
NULL,
" ");
1263 count = fields.size();
1266 if (verboseLevel > 0)
1274 if (count < HEADER_FIELDS)
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");
1282 if (
basicParams[scannerIdx].getNumberOfLayers() == 1)
1284 if (strcmp(fields[15],
"0"))
1286 ROS_WARN_STREAM(
"Field 15 of received data is not equal to 0 (" << std::string(fields[15]) <<
"). Unexpected data, ignoring scan\n");
1297 if (strcmp(fields[20],
"DIST1"))
1299 ROS_WARN_STREAM(
"Field 20 of received data is not equal to DIST1i (" << std::string(fields[20]) <<
"). Unexpected data, ignoring scan\n");
1305 unsigned short int number_of_data = 0;
1306 sscanf(fields[25],
"%hx", &number_of_data);
1308 int numOfExpectedShots =
basicParams[scannerIdx].getNumberOfShots();
1309 if (number_of_data < 1 || number_of_data > numOfExpectedShots)
1311 ROS_WARN_STREAM(
"Data length is outside acceptable range 1-" << numOfExpectedShots <<
" (" << number_of_data <<
"). Ignoring scan");
1314 if (count < HEADER_FIELDS + number_of_data)
1316 ROS_WARN_STREAM(
"Less fields than expected for " << number_of_data <<
" data points (" << count <<
"). Ignoring scan");
1322 size_t rssi_idx = 26 + number_of_data;
1324 if (strcmp(fields[rssi_idx],
"RSSI1") == 0)
1328 unsigned short int number_of_rssi_data = 0;
1331 sscanf(fields[rssi_idx + 5],
"%hx", &number_of_rssi_data);
1334 if (number_of_rssi_data != number_of_data)
1336 ROS_WARN_STREAM(
"Number of RSSI data is lower than number of range data (" << number_of_data <<
" vs " << number_of_rssi_data <<
")");
1342 if (count < HEADER_FIELDS + number_of_data + number_of_rssi_data + 6)
1344 ROS_WARN_STREAM(
"Less fields than expected for " << number_of_data <<
" data points (" << count <<
"). Ignoring scan");
1348 if (strcmp(fields[rssi_idx],
"RSSI1"))
1350 ROS_WARN_STREAM(
"Field " << rssi_idx + 1 <<
" of received data is not equal to RSSI1 (" << fields[rssi_idx + 1] <<
"). Unexpected data, ignoring scan");
1355 if (
basicParams[scannerIdx].getNumberOfLayers() > 1)
1357 sscanf(fields[15],
"%hx", &layer);
1387 unsigned short scanning_freq = -1;
1388 sscanf(fields[16],
"%hx", &scanning_freq);
1389 msg.scan_time = 1.0f / (scanning_freq / 100.0f);
1393 unsigned short measurement_freq = -1;
1394 sscanf(fields[17],
"%hx", &measurement_freq);
1395 msg.time_increment = 1.0f / (measurement_freq * 100.0f);
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);
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);
1432 #if 1 // neuer Ansatz
1446 ROS_WARN(
"Intensity parameter is enabled, but the scanner is not configured to send RSSI values! ");
1461 if (
basicParams[scannerIdx].getNumberOfLayers() > 1)
1463 char szDummy[255] = {0};
1464 sprintf(szDummy,
"%s_%+04d",
config.frame_id.c_str(), layer);
1465 msg.header.frame_id = szDummy;
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