59 #define ROS_DECL_GET_PARAMETER(node,name,value) do{rosDeclareParam((node),(name),(value));rosGetParam((node),(name),(value));}while(false)
62 static bool setOptionalArgument(
const std::map<std::string, std::string>& key_value_pairs,
const std::string& key, std::string& argument)
64 std::map<std::string, std::string>::const_iterator key_value_pair_iter = key_value_pairs.find(key);
65 if (key_value_pair_iter != key_value_pairs.cend())
67 argument = key_value_pair_iter->second;
75 static bool setOptionalArgument(
const std::map<std::string, std::string>& key_value_pairs,
const std::string& key,
bool& argument)
77 std::string str_argument;
80 argument = (str_argument[0] ==
'T' || str_argument[0] ==
't' || std::stoi(str_argument) > 0);
81 ROS_INFO_STREAM(key <<
"=" << (argument?
"true":
"false") <<
" set by commandline");
88 static bool setOptionalArgument(
const std::map<std::string, std::string>& key_value_pairs,
const std::string& key,
int& argument)
90 std::string str_argument;
93 argument = std::stoi(str_argument);
101 static bool setOptionalArgument(
const std::map<std::string, std::string>& key_value_pairs,
const std::string& key,
float& argument)
103 std::string str_argument;
106 argument = std::stof(str_argument);
114 static bool setOptionalArgument(
const std::map<std::string, std::string>& key_value_pairs,
const std::string& key,
double& argument)
116 std::string str_argument;
119 argument = std::stod(str_argument);
130 uint32_t u32_one = 1;
131 uint8_t* p_one = (uint8_t*)&u32_one;
132 uint8_t lsb = p_one[0];
133 uint8_t msb = p_one[3];
134 bool dstTargetIsBigEndian = (lsb == 0 && msb != 0);
135 bool dstTargetIsLittleEndian = (lsb != 0 && msb == 0);
136 assert(dstTargetIsBigEndian || dstTargetIsLittleEndian);
137 return dstTargetIsBigEndian;
148 publish_frame_id =
"world";
149 publish_laserscan_segment_topic =
"scan_segment";
150 publish_laserscan_fullframe_topic =
"scan_fullframe";
151 udp_input_fifolength = 20;
152 msgpack_output_fifolength = 20;
154 measure_timing =
true;
156 export_udp_msg =
false;
158 hostname =
"192.168.0.1";
159 udp_receiver_ip =
"";
163 udp_timeout_ms = 10000;
164 udp_timeout_ms_initial = 60000;
166 performanceprofilenumber = -1;
170 imu_latency_microsec = 0;
173 sopas_tcp_port =
"2111";
174 start_sopas_service =
true;
175 send_sopas_start_stop_cmd =
true;
176 sopas_cola_binary =
false;
177 sopas_timeout_ms = 5000;
178 client_authorization_pw =
"F4724744";
181 host_read_filtersettings =
true;
182 host_FREchoFilter = 1;
183 host_set_FREchoFilter =
false;
184 host_LFPangleRangeFilter =
"0 -180.0 +180.0 -90.0 +90.0 1";
185 host_set_LFPangleRangeFilter =
false;
186 host_LFPlayerFilter =
"0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1";
187 host_set_LFPlayerFilter =
false;
188 host_LFPintervalFilter =
"0 1";
189 host_set_LFPintervalFilter =
false;
192 msgpack_validator_enabled =
false;
193 msgpack_validator_verbose = 0;
194 msgpack_validator_discard_msgpacks_out_of_bounds =
true;
195 msgpack_validator_check_missing_scandata_interval = 12;
196 msgpack_validator_filter_settings.msgpack_validator_required_echos = { 0 };
197 msgpack_validator_filter_settings.msgpack_validator_azimuth_start = (float)(-M_PI);
198 msgpack_validator_filter_settings.msgpack_validator_azimuth_end = (float)(M_PI);
199 msgpack_validator_filter_settings.msgpack_validator_elevation_start = (float)(-M_PI/2.0);
200 msgpack_validator_filter_settings.msgpack_validator_elevation_end = (float)(M_PI/2.0);
201 msgpack_validator_filter_settings.msgpack_validator_layer_filter = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
202 msgpack_validator_valid_segments = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
208 laserscan_layer_filter = { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
224 ROS_INFO_STREAM(
"sick_scansegment_xd receives udp packets from multiScan136 or multiScan136 emulator, unpacks, converts and exports the lidar data.");
226 ROS_INFO_STREAM(
"-udp_sender=<ip> : ip address of udp sender, Use \"\" (default) to receive msgpacks from any udp sender, use \"127.0.0.1\" to restrict to localhost (loopback device), or use the ip-address of a multiScan136 lidar or multiScan136 emulator");
227 ROS_INFO_STREAM(
"-udp_port=<port> : udp port for multiScan136 resp. multiScan136 emulator, default: " <<
udp_port);
228 ROS_INFO_STREAM(
"-udp_input_fifolength=<size> : max. udp input fifo length (-1: unlimited, default: 20 for buffering 1 second at 20 Hz), elements will be removed from front if number of elements exceeds the fifo_length");
229 ROS_INFO_STREAM(
"-msgpack_output_fifolength=<size> : max. msgpack output fifo length(-1: unlimited, default: 20 for buffering 1 second at 20 Hz), elements will be removed from front if number of elements exceeds the fifo_length");
230 ROS_INFO_STREAM(
"-verbose_level=[0-2] : verbose_level <= 0: quiet mode, verbose_level == 1: print statistics, verbose_level == 2: print details incl. msgpack data, default: " <<
verbose_level);
231 ROS_INFO_STREAM(
"-measure_timing=0|1 : measure_timing == true: duration and latency of msgpack conversion and export is measured, default: " << measure_timing);
232 ROS_INFO_STREAM(
"-export_csv=0|1 : export msgpack data to csv file, default: false");
233 ROS_INFO_STREAM(
"-export_udp_msg=0|1 : export binary udp and msgpack data to file(*.udp and* .msg), default: false");
234 ROS_INFO_STREAM(
"-logfolder=<directory> : output folder for logfiles" );
235 ROS_INFO_STREAM(
"-hostname=<ip-address> : ip address of multiScan136 to post start and stop commands default:" << hostname);
236 ROS_INFO_STREAM(
"-udp_receiver_ip=<ip-address> : UDP destination IP address (ip address of udp receiver), default:\"" << udp_receiver_ip <<
"\"");
240 ROS_INFO_STREAM(
"-scandataformat=1|2 : set ScanDataFormat, 1 for msgpack or 2 for compact scandata, default: " << scandataformat);
241 ROS_INFO_STREAM(
"-performanceprofilenumber=[1-9] : set PerformanceProfileNumber or -1 to disable, default: " << performanceprofilenumber);
242 ROS_INFO_STREAM(
"-imu_enable=0|1 : enable or disable IMU data, default: " << imu_enable);
243 ROS_INFO_STREAM(
"-imu_topic=<name> : ROS topic of IMU messages, default: " << imu_topic);
244 ROS_INFO_STREAM(
"-imu_udp_port=<port>: udp port for multiScan imu data, default: " << imu_udp_port);
245 ROS_INFO_STREAM(
"-imu_latency_microsec=<micro_sec>: imu latency in microseconds, default: " << imu_latency_microsec);
307 host_LFPlayerFilter =
"";
308 host_set_LFPlayerFilter =
false;
311 std::string str_msgpack_validator_required_echos =
"0";
312 std::string str_msgpack_validator_valid_segments =
"0 1 2 3 4 5 6 7 8 9 10 11";
313 std::string str_msgpack_validator_layer_filter =
"1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1";
314 float msgpack_validator_azimuth_start_deg = msgpack_validator_filter_settings.msgpack_validator_azimuth_start * 180.0 / M_PI;
315 float msgpack_validator_azimuth_end_deg = msgpack_validator_filter_settings.msgpack_validator_azimuth_end * 180.0 / M_PI;
316 float msgpack_validator_elevation_start_deg = msgpack_validator_filter_settings.msgpack_validator_elevation_start * 180.0 / M_PI;
317 float msgpack_validator_elevation_end_deg = msgpack_validator_filter_settings.msgpack_validator_elevation_end * 180.0 / M_PI;
320 ROS_DECL_GET_PARAMETER(
node,
"msgpack_validator_discard_msgpacks_out_of_bounds", msgpack_validator_discard_msgpacks_out_of_bounds);
321 ROS_DECL_GET_PARAMETER(
node,
"msgpack_validator_check_missing_scandata_interval", msgpack_validator_check_missing_scandata_interval);
328 msgpack_validator_filter_settings.msgpack_validator_azimuth_start = msgpack_validator_azimuth_start_deg * M_PI / 180;
329 msgpack_validator_filter_settings.msgpack_validator_azimuth_end = msgpack_validator_azimuth_end_deg * M_PI / 180;
330 msgpack_validator_filter_settings.msgpack_validator_elevation_start = msgpack_validator_elevation_start_deg * M_PI / 180;
331 msgpack_validator_filter_settings.msgpack_validator_elevation_end = msgpack_validator_elevation_end_deg * M_PI / 180;
337 std::string str_add_transform_xyz_rpy =
"0,0,0,0,0,0";
339 bool add_transform_check_dynamic_updates =
false;
344 std::string str_laserscan_layer_filter =
"0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0";
348 if (imu_enable && scandataformat != 2)
350 ROS_ERROR_STREAM(
"## ERROR sick_scansegment_xd::Config::Init(): IMU requieres scandataformat 2, IMU deactivated.");
363 #if defined __ROS_VERSION && __ROS_VERSION > 1
365 rclcpp::NodeOptions node_options;
366 node_options.allow_undeclared_parameters(
true);
367 node = rclcpp::Node::make_shared(
"sick_scansegment_xd",
"", node_options);
369 #elif defined __ROS_VERSION && __ROS_VERSION > 0
370 ros::init(argc, argv,
"sick_scansegment_xd");
376 std::map<std::string, std::string> cli_parameter_map;
377 for (
int n = 1; n < argc; n++)
379 std::stringstream cli_argument(argv[n]);
380 std::string cli_token;
381 std::vector<std::string> cli_tokens;
383 while (getline(cli_argument, cli_token,
'='))
385 cli_tokens.push_back(cli_token);
387 if (cli_tokens.size() == 2 && !cli_tokens[0].empty() && !cli_tokens[1].empty())
390 if (cli_tokens[0][0] ==
'-')
391 cli_tokens[0] = cli_tokens[0].substr(1);
393 if (cli_tokens[0][(cli_tokens[0].
length() - 1)] ==
':')
394 cli_tokens[0] = cli_tokens[0].substr(0, cli_tokens[0].
length() - 1);
396 cli_parameter_map[cli_tokens[0]] = cli_tokens[1];
399 for(std::map<std::string, std::string>::const_iterator iter = cli_parameter_map.cbegin(); iter != cli_parameter_map.cend(); iter++)
400 ROS_INFO_STREAM(
"commandline argument found: \"" << iter->first <<
"\"=\"" << iter->second <<
"\"");
406 setOptionalArgument(cli_parameter_map,
"check_udp_receiver_port", check_udp_receiver_port);
410 setOptionalArgument(cli_parameter_map,
"publish_laserscan_segment_topic", publish_laserscan_segment_topic);
411 setOptionalArgument(cli_parameter_map,
"publish_laserscan_fullframe_topic", publish_laserscan_fullframe_topic);
413 setOptionalArgument(cli_parameter_map,
"msgpack_output_fifolength", msgpack_output_fifolength);
426 setOptionalArgument(cli_parameter_map,
"performanceprofilenumber", performanceprofilenumber);
433 setOptionalArgument(cli_parameter_map,
"send_sopas_start_stop_cmd", send_sopas_start_stop_cmd);
436 setOptionalArgument(cli_parameter_map,
"client_authorization_pw", client_authorization_pw);
437 setOptionalArgument(cli_parameter_map,
"host_read_filtersettings", host_read_filtersettings);
440 setOptionalArgument(cli_parameter_map,
"host_LFPangleRangeFilter", host_LFPangleRangeFilter);
441 setOptionalArgument(cli_parameter_map,
"host_set_LFPangleRangeFilter", host_set_LFPangleRangeFilter);
443 setOptionalArgument(cli_parameter_map,
"host_set_LFPlayerFilter", host_set_LFPlayerFilter);
445 setOptionalArgument(cli_parameter_map,
"host_set_LFPintervalFilter", host_set_LFPintervalFilter);
446 setOptionalArgument(cli_parameter_map,
"msgpack_validator_enabled", msgpack_validator_enabled);
447 setOptionalArgument(cli_parameter_map,
"msgpack_validator_verbose", msgpack_validator_verbose);
448 setOptionalArgument(cli_parameter_map,
"msgpack_validator_discard_msgpacks_out_of_bounds", msgpack_validator_discard_msgpacks_out_of_bounds);
449 setOptionalArgument(cli_parameter_map,
"msgpack_validator_check_missing_scandata_interval", msgpack_validator_check_missing_scandata_interval);
450 std::string cli_msgpack_validator_required_echos, cli_msgpack_validator_valid_segments, cli_msgpack_validator_layer_filter, cli_laserscan_layer_filter;
451 float cli_msgpack_validator_azimuth_start_deg, cli_msgpack_validator_azimuth_end_deg, cli_msgpack_validator_elevation_start_deg, cli_msgpack_validator_elevation_end_deg;
452 if (
setOptionalArgument(cli_parameter_map,
"msgpack_validator_required_echos", cli_msgpack_validator_required_echos))
454 if (
setOptionalArgument(cli_parameter_map,
"msgpack_validator_azimuth_start", cli_msgpack_validator_azimuth_start_deg))
455 msgpack_validator_filter_settings.msgpack_validator_azimuth_start = cli_msgpack_validator_azimuth_start_deg * (float)M_PI / 180.0
f;
456 if (
setOptionalArgument(cli_parameter_map,
"msgpack_validator_azimuth_end", cli_msgpack_validator_azimuth_end_deg))
457 msgpack_validator_filter_settings.msgpack_validator_azimuth_end = cli_msgpack_validator_azimuth_end_deg * (
float)M_PI / 180.0f;
458 if (
setOptionalArgument(cli_parameter_map,
"msgpack_validator_elevation_start", cli_msgpack_validator_elevation_start_deg))
459 msgpack_validator_filter_settings.msgpack_validator_elevation_start = cli_msgpack_validator_elevation_start_deg * (
float)M_PI / 180.0f;
460 if (
setOptionalArgument(cli_parameter_map,
"msgpack_validator_elevation_end", cli_msgpack_validator_elevation_end_deg))
461 msgpack_validator_filter_settings.msgpack_validator_elevation_end = cli_msgpack_validator_elevation_end_deg * (
float)M_PI / 180.0f;
462 if (
setOptionalArgument(cli_parameter_map,
"msgpack_validator_valid_segments", cli_msgpack_validator_valid_segments))
464 if (
setOptionalArgument(cli_parameter_map,
"msgpack_validator_layer_filter", cli_msgpack_validator_layer_filter))
466 if (
setOptionalArgument(cli_parameter_map,
"laserscan_layer_filter", cli_laserscan_layer_filter))
471 if (imu_enable && scandataformat != 2)
473 ROS_ERROR_STREAM(
"## ERROR sick_scansegment_xd::Config::Init(): IMU requieres scandataformat 2, IMU deactivated.");
490 ROS_INFO_STREAM(
"check_udp_receiver_port: " << check_udp_receiver_port);
494 ROS_INFO_STREAM(
"publish_laserscan_segment_topic: " << publish_laserscan_segment_topic);
495 ROS_INFO_STREAM(
"publish_laserscan_fullframe_topic:" << publish_laserscan_fullframe_topic);
497 ROS_INFO_STREAM(
"msgpack_output_fifolength: " << msgpack_output_fifolength);
511 ROS_INFO_STREAM(
"performanceprofilenumber: " << performanceprofilenumber);
518 ROS_INFO_STREAM(
"send_sopas_start_stop_cmd: " << send_sopas_start_stop_cmd);
521 ROS_INFO_STREAM(
"host_read_filtersettings: " << host_read_filtersettings);
524 ROS_INFO_STREAM(
"host_LFPangleRangeFilter: " << host_LFPangleRangeFilter);
525 ROS_INFO_STREAM(
"host_set_LFPangleRangeFilter: " << host_set_LFPangleRangeFilter);
527 ROS_INFO_STREAM(
"host_set_LFPlayerFilter: " << host_set_LFPlayerFilter);
529 ROS_INFO_STREAM(
"host_set_LFPintervalFilter: " << host_set_LFPintervalFilter);
531 ROS_INFO_STREAM(
"msgpack_validator_enabled: " << msgpack_validator_enabled);
532 ROS_INFO_STREAM(
"msgpack_validator_verbose: " << msgpack_validator_verbose);
533 ROS_INFO_STREAM(
"msgpack_validator_discard_msgpacks_out_of_bounds: " << msgpack_validator_discard_msgpacks_out_of_bounds);
534 ROS_INFO_STREAM(
"msgpack_validator_check_missing_scandata_interval: " << msgpack_validator_check_missing_scandata_interval);
536 ROS_INFO_STREAM(
"msgpack_validator_azimuth_start: " << msgpack_validator_filter_settings.msgpack_validator_azimuth_start <<
" [rad]");
537 ROS_INFO_STREAM(
"msgpack_validator_azimuth_end: " << msgpack_validator_filter_settings.msgpack_validator_azimuth_end <<
" [rad]");
538 ROS_INFO_STREAM(
"msgpack_validator_elevation_start: " << msgpack_validator_filter_settings.msgpack_validator_elevation_start <<
" [rad]");
539 ROS_INFO_STREAM(
"msgpack_validator_elevation_end: " << msgpack_validator_filter_settings.msgpack_validator_elevation_end <<
" [rad]");