sick_generic_field_mon.cpp
Go to the documentation of this file.
1 
63 
64 namespace sick_scan_xd
65 {
66 
67  /*
68  ** @brief Converts a point of a segmented field to carthesian coordinates
69  ** @param[in] range range in meter
70  ** @param[in] angle_rad angle in radians
71  ** @param[out] x x in meter in ros coordinate system
72  ** @param[out] y y in meter in ros coordinate system
73  */
74  void SickScanMonFieldConverter::segmentedFieldPointToCarthesian(float range, float angle_rad, float& x, float& y)
75  {
76  y = -range * std::cos(angle_rad); // y_ros = -x_sick = -range * std::cos(angle_rad)
77  x = range * std::sin(angle_rad); // x_ros = +y_sick = +range * std::sin(angle_rad)
78  }
79 
80  /*
81  ** @brief Converts a rectangular field to carthesian coordinates, i.e. to 4 corner points carthesian (ros) coordinates
82  ** @param[in] distRefPointMeter range of ref point (rect center) in meter
83  ** @param[in] angleRefPointRad angle of ref point (rect center) in radians
84  ** @param[in] rotAngleRad rotation of rectangle in radians
85  ** @param[in] rectWidthMeter width of rectangle in meter
86  ** @param[in] rectLengthMeter width of rectangle in meter
87  ** @param[out] points_x x of corner points in meter in ros coordinate system
88  ** @param[out] points_y y of corner points in meter in ros coordinate system
89  */
90  void SickScanMonFieldConverter::rectangularFieldToCarthesian(float distRefPointMeter, float angleRefPointRad, float rotAngleRad, float rectWidthMeter, float rectLengthMeter, float points_x[4], float points_y[4])
91  {
92  // unrotated rectangle at base point, x_ros = +y_sick, y_ros = -x_sick
93  // base point is the lower left corner of the rectangle
94  points_x[0] = 0;
95  points_y[0] = 0;
96  points_x[1] = 0;
97  points_y[1] = -rectWidthMeter;
98  points_x[2] = rectLengthMeter;
99  points_y[2] = -rectWidthMeter;
100  points_x[3] = rectLengthMeter;
101  points_y[3] = 0;
102  // rotate by rotAngleRad
103  float sin_angle = sinf(rotAngleRad);
104  float cos_angle = cosf(rotAngleRad);
105  for(int n = 0; n < 4; n++)
106  {
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;
110  }
111  // move to refPoint
112  float refPointX = 0, refPointY = 0;
113  segmentedFieldPointToCarthesian(distRefPointMeter, angleRefPointRad, refPointX, refPointY);
114  for(int n = 0; n < 4; n++)
115  {
116  points_x[n] += refPointX;
117  points_y[n] += refPointY;
118  }
119  // ROS_DEBUG_STREAM("rectangularFieldToCarthesian: distRefPointMeter=" << distRefPointMeter << ", angleRefPoint=" << (angleRefPointRad * 180.0 / M_PI) << ", rotAngle=" << (rotAngleRad * 180.0 / M_PI) << ", rectWidthMeter=" << rectWidthMeter << ", rectLengthMeter=" << rectLengthMeter);
120  }
121 
122  /*
123  ** @brief Converts a dynamic field to carthesian coordinates. The dynamic field is just converted into 2 rectangular fields,
124  ** each rectangular field described by to 4 corner points carthesian (ros) coordinates.
125  ** The first rectangular field has size rectWidthMeter x maxLengthMeter, the second rectangular field has size rectWidthMeter x rectLengthMeter.
126  ** The rectangular fields are returned by 4 corner points (points_x[n], points_y[n]) with 0 <= n < 4 for the first (big) rectangle and 4 <= n < 8 for the second (smaller) rectangle.
127  ** @param[in] distRefPointMeter range of ref point (rect center) in meter
128  ** @param[in] angleRefPointRad angle of ref point (rect center) in radians
129  ** @param[in] rotAngleRad rotation of rectangle in radians
130  ** @param[in] rectWidthMeter width of rectangle in meter
131  ** @param[in] rectLengthMeter width of rectangle in meter at v = 0
132  ** @param[in] maxSpeedMeterPerSec max speed (unused)
133  ** @param[in] maxLengthMeter width of rectangle in meter at v = max. speed
134  ** @param[out] points_x x of corner points in meter in ros coordinate system
135  ** @param[out] points_y y of corner points in meter in ros coordinate system
136  */
137  void SickScanMonFieldConverter::dynamicFieldPointToCarthesian(float distRefPointMeter, float angleRefPointRad, float rotAngleRad, float rectWidthMeter, float rectLengthMeter, float maxSpeedMeterPerSec, float maxLengthMeter, float points_x[8], float points_y[8])
138  {
139  // set 2 rectangular fields: 1. rectangular field with rectWidthMeter x maxLengthMeter, 2.nd rectangular field with rectWidthMeter x rectLengthMeter
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++)
144  {
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];
149  }
150  }
151 
152  /* Null, because instance will be initialized on demand. */
154 
156  {
157  if (instance == 0)
158  {
160  }
161 
162  return instance;
163  }
164 
166  {
167  this->monFields.resize(48);
168  }
169 
175  int SickScanFieldMonSingleton::parseAsciiLIDinputstateMsg(unsigned char* datagram, int datagram_length)
176  {
177  ROS_ERROR("SickScanFieldMonSingleton::parseAsciiLIDinputstateMsg not implemented.");
178  int exitCode=ExitSuccess;
179  return (exitCode);
180  }
181 
187  int SickScanFieldMonSingleton::parseBinaryLIDinputstateMsg(unsigned char* datagramm, int datagram_length, sick_scan_msg::LIDinputstateMsg& inputstate_msg)
188  {
189  int exitCode=ExitSuccess;
190  if(datagram_length > 36)
191  {
192  // Read N output states
193  int number_of_input_states = 4; // LMS5xx, TiM7xx and TiM7xxS have 4 digital inputs (M12 connector)
194  inputstate_msg.header.stamp = rosTimeNow();
195  inputstate_msg.input_state.clear();
196  inputstate_msg.input_state.reserve(number_of_input_states);
197  int fieldset = 0;
198  for(int offset = 35; offset >= 32; offset--) // datagramm[32]=INT1, datagramm[33]=INT2, datagramm[34]=INT3, datagramm[35]=INT4
199  {
200  fieldset = (fieldset << 1);
201  fieldset |= ((datagramm[offset] == 1) ? 1 : 0);
202  inputstate_msg.input_state.push_back(datagramm[offset]);
203  }
204  fieldset += 1; // FieldSet in range 1 to 16, i.e. 0x00000000 is fieldset 1, 0x00000001 is fieldset 2, ..., 0x01000000 is fieldset 9, ..., 0x01010101 is fieldset 16
205  if (getFieldSelectionMethod() == 1) // ActiveFieldset from telegram
206  {
207  fieldset = getActiveFieldset();
208  }
209  else // default: ActiveFieldset from LIDinputstate
210  {
211  setActiveFieldset(fieldset);
212  }
213  inputstate_msg.active_fieldset = fieldset;
214  // Read 2 byte version + 4 byte system counter
215  int msg_start_idx = 26; // start after 4 byte STX + payload length + "... LIDinputstate "
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))
220  {
221  ROS_ERROR_STREAM("## ERROR parseBinaryLIDinputstateMsg(): error parsing version_number and system_counter (" << __FILE__ << ":" << __LINE__ << ")");
222  return ExitError;
223  }
224  // Read timestamp state
225  datagramm += 4;
226  datagram_length -= 4;
227  if( !readBinaryBuffer(datagramm, datagram_length, inputstate_msg.time_state))
228  {
229  ROS_ERROR_STREAM("## ERROR parseBinaryLIDinputstateMsg(): error parsing time_state (" << __FILE__ << ":" << __LINE__ << ")");
230  return ExitError;
231  }
232  // Read optional timestamp
233  if(inputstate_msg.time_state > 0)
234  {
235  if(!readBinaryBuffer(datagramm, datagram_length, inputstate_msg.year)
236  || !readBinaryBuffer(datagramm, datagram_length, inputstate_msg.month)
237  || !readBinaryBuffer(datagramm, datagram_length, inputstate_msg.day)
238  || !readBinaryBuffer(datagramm, datagram_length, inputstate_msg.hour)
239  || !readBinaryBuffer(datagramm, datagram_length, inputstate_msg.minute)
240  || !readBinaryBuffer(datagramm, datagram_length, inputstate_msg.second)
241  || !readBinaryBuffer(datagramm, datagram_length, inputstate_msg.microsecond))
242  {
243  ROS_ERROR_STREAM("## ERROR parseBinaryLIDinputstateMsg(): error parsing timestamp (" << __FILE__ << ":" << __LINE__ << ")");
244  return ExitError;
245  }
246  }
247  }
248  else
249  {
250  exitCode = ExitError;
251  }
252  return exitCode;
253  }
254 
260  void SickScanFieldMonSingleton::parseActiveFieldSetResponse(unsigned char* datagram, int datagram_length, uint16_t* active_field_set)
261  {
262  // Example: \x02\x02\x02\x02\x00\x00\x00\x15sRA ActiveFieldSet \x00\x01
263  int arg_start_idx = 27; // start after 4 byte STX + 4 byte payload length + 19 byte "sRA ActiveFieldSet "
264  datagram += arg_start_idx;
265  datagram_length -= arg_start_idx;
266  readBinaryBuffer(datagram, datagram_length, *active_field_set);
267  }
268 
274  void SickScanFieldMonSingleton::parseFieldSetSelectionMethodResponse(unsigned char* datagram, int datagram_length, uint8_t* field_set_selection_method)
275  {
276  int arg_start_idx = 36; // start after 4 byte STX + 4 byte payload length + 28 byte "sRA FieldSetSelectionMethod "
277  datagram += arg_start_idx;
278  datagram_length -= arg_start_idx;
279  readBinaryBuffer(datagram, datagram_length, *field_set_selection_method);
280  }
281 
286  {
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();
296  }
297 
303  int SickScanFieldMonSingleton::parseAsciiDatagram(std::vector<unsigned char> datagramm, float rectFieldAngleRefPointOffsetRad)
304  {
305  ROS_ERROR("SickScanFieldMonSingleton::parseAsciiDatagram not implemented.");
306  int exitCode=ExitSuccess;
307  return (exitCode);
308  }
309 
310  int SickScanFieldMonSingleton::parseBinaryDatagram(std::vector<unsigned char> datagram, float rectFieldAngleRefPointOffsetRad)
311  {
312  if (datagram.size() < 41) // at least 41 byte required to read the field configuration
313  {
314  return 0;
315  }
316  int exitCode = ExitSuccess;
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;
324  uint8_t fieldType;
325  uint8_t fieldNumber;
326  uint16_t segmentedFieldConfigured = 0;
327  uint16_t rectangularFieldConfigured = 0;
328  uint16_t dynamicFieldConfigured = 0;
329  uint32_t dataPtrOffset = 0;
330 
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);
341  swap_endian((unsigned char *) &angScaleFactor, 4);
342  swap_endian((unsigned char *) &angScaleFactorOffset, 4);
343  swap_endian((unsigned char *) &fieldType, 1);
344  swap_endian((unsigned char *) &fieldNumber, 1);
345  swap_endian((unsigned char *) &segmentedFieldConfigured, 2);
346  monFields[fieldNumberFromCMD].fieldType() = (SickScanMonFieldType)(fieldType);
347  dataPtrOffset = 41;
348  if(segmentedFieldConfigured==1) // configuration for segmented fields
349  {
350  uint16_t numOfFieldPoints;
351  uint16_t angIDX;
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++)
357  {
358  memcpy(&angIDX, dataPtr + 43+point*6, 2);
359  memcpy(&startDist, dataPtr + 45+point*6, 2);
360  memcpy(&stopDist, dataPtr + 47+point*6, 2);
361  swap_endian((unsigned char *) &angIDX, 2);
362  swap_endian((unsigned char *) &startDist, 2);
363  swap_endian((unsigned char *) &stopDist, 2);
364  float angRad= (float)((angIDX*angScaleFactor/1e4+angScaleFactorOffset/1e4)*deg2rad);
365  float distMeter=(stopDist*distScaleFactor+distScaleFactorOffset)/1000.0f;
366  float point_x = 0, point_y = 0;
367  SickScanMonFieldConverter::segmentedFieldPointToCarthesian(distMeter, angRad, point_x, point_y);
368  monFields[fieldNumberFromCMD].pushFieldPointCarthesian(point_x, point_y);
369  }
370  dataPtrOffset = 43 + numOfFieldPoints * 6;
371  }
372  memcpy(&rectangularFieldConfigured, dataPtr + dataPtrOffset, 2);
373  swap_endian((unsigned char *) &rectangularFieldConfigured, 2);
374  dataPtrOffset += 2;
375  if(rectangularFieldConfigured==1) // configuration for rectangular fields
376  {
377  int32_t angleRefPoint;
378  uint16_t distRefPoint;
379  int32_t rotAngle;
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);
386  dataPtrOffset += 18;
387  swap_endian((unsigned char *) &angleRefPoint, 4);
388  swap_endian((unsigned char *) &distRefPoint, 2);
389  swap_endian((unsigned char *) &rotAngle, 4);
390  swap_endian((unsigned char *) &rectWidth, 4);
391  swap_endian((unsigned char *) &rectLength, 4);
392  float angleRefPointRad= (float)((angleRefPoint/1e4+angScaleFactorOffset/1e4)*deg2rad) - rectFieldAngleRefPointOffsetRad;
393  float distRefPointMeter=(distRefPoint*distScaleFactor+distScaleFactorOffset)/1000.0f;
394  float rotAngleRad= (float)((rotAngle/1e4)*deg2rad);
395  float rectWidthMeter=(rectWidth)/1000.0f;
396  float rectLengthMeter=(rectLength)/1000.0f;
397  float points_x[4] = {0}, points_y[4] = {0};
398  SickScanMonFieldConverter::rectangularFieldToCarthesian(distRefPointMeter, angleRefPointRad, rotAngleRad, rectWidthMeter, rectLengthMeter, points_x, points_y);
399  for(int n = 0; n < 4; n++)
400  monFields[fieldNumberFromCMD].pushFieldPointCarthesian(points_x[n], points_y[n]);
401  }
402  dataPtrOffset += 2; // 2 byte radial field configured, always 0, currently not supported (not used in LMS5xx and TiM7xx)
403  memcpy(&dynamicFieldConfigured, dataPtr + dataPtrOffset, 2);
404  swap_endian((unsigned char *) &dynamicFieldConfigured, 2);
405  dataPtrOffset += 2;
406  if(dynamicFieldConfigured==1) // configuration for dynamic fields
407  {
408  int32_t angleRefPoint;
409  uint16_t distRefPoint;
410  int32_t rotAngle;
411  uint32_t rectWidth, rectLength;
412  int16_t maxSpeed;
413  uint32_t maxLength;
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);
421  dataPtrOffset += 24;
422  swap_endian((unsigned char *) &angleRefPoint, 4);
423  swap_endian((unsigned char *) &distRefPoint, 2);
424  swap_endian((unsigned char *) &rotAngle, 4);
425  swap_endian((unsigned char *) &rectWidth, 4);
426  swap_endian((unsigned char *) &rectLength, 4);
427  swap_endian((unsigned char *) &maxSpeed, 2);
428  swap_endian((unsigned char *) &maxLength, 4);
429  float angleRefPointRad= (float)((angleRefPoint/1e4+angScaleFactorOffset/1e4)*deg2rad) - rectFieldAngleRefPointOffsetRad;
430  float distRefPointMeter=(distRefPoint*distScaleFactor+distScaleFactorOffset)/1000.0f;
431  float rotAngleRad= (float)((rotAngle/1e4)*deg2rad);
432  float rectWidthMeter=(rectWidth)/1000.0f;
433  float rectLengthMeter=(rectLength)/1000.0f;
434  float maxSpeedMeterPerSec=(maxSpeed)/1000.0f;
435  float maxLengthMeter=(maxLength)/1000.0f;
436  float points_x[8] = {0}, points_y[8] = {0};
437  SickScanMonFieldConverter::dynamicFieldPointToCarthesian(distRefPointMeter, angleRefPointRad, rotAngleRad, rectWidthMeter, rectLengthMeter, maxSpeedMeterPerSec, maxLengthMeter, points_x, points_y);
438  for(int n = 0; n < 8; n++)
439  monFields[fieldNumberFromCMD].pushFieldPointCarthesian(points_x[n], points_y[n]);
440  }
441 
442  return (exitCode);
443  }
444 
445 }
sick_scan_messages.h
swap_endian
void swap_endian(unsigned char *ptr, int numBytes)
Universal swapping function.
Definition: sick_scan_common.cpp:125
sick_scan_xd::SickScanFieldMonSingleton::parseAsciiLIDinputstateMsg
int parseAsciiLIDinputstateMsg(unsigned char *datagram, int datagram_length)
Parse binary LIDinputstate message and set active field set.
Definition: sick_generic_field_mon.cpp:175
sick_scan_xd::SickScanFieldMonSingleton::setActiveFieldset
void setActiveFieldset(int active_fieldset)
Definition: sick_generic_field_mon.h:171
sick_scan_xd::SickScanFieldMonSingleton::LIDinputstateMsgToString
std::string LIDinputstateMsgToString(const sick_scan_msg::LIDinputstateMsg &inputstate_msg)
Converts a LIDinputstateMsg to a readable string.
Definition: sick_generic_field_mon.cpp:285
sick_scan_xd
Definition: abstract_parser.cpp:65
sick_scan_common.h
f
f
sick_scan_xd::SickScanFieldMonSingleton::parseBinaryLIDinputstateMsg
int parseBinaryLIDinputstateMsg(unsigned char *datagram, int datagram_length, sick_scan_msg::LIDinputstateMsg &inputstate_msg)
Parse binary LIDinputstate message and set active field set.
Definition: sick_generic_field_mon.cpp:187
sick_scan_xd::SickScanMonFieldConverter::segmentedFieldPointToCarthesian
static void segmentedFieldPointToCarthesian(float range, float angle_rad, float &x, float &y)
Definition: sick_generic_field_mon.cpp:74
sick_scan_xd::SickScanFieldMonSingleton::parseFieldSetSelectionMethodResponse
void parseFieldSetSelectionMethodResponse(unsigned char *datagram, int datagram_length, uint8_t *field_set_selection_method)
Parse binary FieldSetSelectionMethod response "sRA FieldSetSelectionMethod".
Definition: sick_generic_field_mon.cpp:274
sick_scan_xd::SickScanFieldMonSingleton::parseActiveFieldSetResponse
void parseActiveFieldSetResponse(unsigned char *datagram, int datagram_length, uint16_t *active_field_set)
Parse binary ActiveFieldSet response "sRA ActiveFieldSet".
Definition: sick_generic_field_mon.cpp:260
deg2rad
#define deg2rad
Definition: BasicDatatypes.hpp:83
sick_scan_xd::SickScanMonFieldConverter::rectangularFieldToCarthesian
static void rectangularFieldToCarthesian(float distRefPointMeter, float angleRefPointRad, float rotAngleRad, float rectWidthMeter, float rectLengthMeter, float points_x[4], float points_y[4])
Definition: sick_generic_field_mon.cpp:90
sick_scan_xd::readBinaryBuffer
bool readBinaryBuffer(uint8_ptr &buffer, int &bufferlen, T &value)
Definition: sick_scan_messages.h:73
sick_scan_xd::SickScanFieldMonSingleton::getInstance
static SickScanFieldMonSingleton * getInstance()
Definition: sick_generic_field_mon.cpp:155
sick_scan_xd::ExitSuccess
@ ExitSuccess
Definition: abstract_parser.h:46
sick_scan_xd::SickScanFieldMonSingleton::parseAsciiDatagram
int parseAsciiDatagram(std::vector< unsigned char > datagramm, float rectFieldAngleRefPointOffsetRad)
Parsing Ascii datagram.
Definition: sick_generic_field_mon.cpp:303
sick_scan_xd::SickScanMonFieldType
SickScanMonFieldType
Definition: sick_generic_field_mon.h:72
rosTimeNow
rosTime rosTimeNow(void)
Definition: sick_ros_wrapper.h:173
sick_generic_field_mon.h
sick_scan_xd::SickScanMonFieldConverter::dynamicFieldPointToCarthesian
static void dynamicFieldPointToCarthesian(float distRefPointMeter, float angleRefPointRad, float rotAngleRad, float rectWidthMeter, float rectLengthMeter, float maxSpeedMeterPerSec, float maxLengthMeter, float points_x[8], float points_y[8])
Definition: sick_generic_field_mon.cpp:137
sick_scan_xd::LIDinputstateMsg
::sick_scan_xd::LIDinputstateMsg_< std::allocator< void > > LIDinputstateMsg
Definition: LIDinputstateMsg.h:110
ROS_ERROR
#define ROS_ERROR(...)
Definition: sick_scan_logging.h:127
sick_scan_xd::SickScanFieldMonSingleton::parseBinaryDatagram
int parseBinaryDatagram(std::vector< unsigned char > datagramm, float rectFieldAngleRefPointOffsetRad)
Definition: sick_generic_field_mon.cpp:310
sick_scan_xd::SickScanFieldMonSingleton
Definition: sick_generic_field_mon.h:152
sick_scan_xd::SickScanFieldMonSingleton::getFieldSelectionMethod
int getFieldSelectionMethod(void)
Definition: sick_generic_field_mon.h:175
ROS_ERROR_STREAM
#define ROS_ERROR_STREAM(...)
Definition: sick_scan_ros2_example.cpp:72
sick_scan_xd::SickScanFieldMonSingleton::instance
static SickScanFieldMonSingleton * instance
Definition: sick_generic_field_mon.h:156
sick_scan_xd::SickScanFieldMonSingleton::getActiveFieldset
int getActiveFieldset(void)
Definition: sick_generic_field_mon.h:172
sick_scan_xd::SickScanFieldMonSingleton::SickScanFieldMonSingleton
SickScanFieldMonSingleton()
Definition: sick_generic_field_mon.cpp:165
sick_scan_xd::ExitError
@ ExitError
Definition: abstract_parser.h:47
sick_scan_xd::SickScanFieldMonSingleton::monFields
std::vector< SickScanMonField > monFields
Definition: sick_generic_field_mon.h:161


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