sick_scan_xd_api_dockertest.cpp
Go to the documentation of this file.
1 #include <csignal>
2 #include <iostream>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <sstream>
6 #include <string>
7 #include <thread>
8 #include <vector>
9 #ifdef _MSC_VER
10 #include <conio.h>
11 #include <json/json.h>
12 #else
13 // #include <ncurses.h>
14 #include <jsoncpp/json/json.h>
15 #endif
16 
17 #include "sick_scan_api.h"
18 #include "sick_scan_api_dump.h"
20 
21 #include <stdio.h>
22 #include <algorithm>
23 #include <cassert>
24 #include <cstring>
25 
26 static Json::Value s_json_pointcloud_messages;
27 static Json::Value s_json_imu_messages;
28 static std::string s_json_export_file;
29 static bool s_shutdown_signal_received = false;
30 
32 {
33  if (!s_json_export_file.empty())
34  {
35  Json::Value json_root;
36  if (s_json_pointcloud_messages.size() > 0)
37  json_root["RefPointcloudMsg"] = s_json_pointcloud_messages;
38  if (s_json_imu_messages.size() > 0)
39  json_root["RefImuMsg"] = s_json_imu_messages;
40  std::ofstream fs_json(s_json_export_file);
41  fs_json << json_root;
42  std::cout << "sick_scan_xd_api_dockertest: exported messages to json file \"" << s_json_export_file << "\"" << std::endl;
43  }
44 }
45 
46 // signal handler to close docker test after SIGINT and SIGKILL
47 void signalHandler(int signalRecv)
48 {
49  printf("sick_scan_xd_api_dockertest: caught signal %d, aborting ...\n", signalRecv);
51  std::this_thread::sleep_for(std::chrono::milliseconds(100));
53  std::this_thread::sleep_for(std::chrono::milliseconds(100));
54  printf("sick_scan_xd_api_dockertest: exit (line %d)\n", __LINE__);
55 }
56 
57 // Exit with error message
58 static void exitOnError(const char* msg, int32_t error_code)
59 {
60  printf("## ERROR sick_scan_xd_api_dockertest: %s, error code %d\n", msg, error_code);
61  exit(EXIT_FAILURE);
62 }
63 
64 // Convert a pointcloud message to json
65 static void apiMessageToJson(const SickScanPointCloudMsg* msg, Json::Value& json_msg)
66 {
67  json_msg["frame_id"] = msg->header.frame_id;
68  json_msg["width"] = msg->width;
69  json_msg["height"] = msg->height;
70  json_msg["point_step"] = msg->point_step;
71  json_msg["row_step"] = msg->row_step;
72  Json::Value json_fields;
73  for(int field_cnt = 0; field_cnt < msg->fields.size; field_cnt++)
74  {
75  Json::Value json_field;
76  json_field["name"] = msg->fields.buffer[field_cnt].name;
77  json_field["offset"] = msg->fields.buffer[field_cnt].offset;
78  json_field["datatype"] = msg->fields.buffer[field_cnt].datatype;
79  json_field["count"] = msg->fields.buffer[field_cnt].count;
80  json_fields.append(json_field);
81  }
82  json_msg["fields"] = json_fields;
83  std::stringstream hex_data_str;
84  for(int data_cnt = 0; data_cnt < msg->data.size; data_cnt++)
85  {
86  hex_data_str << std::setfill('0') << std::setw(2) << std::hex << (int)(msg->data.buffer[data_cnt]);
87  }
88  json_msg["data"] = hex_data_str.str();
89 }
90 
91 // Convert an imu message to json
92 static void apiMessageToJson(const SickScanImuMsg* msg, Json::Value& json_msg)
93 {
94  json_msg["frame_id"] = "imu_link"; // msg->header.frame_id; // "world" // frame_id: TODO !!!
95  json_msg["orientation"].resize(4);
96  json_msg["angular_velocity"].resize(3);
97  json_msg["linear_acceleration"].resize(3);
98  json_msg["orientation_covariance"].resize(9);
99  json_msg["angular_velocity_covariance"].resize(9);
100  json_msg["linear_acceleration_covariance"].resize(9);
101  json_msg["orientation"][0] = msg->orientation.x;
102  json_msg["orientation"][1] = msg->orientation.y;
103  json_msg["orientation"][2] = msg->orientation.z;
104  json_msg["orientation"][3] = msg->orientation.w;
105  json_msg["angular_velocity"][0] = msg->angular_velocity.x;
106  json_msg["angular_velocity"][1] = msg->angular_velocity.y;
107  json_msg["angular_velocity"][2] = msg->angular_velocity.z;
108  json_msg["linear_acceleration"][0] = msg->linear_acceleration.x;
109  json_msg["linear_acceleration"][1] = msg->linear_acceleration.y;
110  json_msg["linear_acceleration"][2] = msg->linear_acceleration.z;
111  for(int n = 0; n < 9; n++)
112  {
113  json_msg["orientation_covariance"][n] = msg->orientation_covariance[n];
114  json_msg["angular_velocity_covariance"][n] = msg->angular_velocity_covariance[n];
115  json_msg["linear_acceleration_covariance"][n] = msg->linear_acceleration_covariance[n];
116  }
117 }
118 
119 // Example callback for cartesian pointcloud messages, converts and publishes a SickScanPointCloudMsg to sensor_msgs::PointCloud2 on ROS-1
121 {
122  printf("[Info]: apiTestCartesianPointCloudMsgCallback(apiHandle:%p): %dx%d pointcloud callback...\n", apiHandle, msg->width, msg->height);
123  Json::Value json_msg;
124  apiMessageToJson(msg, json_msg);
125  s_json_pointcloud_messages[msg->topic].append(json_msg);
126 }
127 
128 // Example callback for polar pointcloud messages, converts and publishes a SickScanPointCloudMsg to sensor_msgs::PointCloud2 on ROS-1
130 {
131  printf("[Info]: apiTestPolarPointCloudMsgCallback(apiHandle:%p): %dx%d pointcloud callback...\n", apiHandle, msg->width, msg->height);
132  Json::Value json_msg;
133  apiMessageToJson(msg, json_msg);
134  s_json_pointcloud_messages[msg->topic].append(json_msg);
135 }
136 
137 // Example callback for imu messages
138 static void apiTestImuMsgCallback(SickScanApiHandle apiHandle, const SickScanImuMsg* msg)
139 {
140  printf("[Info]: apiTestImuMsgCallback(apiHandle:%p): Imu message, orientation=(%.6f,%.6f,%.6f,%.6f), angular_velocity=(%.6f,%.6f,%.6f), linear_acceleration=(%.6f,%.6f,%.6f)\n",
141  apiHandle, msg->orientation.x, msg->orientation.y, msg->orientation.z, msg->orientation.w,
142  msg->angular_velocity.x, msg->angular_velocity.y, msg->angular_velocity.y,
143  msg->linear_acceleration.x, msg->linear_acceleration.y, msg->linear_acceleration.z);
144  Json::Value json_msg;
145  apiMessageToJson(msg, json_msg);
146  //s_json_imu_messages["/multiScan/imu"].append(json_msg); // topic: TODO !!!
147  s_json_imu_messages["/sick_mrs_1xxx/imu"].append(json_msg); // topic: TODO !!!
148 }
149 
150 // sick_scan_api_test main: Initialize, receive and process lidar messages via sick_scan_xd API.
151 void sick_scan_api_test_main(int argc, char** argv)
152 {
153  int32_t ret = SICK_SCAN_API_SUCCESS;
154  SickScanApiHandle apiHandle = 0;
155 
156  if ((apiHandle = SickScanApiCreate(argc, argv)) == 0)
157  exitOnError("SickScanApiCreate failed", -1);
158 
159  // Initialize a lidar and starts message receiving and processing
160  if ((ret = SickScanApiInitByCli(apiHandle, argc, argv)) != SICK_SCAN_API_SUCCESS)
161  exitOnError("SickScanApiInitByCli failed", ret);
162 
163  // Register a callback for PointCloud messages
165  exitOnError("SickScanApiRegisterCartesianPointCloudMsg failed", ret);
167  exitOnError("SickScanApiRegisterCartesianPointCloudMsg failed", ret);
168 
169  // Register a callback for Imu messages
171  exitOnError("SickScanApiRegisterImuMsg failed", ret);
172 
173  // Run main loop
175  {
176  std::this_thread::sleep_for(std::chrono::milliseconds(1));
177  }
178 
179  // Cleanup and exit
180  printf("sick_scan_xd_api_dockertest finishing...\n");
184  if ((ret = SickScanApiClose(apiHandle)) != SICK_SCAN_API_SUCCESS)
185  exitOnError("SickScanApiClose failed", ret);
186  if ((ret = SickScanApiRelease(apiHandle)) != SICK_SCAN_API_SUCCESS)
187  exitOnError("SickScanApiRelease failed", ret);
188 }
189 
190 // sick_scan_api_test main: Initialize, receive and process lidar messages via sick_scan_xd API.
191 int main(int argc, char** argv)
192 {
193  int32_t ret = SICK_SCAN_API_SUCCESS;
194  for (int n = 0; n < argc; n++)
195  {
196  printf("%s%s", (n > 0 ? " " : ""), argv[n]);
197  if (strncmp(argv[n], "_jsonfile:=", 11) == 0)
198  s_json_export_file = argv[n] + 11;
199  }
200  signal(SIGINT, signalHandler); // SIGINT = 2, Ctrl-C or kill -2
201  signal(SIGTERM, signalHandler); // SIGTERM = 15, default kill level
202  printf("\nsick_scan_xd_api_dockertest started\n");
203 
204 #ifdef _MSC_VER
205  std::string sick_scan_api_lib = "sick_scan_xd_shared_lib.dll";
206  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/", "./", "../" };
207 #else
208  std::string sick_scan_api_lib = "libsick_scan_xd_shared_lib.so";
209  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/", "./", "../" };
210 #endif
212  for(int search_library_cnt = 0; search_library_cnt < search_library_path.size(); search_library_cnt++)
213  {
214  std::string libfilepath = search_library_path[search_library_cnt] + sick_scan_api_lib;
215  if ((ret = SickScanApiLoadLibrary(libfilepath.c_str())) == SICK_SCAN_API_SUCCESS)
216  {
217  printf("sick_scan_xd library \"%s\" loaded successfully\n", libfilepath.c_str());
218  break;
219  }
220  }
221  if (ret != SICK_SCAN_API_SUCCESS)
222  exitOnError("SickScanApiLoadLibrary failed", ret);
223 
224  // Initialize and run sick_scan_xd_api_dockertest
225  sick_scan_api_test_main(argc, argv);
226 
227  // Unload and exit
228  printf("sick_scan_xd_api_dockertest finishing...\n");
230  exitOnError("SickScanApiUnloadLibrary failed", ret);
231  printf("sick_scan_xd_api_dockertest finished successfully\n");
232  exit(EXIT_SUCCESS);
233 }
SICK_SCAN_API_SUCCESS
@ SICK_SCAN_API_SUCCESS
Definition: sick_scan_api.h:609
msg
msg
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
exitOnError
static void exitOnError(const char *msg, int32_t error_code)
Definition: sick_scan_xd_api_dockertest.cpp:58
SickScanApiDeregisterPolarPointCloudMsg
int32_t SickScanApiDeregisterPolarPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:942
apiTestPolarPointCloudMsgCallback
static void apiTestPolarPointCloudMsgCallback(SickScanApiHandle apiHandle, const SickScanPointCloudMsg *msg)
Definition: sick_scan_xd_api_dockertest.cpp:129
apiTestCartesianPointCloudMsgCallback
static void apiTestCartesianPointCloudMsgCallback(SickScanApiHandle apiHandle, const SickScanPointCloudMsg *msg)
Definition: sick_scan_xd_api_dockertest.cpp:120
SickScanApiUnloadLibrary
int32_t SICK_SCAN_XD_API_CALLING_CONVENTION SickScanApiUnloadLibrary()
Definition: sick_scan_xd_api_wrapper.c:234
SickScanApiLoadLibrary
int32_t SICK_SCAN_XD_API_CALLING_CONVENTION SickScanApiLoadLibrary(const char *library_filepath)
Definition: sick_scan_xd_api_wrapper.c:218
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
exportJsonMessages
void exportJsonMessages()
Definition: sick_scan_xd_api_dockertest.cpp:31
SickScanApiRelease
int32_t SickScanApiRelease(SickScanApiHandle apiHandle)
Definition: api_impl.cpp:674
SickScanApiClose
int32_t SickScanApiClose(SickScanApiHandle apiHandle)
Definition: api_impl.cpp:830
main
int main(int argc, char **argv)
Definition: sick_scan_xd_api_dockertest.cpp:191
s_shutdown_signal_received
static bool s_shutdown_signal_received
Definition: sick_scan_xd_api_dockertest.cpp:29
sick_scan_api.h
apiMessageToJson
static void apiMessageToJson(const SickScanPointCloudMsg *msg, Json::Value &json_msg)
Definition: sick_scan_xd_api_dockertest.cpp:65
s_json_imu_messages
static Json::Value s_json_imu_messages
Definition: sick_scan_xd_api_dockertest.cpp:27
sick_scan_api_test_main
void sick_scan_api_test_main(int argc, char **argv)
Definition: sick_scan_xd_api_dockertest.cpp:151
SickScanPointCloudMsgType
Definition: sick_scan_api.h:137
SICK_SCAN_API_NOT_LOADED
@ SICK_SCAN_API_NOT_LOADED
Definition: sick_scan_api.h:611
signalHandler
void signalHandler(int signalRecv)
Definition: sick_scan_xd_api_dockertest.cpp:47
apiTestImuMsgCallback
static void apiTestImuMsgCallback(SickScanApiHandle apiHandle, const SickScanImuMsg *msg)
Definition: sick_scan_xd_api_dockertest.cpp:138
sick_scan_api_converter.h
SickScanApiHandle
void * SickScanApiHandle
Definition: sick_scan_api.h:456
SickScanApiCreate
SickScanApiHandle SickScanApiCreate(int argc, char **argv)
Definition: api_impl.cpp:637
SickScanApiRegisterImuMsg
int32_t SickScanApiRegisterImuMsg(SickScanApiHandle apiHandle, SickScanImuMsgCallback callback)
Definition: api_impl.cpp:968
SickScanApiRegisterCartesianPointCloudMsg
int32_t SickScanApiRegisterCartesianPointCloudMsg(SickScanApiHandle apiHandle, SickScanPointCloudMsgCallback callback)
Definition: api_impl.cpp:868
SickScanImuMsgType
Definition: sick_scan_api.h:179
s_json_export_file
static std::string s_json_export_file
Definition: sick_scan_xd_api_dockertest.cpp:28
s_json_pointcloud_messages
static Json::Value s_json_pointcloud_messages
Definition: sick_scan_xd_api_dockertest.cpp:26


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