2727// POSSIBILITY OF SUCH DAMAGE.
2828
2929#include < mutex>
30+ #include < rclcpp/logger.hpp>
31+ #include < rclcpp/logging.hpp>
3032#include < ur_robot_driver/robot_state_helper.hpp>
3133
3234#include " rclcpp/rclcpp.hpp"
@@ -66,6 +68,7 @@ RobotStateHelper::RobotStateHelper(const rclcpp::Node::SharedPtr& node)
6668 node->declare_parameter (" headless_mode" , false );
6769 headless_mode_ = node->get_parameter (" headless_mode" ).as_bool ();
6870
71+ <<<<<<< HEAD
6972 // Service to unlock protective stop
7073 unlock_protective_stop_srv_ = node_->create_client <std_srvs::srv::Trigger>(
7174 " dashboard_client/unlock_protective_stop" , rmw_qos_profile_services_default, service_cb_grp_);
@@ -88,6 +91,29 @@ RobotStateHelper::RobotStateHelper(const rclcpp::Node::SharedPtr& node)
8891 play_program_srv_ = node_->create_client <std_srvs::srv::Trigger>(" dashboard_client/play" ,
8992 rmw_qos_profile_services_default, service_cb_grp_);
9093 play_program_srv_->wait_for_service ();
94+ =======
95+ node->declare_parameter (" robot_ip" , " 192.168.56.101" );
96+ robot_ip_ = node->get_parameter (" robot_ip" ).as_string ();
97+
98+ primary_client_ = std::make_shared<urcl::primary_interface::PrimaryClient>(robot_ip_, notifier_);
99+
100+ primary_client_->start (0 , std::chrono::seconds (10 ));
101+ auto robot_version = primary_client_->getRobotVersion ();
102+
103+ if (robot_version->major > 5 ) {
104+ RCLCPP_WARN (rclcpp::get_logger (" robot_state_helper" ), " Running on a PolyScopeX robot. The dashboard server is not "
105+ " available, therefore the robot_state_helper cannot start "
106+ " PolyScope programs and restart the safety." );
107+ } else {
108+ // Service to restart safety
109+ restart_safety_srv_ = node_->create_client <std_srvs::srv::Trigger>(
110+ " dashboard_client/restart_safety" , rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
111+ // Service to start UR program execution on the robot
112+ play_program_srv_ = node_->create_client <std_srvs::srv::Trigger>(
113+ " dashboard_client/play" , rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
114+ play_program_srv_->wait_for_service ();
115+ }
116+ >>>>>>> 5162bf4 (Support PolyScopeX robots (#1318 ))
91117
92118 resend_robot_program_srv_ = node_->create_client <std_srvs::srv::Trigger>(
93119 " io_and_status_controller/resend_robot_program" , rmw_qos_profile_services_default, service_cb_grp_);
@@ -136,7 +162,13 @@ bool RobotStateHelper::recoverFromSafety()
136162{
137163 switch (safety_mode_) {
138164 case urcl::SafetyMode::PROTECTIVE_STOP:
139- return safeDashboardTrigger (this ->unlock_protective_stop_srv_ );
165+ try {
166+ primary_client_->commandUnlockProtectiveStop ();
167+ } catch (const urcl::UrException& e) {
168+ RCLCPP_WARN_STREAM (rclcpp::get_logger (" robot_state_helper" ), e.what ());
169+ return false ;
170+ }
171+ return true ;
140172 case urcl::SafetyMode::SYSTEM_EMERGENCY_STOP:;
141173 case urcl::SafetyMode::ROBOT_EMERGENCY_STOP:
142174 RCLCPP_WARN_STREAM (rclcpp::get_logger (" robot_state_helper" ), " The robot is currently in safety mode."
@@ -145,7 +177,11 @@ bool RobotStateHelper::recoverFromSafety()
145177 return false ;
146178 case urcl::SafetyMode::VIOLATION:;
147179 case urcl::SafetyMode::FAULT:
148- return safeDashboardTrigger (this ->restart_safety_srv_ );
180+ if (restart_safety_srv_ != nullptr ) {
181+ return safeDashboardTrigger (this ->restart_safety_srv_ );
182+ } else {
183+ return false ;
184+ }
149185 default :
150186 // nothing to do
151187 RCLCPP_DEBUG_STREAM (rclcpp::get_logger (" robot_state_helper" ), " No safety recovery needed." );
@@ -155,15 +191,22 @@ bool RobotStateHelper::recoverFromSafety()
155191
156192bool RobotStateHelper::jumpToRobotMode (const urcl::RobotMode target_mode)
157193{
158- switch (target_mode) {
159- case urcl::RobotMode::POWER_OFF:
160- return safeDashboardTrigger (this ->power_off_srv_ );
161- case urcl::RobotMode::IDLE:
162- return safeDashboardTrigger (this ->power_on_srv_ );
163- case urcl::RobotMode::RUNNING:
164- return safeDashboardTrigger (this ->brake_release_srv_ );
165- default :
166- RCLCPP_ERROR_STREAM (rclcpp::get_logger (" robot_state_helper" ), " Unreachable target robot mode." );
194+ try {
195+ switch (target_mode) {
196+ case urcl::RobotMode::POWER_OFF:
197+ primary_client_->commandPowerOff ();
198+ return true ;
199+ case urcl::RobotMode::IDLE:
200+ primary_client_->commandPowerOn ();
201+ return true ;
202+ case urcl::RobotMode::RUNNING:
203+ primary_client_->commandBrakeRelease ();
204+ return true ;
205+ default :
206+ RCLCPP_ERROR_STREAM (rclcpp::get_logger (" robot_state_helper" ), " Unreachable target robot mode." );
207+ }
208+ } catch (const urcl::UrException& e) {
209+ RCLCPP_ERROR_STREAM (rclcpp::get_logger (" robot_state_helper" ), e.what ());
167210 }
168211 return false ;
169212}
@@ -247,14 +290,13 @@ void RobotStateHelper::setModeAcceptCallback(const std::shared_ptr<RobotStateHel
247290
248291bool RobotStateHelper::stopProgram ()
249292{
250- if (safeDashboardTrigger (this ->stop_program_srv_ )) {
251- auto start = std::chrono::steady_clock::now ();
252- while (program_running_ && std::chrono::steady_clock::now () - start < std::chrono::seconds (1 )) {
253- std::this_thread::sleep_for (std::chrono::milliseconds (2 ));
254- return true ;
255- }
293+ try {
294+ primary_client_->commandStop ();
295+ } catch (const urcl::UrException& e) {
296+ RCLCPP_ERROR_STREAM (rclcpp::get_logger (" robot_state_helper" ), e.what ());
297+ return false ;
256298 }
257- return false ;
299+ return true ;
258300}
259301
260302void RobotStateHelper::setModeExecute (const std::shared_ptr<RobotStateHelper::SetModeGoalHandle> goal_handle)
@@ -344,9 +386,14 @@ void RobotStateHelper::setModeExecute(const std::shared_ptr<RobotStateHelper::Se
344386 if (headless_mode_) {
345387 result_->success = safeDashboardTrigger (this ->resend_robot_program_srv_ );
346388 } else {
347- // The dashboard denies playing immediately after switching the mode to RUNNING
348- sleep (1 );
349- result_->success = safeDashboardTrigger (this ->play_program_srv_ );
389+ if (play_program_srv_ == nullptr ) {
390+ result_->success = false ;
391+ result_->message = " Play program service not available on this robot." ;
392+ } else {
393+ // The dashboard denies playing immediately after switching the mode to RUNNING
394+ sleep (1 );
395+ result_->success = safeDashboardTrigger (this ->play_program_srv_ );
396+ }
350397 }
351398 }
352399 if (result_->success ) {
0 commit comments