Skip to content

Commit 769f476

Browse files
committed
Make configuration controller thread safe
Also minor cleanup and add testing of the robot software version service
1 parent ce7d1d9 commit 769f476

File tree

5 files changed

+42
-23
lines changed

5 files changed

+42
-23
lines changed

ur_controllers/include/ur_controllers/ur_configuration_controller.hpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@
4141
#ifndef UR_CONTROLLERS__UR_CONFIGURATION_CONTROLLER_HPP_
4242
#define UR_CONTROLLERS__UR_CONFIGURATION_CONTROLLER_HPP_
4343

44+
#include <realtime_tools/realtime_box.h>
45+
4446
#include <memory>
4547

4648
#include <controller_interface/controller_interface.hpp>
@@ -51,12 +53,19 @@
5153
namespace ur_controllers
5254
{
5355

56+
// Struct to hold version information
57+
struct VersionInformation
58+
{
59+
uint32_t major = 0, minor = 0, build = 0, bugfix = 0;
60+
};
61+
62+
// Enum for indexing into state interfaces.
5463
enum StateInterfaces
5564
{
56-
ROBOT_VERSION_MAJOR,
57-
ROBOT_VERSION_MINOR,
58-
ROBOT_VERSION_BUILD,
59-
ROBOT_VERSION_BUGFIX
65+
ROBOT_VERSION_MAJOR = 0,
66+
ROBOT_VERSION_MINOR = 1,
67+
ROBOT_VERSION_BUILD = 2,
68+
ROBOT_VERSION_BUGFIX = 3,
6069
};
6170

6271
class URConfigurationController : public controller_interface::ControllerInterface
@@ -77,7 +86,10 @@ class URConfigurationController : public controller_interface::ControllerInterfa
7786
CallbackReturn on_init() override;
7887

7988
private:
89+
realtime_tools::RealtimeBox<std::shared_ptr<VersionInformation>> robot_software_version_;
90+
8091
rclcpp::Service<ur_msgs::srv::GetRobotSoftwareVersion>::SharedPtr get_robot_software_version_srv_;
92+
8193
bool getRobotSoftwareVersion(ur_msgs::srv::GetRobotSoftwareVersion::Request::SharedPtr req,
8294
ur_msgs::srv::GetRobotSoftwareVersion::Response::SharedPtr resp);
8395

ur_controllers/src/gpio_controller.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,6 @@ controller_interface::InterfaceConfiguration ur_controllers::GPIOController::sta
158158
// program running
159159
config.names.emplace_back(tf_prefix + "gpio/program_running");
160160

161-
// Get version service
162-
config.names.emplace_back(tf_prefix + "get_robot_software_version/get_version_major");
163-
config.names.emplace_back(tf_prefix + "get_robot_software_version/get_version_minor");
164-
config.names.emplace_back(tf_prefix + "get_robot_software_version/get_version_bugfix");
165-
config.names.emplace_back(tf_prefix + "get_robot_software_version/get_version_build");
166-
167161
return config;
168162
}
169163

ur_controllers/src/ur_configuration_controller.cpp

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,25 @@
3939
//----------------------------------------------------------------------
4040

4141
#include <ur_controllers/ur_configuration_controller.hpp>
42+
#include <realtime_tools/realtime_box.h>
4243
namespace ur_controllers
4344
{
4445

4546
controller_interface::CallbackReturn URConfigurationController::on_init()
4647
{
47-
param_listener_ = std::make_shared<ur_configuration_controller::ParamListener>(get_node());
48-
params_ = param_listener_->get_params();
4948
return controller_interface::CallbackReturn::SUCCESS;
5049
}
5150

5251
controller_interface::CallbackReturn
5352
URConfigurationController::on_configure(const rclcpp_lifecycle::State& /* previous_state */)
5453
{
54+
param_listener_ = std::make_shared<ur_configuration_controller::ParamListener>(get_node());
55+
params_ = param_listener_->get_params();
56+
57+
get_robot_software_version_srv_ = get_node()->create_service<ur_msgs::srv::GetRobotSoftwareVersion>(
58+
"~/get_robot_software_version", std::bind(&URConfigurationController::getRobotSoftwareVersion, this,
59+
std::placeholders::_1, std::placeholders::_2));
60+
5561
return controller_interface::CallbackReturn::SUCCESS;
5662
}
5763

@@ -61,8 +67,6 @@ controller_interface::InterfaceConfiguration URConfigurationController::command_
6167
controller_interface::InterfaceConfiguration config;
6268
config.type = controller_interface::interface_configuration_type::INDIVIDUAL;
6369

64-
const std::string tf_prefix = params_.tf_prefix;
65-
6670
return config;
6771
}
6872

@@ -90,28 +94,32 @@ controller_interface::return_type URConfigurationController::update(const rclcpp
9094
controller_interface::CallbackReturn
9195
URConfigurationController::on_activate(const rclcpp_lifecycle::State& /* previous_state */)
9296
{
93-
get_robot_software_version_srv_ = get_node()->create_service<ur_msgs::srv::GetRobotSoftwareVersion>(
94-
"~/get_robot_software_version", std::bind(&URConfigurationController::getRobotSoftwareVersion, this,
95-
std::placeholders::_1, std::placeholders::_2));
97+
VersionInformation temp;
98+
temp.major = static_cast<uint32_t>(state_interfaces_[StateInterfaces::ROBOT_VERSION_MAJOR].get_value());
99+
temp.minor = static_cast<uint32_t>(state_interfaces_[StateInterfaces::ROBOT_VERSION_MINOR].get_value());
100+
temp.bugfix = static_cast<uint32_t>(state_interfaces_[StateInterfaces::ROBOT_VERSION_BUGFIX].get_value());
101+
temp.build = static_cast<uint32_t>(state_interfaces_[StateInterfaces::ROBOT_VERSION_BUILD].get_value());
96102

103+
robot_software_version_.set(std::make_shared<VersionInformation>(temp));
97104
return controller_interface::CallbackReturn::SUCCESS;
98105
}
99106

100107
controller_interface::CallbackReturn
101108
URConfigurationController::on_deactivate(const rclcpp_lifecycle::State& /* previous_state */)
102109
{
103-
get_robot_software_version_srv_.reset();
104110
return controller_interface::CallbackReturn::SUCCESS;
105111
}
106112

107113
bool URConfigurationController::getRobotSoftwareVersion(
108114
ur_msgs::srv::GetRobotSoftwareVersion::Request::SharedPtr /*req*/,
109115
ur_msgs::srv::GetRobotSoftwareVersion::Response::SharedPtr resp)
110116
{
111-
resp->major = static_cast<uint32_t>(state_interfaces_[StateInterfaces::ROBOT_VERSION_MAJOR].get_value());
112-
resp->minor = static_cast<uint32_t>(state_interfaces_[StateInterfaces::ROBOT_VERSION_MINOR].get_value());
113-
resp->bugfix = static_cast<uint32_t>(state_interfaces_[StateInterfaces::ROBOT_VERSION_BUGFIX].get_value());
114-
resp->build = static_cast<uint32_t>(state_interfaces_[StateInterfaces::ROBOT_VERSION_BUILD].get_value());
117+
std::shared_ptr<VersionInformation> temp;
118+
robot_software_version_.get(temp);
119+
resp->major = temp->major;
120+
resp->minor = temp->minor;
121+
resp->bugfix = temp->bugfix;
122+
resp->build = temp->build;
115123

116124
return true;
117125
}

ur_controllers/src/ur_configuration_controller_parameters.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@ ur_configuration_controller:
22
tf_prefix: {
33
type: string,
44
default_value: "",
5-
description: "Urdf prefix of the corresponding arm"
5+
description: "URDF prefix of the corresponding arm"
66
}

ur_robot_driver/test/robot_driver.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,11 @@ def setUp(self):
110110
# Test functions
111111
#
112112

113+
def test_get_robot_software_version(self):
114+
self.assertNotEqual(
115+
self._configuration_controller_interface.get_robot_software_version().major, 0
116+
)
117+
113118
def test_start_scaled_jtc_controller(self):
114119
self.assertTrue(
115120
self._controller_manager_interface.switch_controller(

0 commit comments

Comments
 (0)