api_impl.cpp
Go to the documentation of this file.
1 #include <exception>
2 #include <iomanip>
3 #include <memory>
4 #include <signal.h>
5 #include <sstream>
6 #include <string>
7 #include <vector>
8 
9 #include "softwarePLL.h"
10 #include "sick_scan_api.h"
11 #include "sick_scan_api_dump.h"
15 
16 template <typename HandleType, class MsgType> std::list<sick_scan_xd::SickWaitForMessageHandler<HandleType, MsgType>*> sick_scan_xd::SickWaitForMessageHandler<HandleType, MsgType>::s_wait_for_message_handler_list;
17 template <typename HandleType, class MsgType> std::mutex sick_scan_xd::SickWaitForMessageHandler<HandleType, MsgType>::s_wait_for_message_handler_mutex;
18 
19 static std::string s_scannerName = "sick_scan";
20 static std::map<SickScanApiHandle,std::string> s_api_caller;
21 static int s_argc = 0;
22 static char** s_argv = 0; // deep copy of argv commandline arguments
23 static std::vector<void*> s_malloced_resources;
35 
36 #if __ROS_VERSION == 2 // workaround for missing imu quaternion operator << in ROS2
37 # define ROS_VECTOR3D_TO_STREAM(msg) ((msg).x) << "," << ((msg).y) << "," << ((msg).z)
38 # define ROS_QUATERNION_TO_STREAM(msg) ((msg).x) << "," << ((msg).y) << "," << ((msg).z) << "," << ((msg).w)
39 #else
40 # define ROS_VECTOR3D_TO_STREAM(msg) (msg)
41 # define ROS_QUATERNION_TO_STREAM(msg) (msg)
42 #endif
43 
45 {
46  return ((SickScanApiHandle)(&(*node))); // return ((SickScanApiHandle)node);
47 }
48 
50 {
51  return (*((rosNodePtr*)&apiHandle)); // return ((rosNodePtr)apiHandle);
52 }
53 
54 /*
55 * Message converter
56 */
57 
59 {
60  SickScanPointCloudMsg export_msg;
61  memset(&export_msg, 0, sizeof(export_msg));
62  // Copy header and pointcloud dimension
63  const ros_sensor_msgs::PointCloud2& msg = msg_with_echo.pointcloud;
64  ROS_HEADER_SEQ(export_msg.header, msg.header.seq); // export_msg.header.seq = msg.header.seq;
65  export_msg.header.timestamp_sec = sec(msg.header.stamp); // msg.header.stamp.sec;
66  export_msg.header.timestamp_nsec = nsec(msg.header.stamp); // msg.header.stamp.nsec;
67  strncpy(export_msg.header.frame_id, msg.header.frame_id.c_str(), sizeof(export_msg.header.frame_id) - 2);
68  strncpy(export_msg.topic, msg_with_echo.topic.c_str(), sizeof(export_msg.topic) - 2);
69  export_msg.width = msg.width;
70  export_msg.height = msg.height;
71  export_msg.is_bigendian = msg.is_bigendian;
72  export_msg.is_dense = msg.is_dense;
73  export_msg.point_step = msg.point_step;
74  export_msg.row_step = msg.row_step;
75  export_msg.num_echos = msg_with_echo.num_echos;
76  export_msg.segment_idx = msg_with_echo.segment_idx;
77  // Copy field descriptions
78  int num_fields = msg.fields.size();
79  std::vector<SickScanPointFieldMsg> export_fields(num_fields);
80  for(int n = 0; n < num_fields; n++)
81  {
82  SickScanPointFieldMsg export_field;
83  memset(&export_field, 0, sizeof(export_field));
84  strncpy(export_field.name, msg.fields[n].name.c_str(), sizeof(export_field.name) - 2);
85  export_field.offset = msg.fields[n].offset;
86  export_field.datatype = msg.fields[n].datatype;
87  export_field.count = msg.fields[n].count;
88  export_fields[n] = export_field;
89  }
90  export_msg.fields.buffer = (SickScanPointFieldMsg*)malloc(num_fields * sizeof(SickScanPointFieldMsg));
91  if (export_msg.fields.buffer != 0)
92  {
93  export_msg.fields.size = num_fields;
94  export_msg.fields.capacity = num_fields;
95  memcpy(export_msg.fields.buffer, export_fields.data(), num_fields * sizeof(SickScanPointFieldMsg));
96  }
97  // Copy pointcloud data
98  export_msg.data.buffer = (uint8_t*)malloc(msg.row_step * msg.height);
99  if (export_msg.data.buffer != 0)
100  {
101  export_msg.data.size = msg.row_step * msg.height;
102  export_msg.data.capacity = msg.row_step * msg.height;
103  memcpy(export_msg.data.buffer, msg.data.data(), msg.row_step * msg.height);
104  }
105  // Return converted pointcloud
106  return export_msg;
107 }
108 
109 static void freePointCloudMsg(SickScanPointCloudMsg& export_msg)
110 {
111  if (export_msg.fields.buffer != 0)
112  free(export_msg.fields.buffer);
113  if (export_msg.data.buffer != 0)
114  free(export_msg.data.buffer);
115  memset(&export_msg, 0, sizeof(export_msg));
116 }
117 
119 {
120  SickScanImuMsg dst_msg;
121  memset(&dst_msg, 0, sizeof(dst_msg));
122  // Copy header
123  ROS_HEADER_SEQ(dst_msg.header, src_msg.header.seq);
124  dst_msg.header.timestamp_sec = sec(src_msg.header.stamp);
125  dst_msg.header.timestamp_nsec = nsec(src_msg.header.stamp);
126  strncpy(dst_msg.header.frame_id, src_msg.header.frame_id.c_str(), sizeof(dst_msg.header.frame_id) - 2);
127  // Copy imu data
128  dst_msg.orientation.x = src_msg.orientation.x;
129  dst_msg.orientation.y = src_msg.orientation.y;
130  dst_msg.orientation.z = src_msg.orientation.z;
131  dst_msg.orientation.w = src_msg.orientation.w;
132  for(int n = 0; n < 9; n++)
133  dst_msg.orientation_covariance[n] = src_msg.orientation_covariance[n];
134  dst_msg.angular_velocity.x = src_msg.angular_velocity.x;
135  dst_msg.angular_velocity.y = src_msg.angular_velocity.y;
136  dst_msg.angular_velocity.z = src_msg.angular_velocity.z;
137  for(int n = 0; n < 9; n++)
138  dst_msg.angular_velocity_covariance[n] = src_msg.angular_velocity_covariance[n];
139  dst_msg.linear_acceleration.x = src_msg.linear_acceleration.x;
140  dst_msg.linear_acceleration.y = src_msg.linear_acceleration.y;
141  dst_msg.linear_acceleration.z = src_msg.linear_acceleration.z;
142  for(int n = 0; n < 9; n++)
143  dst_msg.linear_acceleration_covariance[n] = src_msg.linear_acceleration_covariance[n];
144  return dst_msg;
145 }
146 
147 static void freeImuMsg(SickScanImuMsg& msg)
148 {
149  memset(&msg, 0, sizeof(msg));
150 }
151 
153 {
154  SickScanLFErecMsg dst_msg;
155  memset(&dst_msg, 0, sizeof(dst_msg));
156  // Copy header
157  ROS_HEADER_SEQ(dst_msg.header, src_msg.header.seq);
158  dst_msg.header.timestamp_sec = sec(src_msg.header.stamp);
159  dst_msg.header.timestamp_nsec = nsec(src_msg.header.stamp);
160  strncpy(dst_msg.header.frame_id, src_msg.header.frame_id.c_str(), sizeof(dst_msg.header.frame_id) - 2);
161  // Copy LFErec data
162  int max_fields_number = (int)(sizeof(dst_msg.fields) / sizeof(dst_msg.fields[0]));
163  dst_msg.fields_number = ((src_msg.fields_number < max_fields_number) ? src_msg.fields_number : max_fields_number);
164  for(int n = 0; n < dst_msg.fields_number; n++)
165  {
166  dst_msg.fields[n].version_number = src_msg.fields[n].version_number;
167  dst_msg.fields[n].field_index = src_msg.fields[n].field_index;
168  dst_msg.fields[n].sys_count = src_msg.fields[n].sys_count;
169  dst_msg.fields[n].dist_scale_factor = src_msg.fields[n].dist_scale_factor;
170  dst_msg.fields[n].dist_scale_offset = src_msg.fields[n].dist_scale_offset;
171  dst_msg.fields[n].angle_scale_factor = src_msg.fields[n].angle_scale_factor;
172  dst_msg.fields[n].angle_scale_offset = src_msg.fields[n].angle_scale_offset;
173  dst_msg.fields[n].field_result_mrs = src_msg.fields[n].field_result_mrs;
174  dst_msg.fields[n].time_state = src_msg.fields[n].time_state;
175  dst_msg.fields[n].year = src_msg.fields[n].year;
176  dst_msg.fields[n].month = src_msg.fields[n].month;
177  dst_msg.fields[n].day = src_msg.fields[n].day;
178  dst_msg.fields[n].hour = src_msg.fields[n].hour;
179  dst_msg.fields[n].minute = src_msg.fields[n].minute;
180  dst_msg.fields[n].second = src_msg.fields[n].second;
181  dst_msg.fields[n].microsecond = src_msg.fields[n].microsecond;
182  }
183  return dst_msg;
184 }
185 
187 {
188  memset(&msg, 0, sizeof(msg));
189 }
190 
192 {
194  memset(&dst_msg, 0, sizeof(dst_msg));
195  // Copy header
196  ROS_HEADER_SEQ(dst_msg.header, src_msg.header.seq);
197  dst_msg.header.timestamp_sec = sec(src_msg.header.stamp);
198  dst_msg.header.timestamp_nsec = nsec(src_msg.header.stamp);
199  strncpy(dst_msg.header.frame_id, src_msg.header.frame_id.c_str(), sizeof(dst_msg.header.frame_id) - 2);
200  // Copy LIDoutputstate data
201  dst_msg.version_number = src_msg.version_number;
202  dst_msg.system_counter = src_msg.system_counter;
203  int max_states = (int)(sizeof(dst_msg.output_state) / sizeof(dst_msg.output_state[0]));
204  int max_counts = (int)(sizeof(dst_msg.output_count) / sizeof(dst_msg.output_count[0]));
205  for(int n = 0; n < src_msg.output_state.size() && n < max_states; n++)
206  dst_msg.output_state[n] = src_msg.output_state[n];
207  for(int n = 0; n < src_msg.output_count.size() && n < max_counts; n++)
208  dst_msg.output_count[n] = src_msg.output_count[n];
209  dst_msg.time_state = src_msg.time_state;
210  dst_msg.year = src_msg.year;
211  dst_msg.month = src_msg.month;
212  dst_msg.day = src_msg.day;
213  dst_msg.hour = src_msg.hour;
214  dst_msg.minute = src_msg.minute;
215  dst_msg.second = src_msg.second;
216  dst_msg.microsecond = src_msg.microsecond;
217  return dst_msg;
218 }
219 
221 {
222  memset(&msg, 0, sizeof(msg));
223 }
224 
226 {
227  SickScanRadarScan dst_msg;
228  memset(&dst_msg, 0, sizeof(dst_msg));
229  // Copy header
230  ROS_HEADER_SEQ(dst_msg.header, src_msg.header.seq);
231  dst_msg.header.timestamp_sec = sec(src_msg.header.stamp);
232  dst_msg.header.timestamp_nsec = nsec(src_msg.header.stamp);
233  strncpy(dst_msg.header.frame_id, src_msg.header.frame_id.c_str(), sizeof(dst_msg.header.frame_id) - 2);
234  // Copy radarpreheader data
235  dst_msg.radarpreheader.uiversionno = src_msg.radarpreheader.uiversionno;
236  dst_msg.radarpreheader.uiident = src_msg.radarpreheader.radarpreheaderdeviceblock.uiident;
237  dst_msg.radarpreheader.udiserialno = src_msg.radarpreheader.radarpreheaderdeviceblock.udiserialno;
238  dst_msg.radarpreheader.bdeviceerror = src_msg.radarpreheader.radarpreheaderdeviceblock.bdeviceerror;
239  dst_msg.radarpreheader.bcontaminationwarning = src_msg.radarpreheader.radarpreheaderdeviceblock.bcontaminationwarning;
240  dst_msg.radarpreheader.bcontaminationerror = src_msg.radarpreheader.radarpreheaderdeviceblock.bcontaminationerror;
241  dst_msg.radarpreheader.uitelegramcount = src_msg.radarpreheader.radarpreheaderstatusblock.uitelegramcount;
242  dst_msg.radarpreheader.uicyclecount = src_msg.radarpreheader.radarpreheaderstatusblock.uicyclecount;
243  dst_msg.radarpreheader.udisystemcountscan = src_msg.radarpreheader.radarpreheaderstatusblock.udisystemcountscan;
244  dst_msg.radarpreheader.udisystemcounttransmit = src_msg.radarpreheader.radarpreheaderstatusblock.udisystemcounttransmit;
245  dst_msg.radarpreheader.uiinputs = src_msg.radarpreheader.radarpreheaderstatusblock.uiinputs;
246  dst_msg.radarpreheader.uioutputs = src_msg.radarpreheader.radarpreheaderstatusblock.uioutputs;
247  dst_msg.radarpreheader.uicycleduration = src_msg.radarpreheader.radarpreheadermeasurementparam1block.uicycleduration;
248  dst_msg.radarpreheader.uinoiselevel = src_msg.radarpreheader.radarpreheadermeasurementparam1block.uinoiselevel;
249  dst_msg.radarpreheader.numencoder = src_msg.radarpreheader.radarpreheaderarrayencoderblock.size();
250  int max_encpositions = (int)(sizeof(dst_msg.radarpreheader.udiencoderpos) / sizeof(dst_msg.radarpreheader.udiencoderpos[0]));
251  int max_encspeedvals = (int)(sizeof(dst_msg.radarpreheader.iencoderspeed) / sizeof(dst_msg.radarpreheader.iencoderspeed[0]));
252  dst_msg.radarpreheader.numencoder = ((dst_msg.radarpreheader.numencoder < max_encpositions) ? dst_msg.radarpreheader.numencoder : max_encpositions);
253  dst_msg.radarpreheader.numencoder = ((dst_msg.radarpreheader.numencoder < max_encspeedvals) ? dst_msg.radarpreheader.numencoder : max_encspeedvals);
254  for(int n = 0; n < dst_msg.radarpreheader.numencoder; n++)
255  {
256  dst_msg.radarpreheader.udiencoderpos[n] = src_msg.radarpreheader.radarpreheaderarrayencoderblock[n].udiencoderpos;
257  dst_msg.radarpreheader.iencoderspeed[n] = src_msg.radarpreheader.radarpreheaderarrayencoderblock[n].iencoderspeed;
258  }
259  // Copy radar target pointcloud data
260  sick_scan_xd::PointCloud2withEcho targets_with_echo(&src_msg.targets, 1, 0, "radar");
261  dst_msg.targets = convertPointCloudMsg(targets_with_echo);
262  // Copy radar object data
263  dst_msg.objects.size = src_msg.objects.size();
264  dst_msg.objects.capacity = dst_msg.objects.size;
265  dst_msg.objects.buffer = (SickScanRadarObject*)malloc(dst_msg.objects.capacity * sizeof(SickScanRadarObject));
266  if (!dst_msg.objects.buffer)
267  {
268  dst_msg.objects.size = 0;
269  dst_msg.objects.capacity = 0;
270  }
271  for(int n = 0; n < dst_msg.objects.size; n++)
272  {
273  dst_msg.objects.buffer[n].id = src_msg.objects[n].id;
274  dst_msg.objects.buffer[n].tracking_time_sec = sec(src_msg.objects[n].tracking_time);
275  dst_msg.objects.buffer[n].tracking_time_nsec = nsec(src_msg.objects[n].tracking_time);
276  dst_msg.objects.buffer[n].last_seen_sec = sec(src_msg.objects[n].last_seen);
277  dst_msg.objects.buffer[n].last_seen_nsec = nsec(src_msg.objects[n].last_seen);
278  dst_msg.objects.buffer[n].velocity_linear.x = src_msg.objects[n].velocity.twist.linear.x;
279  dst_msg.objects.buffer[n].velocity_linear.y = src_msg.objects[n].velocity.twist.linear.y;
280  dst_msg.objects.buffer[n].velocity_linear.z = src_msg.objects[n].velocity.twist.linear.y;
281  dst_msg.objects.buffer[n].velocity_angular.x = src_msg.objects[n].velocity.twist.angular.x;
282  dst_msg.objects.buffer[n].velocity_angular.y = src_msg.objects[n].velocity.twist.angular.y;
283  dst_msg.objects.buffer[n].velocity_angular.z = src_msg.objects[n].velocity.twist.angular.y;
284  for(int m = 0; m < 36; m++)
285  dst_msg.objects.buffer[n].velocity_covariance[m] = src_msg.objects[n].velocity.covariance[m];
286  dst_msg.objects.buffer[n].bounding_box_center_position.x = src_msg.objects[n].bounding_box_center.position.x;
287  dst_msg.objects.buffer[n].bounding_box_center_position.y = src_msg.objects[n].bounding_box_center.position.y;
288  dst_msg.objects.buffer[n].bounding_box_center_position.z = src_msg.objects[n].bounding_box_center.position.z;
289  dst_msg.objects.buffer[n].bounding_box_center_orientation.x = src_msg.objects[n].bounding_box_center.orientation.x;
290  dst_msg.objects.buffer[n].bounding_box_center_orientation.y = src_msg.objects[n].bounding_box_center.orientation.y;
291  dst_msg.objects.buffer[n].bounding_box_center_orientation.z = src_msg.objects[n].bounding_box_center.orientation.z;
292  dst_msg.objects.buffer[n].bounding_box_center_orientation.w = src_msg.objects[n].bounding_box_center.orientation.w;
293  dst_msg.objects.buffer[n].bounding_box_size.x = src_msg.objects[n].bounding_box_size.x;
294  dst_msg.objects.buffer[n].bounding_box_size.y = src_msg.objects[n].bounding_box_size.y;
295  dst_msg.objects.buffer[n].bounding_box_size.z = src_msg.objects[n].bounding_box_size.z;
296  dst_msg.objects.buffer[n].object_box_center_position.x = src_msg.objects[n].object_box_center.pose.position.x;
297  dst_msg.objects.buffer[n].object_box_center_position.y = src_msg.objects[n].object_box_center.pose.position.y;
298  dst_msg.objects.buffer[n].object_box_center_position.z = src_msg.objects[n].object_box_center.pose.position.z;
299  dst_msg.objects.buffer[n].object_box_center_orientation.x = src_msg.objects[n].object_box_center.pose.orientation.x;
300  dst_msg.objects.buffer[n].object_box_center_orientation.y = src_msg.objects[n].object_box_center.pose.orientation.y;
301  dst_msg.objects.buffer[n].object_box_center_orientation.z = src_msg.objects[n].object_box_center.pose.orientation.z;
302  dst_msg.objects.buffer[n].object_box_center_orientation.w = src_msg.objects[n].object_box_center.pose.orientation.w;
303  for(int m = 0; m < 36; m++)
304  dst_msg.objects.buffer[n].object_box_center_covariance[m] = src_msg.objects[n].object_box_center.covariance[m];
305  dst_msg.objects.buffer[n].object_box_size.x = src_msg.objects[n].object_box_size.x;
306  dst_msg.objects.buffer[n].object_box_size.y = src_msg.objects[n].object_box_size.y;
307  dst_msg.objects.buffer[n].object_box_size.z = src_msg.objects[n].object_box_size.z;
308  dst_msg.objects.buffer[n].contour_points.size = src_msg.objects[n].contour_points.size();
311  if (!dst_msg.objects.buffer[n].contour_points.buffer)
312  {
313  dst_msg.objects.buffer[n].contour_points.size = 0;
314  dst_msg.objects.buffer[n].contour_points.capacity = 0;
315  }
316  for(int m = 0; m < dst_msg.objects.buffer[n].contour_points.size; m++)
317  {
318  dst_msg.objects.buffer[n].contour_points.buffer[m].x = src_msg.objects[n].contour_points[m].x;
319  dst_msg.objects.buffer[n].contour_points.buffer[m].y = src_msg.objects[n].contour_points[m].y;
320  dst_msg.objects.buffer[n].contour_points.buffer[m].z = src_msg.objects[n].contour_points[m].z;
321 
322  }
323  }
324  return dst_msg;
325 }
326 
328 {
329  freePointCloudMsg(msg.targets);
330  for(int n = 0; n < msg.objects.size; n++)
331  free(msg.objects.buffer[n].contour_points.buffer);
332  free(msg.objects.buffer);
333  memset(&msg, 0, sizeof(msg));
334 }
335 
337 {
338  SickScanLdmrsObjectArray dst_msg;
339  memset(&dst_msg, 0, sizeof(dst_msg));
340  // Copy header
341  ROS_HEADER_SEQ(dst_msg.header, src_msg.header.seq);
342  dst_msg.header.timestamp_sec = sec(src_msg.header.stamp);
343  dst_msg.header.timestamp_nsec = nsec(src_msg.header.stamp);
344  strncpy(dst_msg.header.frame_id, src_msg.header.frame_id.c_str(), sizeof(dst_msg.header.frame_id) - 2);
345  // Copy ldmrs objects
346  dst_msg.objects.size = src_msg.objects.size();
347  dst_msg.objects.capacity = dst_msg.objects.size;
348  dst_msg.objects.buffer = (SickScanLdmrsObject*)malloc(dst_msg.objects.capacity * sizeof(SickScanLdmrsObject));
349  if (!dst_msg.objects.buffer)
350  {
351  dst_msg.objects.size = 0;
352  dst_msg.objects.capacity = 0;
353  }
354  for(int n = 0; n < dst_msg.objects.size; n++)
355  {
356  dst_msg.objects.buffer[n].id = src_msg.objects[n].id;
357  dst_msg.objects.buffer[n].tracking_time_sec = sec(src_msg.objects[n].tracking_time);
358  dst_msg.objects.buffer[n].tracking_time_nsec = nsec(src_msg.objects[n].tracking_time);
359  dst_msg.objects.buffer[n].last_seen_sec = sec(src_msg.objects[n].last_seen);
360  dst_msg.objects.buffer[n].last_seen_nsec = nsec(src_msg.objects[n].last_seen);
361  dst_msg.objects.buffer[n].velocity_linear.x = src_msg.objects[n].velocity.twist.linear.x;
362  dst_msg.objects.buffer[n].velocity_linear.y = src_msg.objects[n].velocity.twist.linear.y;
363  dst_msg.objects.buffer[n].velocity_linear.z = src_msg.objects[n].velocity.twist.linear.y;
364  dst_msg.objects.buffer[n].velocity_angular.x = src_msg.objects[n].velocity.twist.angular.x;
365  dst_msg.objects.buffer[n].velocity_angular.y = src_msg.objects[n].velocity.twist.angular.y;
366  dst_msg.objects.buffer[n].velocity_angular.z = src_msg.objects[n].velocity.twist.angular.y;
367  for(int m = 0; m < 36; m++)
368  dst_msg.objects.buffer[n].velocity_covariance[m] = src_msg.objects[n].velocity.covariance[m];
369  dst_msg.objects.buffer[n].bounding_box_center_position.x = src_msg.objects[n].bounding_box_center.position.x;
370  dst_msg.objects.buffer[n].bounding_box_center_position.y = src_msg.objects[n].bounding_box_center.position.y;
371  dst_msg.objects.buffer[n].bounding_box_center_position.z = src_msg.objects[n].bounding_box_center.position.z;
372  dst_msg.objects.buffer[n].bounding_box_center_orientation.x = src_msg.objects[n].bounding_box_center.orientation.x;
373  dst_msg.objects.buffer[n].bounding_box_center_orientation.y = src_msg.objects[n].bounding_box_center.orientation.y;
374  dst_msg.objects.buffer[n].bounding_box_center_orientation.z = src_msg.objects[n].bounding_box_center.orientation.z;
375  dst_msg.objects.buffer[n].bounding_box_center_orientation.w = src_msg.objects[n].bounding_box_center.orientation.w;
376  dst_msg.objects.buffer[n].bounding_box_size.x = src_msg.objects[n].bounding_box_size.x;
377  dst_msg.objects.buffer[n].bounding_box_size.y = src_msg.objects[n].bounding_box_size.y;
378  dst_msg.objects.buffer[n].bounding_box_size.z = src_msg.objects[n].bounding_box_size.z;
379  dst_msg.objects.buffer[n].object_box_center_position.x = src_msg.objects[n].object_box_center.pose.position.x;
380  dst_msg.objects.buffer[n].object_box_center_position.y = src_msg.objects[n].object_box_center.pose.position.y;
381  dst_msg.objects.buffer[n].object_box_center_position.z = src_msg.objects[n].object_box_center.pose.position.z;
382  dst_msg.objects.buffer[n].object_box_center_orientation.x = src_msg.objects[n].object_box_center.pose.orientation.x;
383  dst_msg.objects.buffer[n].object_box_center_orientation.y = src_msg.objects[n].object_box_center.pose.orientation.y;
384  dst_msg.objects.buffer[n].object_box_center_orientation.z = src_msg.objects[n].object_box_center.pose.orientation.z;
385  dst_msg.objects.buffer[n].object_box_center_orientation.w = src_msg.objects[n].object_box_center.pose.orientation.w;
386  for(int m = 0; m < 36; m++)
387  dst_msg.objects.buffer[n].object_box_center_covariance[m] = src_msg.objects[n].object_box_center.covariance[m];
388  dst_msg.objects.buffer[n].object_box_size.x = src_msg.objects[n].object_box_size.x;
389  dst_msg.objects.buffer[n].object_box_size.y = src_msg.objects[n].object_box_size.y;
390  dst_msg.objects.buffer[n].object_box_size.z = src_msg.objects[n].object_box_size.z;
391  dst_msg.objects.buffer[n].contour_points.size = src_msg.objects[n].contour_points.size();
394  if (!dst_msg.objects.buffer[n].contour_points.buffer)
395  {
396  dst_msg.objects.buffer[n].contour_points.size = 0;
397  dst_msg.objects.buffer[n].contour_points.capacity = 0;
398  }
399  for(int m = 0; m < dst_msg.objects.buffer[n].contour_points.size; m++)
400  {
401  dst_msg.objects.buffer[n].contour_points.buffer[m].x = src_msg.objects[n].contour_points[m].x;
402  dst_msg.objects.buffer[n].contour_points.buffer[m].y = src_msg.objects[n].contour_points[m].y;
403  dst_msg.objects.buffer[n].contour_points.buffer[m].z = src_msg.objects[n].contour_points[m].z;
404 
405  }
406  }
407  return dst_msg;
408 }
409 
411 {
412  for(int n = 0; n < msg.objects.size; n++)
413  free(msg.objects.buffer[n].contour_points.buffer);
414  free(msg.objects.buffer);
415  memset(&msg, 0, sizeof(msg));
416 }
417 
419 {
421  memset(&dst_msg, 0, sizeof(dst_msg));
422  if (src_msg.markers.size() > 0)
423  {
424  // Copy markers
425  dst_msg.markers.size = src_msg.markers.size();
426  dst_msg.markers.capacity = dst_msg.markers.size;
428  if (!dst_msg.markers.buffer)
429  {
430  dst_msg.markers.size = 0;
431  dst_msg.markers.capacity = 0;
432  }
433  for(int n = 0; n < dst_msg.markers.size; n++)
434  {
435  const ros_visualization_msgs::Marker& src_marker = src_msg.markers[n];
436  SickScanVisualizationMarker& dst_marker = dst_msg.markers.buffer[n];
437  memset(&dst_marker, 0, sizeof(dst_marker));
438  // Copy header
439  ROS_HEADER_SEQ(dst_marker.header, src_marker.header.seq);
440  dst_marker.header.timestamp_sec = sec(src_marker.header.stamp);
441  dst_marker.header.timestamp_nsec = nsec(src_marker.header.stamp);
442  strncpy(dst_marker.header.frame_id, src_marker.header.frame_id.c_str(), sizeof(dst_marker.header.frame_id) - 2);
443  // Copy data
444  strncpy(dst_marker.ns, src_marker.ns.c_str(), sizeof(dst_marker.ns) - 2);
445  dst_marker.id = src_marker.id;
446  dst_marker.type = src_marker.type;
447  dst_marker.action = src_marker.action;
448  dst_marker.pose_position.x = src_marker.pose.position.x;
449  dst_marker.pose_position.y = src_marker.pose.position.y;
450  dst_marker.pose_position.z = src_marker.pose.position.z;
451  dst_marker.pose_orientation.x = src_marker.pose.orientation.x;
452  dst_marker.pose_orientation.y = src_marker.pose.orientation.y;
453  dst_marker.pose_orientation.z = src_marker.pose.orientation.z;
454  dst_marker.pose_orientation.w = src_marker.pose.orientation.w;
455  dst_marker.scale.x = src_marker.scale.x;
456  dst_marker.scale.y = src_marker.scale.y;
457  dst_marker.scale.z = src_marker.scale.z;
458  dst_marker.color.r = src_marker.color.r;
459  dst_marker.color.g = src_marker.color.g;
460  dst_marker.color.b = src_marker.color.b;
461  dst_marker.color.a = src_marker.color.a;
462  dst_marker.lifetime_sec = sec(src_marker.lifetime);
463  dst_marker.lifetime_nsec = nsec(src_marker.lifetime);
464  dst_marker.frame_locked = src_marker.frame_locked;
465  strncpy(dst_marker.text, src_marker.text.c_str(), sizeof(dst_marker.text) - 2);
466  strncpy(dst_marker.mesh_resource, src_marker.mesh_resource.c_str(), sizeof(dst_marker.mesh_resource) - 2);
467  dst_marker.mesh_use_embedded_materials = src_marker.mesh_use_embedded_materials;
468  dst_marker.points.size = src_marker.points.size();
469  dst_marker.points.capacity = dst_marker.points.size;
470  dst_marker.points.buffer = (SickScanVector3Msg*)malloc(dst_marker.points.capacity * sizeof(SickScanVector3Msg));
471  if (!dst_marker.points.buffer)
472  {
473  dst_marker.points.size = 0;
474  dst_marker.points.capacity = 0;
475  }
476  for(int m = 0; m < dst_marker.points.size; m++)
477  {
478  dst_marker.points.buffer[m].x = src_marker.points[m].x;
479  dst_marker.points.buffer[m].y = src_marker.points[m].y;
480  dst_marker.points.buffer[m].z = src_marker.points[m].z;
481  }
482  dst_marker.colors.size = src_marker.colors.size();
483  dst_marker.colors.capacity = dst_marker.colors.size;
484  dst_marker.colors.buffer = (SickScanColorRGBA*)malloc(dst_marker.colors.capacity * sizeof(SickScanColorRGBA));
485  if (!dst_marker.colors.buffer)
486  {
487  dst_marker.colors.size = 0;
488  dst_marker.colors.capacity = 0;
489  }
490  for(int m = 0; m < dst_marker.colors.size; m++)
491  {
492  dst_marker.colors.buffer[m].r = src_marker.colors[m].r;
493  dst_marker.colors.buffer[m].g = src_marker.colors[m].g;
494  dst_marker.colors.buffer[m].b = src_marker.colors[m].b;
495  dst_marker.colors.buffer[m].a = src_marker.colors[m].a;
496  }
497  }
498  }
499  return dst_msg;
500 }
501 
503 {
504  for(int n = 0; n < msg.markers.size; n++)
505  {
506  free(msg.markers.buffer[n].points.buffer);
507  free(msg.markers.buffer[n].colors.buffer);
508  }
509  free(msg.markers.buffer);
510  memset(&msg, 0, sizeof(msg));
511 }
512 
513 /*
514 * Callback handler
515 */
516 
518 {
519  ROS_DEBUG_STREAM("api_impl cartesian_pointcloud_callback: PointCloud2 message, " << msg->pointcloud.width << "x" << msg->pointcloud.height << " points");
520  DUMP_API_POINTCLOUD_MESSAGE("impl", msg->pointcloud);
521  // Convert ros_sensor_msgs::PointCloud2 message to SickScanPointCloudMsg and export (i.e. notify all listeners)
524  s_callback_handler_cartesian_pointcloud_messages.notifyListener(apiHandle, &export_msg);
525  freePointCloudMsg(export_msg);
526 }
527 
529 {
530  ROS_DEBUG_STREAM("api_impl polar_pointcloud_callback: PointCloud2 message, " << msg->pointcloud.width << "x" << msg->pointcloud.height << " points");
531  // Convert ros_sensor_msgs::PointCloud2 message to SickScanPointCloudMsg and export (i.e. notify all listeners)
534  s_callback_handler_polar_pointcloud_messages.notifyListener(apiHandle, &export_msg);
535  freePointCloudMsg(export_msg);
536 }
537 
539 {
540  // ROS_DEBUG_STREAM("api_impl lferec_callback: Imu message = {" << (*msg) << "}");
541  DUMP_API_IMU_MESSAGE("impl", *msg);
542  ROS_DEBUG_STREAM("api_impl imu_callback: Imu message, orientation={" << ROS_QUATERNION_TO_STREAM(msg->orientation) << "}, angular_velocity={" << ROS_VECTOR3D_TO_STREAM(msg->angular_velocity) << "}, linear_acceleration={" << ROS_VECTOR3D_TO_STREAM(msg->linear_acceleration) << "}");
543  // Convert ros_sensor_msgs::PointCloud2 message to SickScanPointCloudMsg and export (i.e. notify all listeners)
544  SickScanImuMsg export_msg = convertImuMsg(*msg);
546  s_callback_handler_imu_messages.notifyListener(apiHandle, &export_msg);
547  freeImuMsg(export_msg);
548 }
549 
551 {
552  // ROS_DEBUG_STREAM("api_impl lferec_callback: LFErec message = {" << (*msg) << "}");
553  DUMP_API_LFEREC_MESSAGE("impl", *msg);
554  std::stringstream field_info;
555  for(int n = 0; n < msg->fields_number; n++)
556  {
557  field_info << ", field " << (int)(msg->fields[n].field_index) << ": (";
558  if (msg->fields[n].field_result_mrs == 1)
559  field_info << "free,";
560  else if (msg->fields[n].field_result_mrs == 2)
561  field_info << "infringed,";
562  else
563  field_info << "invalid,";
564  field_info << msg->fields[n].dist_scale_factor << "," << msg->fields[n].dist_scale_offset << "," << msg->fields[n].angle_scale_factor << "," << msg->fields[n].angle_scale_offset << ")";
565  }
566  ROS_DEBUG_STREAM("api_impl lferec_callback: LFErec message, " << msg->fields_number << " fields" << field_info.str());
567  SickScanLFErecMsg export_msg = convertLFErecMsg(*msg);
569  s_callback_handler_lferec_messages.notifyListener(apiHandle, &export_msg);
570  freeLFErecMsg(export_msg);
571 }
572 
574 {
575  // ROS_DEBUG_STREAM("api_impl lidoutputstate_callback: LIDoutputstate message = {" << (*msg) << "}");
577  std::stringstream state_info;
578  state_info << ", outputstate=(";
579  for(int n = 0; n < msg->output_state.size(); n++)
580  state_info << (n > 0 ? ",": "") << (int)(msg->output_state[n]);
581  state_info << "), outputcount=(";
582  for(int n = 0; n < msg->output_count.size(); n++)
583  state_info << (n > 0 ? ",": "") << (int)(msg->output_count[n]);
584  state_info << ")";
585  ROS_DEBUG_STREAM("api_impl lidoutputstate_callback: LIDoutputstate message" << state_info.str());
588  s_callback_handler_lidoutputstate_messages.notifyListener(apiHandle, &export_msg);
589  freeLIDoutputstateMsg(export_msg);
590 }
591 
593 {
594  // ROS_DEBUG_STREAM("api_impl radarscan_callback: RadarScan message = {" << (*msg) << "}");
596  ROS_DEBUG_STREAM("api_impl radarscan_callback: " << (msg->targets.width * msg->targets.height) << " targets, " << msg->objects.size() << " objects");
599  s_callback_handler_radarscan_messages.notifyListener(apiHandle, &export_msg);
600  freeRadarScanMsg(export_msg);
601 }
602 
604 {
605  // ROS_DEBUG_STREAM("api_impl ldmrsobjectarray_callback: LdmrsObjectArray message = {" << (*msg) << "}");
607  ROS_DEBUG_STREAM("api_impl ldmrsobjectarray_callback: " << msg->objects.size() << " objects");
610  s_callback_handler_ldmrsobjectarray_messages.notifyListener(apiHandle, &export_msg);
611  freeLdmrsObjectArrayMsg(export_msg);
612 }
613 
615 {
616  // ROS_DEBUG_STREAM("api_impl visualizationmarker_callback: MarkerArray message = {" << (*msg) << "}");
618  std::stringstream marker_info;
619  for(int n = 0; n < msg->markers.size(); n++)
620  marker_info << ", marker " << msg->markers[n].id << ": pos=(" << msg->markers[n].pose.position.x << "," << msg->markers[n].pose.position.y << "," << msg->markers[n].pose.position.z << ")";
621  ROS_DEBUG_STREAM("api_impl visualizationmarker_callback: " << msg->markers.size() << " markers" << marker_info.str());
624  s_callback_handler_visualizationmarker_messages.notifyListener(apiHandle, &export_msg);
625  freeVisualizationMarkerMsg(export_msg);
626 }
627 
628 /*
629 * Functions to initialize and close the API and a lidar
630 */
631 
632 /*
633 * Create an instance of sick_scan_xd api.
634 * Optional commandline arguments argc, argv identical to sick_generic_caller.
635 * Call SickScanApiInitByLaunchfile or SickScanApiInitByCli to process a lidar.
636 */
637 SickScanApiHandle SickScanApiCreate(int argc, char** argv)
638 {
639  try
640  {
641  std::string versionInfo = std::string("sick_scan_api V. ") + getVersionInfo();
643 
644  #if defined __ROS_VERSION && __ROS_VERSION == 2
645  rclcpp::init(argc, argv);
646  rclcpp::NodeOptions node_options;
647  node_options.allow_undeclared_parameters(true);
648  rosNodePtr node = rclcpp::Node::make_shared("sick_scan", "", node_options);
650  #else
652  SickScanApiHandle apiHandle = new ros::NodeHandle("~");
653  #endif
654 
655  signal(SIGINT, rosSignalHandler);
657 
658  if (argc > 0 && argv != 0 && argv[0] != 0)
659  s_api_caller[apiHandle] = argv[0];
660  return apiHandle;
661  }
662  catch(const std::exception& e)
663  {
664  ROS_ERROR_STREAM("## ERROR SickScanApiCreate(): exception " << e.what());
665  }
666  catch(...)
667  {
668  ROS_ERROR_STREAM("## ERROR SickScanApiCreate(): unknown exception ");
669  }
670  return 0;
671 }
672 
673 // Release and free all resources of a handle; the handle is invalid after SickScanApiRelease
675 {
676  try
677  {
678  if (apiHandle == 0)
679  {
680  ROS_ERROR_STREAM("## ERROR SickScanApiRelease(): invalid apiHandle");
682  }
683  s_api_caller[apiHandle].clear();
693  for(int n = 0; n < s_malloced_resources.size(); n++)
694  free(s_malloced_resources[n]);
695  s_malloced_resources.clear();
696  return SICK_SCAN_API_SUCCESS;
697  }
698  catch(const std::exception& e)
699  {
700  ROS_ERROR_STREAM("## ERROR SickScanApiRelease(): exception " << e.what());
701  }
702  catch(...)
703  {
704  ROS_ERROR_STREAM("## ERROR SickScanApiRelease(): unknown exception ");
705  }
706  return SICK_SCAN_API_ERROR;
707 }
708 
709 // Initializes a lidar by launchfile and starts message receiving and processing
710 int32_t SickScanApiInitByLaunchfile(SickScanApiHandle apiHandle, const char* launchfile_args)
711 {
712  try
713  {
714  if (apiHandle == 0)
715  {
716  ROS_ERROR_STREAM("## ERROR SickScanApiInitByLaunchfile(" << launchfile_args << "): invalid apiHandle");
718  }
719  // Split launchfile_args by spaces
720  ROS_INFO_STREAM("SickScanApiInitByLaunchfile: launchfile_args = \"" << launchfile_args << "\"");
721  std::string args_string(launchfile_args);
722  std::string arg;
723  std::vector<std::string> args;
724  std::string endToken = ".launch";
725  std::size_t pos = args_string.find(endToken);
726  std::string filepath = args_string.substr(0, pos + endToken.length());
727  args_string.erase(0, pos + endToken.length() + 1);
728  args.push_back(filepath);
729  while ((pos = args_string.find(' ')) != std::string::npos)
730  {
731  arg = args_string.substr(0, pos);
732  args.push_back(arg);
733  args_string.erase(0, pos + 1);
734  }
735  args.push_back(args_string);
736  // Convert to argc, argv
737  int argc = args.size() + 1;
738  char** argv = (char**)malloc(argc * sizeof(char*));
739  s_malloced_resources.push_back(argv);
740  argv[0] = (char*)malloc(s_api_caller[apiHandle].size() + 1);
741  strcpy(argv[0], s_api_caller[apiHandle].c_str());
742  s_malloced_resources.push_back(argv[0]);
743  for(int n = 1; n < argc; n++)
744  {
745  argv[n] = (char*)malloc(strlen(args[n-1].c_str()) + 1);
746  strcpy(argv[n], args[n-1].c_str());
747  s_malloced_resources.push_back(argv[n]);
748  }
749  // Init using SickScanApiInitByCli
750  int32_t ret = SickScanApiInitByCli(apiHandle, argc, argv);
751  return ret;
752  }
753  catch(const std::exception& e)
754  {
755  ROS_ERROR_STREAM("## ERROR SickScanApiInitByLaunchfile(): exception " << e.what());
756  }
757  catch(...)
758  {
759  ROS_ERROR_STREAM("## ERROR SickScanApiInitByLaunchfile(): unknown exception ");
760  }
761  return SICK_SCAN_API_ERROR;
762 }
763 
764 // Initializes a lidar by commandline arguments and starts message receiving and processing
765 int32_t SickScanApiInitByCli(SickScanApiHandle apiHandle, int argc, char** argv)
766 {
767  try
768  {
769  if (apiHandle == 0)
770  {
771  ROS_ERROR_STREAM("## ERROR SickScanApiInitByCli(): invalid apiHandle");
773  }
774  // Create a deep copy of argv
775  s_argc = argc;
776  s_argv = (char**)malloc(argc * sizeof(char*));
777  std::stringstream cli_params;
778  for(int n = 0; n < argc; n++)
779  {
780  s_argv[n] = (char*)malloc((strlen(argv[n]) + 1) * sizeof(char));
781  strcpy(s_argv[n],argv[n]);
782  cli_params << (n > 0 ? " ": "") << argv[n];
783  }
784  ROS_INFO_STREAM("SickScanApiInitByCli: " << cli_params.str());
785 
786  // Start sick_scan event loop
787  int exit_code = 0;
788  rosNodePtr node = castApiHandleToNode(apiHandle);
789  try
790  {
791  if (!startGenericLaser(s_argc, s_argv, s_scannerName, node, &exit_code) || exit_code != sick_scan_xd::ExitSuccess)
792  {
793  ROS_ERROR_STREAM("## ERROR SickScanApiInitByCli(): startGenericLaser() failed, could not start generic laser event loop");
794  return SICK_SCAN_API_ERROR;
795  }
796  return SICK_SCAN_API_SUCCESS;
797  }
798  catch(const std::exception& e)
799  {
800  ROS_ERROR_STREAM("## ERROR SickScanApiInitByCli(): exception " << e.what());
801  }
802  try
803  {
804  ROS_WARN_STREAM("SickScanApiInitByCli(): running sick_generic_laser in main thread ...");
806  if (exit_code != sick_scan_xd::ExitSuccess)
807  {
808  ROS_ERROR_STREAM("## ERROR SickScanApiInitByCli(): mainGenericLaser() failed");
809  return SICK_SCAN_API_ERROR;
810  }
811  return SICK_SCAN_API_SUCCESS;
812  }
813  catch(const std::exception& e)
814  {
815  ROS_ERROR_STREAM("## ERROR SickScanApiInitByCli(): exception " << e.what());
816  }
817  }
818  catch(const std::exception& e)
819  {
820  ROS_ERROR_STREAM("## ERROR SickScanApiInitByCli(): exception " << e.what());
821  }
822  catch(...)
823  {
824  ROS_ERROR_STREAM("## ERROR SickScanApiInitByCli(): unknown exception ");
825  }
826  return SICK_SCAN_API_ERROR;
827 }
828 
829 // Stops message receiving and processing and closes a lidar
831 {
832  try
833  {
834  if (apiHandle == 0)
835  {
836  ROS_ERROR_STREAM("## ERROR SickScanApiClose(): invalid apiHandle");
838  }
839  // stopScannerAndExit(true);
840  rosSignalHandler(SIGINT); // Send Ctrl-C for gentle shutdown
850  return SICK_SCAN_API_SUCCESS;
851  }
852  catch(const std::exception& e)
853  {
854  ROS_ERROR_STREAM("## ERROR SickScanApiClose(): exception " << e.what());
855  }
856  catch(...)
857  {
858  ROS_ERROR_STREAM("## ERROR SickScanApiClose(): unknown exception ");
859  }
860  return SICK_SCAN_API_ERROR;
861 }
862 
863 /*
864 * Registration / deregistration of message callbacks
865 */
866 
867 // Register / deregister a callback for cartesian PointCloud messages, pointcloud in cartesian coordinates with fields x, y, z, intensity
869 {
870  try
871  {
872  if (apiHandle == 0)
873  {
874  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterCartesianPointCloudMsg(): invalid apiHandle");
876  }
878  rosNodePtr node = castApiHandleToNode(apiHandle);
880  return SICK_SCAN_API_SUCCESS;
881  }
882  catch(const std::exception& e)
883  {
884  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterCartesianPointCloudMsg(): exception " << e.what());
885  }
886  catch(...)
887  {
888  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterCartesianPointCloudMsg(): unknown exception ");
889  }
890  return SICK_SCAN_API_ERROR;
891 }
893 {
894  try
895  {
896  if (apiHandle == 0)
897  {
898  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterCartesianPointCloudMsg(): invalid apiHandle");
900  }
902  rosNodePtr node = castApiHandleToNode(apiHandle);
904  return SICK_SCAN_API_SUCCESS;
905  }
906  catch(const std::exception& e)
907  {
908  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterCartesianPointCloudMsg(): exception " << e.what());
909  }
910  catch(...)
911  {
912  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterCartesianPointCloudMsg(): unknown exception ");
913  }
914  return SICK_SCAN_API_ERROR;
915 }
916 
917 // Register / deregister a callback for polar PointCloud messages, pointcloud in polar coordinates with fields range, azimuth, elevation, intensity
919 {
920  try
921  {
922  if (apiHandle == 0)
923  {
924  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterPolarPointCloudMsg(): invalid apiHandle");
926  }
928  rosNodePtr node = castApiHandleToNode(apiHandle);
930  return SICK_SCAN_API_SUCCESS;
931  }
932  catch(const std::exception& e)
933  {
934  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterPolarPointCloudMsg(): exception " << e.what());
935  }
936  catch(...)
937  {
938  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterPolarPointCloudMsg(): unknown exception ");
939  }
940  return SICK_SCAN_API_ERROR;
941 }
943 {
944  try
945  {
946  if (apiHandle == 0)
947  {
948  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterPolarPointCloudMsg(): invalid apiHandle");
950  }
951  s_callback_handler_polar_pointcloud_messages.removeListener(apiHandle, callback);
952  rosNodePtr node = castApiHandleToNode(apiHandle);
954  return SICK_SCAN_API_SUCCESS;
955  }
956  catch(const std::exception& e)
957  {
958  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterPolarPointCloudMsg(): exception " << e.what());
959  }
960  catch(...)
961  {
962  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterPolarPointCloudMsg(): unknown exception ");
963  }
964  return SICK_SCAN_API_ERROR;
965 }
966 
967 // Register / deregister a callback for Imu messages
969 {
970  try
971  {
972  if (apiHandle == 0)
973  {
974  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterImuMsg(): invalid apiHandle");
976  }
977  s_callback_handler_imu_messages.addListener(apiHandle, callback);
978  rosNodePtr node = castApiHandleToNode(apiHandle);
980  return SICK_SCAN_API_SUCCESS;
981  }
982  catch(const std::exception& e)
983  {
984  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterImuMsg(): exception " << e.what());
985  }
986  catch(...)
987  {
988  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterImuMsg(): unknown exception ");
989  }
990  return SICK_SCAN_API_ERROR;
991 }
993 {
994  try
995  {
996  if (apiHandle == 0)
997  {
998  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterImuMsg(): invalid apiHandle");
1000  }
1001  s_callback_handler_imu_messages.removeListener(apiHandle, callback);
1002  rosNodePtr node = castApiHandleToNode(apiHandle);
1004  return SICK_SCAN_API_SUCCESS;
1005  }
1006  catch(const std::exception& e)
1007  {
1008  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterImuMsg(): exception " << e.what());
1009  }
1010  catch(...)
1011  {
1012  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterImuMsg(): unknown exception ");
1013  }
1014  return SICK_SCAN_API_ERROR;
1015 }
1016 
1017 // Register / deregister a callback for SickScanLFErecMsg messages
1019 {
1020  try
1021  {
1022  if (apiHandle == 0)
1023  {
1024  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLFErecMsg(): invalid apiHandle");
1026  }
1027  s_callback_handler_lferec_messages.addListener(apiHandle, callback);
1028  rosNodePtr node = castApiHandleToNode(apiHandle);
1030  return SICK_SCAN_API_SUCCESS;
1031  }
1032  catch(const std::exception& e)
1033  {
1034  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLFErecMsg(): exception " << e.what());
1035  }
1036  catch(...)
1037  {
1038  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLFErecMsg(): unknown exception ");
1039  }
1040  return SICK_SCAN_API_ERROR;
1041 }
1043 {
1044  try
1045  {
1046  if (apiHandle == 0)
1047  {
1048  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLFErecMsg(): invalid apiHandle");
1050  }
1051  s_callback_handler_lferec_messages.removeListener(apiHandle, callback);
1052  rosNodePtr node = castApiHandleToNode(apiHandle);
1054  return SICK_SCAN_API_SUCCESS;
1055  }
1056  catch(const std::exception& e)
1057  {
1058  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLFErecMsg(): exception " << e.what());
1059  }
1060  catch(...)
1061  {
1062  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLFErecMsg(): unknown exception ");
1063  }
1064  return SICK_SCAN_API_ERROR;
1065 }
1066 
1067 // Register / deregister a callback for SickScanLIDoutputstateMsg messages
1069 {
1070  try
1071  {
1072  if (apiHandle == 0)
1073  {
1074  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLIDoutputstateMsg(): invalid apiHandle");
1076  }
1077  s_callback_handler_lidoutputstate_messages.addListener(apiHandle, callback);
1078  rosNodePtr node = castApiHandleToNode(apiHandle);
1080  return SICK_SCAN_API_SUCCESS;
1081  }
1082  catch(const std::exception& e)
1083  {
1084  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLIDoutputstateMsg(): exception " << e.what());
1085  }
1086  catch(...)
1087  {
1088  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLIDoutputstateMsg(): unknown exception ");
1089  }
1090  return SICK_SCAN_API_ERROR;
1091 }
1093 {
1094  try
1095  {
1096  if (apiHandle == 0)
1097  {
1098  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLIDoutputstateMsg(): invalid apiHandle");
1100  }
1101  s_callback_handler_lidoutputstate_messages.removeListener(apiHandle, callback);
1102  rosNodePtr node = castApiHandleToNode(apiHandle);
1104  return SICK_SCAN_API_SUCCESS;
1105  }
1106  catch(const std::exception& e)
1107  {
1108  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLIDoutputstateMsg(): exception " << e.what());
1109  }
1110  catch(...)
1111  {
1112  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLIDoutputstateMsg(): unknown exception ");
1113  }
1114  return SICK_SCAN_API_ERROR;
1115 }
1116 
1117 // Register / deregister a callback for SickScanRadarScan messages
1119 {
1120  try
1121  {
1122  if (apiHandle == 0)
1123  {
1124  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterRadarScanMsg(): invalid apiHandle");
1126  }
1127  s_callback_handler_radarscan_messages.addListener(apiHandle, callback);
1128  rosNodePtr node = castApiHandleToNode(apiHandle);
1130  return SICK_SCAN_API_SUCCESS;
1131  }
1132  catch(const std::exception& e)
1133  {
1134  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterRadarScanMsg(): exception " << e.what());
1135  }
1136  catch(...)
1137  {
1138  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterRadarScanMsg(): unknown exception ");
1139  }
1140  return SICK_SCAN_API_ERROR;
1141 }
1143 {
1144  try
1145  {
1146  if (apiHandle == 0)
1147  {
1148  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterRadarScanMsg(): invalid apiHandle");
1150  }
1151  s_callback_handler_radarscan_messages.removeListener(apiHandle, callback);
1152  rosNodePtr node = castApiHandleToNode(apiHandle);
1154  return SICK_SCAN_API_SUCCESS;
1155  }
1156  catch(const std::exception& e)
1157  {
1158  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterRadarScanMsg(): exception " << e.what());
1159  }
1160  catch(...)
1161  {
1162  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterRadarScanMsg(): unknown exception ");
1163  }
1164  return SICK_SCAN_API_ERROR;
1165 }
1166 
1167 // Register / deregister a callback for SickScanLdmrsObjectArray messages
1169 {
1170  try
1171  {
1172  if (apiHandle == 0)
1173  {
1174  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLdmrsObjectArrayMsg(): invalid apiHandle");
1176  }
1178  rosNodePtr node = castApiHandleToNode(apiHandle);
1180  return SICK_SCAN_API_SUCCESS;
1181  }
1182  catch(const std::exception& e)
1183  {
1184  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLdmrsObjectArrayMsg(): exception " << e.what());
1185  }
1186  catch(...)
1187  {
1188  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLdmrsObjectArrayMsg(): unknown exception ");
1189  }
1190  return SICK_SCAN_API_ERROR;
1191 }
1193 {
1194  try
1195  {
1196  if (apiHandle == 0)
1197  {
1198  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLdmrsObjectArrayMsg(): invalid apiHandle");
1200  }
1201  s_callback_handler_ldmrsobjectarray_messages.removeListener(apiHandle, callback);
1202  rosNodePtr node = castApiHandleToNode(apiHandle);
1204  return SICK_SCAN_API_SUCCESS;
1205  }
1206  catch(const std::exception& e)
1207  {
1208  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLdmrsObjectArrayMsg(): exception " << e.what());
1209  }
1210  catch(...)
1211  {
1212  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLdmrsObjectArrayMsg(): unknown exception ");
1213  }
1214  return SICK_SCAN_API_ERROR;
1215 }
1216 
1217 // Register / deregister a callback for VisualizationMarker messages
1219 {
1220  try
1221  {
1222  if (apiHandle == 0)
1223  {
1224  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterVisualizationMarkerMsg(): invalid apiHandle");
1226  }
1228  rosNodePtr node = castApiHandleToNode(apiHandle);
1230  return SICK_SCAN_API_SUCCESS;
1231  }
1232  catch(const std::exception& e)
1233  {
1234  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterVisualizationMarkerMsg(): exception " << e.what());
1235  }
1236  catch(...)
1237  {
1238  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterVisualizationMarkerMsg(): unknown exception ");
1239  }
1240  return SICK_SCAN_API_ERROR;
1241 }
1243 {
1244  try
1245  {
1246  if (apiHandle == 0)
1247  {
1248  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterVisualizationMarkerMsg(): invalid apiHandle");
1250  }
1251  s_callback_handler_visualizationmarker_messages.removeListener(apiHandle, callback);
1252  rosNodePtr node = castApiHandleToNode(apiHandle);
1254  return SICK_SCAN_API_SUCCESS;
1255  }
1256  catch(const std::exception& e)
1257  {
1258  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterVisualizationMarkerMsg(): exception " << e.what());
1259  }
1260  catch(...)
1261  {
1262  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterVisualizationMarkerMsg(): unknown exception ");
1263  }
1264  return SICK_SCAN_API_ERROR;
1265 }
1266 
1267 /*
1268 * Functions for diagnostic and logging
1269 */
1270 // Register a callback for diagnostic messages (notification in case of changed status, e.g. after errors)
1272 {
1273  try
1274  {
1275  if (apiHandle == 0)
1276  {
1277  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterDiagnosticMsg(): invalid apiHandle");
1279  }
1280  s_callback_handler_diagnostic_messages.addListener(apiHandle, callback);
1281  return SICK_SCAN_API_SUCCESS;
1282  }
1283  catch(const std::exception& e)
1284  {
1285  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterDiagnosticMsg(): exception " << e.what());
1286  }
1287  catch(...)
1288  {
1289  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterDiagnosticMsg(): unknown exception ");
1290  }
1291  return SICK_SCAN_API_ERROR;
1292 }
1293 
1294 // Deregister a callback for diagnostic messages (notification in case of changed status, e.g. after errors)
1296 {
1297  try
1298  {
1299  if (apiHandle == 0)
1300  {
1301  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterDiagnosticMsg(): invalid apiHandle");
1303  }
1304  s_callback_handler_diagnostic_messages.removeListener(apiHandle, callback);
1305  return SICK_SCAN_API_SUCCESS;
1306  }
1307  catch(const std::exception& e)
1308  {
1309  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterDiagnosticMsg(): exception " << e.what());
1310  }
1311  catch(...)
1312  {
1313  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterDiagnosticMsg(): unknown exception ");
1314  }
1315  return SICK_SCAN_API_ERROR;
1316 }
1317 
1318 // Register a callback for log messages (all informational and error messages)
1320 {
1321  try
1322  {
1323  if (apiHandle == 0)
1324  {
1325  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLogMsg(): invalid apiHandle");
1327  }
1328  s_callback_handler_log_messages.addListener(apiHandle, callback);
1329  return SICK_SCAN_API_SUCCESS;
1330  }
1331  catch(const std::exception& e)
1332  {
1333  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLogMsg(): exception " << e.what());
1334  }
1335  catch(...)
1336  {
1337  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterLogMsg(): unknown exception ");
1338  }
1339  return SICK_SCAN_API_ERROR;
1340 }
1341 
1342 // Deregister a callback for log messages (all informational and error messages)
1344 {
1345  try
1346  {
1347  if (apiHandle == 0)
1348  {
1349  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLogMsg(): invalid apiHandle");
1351  }
1352  s_callback_handler_log_messages.removeListener(apiHandle, callback);
1353  return SICK_SCAN_API_SUCCESS;
1354  }
1355  catch(const std::exception& e)
1356  {
1357  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLogMsg(): exception " << e.what());
1358  }
1359  catch(...)
1360  {
1361  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterLogMsg(): unknown exception ");
1362  }
1363  return SICK_SCAN_API_ERROR;
1364 }
1365 
1366 // Query current status and status message
1367 int32_t SickScanApiGetStatus(SickScanApiHandle apiHandle, int32_t* status_code, char* message_buffer, int32_t message_buffer_size)
1368 {
1369  try
1370  {
1371  if (apiHandle == 0)
1372  {
1373  ROS_ERROR_STREAM("## ERROR SickScanApiGetStatus(): invalid apiHandle");
1375  }
1377  std::string diagnostic_message;
1378  getDiagnosticStatus(diagnostic_code, diagnostic_message);
1379  int32_t len = std::min<int32_t>(message_buffer_size, (int32_t)diagnostic_message.length() + 1);
1380  *status_code = diagnostic_code;
1381  strncpy(message_buffer, diagnostic_message.c_str(), len);
1382  message_buffer[len-1] = '\0';
1383  return SICK_SCAN_API_SUCCESS;
1384  }
1385  catch(const std::exception& e)
1386  {
1387  ROS_ERROR_STREAM("## ERROR SickScanApiGetStatus(): exception " << e.what());
1388  }
1389  catch(...)
1390  {
1391  ROS_ERROR_STREAM("## ERROR SickScanApiGetStatus(): unknown exception ");
1392  }
1393  return SICK_SCAN_API_ERROR;
1394 }
1395 
1396 // Sends a SOPAS command like "sRN SCdevicestate" or "sRN ContaminationResult" and returns the lidar response
1397 int32_t SickScanApiSendSOPAS(SickScanApiHandle apiHandle, const char* sopas_command, char* sopas_response_buffer, int32_t response_buffer_size)
1398 {
1399  try
1400  {
1401  if (apiHandle == 0)
1402  {
1403  ROS_ERROR_STREAM("## ERROR SickScanApiSendSOPAS(): invalid apiHandle");
1405  }
1406  std::string sopas_ascii_request = sopas_command;
1407  std::string sopas_response;
1408  if (!convertSendSOPASCommand(sopas_ascii_request, sopas_response, true))
1409  {
1410  ROS_ERROR_STREAM("## ERROR SickScanApiSendSOPAS(): convertSendSOPASCommand(\"" << sopas_ascii_request << "\") failed");
1411  return SICK_SCAN_API_ERROR;
1412  }
1413  if (sopas_response.length() >= response_buffer_size)
1414  {
1415  ROS_WARN_STREAM("## ERROR SickScanApiSendSOPAS(\"" << sopas_ascii_request << "\"): response_buffer_size " << response_buffer_size << " too small, response \"" << sopas_response << "\" requires at least " << (sopas_response.length() + 1) << " bytes, response truncated");
1416  }
1417  strncpy(sopas_response_buffer, sopas_response.c_str(), response_buffer_size - 1);
1418  sopas_response_buffer[response_buffer_size - 1] = '\0';
1419  return SICK_SCAN_API_SUCCESS;
1420  }
1421  catch (const std::exception& e)
1422  {
1423  ROS_ERROR_STREAM("## ERROR SickScanApiSendSOPAS(): exception " << e.what());
1424  }
1425  catch (...)
1426  {
1427  ROS_ERROR_STREAM("## ERROR SickScanApiSendSOPAS(): unknown exception ");
1428  }
1429  return SICK_SCAN_API_ERROR;
1430 }
1431 
1432 // Set verbose level 0=DEBUG, 1=INFO, 2=WARN, 3=ERROR, 4=FATAL or 5=QUIET (equivalent to ros::console::levels),
1433 // i.e. print messages on console above the given verbose level.
1434 // Default verbose level is 1 (INFO), i.e. print informational, warnings and error messages.
1436 {
1437  try
1438  {
1439  if (apiHandle == 0)
1440  {
1441  ROS_ERROR_STREAM("## ERROR SickScanApiSetVerboseLevel(): invalid apiHandle");
1443  }
1445  return SICK_SCAN_API_SUCCESS;
1446  }
1447  catch(const std::exception& e)
1448  {
1449  ROS_ERROR_STREAM("## ERROR SickScanApiSetVerboseLevel(): exception " << e.what());
1450  }
1451  catch(...)
1452  {
1453  ROS_ERROR_STREAM("## ERROR SickScanApiSetVerboseLevel(): unknown exception ");
1454  }
1455  return SICK_SCAN_API_ERROR;
1456 }
1457 
1458 // Returns the current verbose level 0=DEBUG, 1=INFO, 2=WARN, 3=ERROR, 4=FATAL or 5=QUIET. Default verbose level is 1 (INFO)
1460 {
1461  int32_t verbose_level = 1;
1462  try
1463  {
1464  if (apiHandle == 0)
1465  ROS_ERROR_STREAM("## ERROR getVerboseLevel(): invalid apiHandle");
1467  }
1468  catch(const std::exception& e)
1469  {
1470  ROS_ERROR_STREAM("## ERROR getVerboseLevel(): exception " << e.what());
1471  }
1472  catch(...)
1473  {
1474  ROS_ERROR_STREAM("## ERROR getVerboseLevel(): unknown exception ");
1475  }
1476  return verbose_level;
1477 }
1478 
1479 // Notifies all registered log message listener, i.e. all registered listener callbacks are called for all messages of type INFO, WARN, ERROR or FATAL
1480 void notifyLogMessageListener(int msg_level, const std::string& message)
1481 {
1483  msg.log_level = msg_level;
1484  msg.log_message = (char*)calloc(message.length() + 1, sizeof(char));
1485  strncpy(msg.log_message, message.c_str(), message.length());
1486  s_callback_handler_log_messages.notifyListener(&msg);
1487  free(msg.log_message);
1488  // std::cout << "SICK_LOG_MESSAGE " << msg_level << ": \"" << message << "\""<< std::endl;
1489 }
1490 
1491 // Notifies all registered listener about a new diagnostic status
1492 void notifyDiagnosticListener(SICK_DIAGNOSTIC_STATUS status_code, const std::string& status_message)
1493 {
1495  msg.status_code = status_code;
1496  msg.status_message = (char*)calloc(status_message.length() + 1, sizeof(char));
1497  strncpy(msg.status_message, status_message.c_str(), status_message.length());
1499  free(msg.status_message);
1500  // std::cout << "SICK_DIAGNOSTIC_STATUS " << status_code << ": \"" << status_message << "\""<< std::endl;
1501 }
1502 
1503 /*
1504 * Polling functions
1505 */
1506 
1507 // Wait for and return the next cartesian resp. polar PointCloud messages. Note: SickScanApiWait...Msg() allocates a message. Use function SickScanApiFree...Msg() to deallocate it after use.
1509 {
1510  int32_t ret_val = SICK_SCAN_API_ERROR;
1511  try
1512  {
1513  memset(msg, 0, sizeof(*msg));
1514  if (apiHandle == 0)
1515  {
1516  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextCartesianPointCloudMsg(): invalid apiHandle");
1518  }
1519  if (!rosOk())
1520  {
1521  ROS_WARN_STREAM("SickScanApiWaitNext closing or uninitialized");
1523  }
1524  rosNodePtr node = castApiHandleToNode(apiHandle);
1530  if (wait_message_handler.waitForNextMessage(ros_msg, timeout_sec)
1531  && ros_msg.pointcloud.width * ros_msg.pointcloud.height > 0
1532  && ros_msg.pointcloud.fields.size() >= 3
1533  && ros_msg.pointcloud.fields[0].name == "x"
1534  && ros_msg.pointcloud.fields[1].name == "y"
1535  && ros_msg.pointcloud.fields[2].name == "z")
1536  {
1537  // ros_sensor_msgs::PointCloud2 message received, convert to SickScanPointCloudMsg
1538  ROS_INFO_STREAM("SickScanApiWaitNextCartesianPointCloudMsg: PointCloud2 message, " << ros_msg.pointcloud.width << "x" << ros_msg.pointcloud.height << " points");
1539  *msg = convertPointCloudMsg(ros_msg);
1540  ret_val = SICK_SCAN_API_SUCCESS;
1541  }
1542  else
1543  {
1544  ret_val = SICK_SCAN_API_TIMEOUT;
1545  }
1547  }
1548  catch(const std::exception& e)
1549  {
1550  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextCartesianPointCloudMsg(): exception " << e.what());
1551  }
1552  catch(...)
1553  {
1554  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextCartesianPointCloudMsg(): unknown exception ");
1555  }
1556  return ret_val;
1557 }
1559 {
1560  int32_t ret_val = SICK_SCAN_API_ERROR;
1561  try
1562  {
1563  memset(msg, 0, sizeof(*msg));
1564  if (apiHandle == 0)
1565  {
1566  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextPolarPointCloudMsg(): invalid apiHandle");
1568  }
1569  if (!rosOk())
1570  {
1571  ROS_WARN_STREAM("SickScanApiWaitNext closing or uninitialized");
1573  }
1574  rosNodePtr node = castApiHandleToNode(apiHandle);
1576  sick_scan_xd::addPolarPointcloudListener(node, sick_scan_xd::WaitForPolarPointCloudMessageHandler::messageCallback); // registrate static SickWaitForMessageHandler callback once
1580  if (wait_message_handler.waitForNextMessage(ros_msg, timeout_sec)
1581  && ros_msg.pointcloud.width * ros_msg.pointcloud.height > 0
1582  && ros_msg.pointcloud.fields.size() >= 3
1583  && ros_msg.pointcloud.fields[0].name == "range"
1584  && ros_msg.pointcloud.fields[1].name == "azimuth"
1585  && ros_msg.pointcloud.fields[2].name == "elevation")
1586  {
1587  // ros_sensor_msgs::PointCloud2 message received, convert to SickScanPointCloudMsg
1588  ROS_INFO_STREAM("SickScanApiWaitNextPolarPointCloudMsg: PointCloud2 message, " << ros_msg.pointcloud.width << "x" << ros_msg.pointcloud.height << " points");
1589  *msg = convertPointCloudMsg(ros_msg);
1590  ret_val = SICK_SCAN_API_SUCCESS;
1591  }
1592  else
1593  {
1594  ret_val = SICK_SCAN_API_TIMEOUT;
1595  }
1597  }
1598  catch(const std::exception& e)
1599  {
1600  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextPolarPointCloudMsg(): exception " << e.what());
1601  }
1602  catch(...)
1603  {
1604  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextPolarPointCloudMsg(): unknown exception ");
1605  }
1606  return ret_val;
1607 }
1609 {
1610  if(apiHandle && msg)
1611  {
1613  return SICK_SCAN_API_SUCCESS;
1614  }
1616 }
1617 
1618 // Wait for and return the next Imu messages. Note: SickScanApiWait...Msg() allocates a message. Use function SickScanApiFree...Msg() to deallocate it after use.
1619 int32_t SickScanApiWaitNextImuMsg(SickScanApiHandle apiHandle, SickScanImuMsg* msg, double timeout_sec)
1620 {
1621  int32_t ret_val = SICK_SCAN_API_ERROR;
1622  try
1623  {
1624  memset(msg, 0, sizeof(*msg));
1625  if (apiHandle == 0)
1626  {
1627  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextImuMsg(): invalid apiHandle");
1629  }
1630  if (!rosOk())
1631  {
1632  ROS_WARN_STREAM("SickScanApiWaitNext closing or uninitialized");
1634  }
1635  rosNodePtr node = castApiHandleToNode(apiHandle);
1638  sick_scan_xd::WaitForImuMessageHandler wait_message_handler;
1640  ros_sensor_msgs::Imu ros_msg;
1641  if (wait_message_handler.waitForNextMessage(ros_msg, timeout_sec))
1642  {
1643  // ros_sensor_msgs::PointCloud2 message received, convert to SickScanPointCloudMsg
1644  ROS_INFO_STREAM("SickScanApiWaitNextImuMsg: Imu message");
1645  *msg = convertImuMsg(ros_msg);
1646  ret_val = SICK_SCAN_API_SUCCESS;
1647  }
1648  else
1649  {
1650  ret_val = SICK_SCAN_API_TIMEOUT;
1651  }
1653  }
1654  catch(const std::exception& e)
1655  {
1656  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextImuMsg(): exception " << e.what());
1657  }
1658  catch(...)
1659  {
1660  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextImuMsg(): unknown exception ");
1661  }
1662  return ret_val;
1663 }
1665 {
1666  if(apiHandle && msg)
1667  {
1668  freeImuMsg(*msg);
1669  return SICK_SCAN_API_SUCCESS;
1670  }
1672 }
1673 
1674 // Wait for and return the next LFErec messages. Note: SickScanApiWait...Msg() allocates a message. Use function SickScanApiFree...Msg() to deallocate it after use.
1675 int32_t SickScanApiWaitNextLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsg* msg, double timeout_sec)
1676 {
1677  int32_t ret_val = SICK_SCAN_API_ERROR;
1678  try
1679  {
1680  memset(msg, 0, sizeof(*msg));
1681  if (apiHandle == 0)
1682  {
1683  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextLFErecMsg(): invalid apiHandle");
1685  }
1686  if (!rosOk())
1687  {
1688  ROS_WARN_STREAM("SickScanApiWaitNext closing or uninitialized");
1690  }
1691  rosNodePtr node = castApiHandleToNode(apiHandle);
1694  sick_scan_xd::WaitForLFErecMessageHandler wait_message_handler;
1696  sick_scan_msg::LFErecMsg ros_msg;
1697  if (wait_message_handler.waitForNextMessage(ros_msg, timeout_sec) && ros_msg.fields_number > 0)
1698  {
1699  // ros_sensor_msgs::PointCloud2 message received, convert to SickScanPointCloudMsg
1700  ROS_INFO_STREAM("SickScanApiWaitNextLFErecMsg: LFErec message, " << ros_msg.fields_number << " fields");
1701  *msg = convertLFErecMsg(ros_msg);
1702  ret_val = SICK_SCAN_API_SUCCESS;
1703  }
1704  else
1705  {
1706  ret_val = SICK_SCAN_API_TIMEOUT;
1707  }
1709  }
1710  catch(const std::exception& e)
1711  {
1712  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextLFErecMsg(): exception " << e.what());
1713  }
1714  catch(...)
1715  {
1716  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextLFErecMsg(): unknown exception ");
1717  }
1718  return ret_val;
1719 }
1721 {
1722  if(apiHandle && msg)
1723  {
1724  freeLFErecMsg(*msg);
1725  return SICK_SCAN_API_SUCCESS;
1726  }
1728 }
1729 
1730 // Wait for and return the next LIDoutputstate messages. Note: SickScanApiWait...Msg() allocates a message. Use function SickScanApiFree...Msg() to deallocate it after use.
1732 {
1733  int32_t ret_val = SICK_SCAN_API_ERROR;
1734  try
1735  {
1736  memset(msg, 0, sizeof(*msg));
1737  if (apiHandle == 0)
1738  {
1739  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextLIDoutputstateMsg(): invalid apiHandle");
1741  }
1742  if (!rosOk())
1743  {
1744  ROS_WARN_STREAM("SickScanApiWaitNext closing or uninitialized");
1746  }
1747  rosNodePtr node = castApiHandleToNode(apiHandle);
1753  if (wait_message_handler.waitForNextMessage(ros_msg, timeout_sec) && ros_msg.output_state.size() + ros_msg.output_count.size() > 0)
1754  {
1755  // ros_sensor_msgs::PointCloud2 message received, convert to SickScanPointCloudMsg
1756  ROS_INFO_STREAM("SickScanApiWaitNextLIDoutputstateMsg: LIDoutputstate message, " << ros_msg.output_state.size() << " states, " << ros_msg.output_count.size() << " counters");
1757  *msg = convertLIDoutputstateMsg(ros_msg);
1758  ret_val = SICK_SCAN_API_SUCCESS;
1759  }
1760  else
1761  {
1762  ret_val = SICK_SCAN_API_TIMEOUT;
1763  }
1765  }
1766  catch(const std::exception& e)
1767  {
1768  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextLIDoutputstateMsg(): exception " << e.what());
1769  }
1770  catch(...)
1771  {
1772  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextLIDoutputstateMsg(): unknown exception ");
1773  }
1774  return ret_val;
1775 }
1777 {
1778  if(apiHandle && msg)
1779  {
1781  return SICK_SCAN_API_SUCCESS;
1782  }
1784 }
1785 
1786 // Wait for and return the next RadarScan messages. Note: SickScanApiWait...Msg() allocates a message. Use function SickScanApiFree...Msg() to deallocate it after use.
1787 int32_t SickScanApiWaitNextRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScan* msg, double timeout_sec)
1788 {
1789  int32_t ret_val = SICK_SCAN_API_ERROR;
1790  try
1791  {
1792  memset(msg, 0, sizeof(*msg));
1793  if (apiHandle == 0)
1794  {
1795  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextRadarScanMsg(): invalid apiHandle");
1797  }
1798  if (!rosOk())
1799  {
1800  ROS_WARN_STREAM("SickScanApiWaitNext closing or uninitialized");
1802  }
1803  rosNodePtr node = castApiHandleToNode(apiHandle);
1806  sick_scan_xd::WaitForRadarScanMessageHandler wait_message_handler;
1808  sick_scan_msg::RadarScan ros_msg;
1809  if (wait_message_handler.waitForNextMessage(ros_msg, timeout_sec) && ros_msg.targets.width * ros_msg.targets.height + ros_msg.objects.size() > 0)
1810  {
1811  // ros_sensor_msgs::PointCloud2 message received, convert to SickScanPointCloudMsg
1812  ROS_INFO_STREAM("SickScanApiWaitNextRadarScanMsg: RadarScan message, " << (ros_msg.targets.width * ros_msg.targets.height) << " targets, " << ros_msg.objects.size() << " objects");
1813  *msg = convertRadarScanMsg(ros_msg);
1814  ret_val = SICK_SCAN_API_SUCCESS;
1815  }
1816  else
1817  {
1818  ret_val = SICK_SCAN_API_TIMEOUT;
1819  }
1821  }
1822  catch(const std::exception& e)
1823  {
1824  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextRadarScanMsg(): exception " << e.what());
1825  }
1826  catch(...)
1827  {
1828  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextRadarScanMsg(): unknown exception ");
1829  }
1830  return ret_val;
1831 }
1833 {
1834  if(apiHandle && msg)
1835  {
1837  return SICK_SCAN_API_SUCCESS;
1838  }
1840 }
1841 
1842 // Wait for and return the next LdmrsObjectArray messages. Note: SickScanApiWait...Msg() allocates a message. Use function SickScanApiFree...Msg() to deallocate it after use.
1844 {
1845  int32_t ret_val = SICK_SCAN_API_ERROR;
1846  try
1847  {
1848  memset(msg, 0, sizeof(*msg));
1849  if (apiHandle == 0)
1850  {
1851  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextLdmrsObjectArrayMsg(): invalid apiHandle");
1853  }
1854  if (!rosOk())
1855  {
1856  ROS_WARN_STREAM("SickScanApiWaitNext closing or uninitialized");
1858  }
1859  rosNodePtr node = castApiHandleToNode(apiHandle);
1865  if (wait_message_handler.waitForNextMessage(ros_msg, timeout_sec) && ros_msg.objects.size() > 0)
1866  {
1867  // ros_sensor_msgs::PointCloud2 message received, convert to SickScanPointCloudMsg
1868  ROS_INFO_STREAM("SickScanApiWaitNextLdmrsObjectArrayMsg: LdmrsObjectArray message, " << ros_msg.objects.size() << " objects");
1869  *msg = convertLdmrsObjectArrayMsg(ros_msg);
1870  ret_val = SICK_SCAN_API_SUCCESS;
1871  }
1872  else
1873  {
1874  ret_val = SICK_SCAN_API_TIMEOUT;
1875  }
1877  }
1878  catch(const std::exception& e)
1879  {
1880  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextLdmrsObjectArrayMsg(): exception " << e.what());
1881  }
1882  catch(...)
1883  {
1884  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextLdmrsObjectArrayMsg(): unknown exception ");
1885  }
1886  return ret_val;
1887 }
1889 {
1890  if(apiHandle && msg)
1891  {
1893  return SICK_SCAN_API_SUCCESS;
1894  }
1896 }
1897 
1898 // Wait for and return the next VisualizationMarker message. Note: SickScanApiWait...Msg() allocates a message. Use function SickScanApiFree...Msg() to deallocate it after use.
1900 {
1901  int32_t ret_val = SICK_SCAN_API_ERROR;
1902  try
1903  {
1904  memset(msg, 0, sizeof(*msg));
1905  if (apiHandle == 0)
1906  {
1907  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextVisualizationMarkerMsg(): invalid apiHandle");
1909  }
1910  if (!rosOk())
1911  {
1912  ROS_WARN_STREAM("SickScanApiWaitNext closing or uninitialized");
1914  }
1915  rosNodePtr node = castApiHandleToNode(apiHandle);
1921  if (wait_message_handler.waitForNextMessage(ros_msg, timeout_sec) && ros_msg.markers.size() > 0)
1922  {
1923  // ros_sensor_msgs::PointCloud2 message received, convert to SickScanPointCloudMsg
1924  ROS_INFO_STREAM("SickScanApiWaitNextVisualizationMarkerMsg: VisualizationMarker message, " << ros_msg.markers.size() << " markers");
1925  *msg = convertVisualizationMarkerMsg(ros_msg);
1926  ret_val = SICK_SCAN_API_SUCCESS;
1927  }
1928  else
1929  {
1930  ret_val = SICK_SCAN_API_TIMEOUT;
1931  }
1933  }
1934  catch(const std::exception& e)
1935  {
1936  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextVisualizationMarkerMsg(): exception " << e.what());
1937  }
1938  catch(...)
1939  {
1940  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextVisualizationMarkerMsg(): unknown exception ");
1941  }
1942  return ret_val;
1943 }
1945 {
1946  if(apiHandle && msg)
1947  {
1949  return SICK_SCAN_API_SUCCESS;
1950  }
1952 }
1953 
1954 /*
1955 ** NAV-350 support and messages
1956 */
1957 
1959 {
1961  memset(&dst_msg, 0, sizeof(dst_msg));
1962  dst_msg.pose_valid = src_msg.poseDataValid;
1963  dst_msg.pose_nav_x = src_msg.poseData.x;
1964  dst_msg.pose_nav_y = src_msg.poseData.y;
1965  dst_msg.pose_nav_phi = src_msg.poseData.phi;
1966  dst_msg.pose_opt_valid = src_msg.poseData.optPoseDataValid;
1969  dst_msg.pose_opt_mean_dev = src_msg.poseData.optPoseData.meanDev;
1970  dst_msg.pose_opt_nav_mode = src_msg.poseData.optPoseData.navMode;
1973  if (dst_msg.pose_valid > 0)
1974  sick_scan_xd::convertNAVCartPos3DtoROSPos3D(dst_msg.pose_nav_x, dst_msg.pose_nav_y, dst_msg.pose_nav_phi, dst_msg.pose_x, dst_msg.pose_y, dst_msg.pose_yaw, src_msg.angleOffset);
1975  if (dst_msg.pose_opt_valid > 0 && SoftwarePLL::instance().IsInitialized())
1977 
1978  if (src_msg.landmarkDataValid && src_msg.landmarkData.reflectors.size() > 0)
1979  {
1980  dst_msg.reflectors.buffer = (SickScanNavReflector*)malloc(src_msg.landmarkData.reflectors.size() * sizeof(SickScanNavReflector));
1981  if (dst_msg.reflectors.buffer)
1982  {
1983  dst_msg.reflectors.size = src_msg.landmarkData.reflectors.size();
1984  dst_msg.reflectors.capacity = src_msg.landmarkData.reflectors.size();
1985  for(int reflector_cnt = 0; reflector_cnt < src_msg.landmarkData.reflectors.size(); reflector_cnt++)
1986  {
1987  const sick_scan_xd::NAV350ReflectorData* src_reflector = &src_msg.landmarkData.reflectors[reflector_cnt];
1988  SickScanNavReflector* dst_reflector = &dst_msg.reflectors.buffer[reflector_cnt];
1989  dst_reflector->cartesian_valid = src_reflector->cartesianDataValid;
1990  dst_reflector->cartesian_x = src_reflector->cartesianData.x;
1991  dst_reflector->cartesian_y = src_reflector->cartesianData.y;
1992  dst_reflector->polar_valid = src_reflector->polarDataValid;
1993  dst_reflector->polar_dist = src_reflector->polarData.dist;
1994  dst_reflector->polar_phi = src_reflector->polarData.phi;
1995  dst_reflector->opt_valid = src_reflector->optReflectorDataValid;
1996  dst_reflector->opt_local_id = src_reflector->optReflectorData.localID;
1997  dst_reflector->opt_global_id = src_reflector->optReflectorData.globalID;
1998  dst_reflector->opt_type = src_reflector->optReflectorData.type;
1999  dst_reflector->opt_subtype = src_reflector->optReflectorData.subType;
2000  dst_reflector->opt_quality = src_reflector->optReflectorData.quality;
2001  dst_reflector->opt_timestamp = src_reflector->optReflectorData.timestamp;
2002  dst_reflector->opt_size = src_reflector->optReflectorData.size;
2003  dst_reflector->opt_hitcount = src_reflector->optReflectorData.hitCount;
2004  dst_reflector->opt_meanecho = src_reflector->optReflectorData.meanEcho;
2005  dst_reflector->opt_startindex = src_reflector->optReflectorData.startIndex;
2006  dst_reflector->opt_endindex = src_reflector->optReflectorData.endIndex;
2007  dst_reflector->pos_valid = src_reflector->cartesianDataValid;
2008  if (src_reflector->cartesianDataValid)
2009  sick_scan_xd::convertNAVCartPos2DtoROSPos2D(src_reflector->cartesianData.x, src_reflector->cartesianData.y, dst_reflector->pos_x, dst_reflector->pos_y, src_msg.angleOffset);
2010  if (src_reflector->optReflectorDataValid > 0 && SoftwarePLL::instance().IsInitialized())
2012  }
2013  }
2014  }
2015  return dst_msg;
2016 }
2018 {
2019  free(msg.reflectors.buffer);
2020  memset(&msg, 0, sizeof(msg));
2021 }
2023 {
2024  ROS_DEBUG_STREAM("api_impl nav_pose_landmark_callback: NAV350mNPOSData message");
2027  s_callback_handler_navposelandmark_messages.notifyListener(apiHandle, &export_msg);
2028  freeNavPoseLandmarkMsg(export_msg);
2029 }
2031 {
2032  try
2033  {
2034  if (apiHandle == 0)
2035  {
2036  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterNavPoseLandmarkMsg(): invalid apiHandle");
2038  }
2039  s_callback_handler_navposelandmark_messages.addListener(apiHandle, callback);
2040  rosNodePtr node = castApiHandleToNode(apiHandle);
2042  return SICK_SCAN_API_SUCCESS;
2043  }
2044  catch(const std::exception& e)
2045  {
2046  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterNavPoseLandmarkMsg(): exception " << e.what());
2047  }
2048  catch(...)
2049  {
2050  ROS_ERROR_STREAM("## ERROR SickScanApiRegisterNavPoseLandmarkMsg(): unknown exception ");
2051  }
2052  return SICK_SCAN_API_ERROR;
2053 }
2055 {
2056  try
2057  {
2058  if (apiHandle == 0)
2059  {
2060  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterNavPoseLandmarkMsg(): invalid apiHandle");
2062  }
2063  s_callback_handler_navposelandmark_messages.removeListener(apiHandle, callback);
2064  rosNodePtr node = castApiHandleToNode(apiHandle);
2066  return SICK_SCAN_API_SUCCESS;
2067  }
2068  catch(const std::exception& e)
2069  {
2070  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterNavPoseLandmarkMsg(): exception " << e.what());
2071  }
2072  catch(...)
2073  {
2074  ROS_ERROR_STREAM("## ERROR SickScanApiDeregisterNavPoseLandmarkMsg(): unknown exception ");
2075  }
2076  return SICK_SCAN_API_ERROR;
2077 }
2079 {
2080  int32_t ret_val = SICK_SCAN_API_ERROR;
2081  try
2082  {
2083  memset(msg, 0, sizeof(*msg));
2084  if (apiHandle == 0)
2085  {
2086  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextNavPoseLandmarkMsg(): invalid apiHandle");
2088  }
2089  rosNodePtr node = castApiHandleToNode(apiHandle);
2092  sick_scan_xd::WaitForNAVPOSDataMessageHandler wait_message_handler;
2094  sick_scan_xd::NAV350mNPOSData navdata_msg;
2095  if (wait_message_handler.waitForNextMessage(navdata_msg, timeout_sec) && (navdata_msg.poseDataValid > 0 || navdata_msg.landmarkDataValid > 0))
2096  {
2097  ROS_INFO_STREAM("SickScanApiWaitNextNavPoseLandmarkMsg: NAV350mNPOSData message");
2098  *msg = convertNAV350mNPOSData(navdata_msg);
2099  ret_val = SICK_SCAN_API_SUCCESS;
2100  }
2101  else
2102  {
2103  ret_val = SICK_SCAN_API_TIMEOUT;
2104  }
2106  }
2107  catch(const std::exception& e)
2108  {
2109  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextNavPoseLandmarkMsg(): exception " << e.what());
2110  }
2111  catch(...)
2112  {
2113  ROS_ERROR_STREAM("## ERROR SickScanApiWaitNextNavPoseLandmarkMsg(): unknown exception ");
2114  }
2115  return ret_val;
2116 }
2118 {
2119  if(apiHandle && msg)
2120  {
2122  return SICK_SCAN_API_SUCCESS;
2123  }
2125 }
2126 // Send odometry data to NAV350
2130 {
2131  return SickScanApiNavOdomVelocityImpl(apiHandle, msg);
2132 }
2134 {
2135  return SickScanApiOdomVelocityImpl(apiHandle, msg);
2136 }
SickScanQuaternionMsgType::z
double z
Definition: sick_scan_api.h:168
SickScanApiRegisterNavPoseLandmarkMsg
int32_t SickScanApiRegisterNavPoseLandmarkMsg(SickScanApiHandle apiHandle, SickScanNavPoseLandmarkCallback callback)
Definition: api_impl.cpp:2030
sick_scan_xd::SickCallbackHandler
Definition: sick_generic_callback.h:147
SickScanApiRegisterLIDoutputstateMsg
int32_t SickScanApiRegisterLIDoutputstateMsg(SickScanApiHandle apiHandle, SickScanLIDoutputstateMsgCallback callback)
Definition: api_impl.cpp:1068
sick_scan_xd::SickWaitForMessageHandler::shutdown
static void shutdown()
Definition: sick_generic_callback.h:297
SickScanLFErecFieldMsgType::field_index
uint8_t field_index
Definition: sick_scan_api.h:193
SickScanLIDoutputstateMsgType::output_count
uint32_t output_count[8]
Definition: sick_scan_api.h:223
SickScanLFErecFieldMsgType::minute
uint8_t minute
Definition: sick_scan_api.h:205
SickScanHeaderType::timestamp_sec
uint32_t timestamp_sec
Definition: sick_scan_api.h:87
SickScanLIDoutputstateMsgType::microsecond
uint32_t microsecond
Definition: sick_scan_api.h:231
SickScanRadarObjectType::contour_points
SickScanPointArray contour_points
Definition: sick_scan_api.h:282
SickScanApiRegisterLogMsg
int32_t SickScanApiRegisterLogMsg(SickScanApiHandle apiHandle, SickScanLogMsgCallback callback)
Definition: api_impl.cpp:1319
nav_pose_landmark_callback
static void nav_pose_landmark_callback(rosNodePtr node, const sick_scan_xd::NAV350mNPOSData *msg)
Definition: api_impl.cpp:2022
sick_scan_xd::NAV350OptReflectorData::subType
uint16_t subType
Definition: sick_nav_scandata.h:115
freeRadarScanMsg
static void freeRadarScanMsg(SickScanRadarScan &msg)
Definition: api_impl.cpp:327
SickScanOdomVelocityMsgType
Definition: sick_scan_api.h:431
sensor_msgs::Imu
::sensor_msgs::Imu_< std::allocator< void > > Imu
Definition: Imu.h:93
s_callback_handler_navposelandmark_messages
static sick_scan_xd::SickCallbackHandler< SickScanApiHandle, SickScanNavPoseLandmarkMsg > s_callback_handler_navposelandmark_messages
Definition: api_impl.cpp:32
SickScanHeaderType::seq
uint32_t seq
Definition: sick_scan_api.h:86
SickScanLdmrsObjectBufferType::buffer
SickScanLdmrsObject * buffer
Definition: sick_scan_api.h:306
SickScanApiRegisterVisualizationMarkerMsg
int32_t SickScanApiRegisterVisualizationMarkerMsg(SickScanApiHandle apiHandle, SickScanVisualizationMarkerCallback callback)
Definition: api_impl.cpp:1218
sick_scan_xd::NAV350mNPOSData::landmarkData
NAV350LandmarkData landmarkData
Definition: sick_nav_scandata.h:210
SickScanVisualizationMarkerMsgType::markers
SickScanVisualizationMarkerBuffer markers
Definition: sick_scan_api.h:360
convertPointCloudMsg
static SickScanPointCloudMsg convertPointCloudMsg(const sick_scan_xd::PointCloud2withEcho &msg_with_echo)
Definition: api_impl.cpp:58
SICK_SCAN_API_SUCCESS
@ SICK_SCAN_API_SUCCESS
Definition: sick_scan_api.h:609
SickScanColorRGBAType::b
float b
Definition: sick_scan_api.h:319
SickScanRadarObjectType::last_seen_sec
uint32_t last_seen_sec
Definition: sick_scan_api.h:264
SickScanRadarObjectArrayType::capacity
uint64_t capacity
Definition: sick_scan_api.h:287
SickScanApiWaitNextCartesianPointCloudMsg
int32_t SickScanApiWaitNextCartesianPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1508
SickScanNavPoseLandmarkMsgType::pose_opt_mean_dev
int32_t pose_opt_mean_dev
Definition: sick_scan_api.h:414
msg
msg
SickScanNavPoseLandmarkMsgType::pose_opt_nav_mode
uint8_t pose_opt_nav_mode
Definition: sick_scan_api.h:415
convertNAV350mNPOSData
static SickScanNavPoseLandmarkMsg convertNAV350mNPOSData(const sick_scan_xd::NAV350mNPOSData &src_msg)
Definition: api_impl.cpp:1958
freeImuMsg
static void freeImuMsg(SickScanImuMsg &msg)
Definition: api_impl.cpp:147
SickScanApiRegisterRadarScanMsg
int32_t SickScanApiRegisterRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScanCallback callback)
Definition: api_impl.cpp:1118
sick_generic_laser.h
SickScanNavReflectorType::polar_valid
uint16_t polar_valid
Definition: sick_scan_api.h:371
SickScanPointCloudMsgType::is_dense
uint8_t is_dense
Definition: sick_scan_api.h:151
SickScanApiDeregisterCartesianPointCloudMsg
int32_t SickScanApiDeregisterCartesianPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:892
SickScanLFErecFieldMsgType::month
uint8_t month
Definition: sick_scan_api.h:202
sick_scan_api_dump.h
sick_scan_xd::removeNavPoseLandmarkListener
void removeNavPoseLandmarkListener(rosNodePtr handle, NAV350mNPOSDataCallback listener)
Definition: sick_generic_callback.cpp:239
SickScanPointFieldArrayType::size
uint64_t size
Definition: sick_scan_api.h:133
sick_scan_xd::NAV350mNPOSData::angleOffset
float angleOffset
Definition: sick_nav_scandata.h:215
SickScanRadarPreHeaderType::udiencoderpos
uint32_t udiencoderpos[3]
Definition: sick_scan_api.h:255
SickScanApiInitByCli
int32_t SickScanApiInitByCli(SickScanApiHandle apiHandle, int argc, char **argv)
Definition: api_impl.cpp:765
SickScanPointArrayType::size
uint64_t size
Definition: sick_scan_api.h:175
DUMP_API_POINTCLOUD_MESSAGE
#define DUMP_API_POINTCLOUD_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:91
lidoutputstate_callback
static void lidoutputstate_callback(rosNodePtr node, const sick_scan_msg::LIDoutputstateMsg *msg)
Definition: api_impl.cpp:573
ros::init
ROSCPP_DECL void init(const M_string &remappings, const std::string &name, uint32_t options=0)
alternate ROS initialization function.
SickScanApiDeregisterPolarPointCloudMsg
int32_t SickScanApiDeregisterPolarPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:942
s_callback_handler_ldmrsobjectarray_messages
static sick_scan_xd::SickCallbackHandler< SickScanApiHandle, SickScanLdmrsObjectArray > s_callback_handler_ldmrsobjectarray_messages
Definition: api_impl.cpp:30
SickScanQuaternionMsgType::w
double w
Definition: sick_scan_api.h:169
s_argc
static int s_argc
Definition: api_impl.cpp:21
SickScanRadarPreHeaderType::udiserialno
uint32_t udiserialno
Definition: sick_scan_api.h:239
SickScanPointCloudMsgCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanPointCloudMsgCallback)(SickScanApiHandle apiHandle, const SickScanPointCloudMsg *msg)
Definition: sick_scan_api.h:457
sick_scan_logging.h
sick_scan_xd_api_test.sopas_response
sopas_response
Definition: sick_scan_xd_api_test.py:453
SickScanImuMsgType::linear_acceleration
SickScanVector3Msg linear_acceleration
Definition: sick_scan_api.h:186
sick_scan_xd::PointCloud2withEcho::num_echos
int32_t num_echos
Definition: sick_generic_callback.h:85
sick_scan_xd::NAV350ReflectorData
Definition: sick_nav_scandata.h:126
SickScanNavReflector
struct SickScanNavReflectorType SickScanNavReflector
SickScanLFErecFieldMsgType::microsecond
uint32_t microsecond
Definition: sick_scan_api.h:207
SickScanDiagnosticMsgType
Definition: sick_scan_api.h:446
SickScanPointArrayType::capacity
uint64_t capacity
Definition: sick_scan_api.h:174
SickScanPointCloudMsgType::height
uint32_t height
Definition: sick_scan_api.h:144
SickScanRadarPreHeaderType::uiinputs
uint16_t uiinputs
Definition: sick_scan_api.h:248
SickScanNavPoseLandmarkMsgType::pose_valid
uint16_t pose_valid
Definition: sick_scan_api.h:400
SickScanApiRegisterLdmrsObjectArrayMsg
int32_t SickScanApiRegisterLdmrsObjectArrayMsg(SickScanApiHandle apiHandle, SickScanLdmrsObjectArrayCallback callback)
Definition: api_impl.cpp:1168
SickScanNavPoseLandmarkMsgType::pose_nav_y
int32_t pose_nav_y
Definition: sick_scan_api.h:408
SickScanNavPoseLandmarkMsgType::reflectors
SickScanNavReflectorBuffer reflectors
Definition: sick_scan_api.h:419
SickScanApiDeregisterLFErecMsg
int32_t SickScanApiDeregisterLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsgCallback callback)
Definition: api_impl.cpp:1042
SickScanNavReflectorType::opt_timestamp_sec
uint32_t opt_timestamp_sec
Definition: sick_scan_api.h:387
SickScanLdmrsObjectArrayCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanLdmrsObjectArrayCallback)(SickScanApiHandle apiHandle, const SickScanLdmrsObjectArray *msg)
Definition: sick_scan_api.h:462
sick_scan_xd::NAV350OptReflectorData::hitCount
uint16_t hitCount
Definition: sick_nav_scandata.h:119
s_callback_handler_lidoutputstate_messages
static sick_scan_xd::SickCallbackHandler< SickScanApiHandle, SickScanLIDoutputstateMsg > s_callback_handler_lidoutputstate_messages
Definition: api_impl.cpp:28
sick_scan_xd::NAV350PolarData::dist
uint32_t dist
Definition: sick_nav_scandata.h:104
getDiagnosticStatus
void getDiagnosticStatus(SICK_DIAGNOSTIC_STATUS &status_code, std::string &status_message)
Definition: sick_generic_laser.cpp:314
convertLdmrsObjectArrayMsg
static SickScanLdmrsObjectArray convertLdmrsObjectArrayMsg(const sick_scan_msg::SickLdmrsObjectArray &src_msg)
Definition: api_impl.cpp:336
SickScanLFErecFieldMsgType::year
uint16_t year
Definition: sick_scan_api.h:201
SickScanVisualizationMarkerType::mesh_resource
char mesh_resource[1024]
Definition: sick_scan_api.h:347
SickScanRadarObjectType::velocity_covariance
double velocity_covariance[36]
Definition: sick_scan_api.h:269
SickScanRadarPreHeaderType::uitelegramcount
uint32_t uitelegramcount
Definition: sick_scan_api.h:244
sick_scan_xd::removeLIDoutputstateListener
void removeLIDoutputstateListener(rosNodePtr handle, LIDoutputstateCallback listener)
Definition: sick_generic_callback.cpp:139
s_argv
static char ** s_argv
Definition: api_impl.cpp:22
sick_scan_xd::isImuListenerRegistered
bool isImuListenerRegistered(rosNodePtr handle, ImuCallback listener)
Definition: sick_generic_callback.cpp:124
SickScanRadarObjectArrayType::size
uint64_t size
Definition: sick_scan_api.h:288
SickScanRadarPreHeaderType::bdeviceerror
uint8_t bdeviceerror
Definition: sick_scan_api.h:240
SickScanRadarPreHeaderType::uicyclecount
uint32_t uicyclecount
Definition: sick_scan_api.h:245
SickScanLFErecFieldMsgType::dist_scale_factor
float dist_scale_factor
Definition: sick_scan_api.h:195
imu_delay_tester.args
args
Definition: imu_delay_tester.py:124
SickScanNavReflectorBufferType::size
uint64_t size
Definition: sick_scan_api.h:394
sensor_msgs::PointCloud2
::sensor_msgs::PointCloud2_< std::allocator< void > > PointCloud2
Definition: PointCloud2.h:90
SickScanApiFreePointCloudMsg
int32_t SickScanApiFreePointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsg *msg)
Definition: api_impl.cpp:1608
SickScanLFErecMsgCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanLFErecMsgCallback)(SickScanApiHandle apiHandle, const SickScanLFErecMsg *msg)
Definition: sick_scan_api.h:459
SickScanVisualizationMarkerType::points
SickScanPointArray points
Definition: sick_scan_api.h:344
SickScanLIDoutputstateMsgType::month
uint8_t month
Definition: sick_scan_api.h:226
convertSendSOPASCommand
bool convertSendSOPASCommand(const std::string &sopas_ascii_request, std::string &sopas_response, bool wait_for_reply)
Converts a given SOPAS command from ascii to binary (in case of binary communication),...
Definition: sick_generic_laser.cpp:233
SoftwarePLL::instance
static SoftwarePLL & instance()
Definition: softwarePLL.h:24
SickScanRadarObjectType::velocity_linear
SickScanVector3Msg velocity_linear
Definition: sick_scan_api.h:267
sick_scan_xd::removePolarPointcloudListener
void removePolarPointcloudListener(rosNodePtr handle, PointCloud2Callback listener)
Definition: sick_generic_callback.cpp:99
sick_scan_xd::addVisualizationMarkerListener
void addVisualizationMarkerListener(rosNodePtr handle, VisualizationMarkerCallback listener)
Definition: sick_generic_callback.cpp:209
SickScanLIDoutputstateMsgType::system_counter
uint32_t system_counter
Definition: sick_scan_api.h:221
sick_scan_xd::NAV350OptPoseData::navMode
uint8_t navMode
Definition: sick_nav_scandata.h:76
SickScanPointCloudMsgType::topic
char topic[256]
Definition: sick_scan_api.h:154
freeLFErecMsg
static void freeLFErecMsg(SickScanLFErecMsg &msg)
Definition: api_impl.cpp:186
sick_scan_xd::NAV350ReflectorData::polarData
NAV350PolarData polarData
Definition: sick_nav_scandata.h:132
SickScanLIDoutputstateMsgType::version_number
uint16_t version_number
Definition: sick_scan_api.h:220
sick_scan_xd::isLdmrsObjectArrayListenerRegistered
bool isLdmrsObjectArrayListenerRegistered(rosNodePtr handle, SickLdmrsObjectArrayCallback listener)
Definition: sick_generic_callback.cpp:184
sick_scan_xd::NAV350OptPoseData::infoState
uint32_t infoState
Definition: sick_nav_scandata.h:77
SickScanNavReflectorType::opt_timestamp
uint32_t opt_timestamp
Definition: sick_scan_api.h:381
SickScanApiFreeImuMsg
int32_t SickScanApiFreeImuMsg(SickScanApiHandle apiHandle, SickScanImuMsg *msg)
Definition: api_impl.cpp:1664
notifyDiagnosticListener
void notifyDiagnosticListener(SICK_DIAGNOSTIC_STATUS status_code, const std::string &status_message)
Definition: api_impl.cpp:1492
SickScanImuMsgType::orientation
SickScanQuaternionMsg orientation
Definition: sick_scan_api.h:182
SickScanPointFieldMsgType::offset
uint32_t offset
Definition: sick_scan_api.h:125
SickScanNavReflectorType::pos_x
float pos_x
Definition: sick_scan_api.h:366
SickScanRadarPreHeaderType::numencoder
uint16_t numencoder
Definition: sick_scan_api.h:254
imu_callback
static void imu_callback(rosNodePtr node, const ros_sensor_msgs::Imu *msg)
Definition: api_impl.cpp:538
SickScanRadarObjectType::velocity_angular
SickScanVector3Msg velocity_angular
Definition: sick_scan_api.h:268
s_callback_handler_radarscan_messages
static sick_scan_xd::SickCallbackHandler< SickScanApiHandle, SickScanRadarScan > s_callback_handler_radarscan_messages
Definition: api_impl.cpp:29
SickScanRadarPreHeaderType::uiident
uint32_t uiident
Definition: sick_scan_api.h:238
SickScanNavPoseLandmarkCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanNavPoseLandmarkCallback)(SickScanApiHandle apiHandle, const SickScanNavPoseLandmarkMsg *msg)
Definition: sick_scan_api.h:464
SickScanNavPoseLandmarkMsgType::pose_opt_timestamp
uint32_t pose_opt_timestamp
Definition: sick_scan_api.h:413
SickScanVector3MsgType::y
double y
Definition: sick_scan_api.h:160
SickScanImuMsgCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanImuMsgCallback)(SickScanApiHandle apiHandle, const SickScanImuMsg *msg)
Definition: sick_scan_api.h:458
SickScanVisualizationMarkerBufferType::capacity
uint64_t capacity
Definition: sick_scan_api.h:353
SickScanApiRegisterPolarPointCloudMsg
int32_t SickScanApiRegisterPolarPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:918
s_callback_handler_cartesian_pointcloud_messages
static sick_scan_xd::SickCallbackHandler< SickScanApiHandle, SickScanPointCloudMsg > s_callback_handler_cartesian_pointcloud_messages
Definition: api_impl.cpp:24
sick_scan_xd::NAV350OptReflectorData::size
uint16_t size
Definition: sick_nav_scandata.h:118
sick_scan_xd::PointCloud2withEcho
Definition: sick_generic_callback.h:76
sick_generic_callback.h
sick_scan_xd::removeLFErecListener
void removeLFErecListener(rosNodePtr handle, LFErecCallback listener)
Definition: sick_generic_callback.cpp:159
SoftwarePLL::getCorrectedTimeStamp
bool getCorrectedTimeStamp(uint32_t &sec, uint32_t &nanoSec, uint32_t tick)
Definition: softwarePLL.cpp:226
SickScanApiDeregisterImuMsg
int32_t SickScanApiDeregisterImuMsg(SickScanApiHandle apiHandle, SickScanImuMsgCallback callback)
Definition: api_impl.cpp:992
SickScanPointArrayType::buffer
SickScanVector3Msg * buffer
Definition: sick_scan_api.h:176
SickScanImuMsgType::linear_acceleration_covariance
double linear_acceleration_covariance[9]
Definition: sick_scan_api.h:187
cartesian_pointcloud_callback
static void cartesian_pointcloud_callback(rosNodePtr node, const sick_scan_xd::PointCloud2withEcho *msg)
Definition: api_impl.cpp:517
sick_scan_xd::NAV350mNPOSData
Definition: sick_nav_scandata.h:200
sick_scan_xd::removeVisualizationMarkerListener
void removeVisualizationMarkerListener(rosNodePtr handle, VisualizationMarkerCallback listener)
Definition: sick_generic_callback.cpp:219
SickScanNavReflectorType::polar_phi
uint32_t polar_phi
Definition: sick_scan_api.h:373
SickScanNavReflectorType::opt_type
uint8_t opt_type
Definition: sick_scan_api.h:378
SickScanRadarObjectType
Definition: sick_scan_api.h:259
SickScanRadarPreHeaderType::udisystemcounttransmit
uint32_t udisystemcounttransmit
Definition: sick_scan_api.h:247
SickScanApiWaitNextPolarPointCloudMsg
int32_t SickScanApiWaitNextPolarPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1558
SICK_SCAN_API_TIMEOUT
@ SICK_SCAN_API_TIMEOUT
Definition: sick_scan_api.h:614
SickScanNavReflectorType::pos_y
float pos_y
Definition: sick_scan_api.h:367
SickScanApiRelease
int32_t SickScanApiRelease(SickScanApiHandle apiHandle)
Definition: api_impl.cpp:674
sick_scan_xd::addRadarScanListener
void addRadarScanListener(rosNodePtr handle, RadarScanCallback listener)
Definition: sick_generic_callback.cpp:189
SickScanDiagnosticMsgCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanDiagnosticMsgCallback)(SickScanApiHandle apiHandle, const SickScanDiagnosticMsg *msg)
Definition: sick_scan_api.h:466
SickScanApiClose
int32_t SickScanApiClose(SickScanApiHandle apiHandle)
Definition: api_impl.cpp:830
ldmrsobjectarray_callback
static void ldmrsobjectarray_callback(rosNodePtr node, const sick_scan_msg::SickLdmrsObjectArray *msg)
Definition: api_impl.cpp:603
SickScanNavPoseLandmarkMsgType::pose_nav_x
int32_t pose_nav_x
Definition: sick_scan_api.h:407
SickScanApiWaitNextVisualizationMarkerMsg
int32_t SickScanApiWaitNextVisualizationMarkerMsg(SickScanApiHandle apiHandle, SickScanVisualizationMarkerMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1899
sick_scan_xd::NAV350PoseData::optPoseDataValid
uint16_t optPoseDataValid
Definition: sick_nav_scandata.h:88
SickScanLFErecFieldMsgType::hour
uint8_t hour
Definition: sick_scan_api.h:204
SickScanVisualizationMarkerType::type
int32_t type
Definition: sick_scan_api.h:335
SickScanApiNavOdomVelocityMsg
int32_t SickScanApiNavOdomVelocityMsg(SickScanApiHandle apiHandle, SickScanNavOdomVelocityMsg *msg)
Definition: api_impl.cpp:2129
sick_scan_xd::SickLdmrsObjectArray
::sick_scan_xd::SickLdmrsObjectArray_< std::allocator< void > > SickLdmrsObjectArray
Definition: SickLdmrsObjectArray.h:56
SickScanRadarObjectType::tracking_time_nsec
uint32_t tracking_time_nsec
Definition: sick_scan_api.h:263
SickScanRadarObjectType::bounding_box_size
SickScanVector3Msg bounding_box_size
Definition: sick_scan_api.h:274
sick_scan_xd::NAV350ReflectorData::polarDataValid
uint16_t polarDataValid
Definition: sick_nav_scandata.h:131
SickScanRadarScanType
Definition: sick_scan_api.h:292
sick_scan_api.h
SickScanVisualizationMarkerType::lifetime_sec
uint32_t lifetime_sec
Definition: sick_scan_api.h:341
sick_scan_xd::PointCloud2withEcho::segment_idx
int32_t segment_idx
Definition: sick_generic_callback.h:86
SickScanPointFieldArrayType::buffer
SickScanPointFieldMsg * buffer
Definition: sick_scan_api.h:134
SickScanApiFreeRadarScanMsg
int32_t SickScanApiFreeRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScan *msg)
Definition: api_impl.cpp:1832
SickScanNavReflectorType::opt_timestamp_nsec
uint32_t opt_timestamp_nsec
Definition: sick_scan_api.h:388
sick_scan_xd::addLIDoutputstateListener
void addLIDoutputstateListener(rosNodePtr handle, LIDoutputstateCallback listener)
Definition: sick_generic_callback.cpp:129
SickScanNavReflectorType::opt_endindex
uint16_t opt_endindex
Definition: sick_scan_api.h:386
SickScanPointCloudMsgType::data
SickScanUint8Array data
Definition: sick_scan_api.h:150
sick_scan_xd::LFErecMsg
::sick_scan_xd::LFErecMsg_< std::allocator< void > > LFErecMsg
Definition: LFErecMsg.h:61
convertImuMsg
static SickScanImuMsg convertImuMsg(const ros_sensor_msgs::Imu &src_msg)
Definition: api_impl.cpp:118
ROS_HEADER_SEQ
#define ROS_HEADER_SEQ(msgheader, value)
Definition: sick_ros_wrapper.h:162
SickScanQuaternionMsgType::x
double x
Definition: sick_scan_api.h:166
SICK_SCAN_API_ERROR
@ SICK_SCAN_API_ERROR
Definition: sick_scan_api.h:610
SickScanUint8ArrayType::size
uint64_t size
Definition: sick_scan_api.h:95
WARN
@ WARN
Definition: sick_scan_logging.h:74
SickScanApiRegisterLFErecMsg
int32_t SickScanApiRegisterLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsgCallback callback)
Definition: api_impl.cpp:1018
roswrap::param::init
void init(const M_string &remappings)
Definition: param_modi.cpp:809
SickScanApiWaitNextLFErecMsg
int32_t SickScanApiWaitNextLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1675
SickScanRadarObjectType::bounding_box_center_position
SickScanVector3Msg bounding_box_center_position
Definition: sick_scan_api.h:271
message
def message(msg, *args, **kwargs)
sick_scan_xd::addLFErecListener
void addLFErecListener(rosNodePtr handle, LFErecCallback listener)
Definition: sick_generic_callback.cpp:149
SickScanColorRGBAArrayType::capacity
uint64_t capacity
Definition: sick_scan_api.h:325
sick_scan_xd::removeRadarScanListener
void removeRadarScanListener(rosNodePtr handle, RadarScanCallback listener)
Definition: sick_generic_callback.cpp:199
SickScanVisualizationMarkerType::text
char text[1024]
Definition: sick_scan_api.h:346
SickScanColorRGBAArrayType::size
uint64_t size
Definition: sick_scan_api.h:326
SickScanRadarScanType::objects
SickScanRadarObjectArray objects
Definition: sick_scan_api.h:297
convertVisualizationMarkerMsg
static SickScanVisualizationMarkerMsg convertVisualizationMarkerMsg(const ros_visualization_msgs::MarkerArray &src_msg)
Definition: api_impl.cpp:418
nsec
uint32_t nsec(const rosTime &time)
Definition: sick_ros_wrapper.h:175
sick_scan_xd::NAV350OptReflectorData::endIndex
uint16_t endIndex
Definition: sick_nav_scandata.h:122
visualizationmarker_callback
static void visualizationmarker_callback(rosNodePtr node, const ros_visualization_msgs::MarkerArray *msg)
Definition: api_impl.cpp:614
s_malloced_resources
static std::vector< void * > s_malloced_resources
Definition: api_impl.cpp:23
freeLdmrsObjectArrayMsg
static void freeLdmrsObjectArrayMsg(SickScanLdmrsObjectArray &msg)
Definition: api_impl.cpp:410
SickScanLFErecFieldMsgType::day
uint8_t day
Definition: sick_scan_api.h:203
ROS_WARN_STREAM
#define ROS_WARN_STREAM(args)
Definition: sick_scan_logging.h:123
sick_scan_xd::NAV350OptReflectorData::localID
uint16_t localID
Definition: sick_nav_scandata.h:112
SickScanRadarObjectType::tracking_time_sec
uint32_t tracking_time_sec
Definition: sick_scan_api.h:262
ROS_INFO_STREAM
#define ROS_INFO_STREAM(...)
Definition: sick_scan_ros2_example.cpp:71
sick_scan_xd::SickWaitForMessageHandler::waitForNextMessage
bool waitForNextMessage(MsgType &msg, double timeout_sec)
Definition: sick_generic_callback.h:248
sick_scan_xd::PointCloud2withEcho::topic
std::string topic
Definition: sick_generic_callback.h:87
SickScanImuMsgType::angular_velocity
SickScanVector3Msg angular_velocity
Definition: sick_scan_api.h:184
sick_scan_xd::isNavPoseLandmarkListenerRegistered
bool isNavPoseLandmarkListenerRegistered(rosNodePtr handle, NAV350mNPOSDataCallback listener)
Definition: sick_generic_callback.cpp:244
softwarePLL.h
SickScanPointCloudMsgType
Definition: sick_scan_api.h:137
SickScanVisualizationMarkerType::lifetime_nsec
uint32_t lifetime_nsec
Definition: sick_scan_api.h:342
SickScanNavReflectorType::cartesian_y
int32_t cartesian_y
Definition: sick_scan_api.h:370
s_callback_handler_polar_pointcloud_messages
static sick_scan_xd::SickCallbackHandler< SickScanApiHandle, SickScanPointCloudMsg > s_callback_handler_polar_pointcloud_messages
Definition: api_impl.cpp:25
SickScanNavReflectorType::cartesian_x
int32_t cartesian_x
Definition: sick_scan_api.h:369
sick_scan_xd::NAV350OptReflectorData::startIndex
uint16_t startIndex
Definition: sick_nav_scandata.h:121
versionInfo
static std::string versionInfo
Definition: sick_generic_laser.cpp:113
SickScanUint8ArrayType::buffer
uint8_t * buffer
Definition: sick_scan_api.h:96
sick_scan_xd::NAV350OptPoseData::quantUsedReflectors
uint8_t quantUsedReflectors
Definition: sick_nav_scandata.h:78
s_callback_handler_lferec_messages
static sick_scan_xd::SickCallbackHandler< SickScanApiHandle, SickScanLFErecMsg > s_callback_handler_lferec_messages
Definition: api_impl.cpp:27
SickScanLIDoutputstateMsgCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanLIDoutputstateMsgCallback)(SickScanApiHandle apiHandle, const SickScanLIDoutputstateMsg *msg)
Definition: sick_scan_api.h:460
sick_scan_xd::NAV350OptReflectorData::meanEcho
uint16_t meanEcho
Definition: sick_nav_scandata.h:120
polar_to_cartesian_pointcloud_ros1.node
node
Definition: polar_to_cartesian_pointcloud_ros1.py:81
SickScanNavPoseLandmarkMsgType::pose_x
float pose_x
Definition: sick_scan_api.h:402
sick_scan_xd::SickWaitForMessageHandler::addWaitForMessageHandlerHandler
static void addWaitForMessageHandlerHandler(SickWaitForMessageHandlerPtr handler)
Definition: sick_generic_callback.h:279
SickScanVisualizationMarkerType::color
SickScanColorRGBA color
Definition: sick_scan_api.h:340
SickScanVisualizationMarkerCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanVisualizationMarkerCallback)(SickScanApiHandle apiHandle, const SickScanVisualizationMarkerMsg *msg)
Definition: sick_scan_api.h:463
SickScanLFErecMsgType::header
SickScanHeader header
Definition: sick_scan_api.h:212
sick_scan_xd::removeLdmrsObjectArrayListener
void removeLdmrsObjectArrayListener(rosNodePtr handle, SickLdmrsObjectArrayCallback listener)
Definition: sick_generic_callback.cpp:179
SickScanApiDeregisterLdmrsObjectArrayMsg
int32_t SickScanApiDeregisterLdmrsObjectArrayMsg(SickScanApiHandle apiHandle, SickScanLdmrsObjectArrayCallback callback)
Definition: api_impl.cpp:1192
visualization_msgs::Marker
::visualization_msgs::Marker_< std::allocator< void > > Marker
Definition: Marker.h:193
SickScanNavPoseLandmarkMsgType::pose_opt_quant_used_reflectors
uint8_t pose_opt_quant_used_reflectors
Definition: sick_scan_api.h:417
SickScanVisualizationMarkerType::pose_position
SickScanVector3Msg pose_position
Definition: sick_scan_api.h:337
SickScanApiDeregisterDiagnosticMsg
int32_t SickScanApiDeregisterDiagnosticMsg(SickScanApiHandle apiHandle, SickScanDiagnosticMsgCallback callback)
Definition: api_impl.cpp:1295
sick_scan_xd::NAV350OptReflectorData::timestamp
uint32_t timestamp
Definition: sick_nav_scandata.h:117
SickScanVector3MsgType::z
double z
Definition: sick_scan_api.h:161
SickScanNavReflectorBufferType::buffer
SickScanNavReflector * buffer
Definition: sick_scan_api.h:395
radarscan_callback
static void radarscan_callback(rosNodePtr node, const sick_scan_msg::RadarScan *msg)
Definition: api_impl.cpp:592
SickScanImuMsgType::orientation_covariance
double orientation_covariance[9]
Definition: sick_scan_api.h:183
SickScanVisualizationMarkerType::action
int32_t action
Definition: sick_scan_api.h:336
SickScanLFErecFieldMsgType::angle_scale_offset
int32_t angle_scale_offset
Definition: sick_scan_api.h:198
s_callback_handler_imu_messages
static sick_scan_xd::SickCallbackHandler< SickScanApiHandle, SickScanImuMsg > s_callback_handler_imu_messages
Definition: api_impl.cpp:26
SickScanRadarPreHeaderType::uiversionno
uint16_t uiversionno
Definition: sick_scan_api.h:236
SickScanRadarObjectType::object_box_size
SickScanVector3Msg object_box_size
Definition: sick_scan_api.h:280
SickScanApiDeregisterRadarScanMsg
int32_t SickScanApiDeregisterRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScanCallback callback)
Definition: api_impl.cpp:1142
SickScanNavReflectorType::opt_size
uint16_t opt_size
Definition: sick_scan_api.h:382
visualization_msgs::MarkerArray
::visualization_msgs::MarkerArray_< std::allocator< void > > MarkerArray
Definition: MarkerArray.h:50
SickScanApiHandle
void * SickScanApiHandle
Definition: sick_scan_api.h:456
sick_scan_xd::NAV350OptPoseData::meanDev
int32_t meanDev
Definition: sick_nav_scandata.h:75
SickScanNavPoseLandmarkMsgType::pose_nav_phi
uint32_t pose_nav_phi
Definition: sick_scan_api.h:409
sick_scan_xd::SickWaitForMessageHandler::removeWaitForMessageHandlerHandler
static void removeWaitForMessageHandlerHandler(SickWaitForMessageHandlerPtr handler)
Definition: sick_generic_callback.h:285
SickScanLdmrsObjectBufferType::capacity
uint64_t capacity
Definition: sick_scan_api.h:304
SickScanNavReflectorType::cartesian_valid
uint16_t cartesian_valid
Definition: sick_scan_api.h:368
sick_scan_xd::addImuListener
void addImuListener(rosNodePtr handle, ImuCallback listener)
Definition: sick_generic_callback.cpp:109
SickScanVisualizationMarkerType::frame_locked
uint8_t frame_locked
Definition: sick_scan_api.h:343
SickScanColorRGBAType::r
float r
Definition: sick_scan_api.h:317
polar_pointcloud_callback
static void polar_pointcloud_callback(rosNodePtr node, const sick_scan_xd::PointCloud2withEcho *msg)
Definition: api_impl.cpp:528
notifyLogMessageListener
void notifyLogMessageListener(int msg_level, const std::string &message)
Definition: api_impl.cpp:1480
SickScanApiDeregisterNavPoseLandmarkMsg
int32_t SickScanApiDeregisterNavPoseLandmarkMsg(SickScanApiHandle apiHandle, SickScanNavPoseLandmarkCallback callback)
Definition: api_impl.cpp:2054
s_scannerName
static std::string s_scannerName
Definition: api_impl.cpp:19
SickScanLFErecFieldMsgType::dist_scale_offset
float dist_scale_offset
Definition: sick_scan_api.h:196
DUMP_API_VISUALIZATIONMARKER_MESSAGE
#define DUMP_API_VISUALIZATIONMARKER_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:97
SickScanApiFreeVisualizationMarkerMsg
int32_t SickScanApiFreeVisualizationMarkerMsg(SickScanApiHandle apiHandle, SickScanVisualizationMarkerMsg *msg)
Definition: api_impl.cpp:1944
SICK_SCAN_API_NOT_INITIALIZED
@ SICK_SCAN_API_NOT_INITIALIZED
Definition: sick_scan_api.h:612
sick_scan_xd::ExitSuccess
@ ExitSuccess
Definition: abstract_parser.h:46
getVersionInfo
std::string getVersionInfo()
Definition: sick_generic_laser.cpp:121
SickScanNavReflectorType::opt_subtype
uint16_t opt_subtype
Definition: sick_scan_api.h:379
SickScanRadarScanType::targets
SickScanPointCloudMsg targets
Definition: sick_scan_api.h:296
sick_scan_xd::addCartesianPointcloudListener
void addCartesianPointcloudListener(rosNodePtr handle, PointCloud2Callback listener)
Definition: sick_generic_callback.cpp:69
sick_scan_xd::NAV350LandmarkData::reflectors
std::vector< NAV350ReflectorData > reflectors
Definition: sick_nav_scandata.h:153
sick_scan_xd::LIDoutputstateMsg
::sick_scan_xd::LIDoutputstateMsg_< std::allocator< void > > LIDoutputstateMsg
Definition: LIDoutputstateMsg.h:110
SickScanLIDoutputstateMsgType::day
uint8_t day
Definition: sick_scan_api.h:227
SickScanNavPoseLandmarkMsgType::pose_yaw
float pose_yaw
Definition: sick_scan_api.h:404
SickScanApiSetVerboseLevel
int32_t SickScanApiSetVerboseLevel(SickScanApiHandle apiHandle, int32_t verbose_level)
Definition: api_impl.cpp:1435
SickScanNavReflectorType::opt_hitcount
uint16_t opt_hitcount
Definition: sick_scan_api.h:383
SickScanRadarObjectType::object_box_center_orientation
SickScanQuaternionMsg object_box_center_orientation
Definition: sick_scan_api.h:277
ROS_DEBUG_STREAM
#define ROS_DEBUG_STREAM(args)
Definition: sick_scan_logging.h:113
sick_scan_xd::NAV350CartesianData::y
int32_t y
Definition: sick_nav_scandata.h:97
sick_scan_xd::isCartesianPointcloudListenerRegistered
bool isCartesianPointcloudListenerRegistered(rosNodePtr handle, PointCloud2Callback listener)
Definition: sick_generic_callback.cpp:84
SickScanLIDoutputstateMsgType::hour
uint8_t hour
Definition: sick_scan_api.h:228
ros::NodeHandle
DUMP_API_LIDOUTPUTSTATE_MESSAGE
#define DUMP_API_LIDOUTPUTSTATE_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:94
sec
uint32_t sec(const rosTime &time)
Definition: sick_ros_wrapper.h:174
SickScanVisualizationMarkerType::ns
char ns[1024]
Definition: sick_scan_api.h:333
sick_scan_xd::NAV350OptReflectorData::globalID
uint16_t globalID
Definition: sick_nav_scandata.h:113
SickScanApiOdomVelocityMsg
int32_t SickScanApiOdomVelocityMsg(SickScanApiHandle apiHandle, SickScanOdomVelocityMsg *msg)
Definition: api_impl.cpp:2133
SickScanNavReflectorType::opt_quality
uint16_t opt_quality
Definition: sick_scan_api.h:380
SickScanHeaderType::timestamp_nsec
uint32_t timestamp_nsec
Definition: sick_scan_api.h:88
sick_scan_xd_api_test.verbose_level
verbose_level
Definition: sick_scan_xd_api_test.py:346
s_callback_handler_diagnostic_messages
static sick_scan_xd::SickCallbackHandler< SickScanApiHandle, SickScanDiagnosticMsg > s_callback_handler_diagnostic_messages
Definition: api_impl.cpp:33
SickScanLFErecFieldMsgType::version_number
uint16_t version_number
Definition: sick_scan_api.h:192
SickScanLFErecMsgType::fields_number
uint16_t fields_number
Definition: sick_scan_api.h:213
SickScanNavReflectorType::pos_valid
uint16_t pos_valid
Definition: sick_scan_api.h:365
SickScanApiWaitNextLdmrsObjectArrayMsg
int32_t SickScanApiWaitNextLdmrsObjectArrayMsg(SickScanApiHandle apiHandle, SickScanLdmrsObjectArray *msg, double timeout_sec)
Definition: api_impl.cpp:1843
SickScanVector3MsgType
Definition: sick_scan_api.h:157
freePointCloudMsg
static void freePointCloudMsg(SickScanPointCloudMsg &export_msg)
Definition: api_impl.cpp:109
freeLIDoutputstateMsg
static void freeLIDoutputstateMsg(SickScanLIDoutputstateMsg &msg)
Definition: api_impl.cpp:220
SickScanImuMsgType::angular_velocity_covariance
double angular_velocity_covariance[9]
Definition: sick_scan_api.h:185
SickScanNavPoseLandmarkMsgType::pose_opt_output_mode
uint8_t pose_opt_output_mode
Definition: sick_scan_api.h:412
SickScanNavReflectorType::opt_startindex
uint16_t opt_startindex
Definition: sick_scan_api.h:385
SickScanVisualizationMarkerType::pose_orientation
SickScanQuaternionMsg pose_orientation
Definition: sick_scan_api.h:338
SickScanApiFreeNavPoseLandmarkMsg
int32_t SickScanApiFreeNavPoseLandmarkMsg(SickScanApiHandle apiHandle, SickScanNavPoseLandmarkMsg *msg)
Definition: api_impl.cpp:2117
SickScanApiDeregisterVisualizationMarkerMsg
int32_t SickScanApiDeregisterVisualizationMarkerMsg(SickScanApiHandle apiHandle, SickScanVisualizationMarkerCallback callback)
Definition: api_impl.cpp:1242
SickScanLIDoutputstateMsgType::second
uint8_t second
Definition: sick_scan_api.h:230
SickScanNavReflectorType
Definition: sick_scan_api.h:363
SickScanVisualizationMarkerBufferType::size
uint64_t size
Definition: sick_scan_api.h:354
SickScanVisualizationMarkerBufferType::buffer
SickScanVisualizationMarker * buffer
Definition: sick_scan_api.h:355
SickScanApiWaitNextNavPoseLandmarkMsg
int32_t SickScanApiWaitNextNavPoseLandmarkMsg(SickScanApiHandle apiHandle, SickScanNavPoseLandmarkMsg *msg, double timeout_sec)
Definition: api_impl.cpp:2078
SickScanNavReflectorType::opt_valid
uint16_t opt_valid
Definition: sick_scan_api.h:374
SickScanVector3MsgType::x
double x
Definition: sick_scan_api.h:159
DUMP_API_IMU_MESSAGE
#define DUMP_API_IMU_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:92
SickScanRadarPreHeaderType::bcontaminationwarning
uint8_t bcontaminationwarning
Definition: sick_scan_api.h:241
SickScanVisualizationMarkerType
Definition: sick_scan_api.h:330
SickScanColorRGBAType
Definition: sick_scan_api.h:315
sick_scan_xd::NAV350ReflectorData::cartesianDataValid
uint16_t cartesianDataValid
Definition: sick_nav_scandata.h:129
SickScanLdmrsObjectArrayType
Definition: sick_scan_api.h:309
SickScanNavReflectorBufferType::capacity
uint64_t capacity
Definition: sick_scan_api.h:393
getVerboseLevel
int32_t getVerboseLevel()
Definition: sick_generic_laser.cpp:329
SickScanPointCloudMsgType::segment_idx
int32_t segment_idx
Definition: sick_scan_api.h:153
sick_scan_xd::isLIDoutputstateListenerRegistered
bool isLIDoutputstateListenerRegistered(rosNodePtr handle, LIDoutputstateCallback listener)
Definition: sick_generic_callback.cpp:144
sick_scan_xd::SickWaitForMessageHandler
Definition: sick_generic_callback.h:242
SickScanLFErecFieldMsgType::time_state
uint16_t time_state
Definition: sick_scan_api.h:200
SickScanRadarObjectArrayType::buffer
SickScanRadarObject * buffer
Definition: sick_scan_api.h:289
DUMP_API_RADARSCAN_MESSAGE
#define DUMP_API_RADARSCAN_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:95
SickScanApiCreate
SickScanApiHandle SickScanApiCreate(int argc, char **argv)
Definition: api_impl.cpp:637
SickScanApiRegisterImuMsg
int32_t SickScanApiRegisterImuMsg(SickScanApiHandle apiHandle, SickScanImuMsgCallback callback)
Definition: api_impl.cpp:968
SickScanApiRegisterDiagnosticMsg
int32_t SickScanApiRegisterDiagnosticMsg(SickScanApiHandle apiHandle, SickScanDiagnosticMsgCallback callback)
Definition: api_impl.cpp:1271
sick_scan_xd::removeCartesianPointcloudListener
void removeCartesianPointcloudListener(rosNodePtr handle, PointCloud2Callback listener)
Definition: sick_generic_callback.cpp:79
sick_scan_xd::NAV350ReflectorData::optReflectorDataValid
uint16_t optReflectorDataValid
Definition: sick_nav_scandata.h:133
SickScanNavPoseLandmarkMsgType::pose_timestamp_nsec
uint32_t pose_timestamp_nsec
Definition: sick_scan_api.h:406
SickScanNavPoseLandmarkMsgType::pose_opt_info_state
uint32_t pose_opt_info_state
Definition: sick_scan_api.h:416
sick_scan_xd::NAV350CartesianData::x
int32_t x
Definition: sick_nav_scandata.h:96
SickScanPointCloudMsgType::width
uint32_t width
Definition: sick_scan_api.h:145
SickScanRadarObjectType::last_seen_nsec
uint32_t last_seen_nsec
Definition: sick_scan_api.h:265
mainGenericLaser
int mainGenericLaser(int argc, char **argv, std::string nodeName, rosNodePtr nhPriv)
Internal Startup routine.
Definition: sick_generic_laser.cpp:873
sick_scan_xd::NAV350PolarData::phi
uint32_t phi
Definition: sick_nav_scandata.h:105
convertLIDoutputstateMsg
static SickScanLIDoutputstateMsg convertLIDoutputstateMsg(const sick_scan_msg::LIDoutputstateMsg &src_msg)
Definition: api_impl.cpp:191
startGenericLaser
bool startGenericLaser(int argc, char **argv, std::string nodeName, rosNodePtr nhPriv, int *exit_code)
Runs mainGenericLaser non-blocking in a new thread.
Definition: sick_generic_laser.cpp:837
SickScanQuaternionMsgType::y
double y
Definition: sick_scan_api.h:167
ROS_VECTOR3D_TO_STREAM
#define ROS_VECTOR3D_TO_STREAM(msg)
Definition: api_impl.cpp:40
SickScanLdmrsObjectArrayType::header
SickScanHeader header
Definition: sick_scan_api.h:311
sick_scan_xd::removeImuListener
void removeImuListener(rosNodePtr handle, ImuCallback listener)
Definition: sick_generic_callback.cpp:119
SickScanNavPoseLandmarkMsgType::pose_opt_valid
uint16_t pose_opt_valid
Definition: sick_scan_api.h:410
SickScanRadarScanCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanRadarScanCallback)(SickScanApiHandle apiHandle, const SickScanRadarScan *msg)
Definition: sick_scan_api.h:461
convertRadarScanMsg
static SickScanRadarScan convertRadarScanMsg(const sick_scan_msg::RadarScan &src_msg)
Definition: api_impl.cpp:225
SickScanApiSendSOPAS
int32_t SickScanApiSendSOPAS(SickScanApiHandle apiHandle, const char *sopas_command, char *sopas_response_buffer, int32_t response_buffer_size)
Definition: api_impl.cpp:1397
freeNavPoseLandmarkMsg
static void freeNavPoseLandmarkMsg(SickScanNavPoseLandmarkMsg &msg)
Definition: api_impl.cpp:2017
SickScanLFErecFieldMsgType::second
uint8_t second
Definition: sick_scan_api.h:206
SickScanNavOdomVelocityMsgType
Definition: sick_scan_api.h:422
lferec_callback
static void lferec_callback(rosNodePtr node, const sick_scan_msg::LFErecMsg *msg)
Definition: api_impl.cpp:550
SickScanApiGetStatus
int32_t SickScanApiGetStatus(SickScanApiHandle apiHandle, int32_t *status_code, char *message_buffer, int32_t message_buffer_size)
Definition: api_impl.cpp:1367
SickScanNavReflectorType::opt_meanecho
uint16_t opt_meanecho
Definition: sick_scan_api.h:384
SickScanRadarPreHeaderType::uinoiselevel
uint32_t uinoiselevel
Definition: sick_scan_api.h:252
SickScanPointFieldMsgType
Definition: sick_scan_api.h:111
sick_scan_xd::NAV350ReflectorData::optReflectorData
NAV350OptReflectorData optReflectorData
Definition: sick_nav_scandata.h:134
SickScanPointCloudMsgType::row_step
uint32_t row_step
Definition: sick_scan_api.h:149
SickScanVisualizationMarkerType::id
int32_t id
Definition: sick_scan_api.h:334
sick_scan_xd::SickWaitForMessageHandler::messageCallback
static void messageCallback(HandleType node, const MsgType *msg)
Definition: sick_generic_callback.h:266
SickScanApiFreeLFErecMsg
int32_t SickScanApiFreeLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsg *msg)
Definition: api_impl.cpp:1720
s_callback_handler_visualizationmarker_messages
static sick_scan_xd::SickCallbackHandler< SickScanApiHandle, SickScanVisualizationMarkerMsg > s_callback_handler_visualizationmarker_messages
Definition: api_impl.cpp:31
SickScanColorRGBAType::a
float a
Definition: sick_scan_api.h:320
SoftwarePLL::IsInitialized
bool IsInitialized() const
Definition: softwarePLL.h:47
SickScanRadarPreHeaderType::udisystemcountscan
uint32_t udisystemcountscan
Definition: sick_scan_api.h:246
SickScanLIDoutputstateMsgType::year
uint16_t year
Definition: sick_scan_api.h:225
SickScanColorRGBAType::g
float g
Definition: sick_scan_api.h:318
SickScanVisualizationMarkerType::header
SickScanHeader header
Definition: sick_scan_api.h:332
sick_scan_xd::NAV350PoseData::optPoseData
NAV350OptPoseData optPoseData
Definition: sick_nav_scandata.h:89
sick_scan_xd::NAV350OptPoseData::outputMode
uint8_t outputMode
Definition: sick_nav_scandata.h:73
SickScanColorRGBAArrayType::buffer
SickScanColorRGBA * buffer
Definition: sick_scan_api.h:327
SickScanHeaderType::frame_id
char frame_id[256]
Definition: sick_scan_api.h:89
sick_scan_xd::isRadarScanListenerRegistered
bool isRadarScanListenerRegistered(rosNodePtr handle, RadarScanCallback listener)
Definition: sick_generic_callback.cpp:204
SickScanImuMsgType::header
SickScanHeader header
Definition: sick_scan_api.h:181
SickScanNavReflectorType::opt_global_id
uint16_t opt_global_id
Definition: sick_scan_api.h:377
SickScanLFErecMsgType
Definition: sick_scan_api.h:210
convertLFErecMsg
static SickScanLFErecMsg convertLFErecMsg(const sick_scan_msg::LFErecMsg &src_msg)
Definition: api_impl.cpp:152
sick_scan_xd::NAV350mNPOSData::landmarkDataValid
uint16_t landmarkDataValid
Definition: sick_nav_scandata.h:209
SickScanPointFieldMsgType::datatype
uint8_t datatype
Definition: sick_scan_api.h:126
SickScanVisualizationMarkerType::colors
SickScanColorRGBAArray colors
Definition: sick_scan_api.h:345
sick_scan_xd::NAV350OptReflectorData::type
uint8_t type
Definition: sick_nav_scandata.h:114
SickScanLdmrsObjectArrayType::objects
SickScanLdmrsObjectBuffer objects
Definition: sick_scan_api.h:312
SickScanLIDoutputstateMsgType::minute
uint8_t minute
Definition: sick_scan_api.h:229
SickScanLFErecFieldMsgType::field_result_mrs
uint8_t field_result_mrs
Definition: sick_scan_api.h:199
SickScanVisualizationMarkerType::mesh_use_embedded_materials
uint8_t mesh_use_embedded_materials
Definition: sick_scan_api.h:348
SickScanLIDoutputstateMsgType::header
SickScanHeader header
Definition: sick_scan_api.h:219
castNodeToApiHandle
static SickScanApiHandle castNodeToApiHandle(rosNodePtr node)
Definition: api_impl.cpp:44
ROS_ERROR_STREAM
#define ROS_ERROR_STREAM(...)
Definition: sick_scan_ros2_example.cpp:72
SickScanRadarScanType::header
SickScanHeader header
Definition: sick_scan_api.h:294
SickScanRadarObjectType::id
int32_t id
Definition: sick_scan_api.h:261
sick_scan_xd::addNavPoseLandmarkListener
void addNavPoseLandmarkListener(rosNodePtr handle, NAV350mNPOSDataCallback listener)
Definition: sick_generic_callback.cpp:229
SickScanPointCloudMsgType::is_bigendian
uint8_t is_bigendian
Definition: sick_scan_api.h:147
sick_scan_xd::NAV350mNPOSData::poseDataValid
uint16_t poseDataValid
Definition: sick_nav_scandata.h:207
SickScanRadarPreHeaderType::uioutputs
uint16_t uioutputs
Definition: sick_scan_api.h:249
sick_scan_xd::RadarScan
::sick_scan_xd::RadarScan_< std::allocator< void > > RadarScan
Definition: RadarScan.h:68
SickScanVisualizationMarkerMsgType
Definition: sick_scan_api.h:358
SickScanRadarObjectType::bounding_box_center_orientation
SickScanQuaternionMsg bounding_box_center_orientation
Definition: sick_scan_api.h:272
sick_scan_xd::NAV350PoseData::phi
uint32_t phi
Definition: sick_nav_scandata.h:87
ROS_QUATERNION_TO_STREAM
#define ROS_QUATERNION_TO_STREAM(msg)
Definition: api_impl.cpp:41
SickScanVisualizationMarkerType::scale
SickScanVector3Msg scale
Definition: sick_scan_api.h:339
SickScanRadarPreHeaderType::uicycleduration
uint32_t uicycleduration
Definition: sick_scan_api.h:251
args
SickScanNavPoseLandmarkMsgType::pose_timestamp_sec
uint32_t pose_timestamp_sec
Definition: sick_scan_api.h:405
SickScanApiNavOdomVelocityImpl
int32_t SickScanApiNavOdomVelocityImpl(SickScanApiHandle apiHandle, SickScanNavOdomVelocityMsg *msg)
Definition: sick_generic_laser.cpp:883
SickScanLIDoutputstateMsgType::output_state
uint8_t output_state[8]
Definition: sick_scan_api.h:222
SickScanLFErecMsgType::fields
SickScanLFErecFieldMsg fields[3]
Definition: sick_scan_api.h:214
sick_scan_xd::NAV350PoseData::x
int32_t x
Definition: sick_nav_scandata.h:85
setVersionInfo
void setVersionInfo(std::string _versionInfo)
Definition: sick_generic_laser.cpp:116
SickScanApiDeregisterLogMsg
int32_t SickScanApiDeregisterLogMsg(SickScanApiHandle apiHandle, SickScanLogMsgCallback callback)
Definition: api_impl.cpp:1343
sick_scan_xd::addPolarPointcloudListener
void addPolarPointcloudListener(rosNodePtr handle, PointCloud2Callback listener)
Definition: sick_generic_callback.cpp:89
SickScanLFErecFieldMsgType::sys_count
uint32_t sys_count
Definition: sick_scan_api.h:194
SickScanPointCloudMsgType::fields
SickScanPointFieldArray fields
Definition: sick_scan_api.h:146
SickScanApiDeregisterLIDoutputstateMsg
int32_t SickScanApiDeregisterLIDoutputstateMsg(SickScanApiHandle apiHandle, SickScanLIDoutputstateMsgCallback callback)
Definition: api_impl.cpp:1092
SickScanLogMsgType
Definition: sick_scan_api.h:440
sick_scan_xd::NAV350OptPoseData::timestamp
uint32_t timestamp
Definition: sick_nav_scandata.h:74
sick_scan_xd::NAV350OptReflectorData::quality
uint16_t quality
Definition: sick_nav_scandata.h:116
rosOk
bool rosOk(void)
Definition: sick_ros_wrapper.h:206
SickScanRadarPreHeaderType::bcontaminationerror
uint8_t bcontaminationerror
Definition: sick_scan_api.h:242
sick_scan_xd::NAV350ReflectorData::cartesianData
NAV350CartesianData cartesianData
Definition: sick_nav_scandata.h:130
SickScanNavPoseLandmarkMsgType
Definition: sick_scan_api.h:398
s_api_caller
static std::map< SickScanApiHandle, std::string > s_api_caller
Definition: api_impl.cpp:20
SickScanLdmrsObjectBufferType::size
uint64_t size
Definition: sick_scan_api.h:305
SickScanApiRegisterCartesianPointCloudMsg
int32_t SickScanApiRegisterCartesianPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:868
SickScanPointCloudMsgType::header
SickScanHeader header
Definition: sick_scan_api.h:143
SickScanRadarScanType::radarpreheader
SickScanRadarPreHeader radarpreheader
Definition: sick_scan_api.h:295
SickScanUint8ArrayType::capacity
uint64_t capacity
Definition: sick_scan_api.h:94
freeVisualizationMarkerMsg
static void freeVisualizationMarkerMsg(SickScanVisualizationMarkerMsg &msg)
Definition: api_impl.cpp:502
SickScanPointFieldArrayType::capacity
uint64_t capacity
Definition: sick_scan_api.h:132
sick_scan_xd::isPolarPointcloudListenerRegistered
bool isPolarPointcloudListenerRegistered(rosNodePtr handle, PointCloud2Callback listener)
Definition: sick_generic_callback.cpp:104
SICK_DIAGNOSTIC_STATUS
SICK_DIAGNOSTIC_STATUS
Definition: sick_scan_logging.h:71
SickScanApiFreeLdmrsObjectArrayMsg
int32_t SickScanApiFreeLdmrsObjectArrayMsg(SickScanApiHandle apiHandle, SickScanLdmrsObjectArray *msg)
Definition: api_impl.cpp:1888
castApiHandleToNode
static rosNodePtr castApiHandleToNode(SickScanApiHandle apiHandle)
Definition: api_impl.cpp:49
SickScanLIDoutputstateMsgType::time_state
uint16_t time_state
Definition: sick_scan_api.h:224
SickScanLIDoutputstateMsgType
Definition: sick_scan_api.h:217
ros::init_options::NoSigintHandler
NoSigintHandler
setVerboseLevel
void setVerboseLevel(int32_t verbose_level)
Definition: sick_generic_laser.cpp:323
sick_scan_xd::isLFErecListenerRegistered
bool isLFErecListenerRegistered(rosNodePtr handle, LFErecCallback listener)
Definition: sick_generic_callback.cpp:164
SickScanRadarObjectType::object_box_center_covariance
double object_box_center_covariance[36]
Definition: sick_scan_api.h:278
SickScanImuMsgType
Definition: sick_scan_api.h:179
SickScanApiWaitNextLIDoutputstateMsg
int32_t SickScanApiWaitNextLIDoutputstateMsg(SickScanApiHandle apiHandle, SickScanLIDoutputstateMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1731
SickScanApiFreeLIDoutputstateMsg
int32_t SickScanApiFreeLIDoutputstateMsg(SickScanApiHandle apiHandle, SickScanLIDoutputstateMsg *msg)
Definition: api_impl.cpp:1776
SickScanPointCloudMsgType::num_echos
int32_t num_echos
Definition: sick_scan_api.h:152
sick_scan_xd::NAV350PoseData::y
int32_t y
Definition: sick_nav_scandata.h:86
SickScanNavReflectorType::opt_local_id
uint16_t opt_local_id
Definition: sick_scan_api.h:376
rosSignalHandler
void rosSignalHandler(int signalRecv)
Definition: sick_generic_laser.cpp:211
sick_scan_xd::convertNAVCartPos3DtoROSPos3D
void convertNAVCartPos3DtoROSPos3D(int32_t nav_posx_mm, int32_t nav_posy_mm, uint32_t nav_phi_mdeg, float &ros_posx_m, float &ros_posy_m, float &ros_yaw_rad, double nav_angle_offset)
Definition: sick_nav_scandata_parser.cpp:792
SickScanLFErecFieldMsgType::angle_scale_factor
uint32_t angle_scale_factor
Definition: sick_scan_api.h:197
sick_scan_xd::isVisualizationMarkerListenerRegistered
bool isVisualizationMarkerListenerRegistered(rosNodePtr handle, VisualizationMarkerCallback listener)
Definition: sick_generic_callback.cpp:224
SickScanPointFieldMsgType::count
uint32_t count
Definition: sick_scan_api.h:127
SickScanApiWaitNextImuMsg
int32_t SickScanApiWaitNextImuMsg(SickScanApiHandle apiHandle, SickScanImuMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1619
SickScanNavPoseLandmarkMsgType::pose_y
float pose_y
Definition: sick_scan_api.h:403
sick_scan_xd::convertNAVCartPos2DtoROSPos2D
void convertNAVCartPos2DtoROSPos2D(int32_t nav_posx_mm, int32_t nav_posy_mm, float &ros_posx_m, float &ros_posy_m, double nav_angle_offset)
Definition: sick_nav_scandata_parser.cpp:784
DUMP_API_LFEREC_MESSAGE
#define DUMP_API_LFEREC_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:93
sick_scan_xd::NAV350mNPOSData::poseData
NAV350PoseData poseData
Definition: sick_nav_scandata.h:208
ros::NodeHandle
SickScanRadarPreHeaderType::iencoderspeed
int16_t iencoderspeed[3]
Definition: sick_scan_api.h:256
SickScanLogMsgCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanLogMsgCallback)(SickScanApiHandle apiHandle, const SickScanLogMsg *msg)
Definition: sick_scan_api.h:465
SickScanPointFieldMsgType::name
char name[256]
Definition: sick_scan_api.h:124
SickScanApiWaitNextRadarScanMsg
int32_t SickScanApiWaitNextRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScan *msg, double timeout_sec)
Definition: api_impl.cpp:1787
SickScanApiOdomVelocityImpl
int32_t SickScanApiOdomVelocityImpl(SickScanApiHandle apiHandle, SickScanOdomVelocityMsg *src_msg)
Definition: sick_generic_laser.cpp:898
s_callback_handler_log_messages
static sick_scan_xd::SickCallbackHandler< SickScanApiHandle, SickScanLogMsg > s_callback_handler_log_messages
Definition: api_impl.cpp:34
DUMP_API_LDMRSOBJECTARRAY_MESSAGE
#define DUMP_API_LDMRSOBJECTARRAY_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:96
SickScanPointCloudMsgType::point_step
uint32_t point_step
Definition: sick_scan_api.h:148
SickScanApiGetVerboseLevel
int32_t SickScanApiGetVerboseLevel(SickScanApiHandle apiHandle)
Definition: api_impl.cpp:1459
callback
void callback(const sick_scan_xd::RadarScan::ConstPtr &oa)
Definition: radar_object_marker.cpp:157
SickScanApiInitByLaunchfile
int32_t SickScanApiInitByLaunchfile(SickScanApiHandle apiHandle, const char *launchfile_args)
Definition: api_impl.cpp:710
sick_scan_xd::addLdmrsObjectArrayListener
void addLdmrsObjectArrayListener(rosNodePtr handle, SickLdmrsObjectArrayCallback listener)
Definition: sick_generic_callback.cpp:169
sick_scan_xd::PointCloud2withEcho::pointcloud
ros_sensor_msgs::PointCloud2 pointcloud
Definition: sick_generic_callback.h:84
SickScanNavReflectorType::polar_dist
uint32_t polar_dist
Definition: sick_scan_api.h:372
SickScanRadarObjectType::object_box_center_position
SickScanVector3Msg object_box_center_position
Definition: sick_scan_api.h:276


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