Skip to content

Commit 9229bce

Browse files
authored
Moved registering publisher and service to on_active (#151)
* Reset publisher and service in on_deactive * Added a function to call service in the test
1 parent 9acf43a commit 9229bce

File tree

2 files changed

+49
-35
lines changed

2 files changed

+49
-35
lines changed

ur_controllers/src/gpio_controller.cpp

Lines changed: 33 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -123,29 +123,6 @@ controller_interface::return_type ur_controllers::GPIOController::update()
123123
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
124124
ur_controllers::GPIOController::on_configure(const rclcpp_lifecycle::State& /*previous_state*/)
125125
{
126-
try {
127-
// register publisher
128-
io_pub_ = get_node()->create_publisher<ur_msgs::msg::IOStates>("~/io_states", rclcpp::SystemDefaultsQoS());
129-
130-
tool_data_pub_ =
131-
get_node()->create_publisher<ur_msgs::msg::ToolDataMsg>("~/tool_data", rclcpp::SystemDefaultsQoS());
132-
133-
robot_mode_pub_ =
134-
get_node()->create_publisher<ur_dashboard_msgs::msg::RobotMode>("~/robot_mode", rclcpp::SystemDefaultsQoS());
135-
136-
safety_mode_pub_ =
137-
get_node()->create_publisher<ur_dashboard_msgs::msg::SafetyMode>("~/safety_mode", rclcpp::SystemDefaultsQoS());
138-
139-
set_io_srv_ = get_node()->create_service<ur_msgs::srv::SetIO>(
140-
"~/set_io", std::bind(&GPIOController::setIO, this, std::placeholders::_1, std::placeholders::_2));
141-
142-
set_speed_slider_srv_ = get_node()->create_service<ur_msgs::srv::SetSpeedSliderFraction>(
143-
"~/set_speed_slider",
144-
std::bind(&GPIOController::setSpeedSlider, this, std::placeholders::_1, std::placeholders::_2));
145-
} catch (...) {
146-
return LifecycleNodeInterface::CallbackReturn::ERROR;
147-
}
148-
149126
return LifecycleNodeInterface::CallbackReturn::SUCCESS;
150127
}
151128

@@ -220,12 +197,45 @@ void GPIOController::publishSafetyMode()
220197
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
221198
ur_controllers::GPIOController::on_activate(const rclcpp_lifecycle::State& /*previous_state*/)
222199
{
200+
try {
201+
// register publisher
202+
io_pub_ = get_node()->create_publisher<ur_msgs::msg::IOStates>("~/io_states", rclcpp::SystemDefaultsQoS());
203+
204+
tool_data_pub_ =
205+
get_node()->create_publisher<ur_msgs::msg::ToolDataMsg>("~/tool_data", rclcpp::SystemDefaultsQoS());
206+
207+
robot_mode_pub_ =
208+
get_node()->create_publisher<ur_dashboard_msgs::msg::RobotMode>("~/robot_mode", rclcpp::SystemDefaultsQoS());
209+
210+
safety_mode_pub_ =
211+
get_node()->create_publisher<ur_dashboard_msgs::msg::SafetyMode>("~/safety_mode", rclcpp::SystemDefaultsQoS());
212+
213+
set_io_srv_ = get_node()->create_service<ur_msgs::srv::SetIO>(
214+
"~/set_io", std::bind(&GPIOController::setIO, this, std::placeholders::_1, std::placeholders::_2));
215+
216+
set_speed_slider_srv_ = get_node()->create_service<ur_msgs::srv::SetSpeedSliderFraction>(
217+
"~/set_speed_slider",
218+
std::bind(&GPIOController::setSpeedSlider, this, std::placeholders::_1, std::placeholders::_2));
219+
} catch (...) {
220+
return LifecycleNodeInterface::CallbackReturn::ERROR;
221+
}
223222
return LifecycleNodeInterface::CallbackReturn::SUCCESS;
224223
}
225224

226225
rclcpp_lifecycle::node_interfaces::LifecycleNodeInterface::CallbackReturn
227226
ur_controllers::GPIOController::on_deactivate(const rclcpp_lifecycle::State& /*previous_state*/)
228227
{
228+
try {
229+
// reset publisher
230+
io_pub_.reset();
231+
tool_data_pub_.reset();
232+
robot_mode_pub_.reset();
233+
safety_mode_pub_.reset();
234+
set_io_srv_.reset();
235+
set_speed_slider_srv_.reset();
236+
} catch (...) {
237+
return LifecycleNodeInterface::CallbackReturn::ERROR;
238+
}
229239
return LifecycleNodeInterface::CallbackReturn::SUCCESS;
230240
}
231241

ur_robot_driver/test/integration_test.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -115,24 +115,20 @@ def test_switch_on(self):
115115
empty_req = Trigger.Request()
116116
get_robot_mode_req = GetRobotMode.Request()
117117

118-
self.power_on_client.call_async(empty_req)
118+
self.call_service(self.power_on_client, empty_req)
119119
end_time = time.time() + 10
120120
mode = RobotMode.DISCONNECTED
121121
while mode not in (RobotMode.IDLE, RobotMode.RUNNING) and time.time() < end_time:
122-
future = self.get_robot_mode_client.call_async(get_robot_mode_req)
123-
while future.done() is False:
124-
rclpy.spin_once(self.node, timeout_sec=0.1)
125-
mode = future.result().robot_mode.mode
122+
result = self.call_service(self.get_robot_mode_client, get_robot_mode_req)
123+
mode = result.robot_mode.mode
126124

127125
self.assertIn(mode, (RobotMode.IDLE, RobotMode.RUNNING))
128126

129-
self.brake_release_client.call_async(empty_req)
127+
self.call_service(self.brake_release_client, empty_req)
130128
end_time = time.time() + 10
131129
while mode != RobotMode.RUNNING and time.time() < end_time:
132-
future = self.get_robot_mode_client.call_async(get_robot_mode_req)
133-
while future.done() is False:
134-
rclpy.spin_once(self.node, timeout_sec=0.1)
135-
mode = future.result().robot_mode.mode
130+
result = self.call_service(self.get_robot_mode_client, get_robot_mode_req)
131+
mode = result.robot_mode.mode
136132

137133
self.assertEqual(mode, RobotMode.RUNNING)
138134

@@ -152,7 +148,7 @@ def test_set_io(self):
152148
set_io_req.pin = pin
153149
set_io_req.state = 1.0
154150

155-
self.set_io_client.call_async(set_io_req)
151+
self.call_service(self.set_io_client, set_io_req)
156152
pin_state = False
157153

158154
end_time = time.time() + 5
@@ -164,7 +160,7 @@ def test_set_io(self):
164160
self.assertEqual(pin_state, 1)
165161

166162
set_io_req.state = 0.0
167-
self.set_io_client.call_async(set_io_req)
163+
self.call_service(self.set_io_client, set_io_req)
168164

169165
end_time = time.time() + 5
170166
while pin_state and time.time() < end_time:
@@ -178,3 +174,11 @@ def test_set_io(self):
178174

179175
def io_msg_cb(self, msg):
180176
self.io_msg = msg
177+
178+
def call_service(self, client, request):
179+
future = client.call_async(request)
180+
rclpy.spin_until_future_complete(self.node, future)
181+
if future.result() is not None:
182+
return future.result()
183+
else:
184+
raise Exception(f"Exception while calling service: {future.exception()}")

0 commit comments

Comments
 (0)