sick_scan_xd_api_test.py
Go to the documentation of this file.
1 #
2 # Python usage example for sick_scan_api
3 #
4 # Make sure that libsick_scan_xd_api_lib.so is included in the system path, f.e. by
5 # python3 sick_scan_xd_api_test.py
6 
7 import datetime
8 import numpy as np
9 import os
10 import sys
11 import threading
12 import time
13 from sick_scan_api import *
14 
15 # set __ROS_VERSION to 0 (no ROS), 1 (publish ROS-1 pointclouds), or 2 (ROS-2)
16 __ROS_VERSION = os.getenv("ROS_VERSION")
17 if __ROS_VERSION is None:
18  __ROS_VERSION = 0
19 else:
20  __ROS_VERSION = int(__ROS_VERSION)
21 
22 plt_enabled = False
23 if __ROS_VERSION == 0:
24  try:
25  from mpl_toolkits import mplot3d
26  import matplotlib.pyplot as plt
27  plt_enabled = True
28  except ModuleNotFoundError:
29  print("import matplotlib failed, visualization disabled")
30 elif __ROS_VERSION == 1:
31  import rospy
32  from sick_scan_api_converter import *
33 elif __ROS_VERSION == 2:
34  import rclpy
35  from rclpy.node import Node
36  from sick_scan_api_converter import *
37 
38 # global settings
40  def __init__(self):
41  self.cartesian_pointcloud_timestamp_published = datetime.datetime.now()
42  self.polar_pointcloud_timestamp_published = datetime.datetime.now()
47  self.plot_figure = None
48  self.plot_axes = None
49  self.plot_points_x = []
50  self.plot_points_y = []
51  self.plot_points_z = []
52  self.polling = False
54  self.polling_functions["SickScanApiWaitNextCartesianPointCloudMsg"] = True # default if polling is True: poll cartesian pointcloud message by SickScanApiWaitNextCartesianPointCloudMsg
55  self.polling_functions["SickScanApiWaitNextPolarPointCloudMsg"] = False
56  self.polling_functions["SickScanApiWaitNextImuMsg"] = False
57  self.polling_functions["SickScanApiWaitNextLFErecMsg"] = False
58  self.polling_functions["SickScanApiWaitNextLIDoutputstateMsg"] = False
59  self.polling_functions["SickScanApiWaitNextRadarScanMsg"] = False
60  self.polling_functions["SickScanApiWaitNextLdmrsObjectArrayMsg"] = False
61  self.polling_functions["SickScanApiWaitNextVisualizationMarkerMsg"] = False
62  self.polling_functions["SickScanApiWaitNextNavPoseLandmarkMsg"] = False
63  self.verbose_level = 2 # Set verbose level 0=DEBUG, 1=INFO, 2=WARN, 3=ERROR, 4=FATAL or 5=QUIET (equivalent to ros::console::levels)
64 
65 # Convert a SickScanCartesianPointCloudMsg to 3D arrays
67  # get pointcloud fields
68  num_fields = pointcloud_msg.fields.size
69  msg_fields_buffer = pointcloud_msg.fields.buffer
70  field_offset_x = -1
71  field_offset_y = -1
72  field_offset_z = -1
73  for n in range(num_fields):
74  field_name = ctypesCharArrayToString(msg_fields_buffer[n].name)
75  field_offset = msg_fields_buffer[n].offset
76  if field_name == "x":
77  field_offset_x = msg_fields_buffer[n].offset
78  elif field_name == "y":
79  field_offset_y = msg_fields_buffer[n].offset
80  elif field_name == "z":
81  field_offset_z = msg_fields_buffer[n].offset
82  # Extract x,y,z
83  cloud_data_buffer_len = (pointcloud_msg.row_step * pointcloud_msg.height) # length of polar cloud data in byte
84  assert(pointcloud_msg.data.size == cloud_data_buffer_len and field_offset_x >= 0 and field_offset_y >= 0 and field_offset_z >= 0)
85  cloud_data_buffer = bytearray(cloud_data_buffer_len)
86  for n in range(cloud_data_buffer_len):
87  cloud_data_buffer[n] = pointcloud_msg.data.buffer[n]
88  points_x = np.zeros(pointcloud_msg.width * pointcloud_msg.height, dtype = np.float32)
89  points_y = np.zeros(pointcloud_msg.width * pointcloud_msg.height, dtype = np.float32)
90  points_z = np.zeros(pointcloud_msg.width * pointcloud_msg.height, dtype = np.float32)
91  point_idx = 0
92  for row_idx in range(pointcloud_msg.height):
93  for col_idx in range(pointcloud_msg.width):
94  # Get lidar point in polar coordinates (range, azimuth and elevation)
95  pointcloud_offset = row_idx * pointcloud_msg.row_step + col_idx * pointcloud_msg.point_step
96  points_x[point_idx] = np.frombuffer(cloud_data_buffer, dtype = np.float32, count = 1, offset = pointcloud_offset + field_offset_x)[0]
97  points_y[point_idx] = np.frombuffer(cloud_data_buffer, dtype = np.float32, count = 1, offset = pointcloud_offset + field_offset_y)[0]
98  points_z[point_idx] = np.frombuffer(cloud_data_buffer, dtype = np.float32, count = 1, offset = pointcloud_offset + field_offset_z)[0]
99  point_idx = point_idx + 1
100  return points_x, points_y, points_z
101 
102 #
103 # Python examples for SickScanApi-callbacks
104 #
105 
106 # Callback for cartesian pointcloud messages
107 def pySickScanCartesianPointCloudMsgCallback(api_handle, pointcloud_msg):
108  pointcloud_msg = pointcloud_msg.contents # dereference msg pointer (pointcloud_msg = pointcloud_msg[0])
109  print("pySickScanCartesianPointCloudMsgCallback (ROS-{}): api_handle={}, {}x{} pointcloud, {} echo(s), segment {}, {} fields, frame_id \"{}\", topic {}, timestamp {}.{:06d}".format(
110  __ROS_VERSION, api_handle, pointcloud_msg.width, pointcloud_msg.height, pointcloud_msg.num_echos , pointcloud_msg.segment_idx, pointcloud_msg.fields.size,
111  pointcloud_msg.header.frame_id, pointcloud_msg.topic, pointcloud_msg.header.timestamp_sec, pointcloud_msg.header.timestamp_nsec))
112  global api_test_settings
113  # Note: Pointcloud conversion and visualization consumes cpu time, therefore we convert and publish the cartesian pointcloud with low frequency.
114  cur_timestamp = datetime.datetime.now()
115  if __ROS_VERSION == 0 and cur_timestamp >= api_test_settings.cartesian_pointcloud_timestamp_published + datetime.timedelta(seconds=0.5):
116  api_test_settings.plot_points_x, api_test_settings.plot_points_y, api_test_settings.plot_points_z = pySickScanCartesianPointCloudMsgToXYZ(pointcloud_msg)
117  api_test_settings.cartesian_pointcloud_timestamp_published = cur_timestamp
118  elif __ROS_VERSION > 0 and api_test_settings.ros_pointcloud_publisher is not None and pointcloud_msg.width > 0 and pointcloud_msg.height > 0 and cur_timestamp >= api_test_settings.cartesian_pointcloud_timestamp_published + datetime.timedelta(seconds=0.2):
119  # Copy cartesian pointcloud_msg to cartesian ros pointcloud and publish
120  ros_pointcloud = SickScanApiConvertPointCloudToROS(pointcloud_msg)
121  api_test_settings.ros_pointcloud_publisher.publish(ros_pointcloud)
122  api_test_settings.cartesian_pointcloud_timestamp_published = cur_timestamp
123 
124 # Callback for polar pointcloud messages
125 def pySickScanPolarPointCloudMsgCallback(api_handle, pointcloud_msg):
126  pointcloud_msg = pointcloud_msg.contents # dereference msg pointer (pointcloud_msg = pointcloud_msg[0])
127  print("pySickScanPolarPointCloudMsgCallback (ROS-{}): api_handle={}, {}x{} pointcloud, {} echo(s), segment {}, {} fields, frame_id \"{}\", topic {}, timestamp {}.{:06d}".format(
128  __ROS_VERSION, api_handle, pointcloud_msg.width, pointcloud_msg.height, pointcloud_msg.num_echos , pointcloud_msg.segment_idx, pointcloud_msg.fields.size,
129  pointcloud_msg.header.frame_id, pointcloud_msg.topic, pointcloud_msg.header.timestamp_sec, pointcloud_msg.header.timestamp_nsec))
130  if __ROS_VERSION == 1:
131  # Convert polar pointcloud_msg to cartesian ros pointcloud and publish.
132  # Note: Pointcloud conversion from polar to cartesian is too cpu-intensive to process all segments from a Multiscan136.
133  # In case of multi-segment scanners, we just publish segment with index -1 (i.e. the 360-degree pointcloud) with low frequency.
134  global api_test_settings
135  if pointcloud_msg.segment_idx < 0:
136  api_test_settings.ros_polar_pointcloud_is_multi_segment_scanner = True
137  if api_test_settings.ros_polar_pointcloud_publisher is not None and pointcloud_msg.width > 0 and pointcloud_msg.height > 0:
138  cur_timestamp = datetime.datetime.now()
139  publish_polar_pointcloud = False
140  if api_test_settings.ros_polar_pointcloud_is_multi_segment_scanner == False and cur_timestamp >= api_test_settings.polar_pointcloud_timestamp_published + datetime.timedelta(seconds=1.0):
141  publish_polar_pointcloud = True
142  elif pointcloud_msg.segment_idx < 0 and cur_timestamp >= api_test_settings.polar_pointcloud_timestamp_published + datetime.timedelta(seconds=1.0):
143  publish_polar_pointcloud = True
144  if publish_polar_pointcloud:
145  ros_pointcloud = SickScanApiConvertPolarPointCloudToROS(pointcloud_msg)
146  api_test_settings.ros_polar_pointcloud_publisher.publish(ros_pointcloud)
147  api_test_settings.polar_pointcloud_timestamp_published = cur_timestamp
148 
149 # Callback for Imu messages
150 def pySickScanImuMsgCallback(api_handle, imu_msg):
151  imu_msg = imu_msg.contents # dereference msg pointer
152  print("pySickScanImuMsgCallback: api_handle={}, imu message: orientation=({:.8},{:.8},{:.8},{:.8}), angular_velocity=({:.8},{:.8},{:.8}), linear_acceleration=({:.8},{:.8},{:.8})".format(
153  api_handle, imu_msg.orientation.x, imu_msg.orientation.y, imu_msg.orientation.z, imu_msg.orientation.w,
154  imu_msg.angular_velocity.x, imu_msg.angular_velocity.y, imu_msg.angular_velocity.y,
155  imu_msg.linear_acceleration.x, imu_msg.linear_acceleration.y, imu_msg.linear_acceleration.z))
156 
157 # Callback for LFErec messages
158 def pySickScanLFErecMsgCallback(api_handle, lferec_msg):
159  lferec_msg = lferec_msg.contents # dereference msg pointer
160  field_info = ""
161  for field in lferec_msg.fields:
162  if field.field_result_mrs == 1:
163  status = "free"
164  elif field.field_result_mrs == 2:
165  status = "infringed"
166  else:
167  status = "invalid"
168  field_info = field_info + ", field {}: ({},{},{},{},{})".format(field.field_index, status, field.dist_scale_factor, field.dist_scale_offset, field.angle_scale_factor, field.angle_scale_offset)
169  print("pySickScanLFErecMsgCallback: api_handle={}, lferec message: {} fields{}".format(api_handle, lferec_msg.fields_number, field_info))
170 
171 # Callback for LIDoutputstate messages
172 def pySickScanLIDoutputstateMsgCallback(api_handle, lidoutputstate_msg):
173  lidoutputstate_msg = lidoutputstate_msg.contents # dereference msg pointer
174  state_info = "({},{},{},{},{},{},{},{})".format(lidoutputstate_msg.output_state[0], lidoutputstate_msg.output_state[1], lidoutputstate_msg.output_state[2], lidoutputstate_msg.output_state[3],
175  lidoutputstate_msg.output_state[4], lidoutputstate_msg.output_state[5], lidoutputstate_msg.output_state[6], lidoutputstate_msg.output_state[7])
176  count_info = "({},{},{},{},{},{},{},{})".format(lidoutputstate_msg.output_count[0], lidoutputstate_msg.output_count[1], lidoutputstate_msg.output_count[2], lidoutputstate_msg.output_count[3],
177  lidoutputstate_msg.output_count[4], lidoutputstate_msg.output_count[5], lidoutputstate_msg.output_count[6], lidoutputstate_msg.output_count[7])
178  print("pySickScanLIDoutputstateMsgCallback: api_handle={}, lidoutputstate message, outputstate={}, outputcount={}".format(api_handle, state_info, count_info))
179 
180 # Callback for RadarScan messages
181 def pySickScanRadarScanCallback(api_handle, radarscan_msg):
182  radarscan_msg = radarscan_msg.contents # dereference msg pointer
183  print("pySickScanRadarScanCallback: api_handle={}, radarscan message: {} targets, {} objects".format(api_handle, radarscan_msg.targets.width, radarscan_msg.objects.size))
184  if __ROS_VERSION == 1:
185  # Copy radar target pointcloud_msg to ros pointcloud and publish
186  global api_test_settings
187  if api_test_settings.ros_pointcloud_publisher is not None and radarscan_msg.targets.width > 0 and radarscan_msg.targets.height > 0:
188  ros_pointcloud = SickScanApiConvertPointCloudToROS(radarscan_msg.targets)
189  api_test_settings.ros_pointcloud_publisher.publish(ros_pointcloud)
190  if api_test_settings.ros_polar_pointcloud_publisher is not None and radarscan_msg.objects.size > 0:
191  ros_pointcloud = SickScanApiConvertRadarObjectsToROS(radarscan_msg.header, radarscan_msg.objects)
192  api_test_settings.ros_polar_pointcloud_publisher.publish(ros_pointcloud)
193 
194 # Callback for LdmrsObjectArray messages
195 def pySickScanLdmrsObjectArrayCallback(api_handle, ldmrsobjectarray_msg):
196  ldmrsobjectarray_msg = ldmrsobjectarray_msg.contents # dereference msg pointer
197  print("pySickScanLdmrsObjectArrayCallback: api_handle={}, ldmrsobjectarray message: {} objects".format(api_handle, ldmrsobjectarray_msg.objects.size))
198 
199 # Callback for VisualizationMarker messages
200 def pySickScanVisualizationMarkerCallback(api_handle, visualizationmarker_msg):
201  visualizationmarker_msg = visualizationmarker_msg.contents # dereference msg pointer
202  marker_info = ""
203  for n in range(visualizationmarker_msg.markers.size):
204  marker = visualizationmarker_msg.markers.buffer[n]
205  marker_info = marker_info + ", marker {}: pos=({},{},{})".format(marker.id, marker.pose_position.x, marker.pose_position.y, marker.pose_position.z)
206  print("pySickScanVisualizationMarkerCallback: api_handle={}, visualizationmarker message: {} marker{}".format(api_handle, visualizationmarker_msg.markers.size, marker_info))
207  if __ROS_VERSION > 0:
208  # Copy radar target pointcloud_msg to ros pointcloud and publish
209  global api_test_settings
210  if api_test_settings.ros_visualizationmarker_publisher is not None and visualizationmarker_msg.markers.size > 0:
211  ros_markers = SickScanApiConvertMarkerArrayToROS(visualizationmarker_msg.markers)
212  api_test_settings.ros_visualizationmarker_publisher.publish(ros_markers)
213 
214 # Callback for SickScanNavPoseLandmarkMsg messages
215 def pySickScanNavPoseLandmarkCallback(api_handle, navposelandmark_msg):
216  navposelandmark_msg = navposelandmark_msg.contents # dereference msg pointer
217  print("pySickScanNavPoseLandmarkCallback: api_handle={}, NavPoseLandmark message: x={:.3}, y={:.3}, yaw={:.4}, {} reflectors".format(api_handle, navposelandmark_msg.pose_x, navposelandmark_msg.pose_y, navposelandmark_msg.pose_yaw, navposelandmark_msg.reflectors.size))
218 
219 # Callback for SickScanDiagnosticMsg messages
220 def pySickScanDiagnosticMsgCallback(api_handle, diagnostic_msg):
221  diagnostic_msg = diagnostic_msg.contents # dereference msg pointer
222  print("pySickScanDiagnosticMsgCallback: api_handle={}, status_code={}, status_message={}".format(api_handle, diagnostic_msg.status_code, diagnostic_msg.status_message))
223 
224 # Callback for SickScanLogMsg messages
225 def pySickScanLogMsgCallback(api_handle, log_msg):
226  log_msg = log_msg.contents # dereference msg pointer
227  print("pySickScanLogMsgCallback: api_handle={}, log_level={}, log_message={}".format(api_handle, log_msg.log_level, log_msg.log_message))
228 
229 #
230 # Python examples for SickScanApiWaitNext-functions ("message polling")
231 #
232 
233 # Receive lidar message by SickScanApiWaitNext-functions ("message polling")
234 def pyrunSickScanApiTestWaitNext(sick_scan_library, api_handle):
235  wait_next_message_timeout = 0.1 # wait max. 0.1 seconds for the next message (otherwise SickScanApiWaitNext-function return with timeout)
236  pointcloud_msg = SickScanPointCloudMsg()
237  imu_msg = SickScanImuMsg()
238  lferec_msg = SickScanLFErecMsg()
239  lidoutputstate_msg = SickScanLIDoutputstateMsg()
240  radarscan_msg = SickScanRadarScan()
241  ldmrsobjectarray_msg = SickScanLdmrsObjectArray()
242  visualizationmarker_msg = SickScanVisualizationMarkerMsg()
243  navposelandmark_msg = SickScanNavPoseLandmarkMsg()
244  odom_msg = SickScanOdomVelocityMsg()
245  odom_msg.vel_x = +1.0
246  odom_msg.vel_y = -1.0
247  odom_msg.omega = 0.5
248  odom_msg.timestamp_sec = 12345
249  odom_msg.timestamp_nsec = 6789
250  navodom_msg = SickScanNavOdomVelocityMsg()
251  navodom_msg.vel_x = +1.0
252  navodom_msg.vel_y = -1.0
253  navodom_msg.omega = 0.5
254  navodom_msg.timestamp = 123456789
255  navodom_msg.coordbase = 0
256  global api_test_settings
257  while api_test_settings.polling:
258  if api_test_settings.polling_functions["SickScanApiWaitNextCartesianPointCloudMsg"]: # Get/poll the next cartesian PointCloud message
259  ret = SickScanApiWaitNextCartesianPointCloudMsg(sick_scan_library, api_handle, ctypes.pointer(pointcloud_msg), wait_next_message_timeout)
260  if ret == int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS):
261  pySickScanCartesianPointCloudMsgCallback(api_handle, ctypes.pointer(pointcloud_msg))
262  if ret == int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS):
263  print("pyrunSickScanApiTestWaitNext: success")
264  if ret == int(SickScanApiErrorCodes.SICK_SCAN_API_TIMEOUT):
265  print("## ERROR pyrunSickScanApiTestWaitNext: SICK_SCAN_API_TIMEOUT, SickScanApiWaitNextCartesianPointCloudMsg failed, error code {} ({})".format(ret, int(ret)))
266  elif ret != int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS) and ret != int(SickScanApiErrorCodes.SICK_SCAN_API_TIMEOUT):
267  print("## ERROR pyrunSickScanApiTestWaitNext: SickScanApiWaitNextCartesianPointCloudMsg failed, error code {} ({})".format(ret, int(ret)))
268  SickScanApiFreePointCloudMsg(sick_scan_library, api_handle, ctypes.pointer(pointcloud_msg))
269  if api_test_settings.polling_functions["SickScanApiWaitNextPolarPointCloudMsg"]: # Get/poll the next polar PointCloud message
270  ret = SickScanApiWaitNextPolarPointCloudMsg(sick_scan_library, api_handle, ctypes.pointer(pointcloud_msg), wait_next_message_timeout)
271  if ret == int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS):
272  pySickScanPolarPointCloudMsgCallback(api_handle, ctypes.pointer(pointcloud_msg))
273  elif ret != int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS) and ret != int(SickScanApiErrorCodes.SICK_SCAN_API_TIMEOUT):
274  print("## ERROR pyrunSickScanApiTestWaitNext: SickScanApiWaitNextPolarPointCloudMsg failed, error code {} ({})".format(ret, int(ret)))
275  SickScanApiFreePointCloudMsg(sick_scan_library, api_handle, ctypes.pointer(pointcloud_msg))
276  if api_test_settings.polling_functions["SickScanApiWaitNextImuMsg"]: # Get/poll the next Imu message
277  ret = SickScanApiWaitNextImuMsg(sick_scan_library, api_handle, ctypes.pointer(imu_msg), wait_next_message_timeout)
278  if ret == int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS):
279  pySickScanImuMsgCallback(api_handle, ctypes.pointer(imu_msg))
280  elif ret != int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS) and ret != int(SickScanApiErrorCodes.SICK_SCAN_API_TIMEOUT):
281  print("## ERROR pyrunSickScanApiTestWaitNext: SickScanApiWaitNextImuMsg failed, error code {} ({})".format(ret, int(ret)))
282  SickScanApiFreeImuMsg(sick_scan_library, api_handle, ctypes.pointer(imu_msg))
283  if api_test_settings.polling_functions["SickScanApiWaitNextLFErecMsg"]: # Get/poll the next LFErec message
284  ret = SickScanApiWaitNextLFErecMsg(sick_scan_library, api_handle, ctypes.pointer(lferec_msg), wait_next_message_timeout)
285  if ret == int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS):
286  pySickScanLFErecMsgCallback(api_handle, ctypes.pointer(lferec_msg))
287  elif ret != int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS) and ret != int(SickScanApiErrorCodes.SICK_SCAN_API_TIMEOUT):
288  print("## ERROR pyrunSickScanApiTestWaitNext: SickScanApiWaitNextLFErecMsg failed, error code {} ({})".format(ret, int(ret)))
289  SickScanApiFreeLFErecMsg(sick_scan_library, api_handle, ctypes.pointer(lferec_msg))
290  if api_test_settings.polling_functions["SickScanApiWaitNextLIDoutputstateMsg"]: # Get/poll the next LIDoutputstate message
291  ret = SickScanApiWaitNextLIDoutputstateMsg(sick_scan_library, api_handle, ctypes.pointer(lidoutputstate_msg), wait_next_message_timeout)
292  if ret == int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS):
293  pySickScanLIDoutputstateMsgCallback(api_handle, ctypes.pointer(lidoutputstate_msg))
294  elif ret != int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS) and ret != int(SickScanApiErrorCodes.SICK_SCAN_API_TIMEOUT):
295  print("## ERROR pyrunSickScanApiTestWaitNext: SickScanApiWaitNextLIDoutputstateMsg failed, error code {} ({})".format(ret, int(ret)))
296  SickScanApiFreeLIDoutputstateMsg(sick_scan_library, api_handle, ctypes.pointer(lidoutputstate_msg))
297  if api_test_settings.polling_functions["SickScanApiWaitNextRadarScanMsg"]: # Get/poll the next RadarScan message
298  ret = SickScanApiWaitNextRadarScanMsg(sick_scan_library, api_handle, ctypes.pointer(radarscan_msg), wait_next_message_timeout)
299  if ret == int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS):
300  pySickScanRadarScanCallback(api_handle, ctypes.pointer(radarscan_msg))
301  elif ret != int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS) and ret != int(SickScanApiErrorCodes.SICK_SCAN_API_TIMEOUT):
302  print("## ERROR pyrunSickScanApiTestWaitNext: SickScanApiWaitNextRadarScanMsg failed, error code {} ({})".format(ret, int(ret)))
303  SickScanApiFreeRadarScanMsg(sick_scan_library, api_handle, ctypes.pointer(radarscan_msg))
304  if api_test_settings.polling_functions["SickScanApiWaitNextLdmrsObjectArrayMsg"]: # Get/poll the next LdmrsObjectArray message
305  ret = SickScanApiWaitNextLdmrsObjectArrayMsg(sick_scan_library, api_handle, ctypes.pointer(ldmrsobjectarray_msg), wait_next_message_timeout)
306  if ret == int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS):
307  pySickScanLdmrsObjectArrayCallback(api_handle, ctypes.pointer(ldmrsobjectarray_msg))
308  elif ret != int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS) and ret != int(SickScanApiErrorCodes.SICK_SCAN_API_TIMEOUT):
309  print("## ERROR pyrunSickScanApiTestWaitNext: SickScanApiWaitNextLdmrsObjectArrayMsg failed, error code {} ({})".format(ret, int(ret)))
310  SickScanApiFreeLdmrsObjectArrayMsg(sick_scan_library, api_handle, ctypes.pointer(ldmrsobjectarray_msg))
311  if api_test_settings.polling_functions["SickScanApiWaitNextVisualizationMarkerMsg"]: # Get/poll the next VisualizationMarker message
312  ret = SickScanApiWaitNextVisualizationMarkerMsg(sick_scan_library, api_handle, ctypes.pointer(visualizationmarker_msg), wait_next_message_timeout)
313  if ret == int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS):
314  pySickScanVisualizationMarkerCallback(api_handle, ctypes.pointer(visualizationmarker_msg))
315  elif ret != int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS) and ret != int(SickScanApiErrorCodes.SICK_SCAN_API_TIMEOUT):
316  print("## ERROR pyrunSickScanApiTestWaitNext: SickScanApiWaitNextVisualizationMarkerMsg failed, error code {} ({})".format(ret, int(ret)))
317  SickScanApiFreeVisualizationMarkerMsg(sick_scan_library, api_handle, ctypes.pointer(visualizationmarker_msg))
318  if api_test_settings.polling_functions["SickScanApiWaitNextNavPoseLandmarkMsg"]: # Get/poll the next SickScanNavPoseLandmarkMsg message
319  ret = SickScanApiWaitNextNavPoseLandmarkMsg(sick_scan_library, api_handle, ctypes.pointer(navposelandmark_msg), wait_next_message_timeout)
320  if ret == int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS):
321  pySickScanNavPoseLandmarkCallback(api_handle, ctypes.pointer(navposelandmark_msg))
322  elif ret != int(SickScanApiErrorCodes.SICK_SCAN_API_SUCCESS) and ret != int(SickScanApiErrorCodes.SICK_SCAN_API_TIMEOUT):
323  print("## ERROR pyrunSickScanApiTestWaitNext: SickScanApiWaitNextNavPoseLandmarkMsg failed, error code {} ({})".format(ret, int(ret)))
324  SickScanApiFreeNavPoseLandmarkMsg(sick_scan_library, api_handle, ctypes.pointer(navposelandmark_msg))
325  # Send NAV350 odom message example
326  # ret = SickScanApiNavOdomVelocityMsg(sick_scan_library, api_handle, ctypes.pointer(navodom_msg))
327  # ret = SickScanApiOdomVelocityMsg(sick_scan_library, api_handle, ctypes.pointer(odom_msg))
328 
329 #
330 # Python usage example for sick_scan_api
331 #
332 
333 if __name__ == "__main__":
334 
335  # Configuration and commandline arguments
336  api_test_settings = ApiTestSettings()
337  plt_enabled = False
338  cli_arg_start_idx = 1
339  for n, cli_arg in enumerate(sys.argv):
340  if cli_arg.startswith("_polling:="):
341  cli_arg_start_idx = max(n + 1, cli_arg_start_idx)
342  if int(cli_arg[10:]) > 0:
343  api_test_settings.polling = True
344  if cli_arg.startswith("_verbose:="):
345  cli_arg_start_idx = max(n + 1, cli_arg_start_idx)
346  api_test_settings.verbose_level = int(cli_arg[10:])
347  cli_args = " ".join(sys.argv[cli_arg_start_idx:])
348  if __ROS_VERSION == 0 and plt_enabled:
349  api_test_settings.plot_figure = plt.figure()
350  api_test_settings.plot_axes = plt.axes(projection="3d")
351  elif __ROS_VERSION == 1:
352  rospy.init_node("sick_scan_api_test_py")
353  api_test_settings.ros_pointcloud_publisher = rospy.Publisher("/sick_scan_xd_api_test/api_cloud", PointCloud2, queue_size=10)
354  api_test_settings.ros_polar_pointcloud_publisher = rospy.Publisher("/sick_scan_xd_api_test/api_cloud_polar", PointCloud2, queue_size=10)
355  api_test_settings.ros_visualizationmarker_publisher = rospy.Publisher("/sick_scan_xd_api_test/marker", MarkerArray, queue_size=10)
356  elif __ROS_VERSION == 2:
357  rclpy.init()
358  ros_node = Node("sick_scan_api_test_py")
359  api_test_settings.ros_pointcloud_publisher = ros_node.create_publisher(PointCloud2, "/sick_scan_xd_api_test/api_cloud", 10)
360  api_test_settings.ros_visualizationmarker_publisher = ros_node.create_publisher(MarkerArray, "/sick_scan_xd_api_test/marker", 10)
361 
362  # Load sick_scan_library
363  if os.name == 'nt': # Load windows dll
364  sick_scan_library = SickScanApiLoadLibrary(["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/", "./", "../"], "sick_scan_xd_shared_lib.dll")
365  else: # Load linux so
366  sick_scan_library = SickScanApiLoadLibrary(["build/", "build_linux/", "src/build/", "src/build_linux/", "src/sick_scan_xd/build/", "src/sick_scan_xd/build_linux/", "./", "../"], "libsick_scan_xd_shared_lib.so")
367  api_handle = SickScanApiCreate(sick_scan_library)
368 
369  # Initialize lidar by launchfile, e.g. sick_tim_7xx.launch
370  # SickScanApiInitByLaunchfile(sick_scan_library, api_handle, "./src/sick_scan_xd/launch/sick_tim_7xx.launch hostname:=127.0.0.1 port:=2111 sw_pll_only_publish:=False")
371  print("sick_scan_xd_api_test.py: initializing lidar, commandline arguments = \"{}\"".format(cli_args))
372  SickScanApiInitByLaunchfile(sick_scan_library, api_handle, cli_args)
373 
374  api_test_wait_next_thread = None
375  if api_test_settings.polling: # Receive lidar message by SickScanApiWaitNext-functions running in a background thread ("message polling")
376  api_test_wait_next_thread = threading.Thread(target=pyrunSickScanApiTestWaitNext, args=(sick_scan_library, api_handle))
377  api_test_wait_next_thread.start()
378 
379  else: # Register callbacks to receive lidar messages (recommended)
380 
381  # Register a callback for PointCloud messages
382  cartesian_pointcloud_callback = SickScanPointCloudMsgCallback(pySickScanCartesianPointCloudMsgCallback)
383  SickScanApiRegisterCartesianPointCloudMsg(sick_scan_library, api_handle, cartesian_pointcloud_callback)
384  polar_pointcloud_callback = SickScanPointCloudMsgCallback(pySickScanPolarPointCloudMsgCallback)
385  SickScanApiRegisterPolarPointCloudMsg(sick_scan_library, api_handle, polar_pointcloud_callback)
386 
387  # Register a callback for Imu messages
388  imu_callback = SickScanImuMsgCallback(pySickScanImuMsgCallback)
389  SickScanApiRegisterImuMsg(sick_scan_library, api_handle, imu_callback)
390 
391  # Register a callback for LFErec messages
392  lferec_callback = SickScanLFErecMsgCallback(pySickScanLFErecMsgCallback)
393  SickScanApiRegisterLFErecMsg(sick_scan_library, api_handle, lferec_callback)
394 
395  # Register a callback for LIDoutputstate messages
396  lidoutputstate_callback = SickScanLIDoutputstateMsgCallback(pySickScanLIDoutputstateMsgCallback)
397  SickScanApiRegisterLIDoutputstateMsg(sick_scan_library, api_handle, lidoutputstate_callback)
398 
399  # Register a callback for RadarScan messages
400  radarscan_callback = SickScanRadarScanCallback(pySickScanRadarScanCallback)
401  SickScanApiRegisterRadarScanMsg(sick_scan_library, api_handle, radarscan_callback)
402 
403  # Register a callback for LdmrsObjectArray messages
404  ldmrsobjectarray_callback = SickScanLdmrsObjectArrayCallback(pySickScanLdmrsObjectArrayCallback)
405  SickScanApiRegisterLdmrsObjectArrayMsg(sick_scan_library, api_handle, ldmrsobjectarray_callback)
406 
407  # Register a callback for VisualizationMarker messages
408  visualizationmarker_callback = SickScanVisualizationMarkerCallback(pySickScanVisualizationMarkerCallback)
409  SickScanApiRegisterVisualizationMarkerMsg(sick_scan_library, api_handle, visualizationmarker_callback)
410 
411  # Register a callback for SickScanNavPoseLandmarkMsg messages
412  navposelandmark_callback = SickScanNavPoseLandmarkCallback(pySickScanNavPoseLandmarkCallback)
413  SickScanApiRegisterNavPoseLandmarkMsg(sick_scan_library, api_handle, navposelandmark_callback)
414 
415  # Register a callback for SickScanDiagnosticMsg messages
416  diagnostic_msg_callback = SickScanDiagnosticMsgCallback(pySickScanDiagnosticMsgCallback)
417  SickScanApiRegisterDiagnosticMsg(sick_scan_library, api_handle, diagnostic_msg_callback)
418 
419  # Register a callback for SickScanLogMsg messages
420  log_msg_callback = SickScanLogMsgCallback(pySickScanLogMsgCallback)
421  SickScanApiRegisterLogMsg(sick_scan_library, api_handle, log_msg_callback)
422 
423  # Set verbose level 0=DEBUG, 1=INFO, 2=WARN, 3=ERROR, 4=FATAL or 5=QUIET (equivalent to ros::console::levels)
424  SickScanApiSetVerboseLevel(sick_scan_library, api_handle, api_test_settings.verbose_level)
425  verbose_level = SickScanApiGetVerboseLevel(sick_scan_library, api_handle)
426  if api_test_settings.verbose_level != verbose_level:
427  print(f"## ERROR sick_scan_xd_api_test.py: SickScanApiSetVerboseLevel(verbose_level={api_test_settings.verbose_level}) failed, running with verbose_level={verbose_level}")
428  else:
429  print(f"sick_scan_xd_api_test.py running with verbose_level={verbose_level}")
430 
431  # Run main loop
432  if __ROS_VERSION == 0:
433  while True:
434  try:
435  if plt_enabled and len(api_test_settings.plot_points_x) > 0 and len(api_test_settings.plot_points_y) > 0 and len(api_test_settings.plot_points_z) > 0:
436  print("sick_scan_xd_api_test.py plotting pointcloud by matplotlib")
437  plot_points_x = np.copy(api_test_settings.plot_points_x)
438  plot_points_y = np.copy(api_test_settings.plot_points_y)
439  plot_points_z = np.copy(api_test_settings.plot_points_z)
440  # Depending on the system, it can be recommended to close all figures instead of just clearing.
441  plt.close("all")
442  api_test_settings.plot_figure = plt.figure()
443  api_test_settings.plot_axes = plt.axes(projection="3d")
444  # api_test_settings.plot_axes.clear()
445  api_test_settings.plot_axes.scatter(plot_points_x, plot_points_y, plot_points_z, c='r', marker='.')
446  api_test_settings.plot_axes.set_xlabel("x")
447  api_test_settings.plot_axes.set_ylabel("y")
448  plt.draw()
449  plt.pause(2.0)
450  else:
451  time.sleep(1.0)
452  # Query device state by SOPAS command "sRN SCdevicestate", sopas_response is e.g. "sRA SCdevicestate \x00"
453  sopas_response = SickScanApiSendSOPAS(sick_scan_library, api_handle, "sRN SCdevicestate")
454  print(f"sick_scan_xd_api_test.py: sopas_request=\"sRN SCdevicestate\", sopas_response=\"{sopas_response}\"")
455  except:
456  break
457  elif __ROS_VERSION == 1:
458  # rospy.spin()
459  while not rospy.is_shutdown():
460  rospy.sleep(0.1)
461  else:
462  user_key = 0
463  while user_key != "\n":
464  time.sleep(1)
465  print("sick_scan_xd_api_test.py running. Press ENTER to exit")
466  user_key = sys.stdin.read(1)
467 
468  # Stop lidar, close connection and api handle
469  print("sick_scan_xd_api_test.py finishing...")
470  if api_test_settings.polling:
471  api_test_settings.polling = False
472  if api_test_wait_next_thread is not None:
473  api_test_wait_next_thread.join()
474  else:
475  SickScanApiDeregisterCartesianPointCloudMsg(sick_scan_library, api_handle, cartesian_pointcloud_callback)
476  SickScanApiDeregisterPolarPointCloudMsg(sick_scan_library, api_handle, polar_pointcloud_callback)
477  SickScanApiDeregisterImuMsg(sick_scan_library, api_handle, imu_callback)
478  SickScanApiDeregisterLFErecMsg(sick_scan_library, api_handle, lferec_callback)
479  SickScanApiDeregisterLIDoutputstateMsg(sick_scan_library, api_handle, lidoutputstate_callback)
480  SickScanApiDeregisterRadarScanMsg(sick_scan_library, api_handle, radarscan_callback)
481  SickScanApiDeregisterLdmrsObjectArrayMsg(sick_scan_library, api_handle, ldmrsobjectarray_callback)
482  SickScanApiDeregisterVisualizationMarkerMsg(sick_scan_library, api_handle, visualizationmarker_callback)
483  SickScanApiDeregisterNavPoseLandmarkMsg(sick_scan_library, api_handle, navposelandmark_callback)
484  SickScanApiClose(sick_scan_library, api_handle)
485  if not api_test_settings.polling:
486  SickScanApiDeregisterDiagnosticMsg(sick_scan_library, api_handle, diagnostic_msg_callback)
487  SickScanApiDeregisterLogMsg(sick_scan_library, api_handle, log_msg_callback)
488  SickScanApiRelease(sick_scan_library, api_handle)
489  SickScanApiUnloadLibrary(sick_scan_library)
490  print("sick_scan_xd_api_test.py finished.")
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
sick_scan_xd_api_test.ApiTestSettings.ros_polar_pointcloud_publisher
ros_polar_pointcloud_publisher
Definition: sick_scan_xd_api_test.py:44
sick_scan_xd_api_test.ApiTestSettings.plot_points_y
plot_points_y
Definition: sick_scan_xd_api_test.py:50
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
SickScanApiWaitNextCartesianPointCloudMsg
int32_t SickScanApiWaitNextCartesianPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1508
SickScanApiRegisterRadarScanMsg
int32_t SickScanApiRegisterRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScanCallback callback)
Definition: api_impl.cpp:1118
SickScanApiDeregisterCartesianPointCloudMsg
int32_t SickScanApiDeregisterCartesianPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:892
sick_scan_xd_api_test.ApiTestSettings.__init__
def __init__(self)
Definition: sick_scan_xd_api_test.py:40
sick_scan_xd_api_test.ApiTestSettings.plot_points_x
plot_points_x
Definition: sick_scan_xd_api_test.py:49
SickScanApiDeregisterPolarPointCloudMsg
int32_t SickScanApiDeregisterPolarPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:942
SickScanPointCloudMsgCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanPointCloudMsgCallback)(SickScanApiHandle apiHandle, const SickScanPointCloudMsg *msg)
Definition: sick_scan_api.h:457
sick_scan_xd_api_test.pySickScanPolarPointCloudMsgCallback
def pySickScanPolarPointCloudMsgCallback(api_handle, pointcloud_msg)
Definition: sick_scan_xd_api_test.py:125
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
SickScanLdmrsObjectArrayCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanLdmrsObjectArrayCallback)(SickScanApiHandle apiHandle, const SickScanLdmrsObjectArray *msg)
Definition: sick_scan_api.h:462
sick_scan_xd_api_test.pySickScanLogMsgCallback
def pySickScanLogMsgCallback(api_handle, log_msg)
Definition: sick_scan_xd_api_test.py:225
SickScanApiUnloadLibrary
int32_t SICK_SCAN_XD_API_CALLING_CONVENTION SickScanApiUnloadLibrary()
Definition: sick_scan_xd_api_wrapper.c:234
sick_scan_xd_api_test.pySickScanDiagnosticMsgCallback
def pySickScanDiagnosticMsgCallback(api_handle, diagnostic_msg)
Definition: sick_scan_xd_api_test.py:220
sick_scan_xd_api_test.ApiTestSettings.cartesian_pointcloud_timestamp_published
cartesian_pointcloud_timestamp_published
Definition: sick_scan_xd_api_test.py:41
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
sick_scan_xd_api_test.ApiTestSettings.plot_axes
plot_axes
Definition: sick_scan_xd_api_test.py:48
roswrap::console::print
ROSCONSOLE_DECL void print(FilterBase *filter, void *logger, Level level, const char *file, int line, const char *function, const char *fmt,...) ROSCONSOLE_PRINTF_ATTRIBUTE(7
Don't call this directly. Use the ROS_LOG() macro instead.
SickScanApiFreeImuMsg
int32_t SickScanApiFreeImuMsg(SickScanApiHandle apiHandle, SickScanImuMsg *msg)
Definition: api_impl.cpp:1664
api.sick_scan_api.ctypesCharArrayToString
def ctypesCharArrayToString(char_array)
Definition: sick_scan_api.py:882
SickScanApiLoadLibrary
int32_t SICK_SCAN_XD_API_CALLING_CONVENTION SickScanApiLoadLibrary(const char *library_filepath)
Definition: sick_scan_xd_api_wrapper.c:218
SickScanNavPoseLandmarkCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanNavPoseLandmarkCallback)(SickScanApiHandle apiHandle, const SickScanNavPoseLandmarkMsg *msg)
Definition: sick_scan_api.h:464
SickScanImuMsgCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanImuMsgCallback)(SickScanApiHandle apiHandle, const SickScanImuMsg *msg)
Definition: sick_scan_api.h:458
SickScanApiRegisterPolarPointCloudMsg
int32_t SickScanApiRegisterPolarPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:918
SickScanApiDeregisterImuMsg
int32_t SickScanApiDeregisterImuMsg(SickScanApiHandle apiHandle, SickScanImuMsgCallback callback)
Definition: api_impl.cpp:992
sick_scan_xd_api_test.ApiTestSettings.plot_figure
plot_figure
Definition: sick_scan_xd_api_test.py:47
sick_scan_xd_api_test.ApiTestSettings.polling
polling
Definition: sick_scan_xd_api_test.py:52
SickScanApiWaitNextPolarPointCloudMsg
int32_t SickScanApiWaitNextPolarPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1558
SickScanApiRelease
int32_t SickScanApiRelease(SickScanApiHandle apiHandle)
Definition: api_impl.cpp:674
sick_scan_api_converter.SickScanApiConvertPointCloudToROS
def SickScanApiConvertPointCloudToROS(api_pointcloud)
Definition: sick_scan_api_converter.py:30
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
SickScanApiWaitNextVisualizationMarkerMsg
int32_t SickScanApiWaitNextVisualizationMarkerMsg(SickScanApiHandle apiHandle, SickScanVisualizationMarkerMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1899
SickScanRadarScanType
Definition: sick_scan_api.h:292
SickScanApiFreeRadarScanMsg
int32_t SickScanApiFreeRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScan *msg)
Definition: api_impl.cpp:1832
SickScanApiRegisterLFErecMsg
int32_t SickScanApiRegisterLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsgCallback callback)
Definition: api_impl.cpp:1018
sick_scan_xd_api_test.ApiTestSettings.ros_pointcloud_publisher
ros_pointcloud_publisher
Definition: sick_scan_xd_api_test.py:43
sick_scan_xd_api_test.ApiTestSettings.ros_polar_pointcloud_is_multi_segment_scanner
ros_polar_pointcloud_is_multi_segment_scanner
Definition: sick_scan_xd_api_test.py:45
SickScanApiWaitNextLFErecMsg
int32_t SickScanApiWaitNextLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1675
SickScanPointCloudMsgType
Definition: sick_scan_api.h:137
SickScanLIDoutputstateMsgCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanLIDoutputstateMsgCallback)(SickScanApiHandle apiHandle, const SickScanLIDoutputstateMsg *msg)
Definition: sick_scan_api.h:460
SickScanVisualizationMarkerCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanVisualizationMarkerCallback)(SickScanApiHandle apiHandle, const SickScanVisualizationMarkerMsg *msg)
Definition: sick_scan_api.h:463
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
sick_scan_xd_api_test.pySickScanLdmrsObjectArrayCallback
def pySickScanLdmrsObjectArrayCallback(api_handle, ldmrsobjectarray_msg)
Definition: sick_scan_xd_api_test.py:195
sick_scan_xd_api_test.pySickScanLFErecMsgCallback
def pySickScanLFErecMsgCallback(api_handle, lferec_msg)
Definition: sick_scan_xd_api_test.py:158
SickScanApiDeregisterRadarScanMsg
int32_t SickScanApiDeregisterRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScanCallback callback)
Definition: api_impl.cpp:1142
sick_scan_xd_api_test.pySickScanVisualizationMarkerCallback
def pySickScanVisualizationMarkerCallback(api_handle, visualizationmarker_msg)
Definition: sick_scan_xd_api_test.py:200
sick_scan_api_converter.SickScanApiConvertRadarObjectsToROS
def SickScanApiConvertRadarObjectsToROS(header, radar_objects)
Definition: sick_scan_api_converter.py:142
sick_scan_api_converter.SickScanApiConvertPolarPointCloudToROS
def SickScanApiConvertPolarPointCloudToROS(api_pointcloud)
Definition: sick_scan_api_converter.py:71
SickScanApiDeregisterNavPoseLandmarkMsg
int32_t SickScanApiDeregisterNavPoseLandmarkMsg(SickScanApiHandle apiHandle, SickScanNavPoseLandmarkCallback callback)
Definition: api_impl.cpp:2054
SickScanApiFreeVisualizationMarkerMsg
int32_t SickScanApiFreeVisualizationMarkerMsg(SickScanApiHandle apiHandle, SickScanVisualizationMarkerMsg *msg)
Definition: api_impl.cpp:1944
sick_scan_xd_api_test.ApiTestSettings.polar_pointcloud_timestamp_published
polar_pointcloud_timestamp_published
Definition: sick_scan_xd_api_test.py:42
SickScanApiSetVerboseLevel
int32_t SickScanApiSetVerboseLevel(SickScanApiHandle apiHandle, int32_t verbose_level)
Definition: api_impl.cpp:1435
sick_scan_api_converter.SickScanApiConvertMarkerArrayToROS
def SickScanApiConvertMarkerArrayToROS(sick_markers)
Definition: sick_scan_api_converter.py:180
sick_scan_xd_api_test.ApiTestSettings.polling_functions
polling_functions
Definition: sick_scan_xd_api_test.py:53
SickScanApiWaitNextLdmrsObjectArrayMsg
int32_t SickScanApiWaitNextLdmrsObjectArrayMsg(SickScanApiHandle apiHandle, SickScanLdmrsObjectArray *msg, double timeout_sec)
Definition: api_impl.cpp:1843
sick_scan_xd_api_test.pySickScanRadarScanCallback
def pySickScanRadarScanCallback(api_handle, radarscan_msg)
Definition: sick_scan_xd_api_test.py:181
sick_scan_xd_api_test.ApiTestSettings.plot_points_z
plot_points_z
Definition: sick_scan_xd_api_test.py:51
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
sick_scan_xd_api_test.pySickScanImuMsgCallback
def pySickScanImuMsgCallback(api_handle, imu_msg)
Definition: sick_scan_xd_api_test.py:150
SickScanLdmrsObjectArrayType
Definition: sick_scan_api.h:309
SickScanApiCreate
SickScanApiHandle SickScanApiCreate(int argc, char **argv)
Definition: api_impl.cpp:637
sick_scan_xd_api_test.pySickScanLIDoutputstateMsgCallback
def pySickScanLIDoutputstateMsgCallback(api_handle, lidoutputstate_msg)
Definition: sick_scan_xd_api_test.py:172
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_api_test.ApiTestSettings.verbose_level
verbose_level
Definition: sick_scan_xd_api_test.py:63
sick_scan_xd_api_test.ApiTestSettings.ros_visualizationmarker_publisher
ros_visualizationmarker_publisher
Definition: sick_scan_xd_api_test.py:46
SickScanRadarScanCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanRadarScanCallback)(SickScanApiHandle apiHandle, const SickScanRadarScan *msg)
Definition: sick_scan_api.h:461
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
sick_scan_xd_api_test.pySickScanNavPoseLandmarkCallback
def pySickScanNavPoseLandmarkCallback(api_handle, navposelandmark_msg)
Definition: sick_scan_xd_api_test.py:215
SickScanApiFreeLFErecMsg
int32_t SickScanApiFreeLFErecMsg(SickScanApiHandle apiHandle, SickScanLFErecMsg *msg)
Definition: api_impl.cpp:1720
sick_scan_xd_api_test.pyrunSickScanApiTestWaitNext
def pyrunSickScanApiTestWaitNext(sick_scan_library, api_handle)
Definition: sick_scan_xd_api_test.py:234
SickScanLFErecMsgType
Definition: sick_scan_api.h:210
sick_scan_xd_api_test.pySickScanCartesianPointCloudMsgCallback
def pySickScanCartesianPointCloudMsgCallback(api_handle, pointcloud_msg)
Definition: sick_scan_xd_api_test.py:107
SickScanVisualizationMarkerMsgType
Definition: sick_scan_api.h:358
SickScanApiDeregisterLogMsg
int32_t SickScanApiDeregisterLogMsg(SickScanApiHandle apiHandle, SickScanLogMsgCallback callback)
Definition: api_impl.cpp:1343
SickScanApiDeregisterLIDoutputstateMsg
int32_t SickScanApiDeregisterLIDoutputstateMsg(SickScanApiHandle apiHandle, SickScanLIDoutputstateMsgCallback callback)
Definition: api_impl.cpp:1092
SickScanNavPoseLandmarkMsgType
Definition: sick_scan_api.h:398
SickScanApiRegisterCartesianPointCloudMsg
int32_t SickScanApiRegisterCartesianPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:868
sick_scan_xd_api_test.pySickScanCartesianPointCloudMsgToXYZ
def pySickScanCartesianPointCloudMsgToXYZ(pointcloud_msg)
Definition: sick_scan_xd_api_test.py:66
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
SickScanApiWaitNextImuMsg
int32_t SickScanApiWaitNextImuMsg(SickScanApiHandle apiHandle, SickScanImuMsg *msg, double timeout_sec)
Definition: api_impl.cpp:1619
SickScanLogMsgCallback
void(SICK_SCAN_XD_API_CALLING_CONVENTION * SickScanLogMsgCallback)(SickScanApiHandle apiHandle, const SickScanLogMsg *msg)
Definition: sick_scan_api.h:465
SickScanApiWaitNextRadarScanMsg
int32_t SickScanApiWaitNextRadarScanMsg(SickScanApiHandle apiHandle, SickScanRadarScan *msg, double timeout_sec)
Definition: api_impl.cpp:1787
SickScanApiGetVerboseLevel
int32_t SickScanApiGetVerboseLevel(SickScanApiHandle apiHandle)
Definition: api_impl.cpp:1459
SickScanApiInitByLaunchfile
int32_t SickScanApiInitByLaunchfile(SickScanApiHandle apiHandle, const char *launchfile_args)
Definition: api_impl.cpp:710
sick_scan_xd_api_test.ApiTestSettings
Definition: sick_scan_xd_api_test.py:39


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