sick_scan_xd_api_test.cpp
Go to the documentation of this file.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sstream>
4 #include <string>
5 #include <thread>
6 #include <vector>
7 #ifdef _MSC_VER
8 #include <conio.h>
9 #else
10 // #include <ncurses.h>
11 #endif
12 
13 #include "sick_scan_api.h"
14 #include "sick_scan_api_dump.h"
16 
17 #if __ROS_VERSION == 1
18 std::string ros_api_cloud_topic = "api_cloud";
19 std::string ros_api_cloud_polar_topic = "api_cloud_polar";
20 std::string ros_api_visualizationmarker_topic = "marker";
21 ros::Publisher ros_api_cloud_publisher;
22 ros::Publisher ros_api_cloud_polar_publisher;
23 ros::Publisher ros_api_visualizationmarker_publisher;
24 #else
25 #include <stdio.h>
26 #include <algorithm>
27 #include <cassert>
28 #include <cstring>
29 #include "toojpeg.h"
30 static FILE *foutJpg = 0;
31 #endif
32 
33 #if __ROS_VERSION != 1
34 // jpeg callback, just writes one byte
35 void jpegOutputCallback(unsigned char oneByte)
36 {
37  assert(foutJpg != 0);
38  fwrite(&oneByte, 1, 1, foutJpg);
39 }
40 // Simple plot function for pointcloud data, just demonstrates how to use a SickScanPointCloudMsg
41 static void plotPointcloudToJpeg(const std::string& jpegfilepath, const SickScanPointCloudMsg& msg)
42 {
43  // Get offsets for x, y, z, intensity values
44  SickScanPointFieldMsg* msg_fields_buffer = (SickScanPointFieldMsg*)msg.fields.buffer;
45  int field_offset_x = -1, field_offset_y = -1, field_offset_z = -1, field_offset_intensity = -1;
46  for(int n = 0; n < msg.fields.size; n++)
47  {
48  if (strcmp(msg_fields_buffer[n].name, "x") == 0 && msg_fields_buffer[n].datatype == SICK_SCAN_POINTFIELD_DATATYPE_FLOAT32)
49  field_offset_x = msg_fields_buffer[n].offset;
50  else if (strcmp(msg_fields_buffer[n].name, "y") == 0 && msg_fields_buffer[n].datatype == SICK_SCAN_POINTFIELD_DATATYPE_FLOAT32)
51  field_offset_y = msg_fields_buffer[n].offset;
52  else if (strcmp(msg_fields_buffer[n].name, "z") == 0 && msg_fields_buffer[n].datatype == SICK_SCAN_POINTFIELD_DATATYPE_FLOAT32)
53  field_offset_z = msg_fields_buffer[n].offset;
54  else if (strcmp(msg_fields_buffer[n].name, "intensity") == 0 && msg_fields_buffer[n].datatype == SICK_SCAN_POINTFIELD_DATATYPE_FLOAT32)
55  field_offset_intensity = msg_fields_buffer[n].offset;
56  }
57  assert(field_offset_x >= 0 && field_offset_y >= 0 && field_offset_z >= 0);
58  // Create an image with 250 pixel/meter, max. +/-2 meter
59  int img_width = 250 * 4, img_height = 250 * 4;
60  uint8_t* img_pixel = (uint8_t*)calloc(3 * img_width * img_height, sizeof(uint8_t)); // allocate 3 byte RGB array
61  // Plot all points in pointcloud
62  for (int row_idx = 0; row_idx < (int)msg.height; row_idx++)
63  {
64  for (int col_idx = 0; col_idx < (int)msg.width; col_idx++)
65  {
66  // Get cartesian point coordinates
67  int polar_point_offset = row_idx * msg.row_step + col_idx * msg.point_step;
68  float point_x = *((float*)(msg.data.buffer + polar_point_offset + field_offset_x));
69  float point_y = *((float*)(msg.data.buffer + polar_point_offset + field_offset_y));
70  float point_z = *((float*)(msg.data.buffer + polar_point_offset + field_offset_z));
71  float point_intensity = 0;
72  if (field_offset_intensity >= 0)
73  point_intensity = *((float*)(msg.data.buffer + polar_point_offset + field_offset_intensity));
74  // Convert point coordinates in meter to image coordinates in pixel
75  int img_x = (int)(250.0f * (-point_y + 2.0f)); // img_x := -pointcloud.y
76  int img_y = (int)(250.0f * (-point_x + 2.0f)); // img_y := -pointcloud.x
77  if (img_x >= 0 && img_x < img_width && img_y >= 0 && img_y < img_height) // point within the image area
78  {
79  img_pixel[3 * img_y * img_width + 3 * img_x + 0] = 255; // R
80  img_pixel[3 * img_y * img_width + 3 * img_x + 1] = 255; // G
81  img_pixel[3 * img_y * img_width + 3 * img_x + 2] = 255; // B
82  }
83  }
84  }
85  // Write image to jpeg-file
86  std::string jpeg_filename = jpegfilepath;
87 #ifdef _MSC_VER
88  std::replace(jpeg_filename.begin(), jpeg_filename.end(), '/', '\\');
89 #else
90  std::replace(jpeg_filename.begin(), jpeg_filename.end(), '\\', '/');
91 #endif
92  std::string jpeg_filename_tmp = jpeg_filename + "_tmp";
93  foutJpg = fopen(jpeg_filename_tmp.c_str(), "wb");
94  if (foutJpg)
95  {
96  TooJpeg::writeJpeg(jpegOutputCallback, img_pixel, img_width, img_height, true, 99);
97  fclose(foutJpg);
98 #ifdef _MSC_VER
99  _unlink(jpegfilepath.c_str());
100  rename(jpeg_filename_tmp.c_str(), jpegfilepath.c_str());
101 #else
102  rename(jpeg_filename_tmp.c_str(), jpegfilepath.c_str());
103 #endif
104  }
105  free(img_pixel);
106 }
107 #endif
108 
109 // Exit with error message
110 static void exitOnError(const char* msg, int32_t error_code)
111 {
112  printf("## ERROR sick_scan_xd_api_test: %s, error code %d\n", msg, error_code);
113  exit(EXIT_FAILURE);
114 }
115 
116 // Example callback for cartesian pointcloud messages, converts and publishes a SickScanPointCloudMsg to sensor_msgs::PointCloud2 on ROS-1
118 {
119  printf("[Info]: apiTestCartesianPointCloudMsgCallback(apiHandle:%p): %dx%d pointcloud callback...\n", apiHandle, msg->width, msg->height);
120 #if __ROS_VERSION == 1
122  ros_api_cloud_publisher.publish(pointcloud);
123  ROS_INFO_STREAM("apiTestCartesianPointCloudMsgCallback(apiHandle:" << apiHandle << "): published " << pointcloud.width << "x" << pointcloud.height << " pointcloud on topic \"" << ros_api_cloud_topic << "\"");
124  DUMP_API_POINTCLOUD_MESSAGE("test", pointcloud);
125 #else
126  plotPointcloudToJpeg("/tmp/sick_scan_api_demo.jpg", *msg);
127 #endif
128 }
129 
130 // Example callback for polar pointcloud messages, converts and publishes a SickScanPointCloudMsg to sensor_msgs::PointCloud2 on ROS-1
132 {
133  printf("[Info]: apiTestPolarPointCloudMsgCallback(apiHandle:%p): %dx%d pointcloud callback...\n", apiHandle, msg->width, msg->height);
134 #if __ROS_VERSION == 1
135  sensor_msgs::PointCloud2 pointcloud = SickScanApiConverter::convertPolarPointCloudMsg(*msg);
136  ros_api_cloud_polar_publisher.publish(pointcloud);
137  ROS_INFO_STREAM("apiTestPolarPointCloudMsgCallback(apiHandle:" << apiHandle << "): published " << pointcloud.width << "x" << pointcloud.height << " pointcloud on topic \"" << ros_api_cloud_polar_topic << "\"");
138 #endif
139 }
140 
141 // Example callback for imu messages
142 static void apiTestImuMsgCallback(SickScanApiHandle apiHandle, const SickScanImuMsg* msg)
143 {
144  printf("[Info]: apiTestImuMsgCallback(apiHandle:%p): Imu message, orientation=(%.6f,%.6f,%.6f,%.6f), angular_velocity=(%.6f,%.6f,%.6f), linear_acceleration=(%.6f,%.6f,%.6f)\n",
145  apiHandle, msg->orientation.x, msg->orientation.y, msg->orientation.z, msg->orientation.w,
146  msg->angular_velocity.x, msg->angular_velocity.y, msg->angular_velocity.y,
147  msg->linear_acceleration.x, msg->linear_acceleration.y, msg->linear_acceleration.z);
148 #if __ROS_VERSION == 1
150  DUMP_API_IMU_MESSAGE("test", ros_msg);
151 #endif
152 }
153 
154 // Example callback for lferec messages
156 {
157  printf("[Info]: apiTestLFErecMsgCallback(apiHandle:%p): LFErec message, %d fields\n", apiHandle, (int)msg->fields_number);
158 #if __ROS_VERSION == 1
160  DUMP_API_LFEREC_MESSAGE("test", ros_msg);
161 #endif
162 }
163 
164 // Example callback for LIDoutputstate messages
166 {
167  printf("[Info]: apiTestLIDoutputstateMsgCallback(apiHandle:%p): LIDoutputstate message, state=(%d,%d,%d,%d,%d,%d,%d,%d), count=(%d,%d,%d,%d,%d,%d,%d,%d)\n", apiHandle,
168  (int)msg->output_state[0], (int)msg->output_state[1], (int)msg->output_state[2], (int)msg->output_state[3], (int)msg->output_state[4], (int)msg->output_state[5], (int)msg->output_state[6], (int)msg->output_state[7],
169  (int)msg->output_state[0], (int)msg->output_count[1], (int)msg->output_count[2], (int)msg->output_count[3], (int)msg->output_count[4], (int)msg->output_count[5], (int)msg->output_count[6], (int)msg->output_count[7]);
170 #if __ROS_VERSION == 1
172  DUMP_API_LIDOUTPUTSTATE_MESSAGE("test", ros_msg);
173 #endif
174 }
175 
176 // Example callback for RadarScan messages
178 {
179  printf("[Info]: apiTestRadarScanMsgCallback(apiHandle:%p): RadarScan message, %d targets, %d objects\n", apiHandle, (int)(msg->targets.width * msg->targets.height), (int)msg->objects.size);
180 #if __ROS_VERSION == 1
182  if (ros_msg.targets.width * ros_msg.targets.height > 0)
183  ros_api_cloud_publisher.publish(ros_msg.targets);
184  sensor_msgs::PointCloud2 ros_pointcloud = SickScanApiConverter::convertRadarObjectsToPointCloud(msg->header, &ros_msg.objects[0], ros_msg.objects.size());
185  if (ros_pointcloud.width * ros_pointcloud.height > 0)
186  ros_api_cloud_polar_publisher.publish(ros_pointcloud);
187  DUMP_API_RADARSCAN_MESSAGE("test", ros_msg);
188 #endif
189 }
190 
191 // Example callback for LdmrsObjectArray messages
193 {
194  printf("[Info]: apiTestLdmrsObjectArrayCallback(apiHandle:%p): LdmrsObjectArray message, %d objects\n", apiHandle, (int)msg->objects.size);
195 #if __ROS_VERSION == 1
196  sick_scan_xd::SickLdmrsObjectArray ros_msg = SickScanApiConverter::convertLdmrsObjectArray(*msg);
197  DUMP_API_LDMRSOBJECTARRAY_MESSAGE("test", ros_msg);
198 #endif
199 }
200 
201 // Example callback for VisualizationMarker messages
203 {
204  printf("[Info]: apiTestVisualizationMarkerMsgCallback(apiHandle:%p): VisualizationMarker message, %d objects\n", apiHandle, (int)msg->markers.size);
205 #if __ROS_VERSION == 1
207  DUMP_API_VISUALIZATIONMARKER_MESSAGE("test", ros_msg);
208  if (ros_msg.markers.size() > 0)
209  ros_api_visualizationmarker_publisher.publish(ros_msg);
210 #endif
211 }
212 
213 // Example callback for NAV350 Pose- and Landmark messages
215 {
216  printf("[Info]: apiTestNavPoseLandmarkMsgCallback(apiHandle:%p): pose_x=%f, pose_y=%f, yaw=%f, %d reflectors\n", apiHandle, msg->pose_x, msg->pose_y, msg->pose_yaw, (int)msg->reflectors.size);
217 }
218 
219 // Example callback for diagnostic messages
221 {
222  if (msg->status_code == 1) // status_code defined in SICK_DIAGNOSTIC_STATUS: WARN=1
223  printf("[WARN]: apiTestDiagnosticMsgCallback(apiHandle:%p): status_code = %d (WARNING), status_message = \"%s\"\n", apiHandle, msg->status_code, msg->status_message);
224  else if (msg->status_code == 2) // status_code defined in SICK_DIAGNOSTIC_STATUS: ERROR=2
225  printf("[ERROR]: apiTestDiagnosticMsgCallback(apiHandle:%p): status_code = %d (ERROR), status_message = \"%s\"\n", apiHandle, msg->status_code, msg->status_message);
226  else
227  printf("[Info]: apiTestDiagnosticMsgCallback(apiHandle:%p): status_code = %d, status_message = \"%s\"\n", apiHandle, msg->status_code, msg->status_message);
228  int32_t status_code = -1;
229  char message_buffer[1024] = "";
230  if (SickScanApiGetStatus(apiHandle, &status_code, message_buffer, (int32_t)sizeof(message_buffer)) == SICK_SCAN_API_SUCCESS)
231  {
232  printf("[Info]: SickScanApiGetStatus(apiHandle:%p): status_code = %d, message = \"%s\"\n", apiHandle, status_code, message_buffer);
233  }
234  else
235  {
236  printf("[ERROR]: SickScanApiGetStatus(apiHandle:%p) failed\n", apiHandle);
237  }
238 }
239 
240 // Example callback for diagnostic messages
241 static void apiTestLogMsgCallback(SickScanApiHandle apiHandle, const SickScanLogMsg* msg)
242 {
243  if (msg->log_level == 2) // log_level defined in ros::console::levels: Warn=2
244  printf("[WARN]: apiTestLogMsgCallback(apiHandle:%p): log_level = %d (WARNING), log_message = %s\n", apiHandle, msg->log_level, msg->log_message);
245  else if (msg->log_level >= 3) // log_level defined in ros::console::levels: Error=3, Fatal=4
246  printf("[ERROR]: apiTestLogMsgCallback(apiHandle:%p): log_level = %d (ERROR), log_message = %s\n", apiHandle, msg->log_level, msg->log_message);
247  else if (false) // debugging
248  printf("[Info]: apiTestLogMsgCallback(apiHandle:%p): log_level = %d, log_message = %s\n", apiHandle, msg->log_level, msg->log_message);
249 }
250 
251 // Receive lidar message by SickScanApiWaitNext-functions ("message polling")
252 static void runSickScanApiTestWaitNext(SickScanApiHandle* apiHandle, bool* run_flag)
253 {
254  double wait_next_message_timeout = 0.1; // wait max. 0.1 seconds for the next message (otherwise SickScanApiWaitNext-function return with timeout)
255  SickScanPointCloudMsg pointcloud_msg;
256  SickScanImuMsg imu_msg;
257  SickScanLFErecMsg lferec_msg;
258  SickScanLIDoutputstateMsg lidoutputstate_msg;
259  SickScanRadarScan radarscan_msg;
260  SickScanLdmrsObjectArray ldmrsobjectarray_msg;
261  SickScanVisualizationMarkerMsg visualizationmarker_msg;
262  SickScanNavPoseLandmarkMsg navposelandmark_msg;
263  SickScanOdomVelocityMsg odom_msg;
264  odom_msg.vel_x = +1.0f;
265  odom_msg.vel_y = -1.0f;
266  odom_msg.omega = 0.5f;
267  odom_msg.timestamp_sec = 12345;
268  odom_msg.timestamp_nsec = 6789;
269  SickScanNavOdomVelocityMsg navodom_msg;
270  navodom_msg.vel_x = +1.0f;
271  navodom_msg.vel_y = -1.0f;
272  navodom_msg.omega = 0.5f;
273  navodom_msg.timestamp = 123456789;
274  navodom_msg.coordbase = 0;
275  while(run_flag && *run_flag)
276  {
277  // Get/poll the next cartesian PointCloud message
278  int32_t ret = SickScanApiWaitNextCartesianPointCloudMsg(*apiHandle, &pointcloud_msg, wait_next_message_timeout);
279  if (ret == SICK_SCAN_API_SUCCESS)
280  apiTestCartesianPointCloudMsgCallback(*apiHandle, &pointcloud_msg);
281  else if (ret != SICK_SCAN_API_SUCCESS && ret != SICK_SCAN_API_TIMEOUT)
282  printf("## ERROR sick_scan_xd_api_test: SickScanApiWaitNextCartesianPointCloudMsg failed\n");
283  SickScanApiFreePointCloudMsg(*apiHandle, &pointcloud_msg);
284 
285  // Get/poll the next polar PointCloud message
286  ret = SickScanApiWaitNextPolarPointCloudMsg(*apiHandle, &pointcloud_msg, wait_next_message_timeout);
287  if (ret == SICK_SCAN_API_SUCCESS)
288  apiTestPolarPointCloudMsgCallback(*apiHandle, &pointcloud_msg);
289  else if (ret != SICK_SCAN_API_SUCCESS && ret != SICK_SCAN_API_TIMEOUT)
290  printf("## ERROR sick_scan_xd_api_test: SickScanApiWaitNextPolarPointCloudMsg failed\n");
291  SickScanApiFreePointCloudMsg(*apiHandle, &pointcloud_msg);
292 
293  // Get/poll the next Imu message
294  ret = SickScanApiWaitNextImuMsg(*apiHandle, &imu_msg, wait_next_message_timeout);
295  if (ret == SICK_SCAN_API_SUCCESS)
296  apiTestImuMsgCallback(*apiHandle, &imu_msg);
297  else if (ret != SICK_SCAN_API_SUCCESS && ret != SICK_SCAN_API_TIMEOUT)
298  printf("## ERROR sick_scan_xd_api_test: SickScanApiWaitNextImuMsg failed\n");
299  SickScanApiFreeImuMsg(*apiHandle, &imu_msg);
300 
301  // Get/poll the next LFErec message
302  ret = SickScanApiWaitNextLFErecMsg(*apiHandle, &lferec_msg, wait_next_message_timeout);
303  if (ret == SICK_SCAN_API_SUCCESS)
304  apiTestLFErecMsgCallback(*apiHandle, &lferec_msg);
305  else if (ret != SICK_SCAN_API_SUCCESS && ret != SICK_SCAN_API_TIMEOUT)
306  printf("## ERROR sick_scan_xd_api_test: SickScanApiWaitNextLFErecMsg failed\n");
307  SickScanApiFreeLFErecMsg(*apiHandle, &lferec_msg);
308 
309  // Get/poll the next LIDoutputstate message
310  ret = SickScanApiWaitNextLIDoutputstateMsg(*apiHandle, &lidoutputstate_msg, wait_next_message_timeout);
311  if (ret == SICK_SCAN_API_SUCCESS)
312  apiTestLIDoutputstateMsgCallback(*apiHandle, &lidoutputstate_msg);
313  else if (ret != SICK_SCAN_API_SUCCESS && ret != SICK_SCAN_API_TIMEOUT)
314  printf("## ERROR sick_scan_xd_api_test: SickScanApiWaitNextLIDoutputstateMsg failed\n");
315  SickScanApiFreeLIDoutputstateMsg(*apiHandle, &lidoutputstate_msg);
316 
317  // Get/poll the next RadarScan message
318  ret = SickScanApiWaitNextRadarScanMsg(*apiHandle, &radarscan_msg, wait_next_message_timeout);
319  if (ret == SICK_SCAN_API_SUCCESS)
320  apiTestRadarScanMsgCallback(*apiHandle, &radarscan_msg);
321  else if (ret != SICK_SCAN_API_SUCCESS && ret != SICK_SCAN_API_TIMEOUT)
322  printf("## ERROR sick_scan_xd_api_test: SickScanApiWaitNextRadarScanMsg failed\n");
323  SickScanApiFreeRadarScanMsg(*apiHandle, &radarscan_msg);
324 
325  // Get/poll the next LdmrsObjectArray message
326  ret = SickScanApiWaitNextLdmrsObjectArrayMsg(*apiHandle, &ldmrsobjectarray_msg, wait_next_message_timeout);
327  if (ret == SICK_SCAN_API_SUCCESS)
328  apiTestLdmrsObjectArrayCallback(*apiHandle, &ldmrsobjectarray_msg);
329  else if (ret != SICK_SCAN_API_SUCCESS && ret != SICK_SCAN_API_TIMEOUT)
330  printf("## ERROR sick_scan_xd_api_test: SickScanApiWaitNextLdmrsObjectArrayMsg failed\n");
331  SickScanApiFreeLdmrsObjectArrayMsg(*apiHandle, &ldmrsobjectarray_msg);
332 
333  // Get/poll the next VisualizationMarker message
334  ret = SickScanApiWaitNextVisualizationMarkerMsg(*apiHandle, &visualizationmarker_msg, wait_next_message_timeout);
335  if (ret == SICK_SCAN_API_SUCCESS)
336  apiTestVisualizationMarkerMsgCallback(*apiHandle, &visualizationmarker_msg);
337  else if (ret != SICK_SCAN_API_SUCCESS && ret != SICK_SCAN_API_TIMEOUT)
338  printf("## ERROR sick_scan_xd_api_test: SickScanApiWaitNextVisualizationMarkerMsg failed\n");
339  SickScanApiFreeVisualizationMarkerMsg(*apiHandle, &visualizationmarker_msg);
340 
341  // Get/poll the next NAV350 Pose- and Landmark message
342  ret = SickScanApiWaitNextNavPoseLandmarkMsg(*apiHandle, &navposelandmark_msg, wait_next_message_timeout);
343  if (ret == SICK_SCAN_API_SUCCESS)
344  apiTestNavPoseLandmarkMsgCallback(*apiHandle, &navposelandmark_msg);
345  else if (ret != SICK_SCAN_API_SUCCESS && ret != SICK_SCAN_API_TIMEOUT)
346  printf("## ERROR sick_scan_xd_api_test: SickScanApiWaitNextNavPoseLandmarkMsg failed\n");
347  SickScanApiFreeNavPoseLandmarkMsg(*apiHandle, &navposelandmark_msg);
348 
349  // Send NAV350 odom message example
350  // ret = SickScanApiNavOdomVelocityMsg(*apiHandle, &navodom_msg);
351  // ret = SickScanApiOdomVelocityMsg(*apiHandle, &odom_msg);
352  }
353 }
354 
355 // sick_scan_api_test main: Initialize, receive and process lidar messages via sick_scan_xd API.
356 int sick_scan_api_test_main(int argc, char** argv, const std::string& sick_scan_args, bool polling)
357 {
358  int32_t ret = SICK_SCAN_API_SUCCESS;
359  SickScanApiHandle apiHandle = 0;
360 
361  if ((apiHandle = SickScanApiCreate(argc, argv)) == 0)
362  exitOnError("SickScanApiCreate failed", -1);
363 
364  // Initialize a lidar and starts message receiving and processing
365 #if __ROS_VERSION == 1
366  if ((ret = SickScanApiInitByLaunchfile(apiHandle, sick_scan_args.c_str())) != SICK_SCAN_API_SUCCESS)
367  exitOnError("SickScanApiInitByLaunchfile failed", ret);
368 #else
369  if ((ret = SickScanApiInitByCli(apiHandle, argc, argv)) != SICK_SCAN_API_SUCCESS)
370  exitOnError("SickScanApiInitByCli failed", ret);
371 #endif
372 
373  bool run_polling = polling;
374  std::thread* run_polling_thread = 0;
375  if (polling) // Receive lidar message by SickScanApiWaitNext-functions running in a background thread ("message polling")
376  {
377  run_polling_thread = new std::thread(runSickScanApiTestWaitNext, &apiHandle, &run_polling);
378  }
379  else
380  {
381  // Register a callback for PointCloud messages
383  exitOnError("SickScanApiRegisterCartesianPointCloudMsg failed", ret);
385  exitOnError("SickScanApiRegisterCartesianPointCloudMsg failed", ret);
386 
387  // Register a callback for Imu messages
389  exitOnError("SickScanApiRegisterImuMsg failed", ret);
390 
391  // Register a callback for LFErec messages
393  exitOnError("SickScanApiRegisterLFErecMsg failed", ret);
394 
395  // Register a callback for LIDoutputstate messages
397  exitOnError("SickScanApiRegisterLIDoutputstateMsg failed", ret);
398 
399  // Register a callback for RadarScan messages
401  exitOnError("SickScanApiRegisterRadarScanMsg failed", ret);
402 
403  // Register a callback for LdmrsObjectArray messages
405  exitOnError("SickScanApiRegisterLdmrsObjectArrayMsg failed", ret);
406 
407  // Register a callback for VisualizationMarker messages
409  exitOnError("SickScanApiRegisterVisualizationMarkerMsg failed", ret);
410 
411  // Register a callback for NAV350 Pose- and Landmark messages messages
413  exitOnError("SickScanApiRegisterVisualizationSickScanApiRegisterNavPoseLandmarkMsgMarkerMsg failed", ret);
414 
415  // Register a callback for diagnostic messages (notification in case of changed status, e.g. after errors)
417  exitOnError("SickScanApiRegisterDiagnosticMsg failed", ret);
418 
419  // Register a callback for log messages (all informational and error messages)
421  exitOnError("SickScanApiRegisterLogMsg failed", ret);
422 
423  }
424 
425  // Run main loop
426  int user_key = 0;
427  char sopas_response_buffer[1024] = { 0 };
428  while (true)
429  {
430 #if __ROS_VERSION == 1
431  ros::spin();
432 #elif __ROS_VERSION == 0 && defined _MSC_VER
433  while (_kbhit() == 0)
434  {
435  std::this_thread::sleep_for(std::chrono::seconds(1));
436  printf("sick_scan_xd_api_test running. Press ENTER to exit or r for re-initialization\n");
437  }
438  user_key = _getch();
439 #else
440  user_key = getchar();
441  getchar();
442 #endif
443  printf("sick_scan_xd_api_test: user_key = '%c' (%d)\n", (char)user_key, user_key);
444  const char* sopas_request = 0;
445  if (user_key == 's' || user_key == 'S') // Send sopas command "sRN SCdevicestate", sopas response: "sRA SCdevicestate \x01"
446  sopas_request = "sRN SCdevicestate";
447  // else if (user_key == 'c' || user_key == 'C') // Send sopas command "sRN ContaminationResult" supported by MRS-1000, LMS-1000, multiScan, sopas response: "sRA ContaminationResult \x00\x00"
448  // sopas_request = "sRN ContaminationResult";
449  if (sopas_request) // Send sopas command and continue
450  {
451  if (SickScanApiSendSOPAS(apiHandle, sopas_request, &sopas_response_buffer[0], (int32_t)sizeof(sopas_response_buffer)) != SICK_SCAN_API_SUCCESS)
452  printf("## WARNING sick_scan_xd_api_test: SickScanApiSendSOPAS(\"%s\") failed\n", sopas_request);
453  else
454  printf("sick_scan_xd_api_test: SickScanApiSendSOPAS(\"%s\") succeeded: response = \"%s\"\n\n", sopas_request, sopas_response_buffer);
455  }
456  else
457  {
458  break;
459  }
460  }
461 
462  // Cleanup and exit
463  printf("sick_scan_xd_api_test finishing...\n");
464  if (polling)
465  {
466  run_polling = false;
467  if ((ret = SickScanApiClose(apiHandle)) != SICK_SCAN_API_SUCCESS)
468  exitOnError("SickScanApiClose failed", ret);
469  if (run_polling_thread->joinable())
470  run_polling_thread->join();
471  delete run_polling_thread;
472  run_polling_thread = 0;
473  }
474  else
475  {
485  if ((ret = SickScanApiClose(apiHandle)) != SICK_SCAN_API_SUCCESS)
486  exitOnError("SickScanApiClose failed", ret);
487  }
488  if ((ret = SickScanApiRelease(apiHandle)) != SICK_SCAN_API_SUCCESS)
489  exitOnError("SickScanApiRelease failed", ret);
490  if (!polling)
491  {
494  }
495 
496  return user_key;
497 }
498 
499 // sick_scan_api_test main: Initialize, receive and process lidar messages via sick_scan_xd API.
500 int main(int argc, char** argv)
501 {
502  int32_t ret = SICK_SCAN_API_SUCCESS;
503  std::string sick_scan_args;
504  bool polling = false;
505 
506 #if __ROS_VERSION == 1
507  sick_scan_args = "./src/sick_scan_xd/launch/sick_tim_7xx.launch"; // example launch file
508  for (int n = 0; n < argc; n++)
509  {
510  printf("%s%s", (n > 0 ? " " : ""), argv[n]);
511  if (strncmp(argv[n], "_sick_scan_args:=", 17) == 0)
512  sick_scan_args = argv[n] + 17;
513  if (strncmp(argv[n], "_polling:=", 10) == 0 && atoi(argv[n] + 10) > 0)
514  polling = true;
515  }
516  ros::init(argc, argv, "sick_scan_xd_api_test");
517  ros::NodeHandle nh("~");
518  ros_api_cloud_publisher = nh.advertise<sensor_msgs::PointCloud2>(ros_api_cloud_topic, 10);
519  ros_api_cloud_polar_publisher = nh.advertise<sensor_msgs::PointCloud2>(ros_api_cloud_polar_topic, 10);
520  ros_api_visualizationmarker_publisher = nh.advertise<visualization_msgs::MarkerArray>(ros_api_visualizationmarker_topic, 10);
521 #endif
522  printf("\nsick_scan_xd_api_test started\n");
523 
524 #ifdef _MSC_VER
525  std::string sick_scan_api_lib = "sick_scan_xd_shared_lib.dll";
526  std::vector<std::string> search_library_path = { "", "build/Debug/", "build_win64/Debug/", "src/build/Debug/", "src/build_win64/Debug/", "src/sick_scan_xd/build/Debug/", "src/sick_scan_xd/build_win64/Debug/", "./", "../" };
527 #else
528  std::string sick_scan_api_lib = "libsick_scan_xd_shared_lib.so";
529  std::vector<std::string> search_library_path = { "", "build/", "build_linux/", "src/build/", "src/build_linux/", "src/sick_scan_xd/build/", "src/sick_scan_xd/build_linux/", "./", "../" };
530 #endif
532  for(int search_library_cnt = 0; search_library_cnt < search_library_path.size(); search_library_cnt++)
533  {
534  std::string libfilepath = search_library_path[search_library_cnt] + sick_scan_api_lib;
535  if ((ret = SickScanApiLoadLibrary(libfilepath.c_str())) == SICK_SCAN_API_SUCCESS)
536  {
537  printf("sick_scan_xd library \"%s\" loaded successfully\n", libfilepath.c_str());
538  sick_scan_api_lib = libfilepath;
539  break;
540  }
541  }
542  if (ret != SICK_SCAN_API_SUCCESS)
543  exitOnError("SickScanApiLoadLibrary failed", ret);
544 
545  // (Re-)Initialize and run sick_scan_xd_api_test
546  int user_key = 0;
547  do
548  {
549  user_key = sick_scan_api_test_main(argc, argv, sick_scan_args, polling);
550  std::this_thread::sleep_for(std::chrono::seconds(1));
551  printf("sick_scan_xd_api_test finished with user key '%c' (%d), re-initialize and repeat sick_scan_xd_api_test ...\n", (char)user_key, user_key);
552  } while (user_key == 'R' || user_key == 'r');
553 
554  // Unload and exit
555  printf("sick_scan_xd_api_test finishing...\n");
557  exitOnError("SickScanApiUnloadLibrary failed", ret);
558  printf("sick_scan_xd_api_test finished successfully\n");
559 
560  if (false) // Optional test: reload, initialize and run sick_scan_xd_api_test
561  {
562  printf("\nsick_scan_xd_api_test: reload %s\n", sick_scan_api_lib.c_str());
563  if ((ret = SickScanApiLoadLibrary(sick_scan_api_lib.c_str())) != SICK_SCAN_API_SUCCESS)
564  exitOnError("SickScanApiLoadLibrary failed", ret);
565  printf("\nsick_scan_xd_api_test: restart\n");
566  int user_key = 0;
567  do
568  {
569  user_key = sick_scan_api_test_main(argc, argv, sick_scan_args, polling);
570  std::this_thread::sleep_for(std::chrono::seconds(1));
571  printf("sick_scan_xd_api_test finished with user key '%c' (%d), re-initialize and repeat sick_scan_xd_api_test ...\n", (char)user_key, user_key);
572  } while (user_key == 'R' || user_key == 'r');
573  printf("sick_scan_xd_api_test finishing...\n");
575  exitOnError("SickScanApiUnloadLibrary failed", ret);
576  printf("sick_scan_xd_api_test finished successfully\n");
577  }
578 
579  exit(EXIT_SUCCESS);
580 }
SickScanApiRegisterNavPoseLandmarkMsg
int32_t SickScanApiRegisterNavPoseLandmarkMsg(SickScanApiHandle apiHandle, SickScanNavPoseLandmarkCallback callback)
Definition: api_impl.cpp:2030
SickScanApiRegisterLIDoutputstateMsg
int32_t SickScanApiRegisterLIDoutputstateMsg(SickScanApiHandle apiHandle, SickScanLIDoutputstateMsgCallback callback)
Definition: api_impl.cpp:1068
apiTestVisualizationMarkerMsgCallback
static void apiTestVisualizationMarkerMsgCallback(SickScanApiHandle apiHandle, const SickScanVisualizationMarkerMsg *msg)
Definition: sick_scan_xd_api_test.cpp:202
runSickScanApiTestWaitNext
static void runSickScanApiTestWaitNext(SickScanApiHandle *apiHandle, bool *run_flag)
Definition: sick_scan_xd_api_test.cpp:252
SickScanApiRegisterLogMsg
int32_t SickScanApiRegisterLogMsg(SickScanApiHandle apiHandle, SickScanLogMsgCallback callback)
Definition: api_impl.cpp:1319
SickScanOdomVelocityMsgType
Definition: sick_scan_api.h:431
SickScanApiRegisterVisualizationMarkerMsg
int32_t SickScanApiRegisterVisualizationMarkerMsg(SickScanApiHandle apiHandle, SickScanVisualizationMarkerCallback callback)
Definition: api_impl.cpp:1218
plotPointcloudToJpeg
static void plotPointcloudToJpeg(const std::string &jpegfilepath, const SickScanPointCloudMsg &msg)
Definition: sick_scan_xd_api_test.cpp:41
apiTestNavPoseLandmarkMsgCallback
static void apiTestNavPoseLandmarkMsgCallback(SickScanApiHandle apiHandle, const SickScanNavPoseLandmarkMsg *msg)
Definition: sick_scan_xd_api_test.cpp:214
sensor_msgs::Imu_
Definition: Imu.h:28
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
SickScanApiWaitNextCartesianPointCloudMsg
int32_t SickScanApiWaitNextCartesianPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1508
msg
msg
ros::Publisher
SickScanApiRegisterRadarScanMsg
int32_t SickScanApiRegisterRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScanCallback callback)
Definition: api_impl.cpp:1118
sensor_msgs::PointCloud2_::width
_width_type width
Definition: PointCloud2.h:62
SickScanApiDeregisterCartesianPointCloudMsg
int32_t SickScanApiDeregisterCartesianPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:892
sick_scan_api_dump.h
SickScanApiInitByCli
int32_t SickScanApiInitByCli(SickScanApiHandle apiHandle, int argc, char **argv)
Definition: api_impl.cpp:765
DUMP_API_POINTCLOUD_MESSAGE
#define DUMP_API_POINTCLOUD_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:91
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
SickScanOdomVelocityMsgType::timestamp_sec
uint32_t timestamp_sec
Definition: sick_scan_api.h:436
SickScanNavOdomVelocityMsgType::timestamp
uint32_t timestamp
Definition: sick_scan_api.h:427
SickScanDiagnosticMsgType
Definition: sick_scan_api.h:446
SickScanApiRegisterLdmrsObjectArrayMsg
int32_t SickScanApiRegisterLdmrsObjectArrayMsg(SickScanApiHandle apiHandle, SickScanLdmrsObjectArrayCallback callback)
Definition: api_impl.cpp:1168
SickScanApiDeregisterLFErecMsg
int32_t SickScanApiDeregisterLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsgCallback callback)
Definition: api_impl.cpp:1042
SickScanApiUnloadLibrary
int32_t SICK_SCAN_XD_API_CALLING_CONVENTION SickScanApiUnloadLibrary()
Definition: sick_scan_xd_api_wrapper.c:234
sick_scan_xd::RadarScan_::targets
_targets_type targets
Definition: RadarScan.h:54
apiTestLdmrsObjectArrayCallback
static void apiTestLdmrsObjectArrayCallback(SickScanApiHandle apiHandle, const SickScanLdmrsObjectArray *msg)
Definition: sick_scan_xd_api_test.cpp:192
sick_scan_xd::LIDoutputstateMsg_
Definition: LIDoutputstateMsg.h:24
SickScanApiFreePointCloudMsg
int32_t SickScanApiFreePointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsg *msg)
Definition: api_impl.cpp:1608
sick_scan_api_test_main
int sick_scan_api_test_main(int argc, char **argv, const std::string &sick_scan_args, bool polling)
Definition: sick_scan_xd_api_test.cpp:356
SickScanApiFreeImuMsg
int32_t SickScanApiFreeImuMsg(SickScanApiHandle apiHandle, SickScanImuMsg *msg)
Definition: api_impl.cpp:1664
SickScanApiLoadLibrary
int32_t SICK_SCAN_XD_API_CALLING_CONVENTION SickScanApiLoadLibrary(const char *library_filepath)
Definition: sick_scan_xd_api_wrapper.c:218
apiTestRadarScanMsgCallback
static void apiTestRadarScanMsgCallback(SickScanApiHandle apiHandle, const SickScanRadarScan *msg)
Definition: sick_scan_xd_api_test.cpp:177
SickScanApiRegisterPolarPointCloudMsg
int32_t SickScanApiRegisterPolarPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:918
SickScanOdomVelocityMsgType::vel_x
float vel_x
Definition: sick_scan_api.h:433
apiTestLIDoutputstateMsgCallback
static void apiTestLIDoutputstateMsgCallback(SickScanApiHandle apiHandle, const SickScanLIDoutputstateMsg *msg)
Definition: sick_scan_xd_api_test.cpp:165
SickScanApiDeregisterImuMsg
int32_t SickScanApiDeregisterImuMsg(SickScanApiHandle apiHandle, SickScanImuMsgCallback callback)
Definition: api_impl.cpp:992
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
sensor_msgs::PointCloud2_::height
_height_type height
Definition: PointCloud2.h:59
ros::NodeHandle::advertise
Publisher advertise(AdvertiseOptions &ops)
Definition: rossimu.cpp:350
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
SickScanApiRelease
int32_t SickScanApiRelease(SickScanApiHandle apiHandle)
Definition: api_impl.cpp:674
SickScanApiClose
int32_t SickScanApiClose(SickScanApiHandle apiHandle)
Definition: api_impl.cpp:830
f
f
SickScanApiWaitNextVisualizationMarkerMsg
int32_t SickScanApiWaitNextVisualizationMarkerMsg(SickScanApiHandle apiHandle, SickScanVisualizationMarkerMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1899
SickScanRadarScanType
Definition: sick_scan_api.h:292
sick_scan_api.h
sick_scan_xd::SickLdmrsObjectArray_
Definition: SickLdmrsObjectArray.h:25
SickScanApiFreeRadarScanMsg
int32_t SickScanApiFreeRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScan *msg)
Definition: api_impl.cpp:1832
convertImuMsg
static SickScanImuMsg convertImuMsg(const ros_sensor_msgs::Imu &src_msg)
Definition: api_impl.cpp:118
sick_scan_xd::LFErecMsg_
Definition: LFErecMsg.h:25
SickScanApiRegisterLFErecMsg
int32_t SickScanApiRegisterLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsgCallback callback)
Definition: api_impl.cpp:1018
SickScanApiWaitNextLFErecMsg
int32_t SickScanApiWaitNextLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1675
convertVisualizationMarkerMsg
static SickScanVisualizationMarkerMsg convertVisualizationMarkerMsg(const ros_visualization_msgs::MarkerArray &src_msg)
Definition: api_impl.cpp:418
ROS_INFO_STREAM
#define ROS_INFO_STREAM(...)
Definition: sick_scan_ros2_example.cpp:71
visualization_msgs::MarkerArray_::markers
_markers_type markers
Definition: MarkerArray.h:39
SickScanPointCloudMsgType
Definition: sick_scan_api.h:137
api.setup.name
name
Definition: python/api/setup.py:12
SICK_SCAN_API_NOT_LOADED
@ SICK_SCAN_API_NOT_LOADED
Definition: sick_scan_api.h:611
TooJpeg::writeJpeg
bool writeJpeg(WRITE_ONE_BYTE output, const void *pixels_, unsigned short width, unsigned short height, bool isRGB, unsigned char quality_, bool downsample, const char *comment)
Definition: roswrap/src/toojpeg/toojpeg.cpp:352
exitOnError
static void exitOnError(const char *msg, int32_t error_code)
Definition: sick_scan_xd_api_test.cpp:110
SickScanApiDeregisterLdmrsObjectArrayMsg
int32_t SickScanApiDeregisterLdmrsObjectArrayMsg(SickScanApiHandle apiHandle, SickScanLdmrsObjectArrayCallback callback)
Definition: api_impl.cpp:1192
SickScanApiDeregisterDiagnosticMsg
int32_t SickScanApiDeregisterDiagnosticMsg(SickScanApiHandle apiHandle, SickScanDiagnosticMsgCallback callback)
Definition: api_impl.cpp:1295
apiTestImuMsgCallback
static void apiTestImuMsgCallback(SickScanApiHandle apiHandle, const SickScanImuMsg *msg)
Definition: sick_scan_xd_api_test.cpp:142
sick_scan_xd::RadarScan_
Definition: RadarScan.h:27
SickScanApiDeregisterRadarScanMsg
int32_t SickScanApiDeregisterRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScanCallback callback)
Definition: api_impl.cpp:1142
sick_scan_api_converter.h
SickScanApiHandle
void * SickScanApiHandle
Definition: sick_scan_api.h:456
SickScanApiDeregisterNavPoseLandmarkMsg
int32_t SickScanApiDeregisterNavPoseLandmarkMsg(SickScanApiHandle apiHandle, SickScanNavPoseLandmarkCallback callback)
Definition: api_impl.cpp:2054
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
DUMP_API_LIDOUTPUTSTATE_MESSAGE
#define DUMP_API_LIDOUTPUTSTATE_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:94
SickScanOdomVelocityMsgType::vel_y
float vel_y
Definition: sick_scan_api.h:434
SickScanApiWaitNextLdmrsObjectArrayMsg
int32_t SickScanApiWaitNextLdmrsObjectArrayMsg(SickScanApiHandle apiHandle, SickScanLdmrsObjectArray *msg, double timeout_sec)
Definition: api_impl.cpp:1843
SickScanNavOdomVelocityMsgType::vel_x
float vel_x
Definition: sick_scan_api.h:424
sick_scan_xd::RadarScan_::objects
_objects_type objects
Definition: RadarScan.h:57
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
SickScanApiWaitNextNavPoseLandmarkMsg
int32_t SickScanApiWaitNextNavPoseLandmarkMsg(SickScanApiHandle apiHandle, SickScanNavPoseLandmarkMsg *msg, double timeout_sec)
Definition: api_impl.cpp:2078
DUMP_API_IMU_MESSAGE
#define DUMP_API_IMU_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:92
sensor_msgs::PointCloud2_
Definition: PointCloud2.h:25
SickScanLdmrsObjectArrayType
Definition: sick_scan_api.h:309
SickScanOdomVelocityMsgType::timestamp_nsec
uint32_t timestamp_nsec
Definition: sick_scan_api.h:437
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
visualization_msgs::MarkerArray_
Definition: MarkerArray.h:24
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
SickScanOdomVelocityMsgType::omega
float omega
Definition: sick_scan_api.h:435
SickScanNavOdomVelocityMsgType::vel_y
float vel_y
Definition: sick_scan_api.h:425
convertLIDoutputstateMsg
static SickScanLIDoutputstateMsg convertLIDoutputstateMsg(const sick_scan_msg::LIDoutputstateMsg &src_msg)
Definition: api_impl.cpp:191
SICK_SCAN_POINTFIELD_DATATYPE_FLOAT32
@ SICK_SCAN_POINTFIELD_DATATYPE_FLOAT32
Definition: sick_scan_api.h:107
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
SickScanNavOdomVelocityMsgType
Definition: sick_scan_api.h:422
SickScanApiGetStatus
int32_t SickScanApiGetStatus(SickScanApiHandle apiHandle, int32_t *status_code, char *message_buffer, int32_t message_buffer_size)
Definition: api_impl.cpp:1367
apiTestDiagnosticMsgCallback
static void apiTestDiagnosticMsgCallback(SickScanApiHandle apiHandle, const SickScanDiagnosticMsg *msg)
Definition: sick_scan_xd_api_test.cpp:220
apiTestPolarPointCloudMsgCallback
static void apiTestPolarPointCloudMsgCallback(SickScanApiHandle apiHandle, const SickScanPointCloudMsg *msg)
Definition: sick_scan_xd_api_test.cpp:131
SickScanPointFieldMsgType
Definition: sick_scan_api.h:111
SickScanApiFreeLFErecMsg
int32_t SickScanApiFreeLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsg *msg)
Definition: api_impl.cpp:1720
ROS::seconds
double seconds(ROS::Duration duration)
Definition: ros_wrapper.cpp:180
SickScanLFErecMsgType
Definition: sick_scan_api.h:210
convertLFErecMsg
static SickScanLFErecMsg convertLFErecMsg(const sick_scan_msg::LFErecMsg &src_msg)
Definition: api_impl.cpp:152
SickScanPointFieldMsgType::datatype
uint8_t datatype
Definition: sick_scan_api.h:126
apiTestLFErecMsgCallback
static void apiTestLFErecMsgCallback(SickScanApiHandle apiHandle, const SickScanLFErecMsg *msg)
Definition: sick_scan_xd_api_test.cpp:155
ros::spin
ROSCPP_DECL void spin()
Enter simple event loop.
Definition: rossimu.cpp:260
jpegOutputCallback
void jpegOutputCallback(unsigned char oneByte)
Definition: sick_scan_xd_api_test.cpp:35
SickScanVisualizationMarkerMsgType
Definition: sick_scan_api.h:358
apiTestLogMsgCallback
static void apiTestLogMsgCallback(SickScanApiHandle apiHandle, const SickScanLogMsg *msg)
Definition: sick_scan_xd_api_test.cpp:241
SickScanApiDeregisterLogMsg
int32_t SickScanApiDeregisterLogMsg(SickScanApiHandle apiHandle, SickScanLogMsgCallback callback)
Definition: api_impl.cpp:1343
foutJpg
static FILE * foutJpg
Definition: sick_scan_xd_api_test.cpp:30
SickScanApiDeregisterLIDoutputstateMsg
int32_t SickScanApiDeregisterLIDoutputstateMsg(SickScanApiHandle apiHandle, SickScanLIDoutputstateMsgCallback callback)
Definition: api_impl.cpp:1092
SickScanNavOdomVelocityMsgType::omega
float omega
Definition: sick_scan_api.h:426
SickScanLogMsgType
Definition: sick_scan_api.h:440
SickScanNavPoseLandmarkMsgType
Definition: sick_scan_api.h:398
SickScanApiRegisterCartesianPointCloudMsg
int32_t SickScanApiRegisterCartesianPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:868
SickScanApiFreeLdmrsObjectArrayMsg
int32_t SickScanApiFreeLdmrsObjectArrayMsg(SickScanApiHandle apiHandle, SickScanLdmrsObjectArray *msg)
Definition: api_impl.cpp:1888
SickScanLIDoutputstateMsgType
Definition: sick_scan_api.h:217
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
SickScanNavOdomVelocityMsgType::coordbase
uint8_t coordbase
Definition: sick_scan_api.h:428
SickScanApiWaitNextImuMsg
int32_t SickScanApiWaitNextImuMsg(SickScanApiHandle apiHandle, SickScanImuMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1619
apiTestCartesianPointCloudMsgCallback
static void apiTestCartesianPointCloudMsgCallback(SickScanApiHandle apiHandle, const SickScanPointCloudMsg *msg)
Definition: sick_scan_xd_api_test.cpp:117
DUMP_API_LFEREC_MESSAGE
#define DUMP_API_LFEREC_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:93
sick_scan_xd_api_test.polling
polling
Definition: sick_scan_xd_api_test.py:343
sick_scan_xd_api_test.user_key
int user_key
Definition: sick_scan_xd_api_test.py:462
ros::NodeHandle
SickScanApiWaitNextRadarScanMsg
int32_t SickScanApiWaitNextRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScan *msg, double timeout_sec)
Definition: api_impl.cpp:1787
DUMP_API_LDMRSOBJECTARRAY_MESSAGE
#define DUMP_API_LDMRSOBJECTARRAY_MESSAGE(postfix, msg)
Definition: sick_scan_api_dump.h:96
main
int main(int argc, char **argv)
Definition: sick_scan_xd_api_test.cpp:500
SickScanApiInitByLaunchfile
int32_t SickScanApiInitByLaunchfile(SickScanApiHandle apiHandle, const char *launchfile_args)
Definition: api_impl.cpp:710


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