68 #define SCANSEGMENT_XD_SOPAS_ARGS_BIG_ENDIAN (true) // Arguments of SOPAS commands are big endian encoded
71 : m_common_tcp(common_tcp), m_cola_binary(true)
73 bool srvSupportColaMsg =
true, srvSupportECRChangeArr =
true, srvSupportLIDoutputstate =
true, srvSupportSCdevicestate =
true;
74 bool srvSupportSCreboot =
true, srvSupportSCsoftreset =
true, srvSupportSickScanExit =
true;
75 bool srvSupportGetContaminationResult =
false;
81 srvSupportECRChangeArr =
false;
82 srvSupportLIDoutputstate =
false;
83 srvSupportSCreboot =
false;
84 srvSupportSCsoftreset =
false;
90 srvSupportGetContaminationResult =
true;
101 #if __ROS_VERSION == 2
102 #define serviceCbColaMsgROS sick_scan_xd::SickScanServices::serviceCbColaMsgROS2
103 #define serviceCbECRChangeArrROS sick_scan_xd::SickScanServices::serviceCbECRChangeArrROS2
104 #define serviceCbLIDoutputstateROS sick_scan_xd::SickScanServices::serviceCbLIDoutputstateROS2
105 #define serviceCbSCdevicestateROS sick_scan_xd::SickScanServices::serviceCbSCdevicestateROS2
106 #define serviceCbSCrebootROS sick_scan_xd::SickScanServices::serviceCbSCrebootROS2
107 #define serviceCbSCsoftresetROS sick_scan_xd::SickScanServices::serviceCbSCsoftresetROS2
108 #define serviceCbSickScanExitROS sick_scan_xd::SickScanServices::serviceCbSickScanExitROS2
109 #define serviceCbGetContaminationResultROS sick_scan_xd::SickScanServices::serviceCbGetContaminationResultROS2
110 #define serviceCbFieldSetReadROS sick_scan_xd::SickScanServices::serviceCbFieldSetReadROS2
111 #define serviceCbFieldSetWriteROS sick_scan_xd::SickScanServices::serviceCbFieldSetWriteROS2
113 #define serviceCbColaMsgROS sick_scan_xd::SickScanServices::serviceCbColaMsg
114 #define serviceCbECRChangeArrROS sick_scan_xd::SickScanServices::serviceCbECRChangeArr
115 #define serviceCbLIDoutputstateROS sick_scan_xd::SickScanServices::serviceCbLIDoutputstate
116 #define serviceCbSCdevicestateROS sick_scan_xd::SickScanServices::serviceCbSCdevicestate
117 #define serviceCbSCrebootROS sick_scan_xd::SickScanServices::serviceCbSCreboot
118 #define serviceCbSCsoftresetROS sick_scan_xd::SickScanServices::serviceCbSCsoftreset
119 #define serviceCbSickScanExitROS sick_scan_xd::SickScanServices::serviceCbSickScanExit
120 #define serviceCbGetContaminationResultROS sick_scan_xd::SickScanServices::serviceCbGetContaminationResult
121 #define serviceCbFieldSetReadROS sick_scan_xd::SickScanServices::serviceCbFieldSetRead
122 #define serviceCbFieldSetWriteROS sick_scan_xd::SickScanServices::serviceCbFieldSetWrite
124 #if __ROS_VERSION == 1
125 #define printServiceCreated(a,b) ROS_INFO_STREAM("SickScanServices: service \"" << a.getService() << "\" created (\"" << b.getService() << "\")");
126 #elif __ROS_VERSION == 2
127 #define printServiceCreated(a,b) ROS_INFO_STREAM("SickScanServices: service \"" << a->get_service_name() << "\" created (\"" << b->get_service_name() << "\")");
129 #define printServiceCreated(a,b)
131 if(srvSupportColaMsg)
137 if(srvSupportECRChangeArr)
143 if(srvSupportGetContaminationResult)
149 if(srvSupportLIDoutputstate)
155 if(srvSupportSCdevicestate)
161 if(srvSupportSCreboot)
167 if(srvSupportSCsoftreset)
173 if(srvSupportSickScanExit)
179 #if __ROS_VERSION > 0
211 ROS_INFO_STREAM(
"SickScanServices: Sending request \"" << sopasCmd <<
"\"");
212 std::string sopasRequest = std::string(
"\x02") + sopasCmd +
"\x03";
216 std::vector<unsigned char> reqBinary;
217 m_common_tcp->convertAscii2BinaryCmd(sopasRequest.c_str(), &reqBinary);
218 result = m_common_tcp->sendSopasAndCheckAnswer(reqBinary, &sopasReplyBin, -1);
222 result = m_common_tcp->sendSopasAndCheckAnswer(sopasRequest.c_str(), &sopasReplyBin, -1);
226 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasAndCheckAnswer: error sending sopas command \"" << sopasCmd <<
"\"");
230 sopasReplyString = m_common_tcp->sopasReplyToString(sopasReplyBin);
231 ROS_INFO_STREAM(
"SickScanServices: Request \"" << sopasCmd <<
"\" successfully sent, received reply \"" << sopasReplyString <<
"\"");
237 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasAndCheckAnswer: m_common_tcp not initialized");
250 std::string sopasCmd = service_request.request;
251 std::vector<unsigned char> sopasReplyBin;
252 std::string sopasReplyString;
254 if(!sendSopasAndCheckAnswer(sopasCmd, sopasReplyBin, sopasReplyString))
256 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasAndCheckAnswer failed on sending command\"" << sopasCmd <<
"\"");
261 ROS_INFO_STREAM(
"SickScanServices: response: \"" << sopasReplyString <<
"\"");
263 service_response.response = sopasReplyString;
276 std::string sopasCmd = std::string(
"sEN ECRChangeArr ") + (service_request.active ?
"1" :
"0");
277 std::vector<unsigned char> sopasReplyBin;
278 std::string sopasReplyString;
280 service_response.success =
false;
281 if(!sendSopasAndCheckAnswer(sopasCmd, sopasReplyBin, sopasReplyString))
283 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasAndCheckAnswer failed on sending command\"" << sopasCmd <<
"\"");
286 service_response.success =
true;
289 ROS_INFO_STREAM(
"SickScanServices: response: \"" << sopasReplyString <<
"\"");
302 std::string sopasCmd = std::string(
"sRN ContaminationResult");
303 std::vector<unsigned char> sopasReplyBin;
304 std::string sopasReplyString;
306 service_response.success =
false;
307 service_response.warning = 0;
308 service_response.error = 0;
309 if(!sendSopasAndCheckAnswer(sopasCmd, sopasReplyBin, sopasReplyString))
311 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasAndCheckAnswer failed on sending command\"" << sopasCmd <<
"\"");
314 service_response.success =
true;
316 std::string response_str((
char*)sopasReplyBin.data(), sopasReplyBin.size());
317 std::size_t state_pos = response_str.find(
"ContaminationResult");
319 if (state_pos != std::string::npos && state_pos + result_idx < sopasReplyBin.size())
321 uint8_t result_byte = sopasReplyBin[state_pos + result_idx];
322 result_byte = ((result_byte >=
'0') ? (result_byte -
'0') : (result_byte));
323 service_response.warning = result_byte;
325 if (result_idx < sopasReplyBin.size() && sopasReplyBin[state_pos + result_idx] ==
' ')
327 if (result_idx < sopasReplyBin.size())
329 result_byte = sopasReplyBin[state_pos + result_idx];
330 result_byte = ((result_byte >=
'0') ? (result_byte -
'0') : (result_byte));
331 service_response.error = result_byte;
336 <<
" (response.success=" << (
int)(service_response.success) <<
", response.warning=" << (
int)(service_response.warning) <<
", response.error=" << (
int)(service_response.error) <<
")");
351 std::string sopasCmd = std::string(
"sEN LIDoutputstate ") + (service_request.active ?
"1" :
"0");
352 std::vector<unsigned char> sopasReplyBin;
353 std::string sopasReplyString;
355 service_response.success =
false;
356 if(!sendSopasAndCheckAnswer(sopasCmd, sopasReplyBin, sopasReplyString))
358 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasAndCheckAnswer failed on sending command\"" << sopasCmd <<
"\"");
361 service_response.success =
true;
364 ROS_INFO_STREAM(
"SickScanServices: response: \"" << sopasReplyString <<
"\"");
374 std::string sopasCmd = std::string(
"sMN SetAccessMode 3 ") + m_client_authorization_pw;
375 std::vector<unsigned char> sopasReplyBin;
376 std::string sopasReplyString;
378 if(!sendSopasAndCheckAnswer(sopasCmd, sopasReplyBin, sopasReplyString))
380 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasAndCheckAnswer failed on sending command\"" << sopasCmd <<
"\"");
385 ROS_INFO_STREAM(
"SickScanServices: response: \"" << sopasReplyString <<
"\"");
395 std::string sopasCmd = std::string(
"sMN Run");
396 std::vector<unsigned char> sopasReplyBin;
397 std::string sopasReplyString;
399 if(!sendSopasAndCheckAnswer(sopasCmd, sopasReplyBin, sopasReplyString))
401 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasAndCheckAnswer failed on sending command\"" << sopasCmd <<
"\"");
406 ROS_INFO_STREAM(
"SickScanServices: response: \"" << sopasReplyString <<
"\"");
416 std::vector<unsigned char> sopasReplyBin;
417 std::string sopasReplyString;
418 if(!sendSopasAndCheckAnswer(sopas_request, sopasReplyBin, sopasReplyString))
420 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasCmdCheckResponse() failed on sending command\"" << sopas_request <<
"\"");
423 ROS_INFO_STREAM(
"SickScanServices::sendSopasCmdCheckResponse(): request: \"" << sopas_request <<
"\", response: \"" << sopasReplyString <<
"\"");
424 if(sopasReplyString.find(expected_response) == std::string::npos)
426 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasCmdCheckResponse(): request: \"" << sopas_request <<
"\", unexpected response: \"" << sopasReplyString <<
"\", \"" << expected_response <<
"\" not found");
432 #if defined SCANSEGMENT_XD_SUPPORT && SCANSEGMENT_XD_SUPPORT > 0
433 static void printPicoScanImuDisabledWarning()
440 ROS_WARN_STREAM(
"## If you are using a picoScan150 w/o addons, disable the IMU by setting option \"imu_enable\" to \"False\" in your launchfile, or use sick_picoscan_single_echo.launch to avoid this error");
441 ROS_WARN_STREAM(
"## If you are using a picoScan with IMU, check IMU settings with SOPAS Air");
455 bool sick_scan_xd::SickScanServices::sendMultiScanStartCmd(
const std::string& hostname,
int port,
const std::string& scanner_type,
int scandataformat,
bool& imu_enable,
int imu_udp_port,
int performanceprofilenumber,
bool check_udp_receiver_ip,
int check_udp_receiver_port)
458 std::stringstream ip_stream(hostname);
459 std::string ip_token;
460 std::vector<std::string> ip_tokens;
461 while (getline(ip_stream, ip_token,
'.'))
463 ip_tokens.push_back(ip_token);
465 if (ip_tokens.size() != 4)
467 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiScanStartCmd() failed: can't split ip address \"" << hostname <<
"\" into 4 tokens, check ip address.");
468 ROS_ERROR_STREAM(
"## ERROR parsing ip address, check configuration of parameter udp_receiver_ip=\"" << hostname <<
"\" (launch file or commandline option).");
469 ROS_ERROR_STREAM(
"## Parameter \"udp_receiver_ip\" should be the IPv4 address like 192.168.0.x of the system running sick_scan_xd.");
473 std::string check_udp_receiver_msg =
"sick_scan_xd udp test message verifying udp_receiver_ip";
474 if (check_udp_receiver_ip && !check_udp_receiver_msg.empty())
477 std::string check_udp_receiver_response;
478 if (!udp_loopback_poster.Post(check_udp_receiver_msg, check_udp_receiver_response) || check_udp_receiver_msg != check_udp_receiver_response)
480 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiScanStartCmd() failed to send and receive a UDP test messsage to " << hostname <<
":" << check_udp_receiver_port);
481 ROS_ERROR_STREAM(
"## Check configuration of parameter udp_receiver_ip=\"" << hostname <<
"\" (launch file or commandline option).");
482 ROS_ERROR_STREAM(
"## Parameter \"udp_receiver_ip\" should be the IPv4 address like 192.168.0.x of the system running sick_scan_xd.");
487 ROS_DEBUG_STREAM(
"SickScanServices::sendMultiScanStartCmd(): UDP test message \"" << check_udp_receiver_response <<
"\" successfully received.");
488 ROS_INFO_STREAM(
"SickScanServices::sendMultiScanStartCmd(): UDP test message successfully send to " << hostname <<
":" << check_udp_receiver_port <<
", parameter udp_receiver_ip=\"" << hostname <<
"\" is valid.");
492 std::stringstream eth_settings_cmd, imu_eth_settings_cmd, scandataformat_cmd, performanceprofilenumber_cmd;
493 scandataformat_cmd <<
"sWN ScanDataFormat " << scandataformat;
494 if (performanceprofilenumber >= 0)
496 performanceprofilenumber_cmd <<
"sWN PerformanceProfileNumber " << std::uppercase << std::hex << performanceprofilenumber;
498 eth_settings_cmd <<
"sWN ScanDataEthSettings 1";
499 imu_eth_settings_cmd <<
"sWN ImuDataEthSettings 1";
500 for (
int i = 0; i < ip_tokens.size(); i++)
502 eth_settings_cmd <<
" +";
503 eth_settings_cmd << ip_tokens[i];
504 imu_eth_settings_cmd <<
" +";
505 imu_eth_settings_cmd << ip_tokens[i];
507 eth_settings_cmd <<
" +";
508 eth_settings_cmd << port;
509 imu_eth_settings_cmd <<
" +";
510 imu_eth_settings_cmd << imu_udp_port;
511 if (!sendSopasCmdCheckResponse(eth_settings_cmd.str(),
"sWA ScanDataEthSettings"))
513 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiScanStartCmd(): sendSopasCmdCheckResponse(\"sWN ScanDataEthSettings 1\") failed.");
516 if (scandataformat != 1 && scandataformat != 2)
518 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiscanStartCmd(): invalid scandataformat configuration, unsupported scandataformat=" << scandataformat <<
", check configuration and use 1 for msgpack or 2 for compact data");
521 if (!sendSopasCmdCheckResponse(scandataformat_cmd.str(),
"sWA ScanDataFormat"))
523 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiscanStartCmd(): sendSopasCmdCheckResponse(\"sWN ScanDataFormat 1\") failed.");
526 if (performanceprofilenumber >= 0)
528 if (!sendSopasCmdCheckResponse(performanceprofilenumber_cmd.str(),
"sWA PerformanceProfileNumber"))
530 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiscanStartCmd(): sendSopasCmdCheckResponse(\"sWN PerformanceProfileNumber ..\") failed.");
536 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiscanStartCmd(): sendSopasCmdCheckResponse(\"sWN ScanDataPreformatting 1\") failed.");
539 if (imu_enable && !sendSopasCmdCheckResponse(imu_eth_settings_cmd.str(),
"sWA ImuDataEthSettings"))
545 ROS_WARN_STREAM(
"## WARNING SickScanServices::sendMultiScanStartCmd(): sendSopasCmdCheckResponse(\"" << imu_eth_settings_cmd.str() <<
"\") failed.");
546 printPicoScanImuDisabledWarning();
551 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiScanStartCmd(): sendSopasCmdCheckResponse(\"" << imu_eth_settings_cmd.str() <<
"\") failed.");
558 if (!sendAuthorization())
562 if (!sendSopasCmdCheckResponse(
"sWN ScanDataEnable 1",
"sWA ScanDataEnable"))
564 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiScanStartCmd(): sendSopasCmdCheckResponse(\"sWN ScanDataEnable 1\") failed.");
567 if (imu_enable && !sendSopasCmdCheckResponse(
"sWN ImuDataEnable 1",
"sWA ImuDataEnable"))
573 ROS_WARN_STREAM(
"## WARNING SickScanServices::sendMultiScanStartCmd(): sendSopasCmdCheckResponse(\"sWN ImuDataEnable 1\") failed.");
574 printPicoScanImuDisabledWarning();
579 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiScanStartCmd(): sendSopasCmdCheckResponse(\"sWN ImuDataEnable 1\") failed.");
586 if (!sendAuthorization())
590 if (!sendSopasCmdCheckResponse(
"sMN LMCstartmeas",
"sAN LMCstartmeas"))
592 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiScanStartCmd(): sendSopasCmdCheckResponse(\"sMN LMCstartmeas\") failed.");
597 #endif // SCANSEGMENT_XD_SUPPORT
599 #if defined SCANSEGMENT_XD_SUPPORT && SCANSEGMENT_XD_SUPPORT > 0
603 bool sick_scan_xd::SickScanServices::sendMultiScanStopCmd(
bool imu_enable)
605 if (!sendSopasCmdCheckResponse(
"sWN ScanDataEnable 0",
"sWA ScanDataEnable"))
607 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiScanStopCmd(): sendSopasCmdCheckResponse(\"sWN ScanDataEnable 0\") failed.");
610 if (imu_enable && !sendSopasCmdCheckResponse(
"sWN ImuDataEnable 0",
"sWA ImuDataEnable"))
612 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendMultiScanStopCmd(): sendSopasCmdCheckResponse(\"sWN ImuDataEnable 0\") failed.");
621 #endif // SCANSEGMENT_XD_SUPPORT
641 if(hexStrIsBigEndian)
643 for(
int m = 3, n = 1; n < hex_str.size(); n+=2, m--)
645 char hexval[4] = { hex_str[n-1], hex_str[n],
'\0',
'\0' };
646 hex_buffer.
u8_bytes[m] = (uint8_t)(std::strtoul(hexval,
NULL, 16) & 0xFF);
651 for(
int m = 0, n = 1; n < hex_str.size(); n+=2, m++)
653 char hexval[4] = { hex_str[n-1], hex_str[n],
'\0',
'\0' };
654 hex_buffer.
u8_bytes[m] = (uint8_t)(std::strtoul(hexval,
NULL, 16) & 0xFF);
658 return hex_buffer.
value;
671 hex_buffer.
value = value;
672 std::stringstream hex_str;
673 if(hexStrIsBigEndian)
675 for(
int n = 3; n >= 0; n--)
676 hex_str << std::setfill(
'0') << std::setw(2) << std::uppercase << std::hex << (int)(hex_buffer.
u8_bytes[n]);
680 for(
int n = 0; n < 4; n++)
681 hex_str << std::setfill(
'0') << std::setw(2) << std::uppercase << std::hex << (int)(hex_buffer.
u8_bytes[n]);
684 return hex_str.str();
692 char hex_str_8byte[9] =
"00000000";
693 for(
int m=7,n=hex_str.size()-1; n >= 0; m--,n--)
694 hex_str_8byte[m] = hex_str[n];
696 if(hexStrIsBigEndian)
698 for(
int m = 3, n = 1; n < 8; n+=2, m--)
700 char hexval[4] = { hex_str_8byte[n-1], hex_str_8byte[n],
'\0',
'\0' };
701 hex_buffer.
u8_bytes[m] = (uint8_t)(std::strtoul(hexval,
NULL, 16) & 0xFF);
706 for(
int m = 0, n = 1; n < 8; n+=2, m++)
708 char hexval[4] = { hex_str_8byte[n-1], hex_str_8byte[n],
'\0',
'\0' };
709 hex_buffer.
u8_bytes[m] = (uint8_t)(std::strtoul(hexval,
NULL, 16) & 0xFF);
712 float angle_deg = (float)(hex_buffer.
i32_bytes / 10000.0);
722 int32_t angle_val = (int32_t)std::round(angle_deg * 10000.0
f);
725 std::stringstream hex_str;
726 if(hexStrIsBigEndian)
728 for(
int n = 3; n >= 0; n--)
729 hex_str << std::setfill(
'0') << std::setw(2) << std::uppercase << std::hex << (int)(hex_buffer.
u8_bytes[n]);
733 for(
int n = 0; n < 4; n++)
734 hex_str << std::setfill(
'0') << std::setw(2) << std::uppercase << std::hex << (int)(hex_buffer.
u8_bytes[n]);
737 return hex_str.str();
740 #if defined SCANSEGMENT_XD_SUPPORT && SCANSEGMENT_XD_SUPPORT > 0
748 bool sick_scan_xd::SickScanServices::queryMultiScanFiltersettings(
int& host_FREchoFilter, std::string& host_LFPangleRangeFilter, std::string& host_LFPlayerFilter,
751 std::vector<std::vector<unsigned char>> sopasRepliesBin;
752 std::vector<std::string> sopasRepliesString;
755 bool enableFREchoFilter =
true, enableLFPangleRangeFilter =
true, enableLFPlayerFilter =
true;
759 enableLFPlayerFilter =
false;
761 std::vector<std::string> sopasCommands;
762 if (enableFREchoFilter)
763 sopasCommands.push_back(
"FREchoFilter");
764 if (enableLFPangleRangeFilter)
765 sopasCommands.push_back(
"LFPangleRangeFilter");
766 if (enableLFPlayerFilter)
767 sopasCommands.push_back(
"LFPlayerFilter");
768 for(
int n = 0; n < sopasCommands.size(); n++)
770 std::string sopasRequest =
"sRN " + sopasCommands[n];
771 std::string sopasExpectedResponse =
"sRA " + sopasCommands[n];
772 std::vector<unsigned char> sopasReplyBin;
773 std::string sopasReplyString;
774 if(!sendSopasAndCheckAnswer(sopasRequest, sopasReplyBin, sopasReplyString) || sopasReplyString.find(sopasExpectedResponse) == std::string::npos)
776 ROS_ERROR_STREAM(
"## ERROR SickScanServices::queryMultiScanFiltersettings(): sendSopasAndCheckAnswer(\"" << sopasRequest <<
"\") failed or unexpected response: \"" << sopasReplyString <<
"\", expected: \"" << sopasExpectedResponse <<
"\"");
779 ROS_DEBUG_STREAM(
"SickScanServices::queryMultiScanFiltersettings(): request: \"" << sopasRequest <<
"\", response: \"" << sopasReplyString <<
"\"");
780 sopasRepliesBin.push_back(sopasReplyBin);
781 sopasRepliesString.push_back(sopasReplyString);
785 std::vector<std::vector<std::string>> sopasTokens;
786 for(
int n = 0; n < sopasCommands.size(); n++)
788 std::string parameterString = sopasRepliesString[n].substr(4 + sopasCommands[n].size() + 1);
789 std::vector<std::string> parameterToken;
791 sopasTokens.push_back(parameterToken);
795 std::vector<float> multiscan_angles_deg;
796 std::vector<int> layer_active_vector;
797 for(
int sopasCommandCnt = 0; sopasCommandCnt < sopasCommands.size(); sopasCommandCnt++)
799 const std::string& sopasCommand = sopasCommands[sopasCommandCnt];
800 const std::vector<std::string>& sopasToken = sopasTokens[sopasCommandCnt];
802 if (sopasCommand ==
"FREchoFilter")
804 if(sopasToken.size() == 1)
806 host_FREchoFilter = std::stoi(sopasToken[0]);
810 ROS_ERROR_STREAM(
"## ERROR SickScanServices::queryMultiScanFiltersettings(): parse error in FREchoFilter");
815 if (sopasCommand ==
"LFPangleRangeFilter")
817 if(sopasToken.size() == 6)
819 std::stringstream parameter;
820 int filter_enabled = std::stoi(sopasToken[0]);
821 parameter << filter_enabled;
822 for(
int n = 1; n < 5; n++)
826 parameter <<
" " << angle_deg;
828 multiscan_angles_deg.push_back(angle_deg);
830 parameter <<
" " << sopasToken[5];
831 host_LFPangleRangeFilter = parameter.str();
835 ROS_ERROR_STREAM(
"## ERROR SickScanServices::queryMultiScanFiltersettings(): parse error in LFPangleRangeFilter");
840 if (sopasCommand ==
"LFPlayerFilter")
842 if(sopasToken.size() == 17)
844 std::stringstream parameter;
845 int filter_enabled = std::stoi(sopasToken[0]);
846 parameter << filter_enabled;
847 for(
int n = 1; n < sopasToken.size(); n++)
849 int layer_active = std::stoi(sopasToken[n]);
851 layer_active_vector.push_back(layer_active);
852 parameter <<
" " << layer_active;
854 host_LFPlayerFilter = parameter.str();
858 ROS_ERROR_STREAM(
"## ERROR SickScanServices::queryMultiScanFiltersettings(): parse error in LFPlayerFilter");
866 if(host_FREchoFilter == 0 || host_FREchoFilter == 2)
870 else if(host_FREchoFilter == 1)
876 ROS_ERROR_STREAM(
"## ERROR SickScanServices::queryMultiScanFiltersettings(): unexpected value of FREchoFilter = " << host_FREchoFilter
877 <<
", expected 0: FIRST_ECHO (EchoCount=1), 1: ALL_ECHOS (EchoCount=3) or 2: LAST_ECHO (EchoCount=1)");
880 if(multiscan_angles_deg.size() == 4)
887 if(layer_active_vector.size() == 16)
894 ROS_INFO_STREAM(
"SickScanServices::queryMultiScanFiltersettings(): sopas.FREchoFilter = \"" << host_FREchoFilter
895 <<
"\", sopas.LFPangleRangeFilter = \"" << host_LFPangleRangeFilter
896 <<
"\", sopas.LFPlayerFilter = \"" << host_LFPlayerFilter <<
"\"");
903 #endif // SCANSEGMENT_XD_SUPPORT
905 #if defined SCANSEGMENT_XD_SUPPORT && SCANSEGMENT_XD_SUPPORT > 0
913 bool sick_scan_xd::SickScanServices::writeMultiScanFiltersettings(
int host_FREchoFilter,
const std::string& host_LFPangleRangeFilter,
const std::string& host_LFPlayerFilter,
const std::string& host_LFPintervalFilter,
const std::string& scanner_type)
916 bool enableFREchoFilter =
true, enableLFPangleRangeFilter =
true, enableLFPlayerFilter =
true, enableLFPintervalFilter =
true;
920 enableLFPlayerFilter =
false;
925 if(enableFREchoFilter && host_FREchoFilter >= 0)
927 std::string sopasRequest =
"sWN FREchoFilter " + std::to_string(host_FREchoFilter), sopasExpectedResponse =
"sWA FREchoFilter";
928 if (!sendSopasCmdCheckResponse(sopasRequest, sopasExpectedResponse))
930 ROS_ERROR_STREAM(
"## ERROR SickScanServices::writeMultiScanFiltersettings(): sendSopasCmdCheckResponse(\"" << sopasRequest <<
"\") failed.");
936 if(enableLFPangleRangeFilter && !host_LFPangleRangeFilter.empty())
939 std::vector<std::string> parameter_token;
941 if(parameter_token.size() != 6)
943 ROS_ERROR_STREAM(
"## ERROR SickScanServices::writeMultiScanFiltersettings(): can't split host_LFPangleRangeFilter = \"" << host_LFPangleRangeFilter <<
"\", expected 6 values separated by space");
944 ROS_ERROR_STREAM(
"## ERROR SickScanServices::writeMultiScanFiltersettings() failed.");
947 int filter_enabled = std::stoi(parameter_token[0]);
948 std::vector<float> angle_deg;
949 for(
int n = 1; n < 5; n++)
950 angle_deg.push_back(std::stof(parameter_token[n]));
951 int beam_increment = std::stoi(parameter_token[5]);
952 std::stringstream sopas_parameter;
953 sopas_parameter << filter_enabled;
954 for(
int n = 0; n < angle_deg.size(); n++)
959 sopas_parameter <<
" " << beam_increment;
961 std::string sopasRequest =
"sWN LFPangleRangeFilter " + sopas_parameter.str(), sopasExpectedResponse =
"sWA LFPangleRangeFilter";
962 if (!sendSopasCmdCheckResponse(sopasRequest, sopasExpectedResponse))
964 ROS_ERROR_STREAM(
"## ERROR SickScanServices::writeMultiScanFiltersettings(): sendSopasCmdCheckResponse(\"" << sopasRequest <<
"\") failed.");
970 if(enableLFPlayerFilter && !host_LFPlayerFilter.empty())
972 std::string sopasRequest =
"sWN LFPlayerFilter " + host_LFPlayerFilter, sopasExpectedResponse =
"sWA LFPlayerFilter";
973 if (!sendSopasCmdCheckResponse(sopasRequest, sopasExpectedResponse))
975 ROS_ERROR_STREAM(
"## ERROR SickScanServices::writeMultiScanFiltersettings(): sendSopasCmdCheckResponse(\"" << sopasRequest <<
"\") failed.");
981 if(enableLFPintervalFilter && !host_LFPintervalFilter.empty())
983 std::string sopasRequest =
"sWN LFPintervalFilter " + host_LFPintervalFilter, sopasExpectedResponse =
"sWA LFPintervalFilter";
984 if (!sendSopasCmdCheckResponse(sopasRequest, sopasExpectedResponse))
986 ROS_ERROR_STREAM(
"## ERROR SickScanServices::writeMultiScanFiltersettings(): sendSopasCmdCheckResponse(\"" << sopasRequest <<
"\") failed.");
992 if (!sendSopasCmdCheckResponse(
"sMN Run",
"sAN Run"))
994 ROS_ERROR_STREAM(
"## ERROR SickScanServices::writeMultiScanFiltersettings(): sendSopasCmdCheckResponse(\"sMN Run\") failed.");
999 #endif // SCANSEGMENT_XD_SUPPORT
1009 std::string sopasCmd = std::string(
"sRN SCdevicestate");
1010 std::vector<unsigned char> sopasReplyBin;
1011 std::string sopasReplyString;
1013 service_response.success =
false;
1014 service_response.state = 2;
1015 if(!sendSopasAndCheckAnswer(sopasCmd, sopasReplyBin, sopasReplyString))
1017 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasAndCheckAnswer failed on sending command\"" << sopasCmd <<
"\"");
1020 service_response.success =
true;
1022 std::string response_str((
char*)sopasReplyBin.data(), sopasReplyBin.size());
1023 std::size_t state_pos = response_str.find(
"SCdevicestate");
1024 if (state_pos != std::string::npos && state_pos + 14 < sopasReplyBin.size())
1026 uint8_t state_byte = sopasReplyBin[state_pos + 14];
1027 if(state_byte >=
'0')
1029 service_response.state = state_byte;
1039 std::string sopasCmd = std::string(
"sMN mSCreboot");
1040 std::vector<unsigned char> sopasReplyBin;
1041 std::string sopasReplyString;
1043 service_response.success =
false;
1044 if(!sendAuthorization())
1046 ROS_ERROR_STREAM(
"## ERROR SickScanServices: sendAuthorization failed for command\"" << sopasCmd <<
"\"");
1050 if(!sendSopasAndCheckAnswer(sopasCmd, sopasReplyBin, sopasReplyString))
1052 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasAndCheckAnswer failed on sending command\"" << sopasCmd <<
"\"");
1057 ROS_INFO_STREAM(
"SickScanServices: response: \"" << sopasReplyString <<
"\"");
1061 ROS_ERROR_STREAM(
"## ERROR SickScanServices: sendRun failed for command\"" << sopasCmd <<
"\"");
1064 service_response.success =
true;
1071 std::string sopasCmd = std::string(
"sMN mSCsoftreset");
1072 std::vector<unsigned char> sopasReplyBin;
1073 std::string sopasReplyString;
1075 service_response.success =
false;
1076 if(!sendAuthorization())
1078 ROS_ERROR_STREAM(
"## ERROR SickScanServices: sendAuthorization failed for command\"" << sopasCmd <<
"\"");
1082 if(!sendSopasAndCheckAnswer(sopasCmd, sopasReplyBin, sopasReplyString))
1084 ROS_ERROR_STREAM(
"## ERROR SickScanServices::sendSopasAndCheckAnswer failed on sending command\"" << sopasCmd <<
"\"");
1089 ROS_INFO_STREAM(
"SickScanServices: response: \"" << sopasReplyString <<
"\"");
1093 ROS_ERROR_STREAM(
"## ERROR SickScanServices: sendRun failed for command\"" << sopasCmd <<
"\"");
1096 service_response.success =
true;
1134 #if __ROS_VERSION > 0
1135 bool sick_scan_xd::SickScanServices::serviceCbFieldSetRead(sick_scan_srv::FieldSetReadSrv::Request &service_request, sick_scan_srv::FieldSetReadSrv::Response &service_response)
1140 std::vector<unsigned char> sopasReply;
1141 int result1 = m_common_tcp->readFieldSetSelectionMethod(field_set_selection_method, sopasReply);
1142 int result2 = m_common_tcp->readActiveFieldSet(active_field_set, sopasReply);
1144 service_response.field_set_selection_method = field_set_selection_method;
1145 service_response.active_field_set = active_field_set;
1149 bool sick_scan_xd::SickScanServices::serviceCbFieldSetWrite(sick_scan_srv::FieldSetWriteSrv::Request &service_request, sick_scan_srv::FieldSetWriteSrv::Response &service_response)
1151 int field_set_selection_method = service_request.field_set_selection_method_in;
1152 int active_field_set = service_request.active_field_set_in;
1153 std::vector<unsigned char> sopasReply;
1155 if (field_set_selection_method >= 0)
1157 result1 = m_common_tcp->writeFieldSetSelectionMethod(field_set_selection_method, sopasReply);
1159 if (active_field_set >= 0)
1161 result2 = m_common_tcp->writeActiveFieldSet(active_field_set, sopasReply);
1163 int result3 = m_common_tcp->readFieldSetSelectionMethod(field_set_selection_method, sopasReply);
1164 int result4 = m_common_tcp->readActiveFieldSet(active_field_set, sopasReply);
1166 service_response.field_set_selection_method = field_set_selection_method;
1167 service_response.active_field_set = active_field_set;
1168 service_response.success =
true;