76 y = -range * std::cos(angle_rad);
77 x = range * std::sin(angle_rad);
97 points_y[1] = -rectWidthMeter;
98 points_x[2] = rectLengthMeter;
99 points_y[2] = -rectWidthMeter;
100 points_x[3] = rectLengthMeter;
103 float sin_angle = sinf(rotAngleRad);
104 float cos_angle = cosf(rotAngleRad);
105 for(
int n = 0; n < 4; n++)
107 float x = points_x[n], y = points_y[n];
108 points_x[n] = x * cos_angle - y * sin_angle;
109 points_y[n] = x * sin_angle + y * cos_angle;
112 float refPointX = 0, refPointY = 0;
114 for(
int n = 0; n < 4; n++)
116 points_x[n] += refPointX;
117 points_y[n] += refPointY;
140 float field1_points_x[4], field1_points_y[4], field2_points_x[4], field2_points_y[4];
141 rectangularFieldToCarthesian(distRefPointMeter, angleRefPointRad, rotAngleRad, rectWidthMeter, maxLengthMeter, field1_points_x, field1_points_y);
142 rectangularFieldToCarthesian(distRefPointMeter, angleRefPointRad, rotAngleRad, rectWidthMeter, rectLengthMeter, field2_points_x, field2_points_y);
143 for(
int n = 0; n < 4; n++)
145 points_x[n + 0] = field1_points_x[n];
146 points_y[n + 0] = field1_points_y[n];
147 points_x[n + 4] = field2_points_x[n];
148 points_y[n + 4] = field2_points_y[n];
177 ROS_ERROR(
"SickScanFieldMonSingleton::parseAsciiLIDinputstateMsg not implemented.");
190 if(datagram_length > 36)
193 int number_of_input_states = 4;
195 inputstate_msg.input_state.clear();
196 inputstate_msg.input_state.reserve(number_of_input_states);
198 for(
int offset = 35; offset >= 32; offset--)
200 fieldset = (fieldset << 1);
201 fieldset |= ((datagramm[offset] == 1) ? 1 : 0);
202 inputstate_msg.input_state.push_back(datagramm[offset]);
213 inputstate_msg.active_fieldset = fieldset;
215 int msg_start_idx = 26;
216 datagramm += msg_start_idx;
217 datagram_length -= msg_start_idx;
218 if( !
readBinaryBuffer(datagramm, datagram_length, inputstate_msg.version_number)
219 || !
readBinaryBuffer(datagramm, datagram_length, inputstate_msg.system_counter))
221 ROS_ERROR_STREAM(
"## ERROR parseBinaryLIDinputstateMsg(): error parsing version_number and system_counter (" << __FILE__ <<
":" << __LINE__ <<
")");
226 datagram_length -= 4;
227 if( !
readBinaryBuffer(datagramm, datagram_length, inputstate_msg.time_state))
229 ROS_ERROR_STREAM(
"## ERROR parseBinaryLIDinputstateMsg(): error parsing time_state (" << __FILE__ <<
":" << __LINE__ <<
")");
233 if(inputstate_msg.time_state > 0)
241 || !
readBinaryBuffer(datagramm, datagram_length, inputstate_msg.microsecond))
243 ROS_ERROR_STREAM(
"## ERROR parseBinaryLIDinputstateMsg(): error parsing timestamp (" << __FILE__ <<
":" << __LINE__ <<
")");
263 int arg_start_idx = 27;
264 datagram += arg_start_idx;
265 datagram_length -= arg_start_idx;
276 int arg_start_idx = 36;
277 datagram += arg_start_idx;
278 datagram_length -= arg_start_idx;
287 std::stringstream state_str;
288 state_str <<
"LIDinputstateMsg = { " <<
"version_number: " << (uint32_t)inputstate_msg.version_number <<
", system_counter: " << (uint32_t)inputstate_msg.system_counter <<
", states: (";
289 for(
int state_cnt = 0; state_cnt < inputstate_msg.input_state.size(); state_cnt++)
290 state_str << (state_cnt > 0 ?
", " :
"") << (uint32_t)inputstate_msg.input_state[state_cnt];
291 state_str <<
"), active_fieldset: " << inputstate_msg.active_fieldset <<
", time state: " << (uint32_t)inputstate_msg.time_state
292 <<
", date: " << std::setfill(
'0') << std::setw(4) << (uint32_t)inputstate_msg.year <<
"-" << std::setfill(
'0') << std::setw(2) << (uint32_t)inputstate_msg.month <<
"-" << std::setfill(
'0') << std::setw(2) << (uint32_t)inputstate_msg.day
293 <<
", time: " << std::setfill(
'0') << std::setw(2) << (uint32_t)inputstate_msg.hour <<
":" << std::setfill(
'0') << std::setw(2) << (uint32_t)inputstate_msg.minute <<
":" << std::setfill(
'0') << std::setw(2) << (uint32_t)inputstate_msg.second
294 <<
"." << std::setfill(
'0') << std::setw(6) << (uint32_t)inputstate_msg.microsecond <<
" }";
295 return state_str.str();
305 ROS_ERROR(
"SickScanFieldMonSingleton::parseAsciiDatagram not implemented.");
312 if (datagram.size() < 41)
317 int fieldNumberFromCMD=0;
318 std::string sDatagramm( datagram.begin()+8, datagram.end() );
319 sscanf(sDatagramm.c_str(),
"sRA field%d", &fieldNumberFromCMD);
320 float distScaleFactor;
321 float distScaleFactorOffset;
322 uint32_t angScaleFactor;
323 int32_t angScaleFactorOffset;
326 uint16_t segmentedFieldConfigured = 0;
327 uint16_t rectangularFieldConfigured = 0;
328 uint16_t dynamicFieldConfigured = 0;
329 uint32_t dataPtrOffset = 0;
331 unsigned char *dataPtr= &(datagram[0]);
332 memcpy(&distScaleFactor, dataPtr + 21, 4);
333 memcpy(&distScaleFactorOffset, dataPtr + 25, 4);
334 memcpy(&angScaleFactor, dataPtr + 29, 4);
335 memcpy(&angScaleFactorOffset, dataPtr + 33, 4);
336 memcpy(&fieldType, dataPtr + 37, 1);
337 memcpy(&fieldNumber, dataPtr + 38, 1);
338 memcpy(&segmentedFieldConfigured, dataPtr + 39, 2);
339 swap_endian((
unsigned char *) &distScaleFactor, 4);
340 swap_endian((
unsigned char *) &distScaleFactorOffset, 4);
342 swap_endian((
unsigned char *) &angScaleFactorOffset, 4);
345 swap_endian((
unsigned char *) &segmentedFieldConfigured, 2);
348 if(segmentedFieldConfigured==1)
350 uint16_t numOfFieldPoints;
352 uint16_t startDist,stopDist;
353 memcpy(&numOfFieldPoints, dataPtr + 41, 2);
354 swap_endian((
unsigned char *) &numOfFieldPoints, 2);
355 monFields[fieldNumberFromCMD].pushFieldPointCarthesian(0, 0);
356 for(uint16_t point=0;point<numOfFieldPoints;point++)
358 memcpy(&angIDX, dataPtr + 43+point*6, 2);
359 memcpy(&startDist, dataPtr + 45+point*6, 2);
360 memcpy(&stopDist, dataPtr + 47+point*6, 2);
364 float angRad= (float)((angIDX*angScaleFactor/1e4+angScaleFactorOffset/1e4)*
deg2rad);
365 float distMeter=(stopDist*distScaleFactor+distScaleFactorOffset)/1000.0
f;
366 float point_x = 0, point_y = 0;
368 monFields[fieldNumberFromCMD].pushFieldPointCarthesian(point_x, point_y);
370 dataPtrOffset = 43 + numOfFieldPoints * 6;
372 memcpy(&rectangularFieldConfigured, dataPtr + dataPtrOffset, 2);
373 swap_endian((
unsigned char *) &rectangularFieldConfigured, 2);
375 if(rectangularFieldConfigured==1)
377 int32_t angleRefPoint;
378 uint16_t distRefPoint;
380 uint32_t rectWidth, rectLength;
381 memcpy(&angleRefPoint, dataPtr + dataPtrOffset + 0, 4);
382 memcpy(&distRefPoint, dataPtr + dataPtrOffset + 4, 2);
383 memcpy(&rotAngle, dataPtr + dataPtrOffset + 6, 4);
384 memcpy(&rectWidth, dataPtr + dataPtrOffset + 10, 4);
385 memcpy(&rectLength, dataPtr + dataPtrOffset + 14, 4);
392 float angleRefPointRad= (float)((angleRefPoint/1e4+angScaleFactorOffset/1e4)*
deg2rad) - rectFieldAngleRefPointOffsetRad;
393 float distRefPointMeter=(distRefPoint*distScaleFactor+distScaleFactorOffset)/1000.0
f;
394 float rotAngleRad= (float)((rotAngle/1e4)*
deg2rad);
395 float rectWidthMeter=(rectWidth)/1000.0
f;
396 float rectLengthMeter=(rectLength)/1000.0
f;
397 float points_x[4] = {0}, points_y[4] = {0};
399 for(
int n = 0; n < 4; n++)
400 monFields[fieldNumberFromCMD].pushFieldPointCarthesian(points_x[n], points_y[n]);
403 memcpy(&dynamicFieldConfigured, dataPtr + dataPtrOffset, 2);
404 swap_endian((
unsigned char *) &dynamicFieldConfigured, 2);
406 if(dynamicFieldConfigured==1)
408 int32_t angleRefPoint;
409 uint16_t distRefPoint;
411 uint32_t rectWidth, rectLength;
414 memcpy(&angleRefPoint, dataPtr + dataPtrOffset + 0, 4);
415 memcpy(&distRefPoint, dataPtr + dataPtrOffset + 4, 2);
416 memcpy(&rotAngle, dataPtr + dataPtrOffset + 6, 4);
417 memcpy(&rectWidth, dataPtr + dataPtrOffset + 10, 4);
418 memcpy(&rectLength, dataPtr + dataPtrOffset + 14, 4);
419 memcpy(&maxSpeed, dataPtr + dataPtrOffset + 18, 2);
420 memcpy(&maxLength, dataPtr + dataPtrOffset + 20, 4);
429 float angleRefPointRad= (float)((angleRefPoint/1e4+angScaleFactorOffset/1e4)*
deg2rad) - rectFieldAngleRefPointOffsetRad;
430 float distRefPointMeter=(distRefPoint*distScaleFactor+distScaleFactorOffset)/1000.0
f;
431 float rotAngleRad= (float)((rotAngle/1e4)*
deg2rad);
432 float rectWidthMeter=(rectWidth)/1000.0
f;
433 float rectLengthMeter=(rectLength)/1000.0
f;
434 float maxSpeedMeterPerSec=(maxSpeed)/1000.0
f;
435 float maxLengthMeter=(maxLength)/1000.0
f;
436 float points_x[8] = {0}, points_y[8] = {0};
438 for(
int n = 0; n < 8; n++)
439 monFields[fieldNumberFromCMD].pushFieldPointCarthesian(points_x[n], points_y[n]);