Skip to content

Commit 4fae736

Browse files
author
Felix Exner
authored
Merge pull request #177 from UniversalRobots/fix_robot_state_helper
Make robot_state helper wait for a first status from robot before advertising the set_mode action.
2 parents 43fd5d0 + 5786cee commit 4fae736

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

ur_robot_driver/include/ur_robot_driver/ros/robot_state_helper.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class RobotStateHelper
5959
virtual ~RobotStateHelper() = default;
6060

6161
private:
62+
ros::NodeHandle nh_;
6263
void robotModeCallback(const ur_dashboard_msgs::RobotMode& msg);
6364
void safetyModeCallback(const ur_dashboard_msgs::SafetyMode& msg);
6465

@@ -85,8 +86,9 @@ class RobotStateHelper
8586
// Action server functions
8687
void setModeGoalCallback();
8788
void setModePreemptCallback();
89+
void startActionServer();
90+
bool is_started_;
8891

89-
ros::NodeHandle nh_;
9092
RobotMode robot_mode_;
9193
SafetyMode safety_mode_;
9294

ur_robot_driver/include/ur_robot_driver/ur/datatypes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ namespace ur_driver
3333
{
3434
enum class RobotMode : int8_t
3535
{
36+
UNKNOWN = -128, // This is not defined by UR but only inside this driver
3637
NO_CONTROLLER = -1,
3738
DISCONNECTED = 0,
3839
CONFIRM_SAFETY = 1,

ur_robot_driver/src/ros/robot_state_helper.cpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,12 @@
3030
#include <std_srvs/Trigger.h>
3131
namespace 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

6065
void 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

Comments
 (0)