Skip to content

Commit 75308f0

Browse files
committed
Fix bug where servo node was blocking the move home action, added pause functionality
Signed-off-by: Rosalie <rosalie.van.ark@alliander.com>
1 parent c961eb4 commit 75308f0

File tree

2 files changed

+57
-8
lines changed

2 files changed

+57
-8
lines changed

alliander_joystick/src/rcdt_joystick/include/joystick_manager.hpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,18 @@
55
#ifndef JOYSTICK_MANAGER_HPP_
66
#define JOYSTICK_MANAGER_HPP_
77

8-
#include <cstdint>
9-
#include <geometry_msgs/msg/twist_stamped.hpp>
108
#include <alliander_interfaces/action/trigger_action.hpp>
119
#include <alliander_interfaces/srv/string_srv.hpp>
10+
#include <cstdint>
11+
#include <geometry_msgs/msg/twist_stamped.hpp>
1212
#include <rclcpp/client.hpp>
1313
#include <rclcpp/node.hpp>
1414
#include <rclcpp/node_options.hpp>
1515
#include <rclcpp/rclcpp.hpp>
1616
#include <rclcpp_action/client.hpp>
1717
#include <rclcpp_action/rclcpp_action.hpp>
1818
#include <sensor_msgs/msg/joy.hpp>
19+
#include <std_srvs/srv/set_bool.hpp>
1920
#include <std_srvs/srv/trigger.hpp>
2021

2122
using std::placeholders::_1;
@@ -56,6 +57,8 @@ class JoystickManager {
5657
rclcpp::Client<std_srvs::srv::Trigger>::SharedPtr srv_client_estop_trigger;
5758
/// Client to reset the vehicle's E-stop
5859
rclcpp::Client<std_srvs::srv::Trigger>::SharedPtr srv_client_estop_reset;
60+
/// Client to pause and unpause the servo node
61+
rclcpp::Client<std_srvs::srv::SetBool>::SharedPtr srv_client_pause_servo;
5962
/// Client to move the arm back to home position
6063
rclcpp::Client<alliander_interfaces::srv::StringSrv>::SharedPtr
6164
srv_client_arm_home;
@@ -177,6 +180,13 @@ class JoystickManager {
177180
*/
178181
void move_arm_to_home();
179182

183+
/**
184+
* @brief (un)pause the servo node via a service request.
185+
* @param pause indication whether the servo node should be paused (true) or
186+
* unpaused (false).
187+
*/
188+
void pause_servo_node(bool pause);
189+
180190
/**
181191
* @brief send a trigger service request with the provided service client.
182192
* @param client service client with which the request will be send.

alliander_joystick/src/rcdt_joystick/src/joystick_manager.cpp

Lines changed: 45 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,11 @@ void JoystickManager::initialize_joystick_manager() {
4444
vehicle_estop_trigger_service);
4545
srv_client_estop_reset =
4646
node->create_client<std_srvs::srv::Trigger>(vehicle_estop_reset_service);
47+
srv_client_pause_servo =
48+
node->create_client<std_srvs::srv::SetBool>("/franka/servo_node/pause_servo");
4749
srv_client_arm_home =
48-
node->create_client<alliander_interfaces::srv::StringSrv>(arm_home_service);
50+
node->create_client<alliander_interfaces::srv::StringSrv>(
51+
arm_home_service);
4952

5053
// Action clients
5154
action_client_gripper_open = rclcpp_action::create_client<TriggerAction>(
@@ -86,8 +89,11 @@ void JoystickManager::joy_cb(const sensor_msgs::msg::Joy::SharedPtr msg) {
8689
handle_button_input(msg->buttons);
8790

8891
switch (current_mode) {
89-
case arm_mode && !arm_busy: // Don't send arm messages while it's already
90-
// following a trajectory
92+
case arm_mode:
93+
if (arm_busy) {
94+
// Don't send arm messages while it's already following a trajectory.
95+
break;
96+
}
9197
handle_arm_movement(msg->axes[1], msg->axes[0], msg->axes[3],
9298
msg->axes[2]);
9399
break;
@@ -241,9 +247,12 @@ void JoystickManager::move_arm_to_home() {
241247
return;
242248
}
243249

250+
pause_servo_node(true);
251+
244252
arm_busy = true;
245253

246-
auto request = std::make_shared<alliander_interfaces::srv::StringSrv::Request>();
254+
auto request =
255+
std::make_shared<alliander_interfaces::srv::StringSrv::Request>();
247256
request->text = "home";
248257

249258
if (!srv_client_arm_home->service_is_ready()) {
@@ -260,20 +269,50 @@ void JoystickManager::move_arm_to_home() {
260269
auto response = future.get();
261270

262271
if (response->success) {
263-
RCLCPP_INFO(node->get_logger(), "Arm moved home successfully.");
272+
RCLCPP_DEBUG(node->get_logger(), "Arm moved home successfully.");
264273
} else {
265274
RCLCPP_WARN(node->get_logger(), "Move home failed.");
266275
}
267276
} catch (const std::exception& e) {
268277
RCLCPP_ERROR(node->get_logger(), "'Move arm' service call failed: %s",
269278
e.what());
270279
}
280+
pause_servo_node(false);
271281

272282
// Unblock arm once service call finishes
273283
arm_busy = false;
274284
});
275285
}
276286

287+
void JoystickManager::pause_servo_node(bool pause) {
288+
auto request = std::make_shared<std_srvs::srv::SetBool::Request>();
289+
request->data = pause;
290+
291+
if (!srv_client_pause_servo->service_is_ready()) {
292+
RCLCPP_WARN(node->get_logger(), "(Un)pause servo node service not available.");
293+
arm_busy = false;
294+
return;
295+
}
296+
297+
srv_client_pause_servo->async_send_request(
298+
request,
299+
[this](rclcpp::Client<std_srvs::srv::SetBool>::SharedFuture future) {
300+
try {
301+
auto response = future.get();
302+
303+
if (response->success) {
304+
RCLCPP_DEBUG(node->get_logger(),
305+
"Servo node (un)paused successfully.");
306+
} else {
307+
RCLCPP_WARN(node->get_logger(), "(Un)pause servo node failed.");
308+
}
309+
} catch (const std::exception& e) {
310+
RCLCPP_ERROR(node->get_logger(),
311+
"(Un)pause servo node service call failed: %s", e.what());
312+
}
313+
});
314+
}
315+
277316
void JoystickManager::send_trigger_request(
278317
const rclcpp::Client<std_srvs::srv::Trigger>::SharedPtr& client) {
279318
auto trigger_request = std::make_shared<std_srvs::srv::Trigger::Request>();
@@ -291,7 +330,7 @@ void JoystickManager::send_trigger_request(
291330
auto response = future.get();
292331

293332
if (response->success) {
294-
RCLCPP_INFO(node->get_logger(), "Trigger service successful.");
333+
RCLCPP_DEBUG(node->get_logger(), "Trigger service successful.");
295334
} else {
296335
RCLCPP_WARN(node->get_logger(), "Trigger service failed.");
297336
}

0 commit comments

Comments
 (0)