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,28 +68,27 @@ 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
69- // Service to unlock protective stop
70- unlock_protective_stop_srv_ = node_->create_client <std_srvs::srv::Trigger>(
71- " dashboard_client/unlock_protective_stop" , rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
72- // Service to restart safety
73- restart_safety_srv_ = node_->create_client <std_srvs::srv::Trigger>(
74- " dashboard_client/restart_safety" , rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
75- // Service to power on the robot
76- power_on_srv_ = node_->create_client <std_srvs::srv::Trigger>(" dashboard_client/power_on" ,
77- rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
78- // Service to power off the robot
79- power_off_srv_ = node_->create_client <std_srvs::srv::Trigger>(" dashboard_client/power_off" ,
80- rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
81- // Service to release the robot's brakes
82- brake_release_srv_ = node_->create_client <std_srvs::srv::Trigger>(" dashboard_client/brake_release" ,
83- rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
84- // Service to stop UR program execution on the robot
85- stop_program_srv_ = node_->create_client <std_srvs::srv::Trigger>(" dashboard_client/stop" ,
86- rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
87- // Service to start UR program execution on the robot
88- play_program_srv_ = node_->create_client <std_srvs::srv::Trigger>(" dashboard_client/play" ,
89- rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
90- play_program_srv_->wait_for_service ();
71+ node->declare_parameter (" robot_ip" , " 192.168.56.101" );
72+ robot_ip_ = node->get_parameter (" robot_ip" ).as_string ();
73+
74+ primary_client_ = std::make_shared<urcl::primary_interface::PrimaryClient>(robot_ip_, notifier_);
75+
76+ primary_client_->start (0 , std::chrono::seconds (10 ));
77+ auto robot_version = primary_client_->getRobotVersion ();
78+
79+ if (robot_version->major > 5 ) {
80+ RCLCPP_WARN (rclcpp::get_logger (" robot_state_helper" ), " Running on a PolyScopeX robot. The dashboard server is not "
81+ " available, therefore the robot_state_helper cannot start "
82+ " PolyScope programs." );
83+ } else {
84+ // Service to restart safety
85+ restart_safety_srv_ = node_->create_client <std_srvs::srv::Trigger>(
86+ " dashboard_client/restart_safety" , rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
87+ // Service to start UR program execution on the robot
88+ play_program_srv_ = node_->create_client <std_srvs::srv::Trigger>(
89+ " dashboard_client/play" , rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
90+ play_program_srv_->wait_for_service ();
91+ }
9192
9293 resend_robot_program_srv_ = node_->create_client <std_srvs::srv::Trigger>(
9394 " io_and_status_controller/resend_robot_program" , rclcpp::QoS (rclcpp::KeepLast (10 )), service_cb_grp_);
@@ -136,7 +137,13 @@ bool RobotStateHelper::recoverFromSafety()
136137{
137138 switch (safety_mode_) {
138139 case urcl::SafetyMode::PROTECTIVE_STOP:
139- return safeDashboardTrigger (this ->unlock_protective_stop_srv_ );
140+ try {
141+ primary_client_->commandUnlockProtectiveStop ();
142+ } catch (const urcl::UrException& e) {
143+ RCLCPP_WARN_STREAM (rclcpp::get_logger (" robot_state_helper" ), e.what ());
144+ return false ;
145+ }
146+ return true ;
140147 case urcl::SafetyMode::SYSTEM_EMERGENCY_STOP:;
141148 case urcl::SafetyMode::ROBOT_EMERGENCY_STOP:
142149 RCLCPP_WARN_STREAM (rclcpp::get_logger (" robot_state_helper" ), " The robot is currently in safety mode."
@@ -145,7 +152,11 @@ bool RobotStateHelper::recoverFromSafety()
145152 return false ;
146153 case urcl::SafetyMode::VIOLATION:;
147154 case urcl::SafetyMode::FAULT:
148- return safeDashboardTrigger (this ->restart_safety_srv_ );
155+ if (restart_safety_srv_ != nullptr ) {
156+ return safeDashboardTrigger (this ->restart_safety_srv_ );
157+ } else {
158+ return false ;
159+ }
149160 default :
150161 // nothing to do
151162 RCLCPP_DEBUG_STREAM (rclcpp::get_logger (" robot_state_helper" ), " No safety recovery needed." );
@@ -155,15 +166,22 @@ bool RobotStateHelper::recoverFromSafety()
155166
156167bool RobotStateHelper::jumpToRobotMode (const urcl::RobotMode target_mode)
157168{
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." );
169+ try {
170+ switch (target_mode) {
171+ case urcl::RobotMode::POWER_OFF:
172+ primary_client_->commandPowerOff ();
173+ return true ;
174+ case urcl::RobotMode::IDLE:
175+ primary_client_->commandPowerOn ();
176+ return true ;
177+ case urcl::RobotMode::RUNNING:
178+ primary_client_->commandBrakeRelease ();
179+ return true ;
180+ default :
181+ RCLCPP_ERROR_STREAM (rclcpp::get_logger (" robot_state_helper" ), " Unreachable target robot mode." );
182+ }
183+ } catch (const urcl::UrException& e) {
184+ RCLCPP_ERROR_STREAM (rclcpp::get_logger (" robot_state_helper" ), e.what ());
167185 }
168186 return false ;
169187}
@@ -247,14 +265,13 @@ void RobotStateHelper::setModeAcceptCallback(const std::shared_ptr<RobotStateHel
247265
248266bool RobotStateHelper::stopProgram ()
249267{
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- }
268+ try {
269+ primary_client_->commandStop ();
270+ } catch (const urcl::UrException& e) {
271+ RCLCPP_ERROR_STREAM (rclcpp::get_logger (" robot_state_helper" ), e.what ());
272+ return false ;
256273 }
257- return false ;
274+ return true ;
258275}
259276
260277void RobotStateHelper::setModeExecute (const std::shared_ptr<RobotStateHelper::SetModeGoalHandle> goal_handle)
@@ -346,7 +363,12 @@ void RobotStateHelper::setModeExecute(const std::shared_ptr<RobotStateHelper::Se
346363 } else {
347364 // The dashboard denies playing immediately after switching the mode to RUNNING
348365 sleep (1 );
349- result_->success = safeDashboardTrigger (this ->play_program_srv_ );
366+ if (play_program_srv_ == nullptr ) {
367+ result_->success = false ;
368+ result_->message = " Play program service not available on this robot." ;
369+ } else {
370+ result_->success = safeDashboardTrigger (this ->play_program_srv_ );
371+ }
350372 }
351373 }
352374 if (result_->success ) {
0 commit comments