3030#include < std_srvs/Trigger.h>
3131namespace ur_driver
3232{
33- RobotStateHelper::RobotStateHelper (const ros::NodeHandle& nh) : nh_(nh), set_mode_as_(nh_, " set_mode" , false )
33+ RobotStateHelper::RobotStateHelper (const ros::NodeHandle& nh)
34+ : nh_(nh)
35+ , is_started_(false )
36+ , robot_mode_(RobotMode::UNKNOWN)
37+ , safety_mode_(SafetyMode::UNDEFINED_SAFETY_MODE)
38+ , set_mode_as_(nh_, " set_mode" , false )
3439{
3540 // Topic on which the robot_mode is published by the driver
3641 robot_mode_sub_ = nh_.subscribe (" robot_mode" , 1 , &RobotStateHelper::robotModeCallback, this );
@@ -52,9 +57,9 @@ RobotStateHelper::RobotStateHelper(const ros::NodeHandle& nh) : nh_(nh), set_mod
5257 // Service to start UR program execution on the robot
5358 play_program_srv_ = nh_.serviceClient <std_srvs::Trigger>(" dashboard/play" );
5459
60+ play_program_srv_.waitForExistence ();
5561 set_mode_as_.registerGoalCallback (std::bind (&RobotStateHelper::setModeGoalCallback, this ));
5662 set_mode_as_.registerPreemptCallback (std::bind (&RobotStateHelper::setModePreemptCallback, this ));
57- set_mode_as_.start ();
5863}
5964
6065void RobotStateHelper::robotModeCallback (const ur_dashboard_msgs::RobotMode& msg)
@@ -64,6 +69,10 @@ void RobotStateHelper::robotModeCallback(const ur_dashboard_msgs::RobotMode& msg
6469 robot_mode_ = RobotMode (msg.mode );
6570 ROS_INFO_STREAM (" Robot mode is now " << robotModeString (robot_mode_));
6671 updateRobotState ();
72+ if (!is_started_)
73+ {
74+ startActionServer ();
75+ }
6776 }
6877}
6978
@@ -74,6 +83,10 @@ void RobotStateHelper::safetyModeCallback(const ur_dashboard_msgs::SafetyMode& m
7483 safety_mode_ = SafetyMode (msg.mode );
7584 ROS_INFO_STREAM (" Robot's safety mode is now " << safetyModeString (safety_mode_));
7685 updateRobotState ();
86+ if (!is_started_)
87+ {
88+ startActionServer ();
89+ }
7790 }
7891}
7992
@@ -256,4 +269,13 @@ bool RobotStateHelper::safeDashboardTrigger(ros::ServiceClient* srv_client)
256269 }
257270 return srv.response .success ;
258271}
272+
273+ void RobotStateHelper::startActionServer ()
274+ {
275+ if (robot_mode_ != RobotMode::UNKNOWN && safety_mode_ != SafetyMode::UNDEFINED_SAFETY_MODE)
276+ {
277+ set_mode_as_.start ();
278+ is_started_ = true ;
279+ }
280+ }
259281} // namespace ur_driver
0 commit comments