14 #include <franka_msgs/ErrorRecoveryAction.h> 16 #include <std_srvs/Trigger.h> 21 int main(
int argc,
char** argv) {
22 ros::init(argc, argv,
"franka_control_node");
28 if (!franka_control.
init(public_node_handle, node_handle)) {
29 ROS_ERROR(
"franka_control_node: Failed to initialize FrankaHW class. Shutting down!");
33 auto services = std::make_unique<ServiceContainer>();
34 std::unique_ptr<actionlib::SimpleActionServer<franka_msgs::ErrorRecoveryAction>>
35 recovery_action_server;
37 std::atomic_bool has_error(
false);
39 auto connect = [&]() {
41 std::lock_guard<std::mutex> lock(franka_control.
robotMutex());
42 auto& robot = franka_control.
robot();
44 services = std::make_unique<ServiceContainer>();
47 recovery_action_server =
48 std::make_unique<actionlib::SimpleActionServer<franka_msgs::ErrorRecoveryAction>>(
49 node_handle,
"error_recovery",
50 [&](
const franka_msgs::ErrorRecoveryGoalConstPtr&) {
52 std::lock_guard<std::mutex> lock(franka_control.
robotMutex());
53 robot.automaticErrorRecovery();
55 recovery_action_server->setSucceeded();
58 recovery_action_server->setAborted(franka_msgs::ErrorRecoveryResult(), ex.what());
63 recovery_action_server->start();
66 franka_control.
update(robot.readOnce());
69 auto disconnect_handler = [&](std_srvs::Trigger::Request& request,
70 std_srvs::Trigger::Response&
response) ->
bool {
73 response.message =
"Controller is active. Cannot disconnect while a controller is running.";
77 recovery_action_server.reset();
80 response.message = result ?
"" :
"Failed to disconnect robot.";
84 auto connect_handler = [&](std_srvs::Trigger::Request& request,
85 std_srvs::Trigger::Response&
response) ->
bool {
88 response.message =
"Already connected to robot. Cannot connect twice.";
102 node_handle.
advertiseService<std_srvs::Trigger::Request, std_srvs::Trigger::Response>(
103 "connect", connect_handler);
105 node_handle.
advertiseService<std_srvs::Trigger::Request, std_srvs::Trigger::Response>(
106 "disconnect", disconnect_handler);
121 std::lock_guard<std::mutex> lock(franka_control.
robotMutex());
124 control_manager.update(now, now - last_time);
127 }
catch (
const std::logic_error& e) {
130 std::this_thread::sleep_for(1ms);
142 if (period.
toSec() == 0.0) {
144 control_manager.update(now, period,
true);
146 franka_control.
reset();
148 control_manager.update(now, period);
virtual std::mutex & robotMutex()
virtual void enforceLimits(const ros::Duration &period)
void setupServices(franka::Robot &robot, std::mutex &robot_mutex, ros::NodeHandle &node_handle, ServiceContainer &services)
virtual bool controllerActive() const noexcept
virtual void update(const franka::RobotState &robot_state)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
virtual void checkJointLimits()
ServiceServer advertiseService(const std::string &service, bool(T::*srv_func)(MReq &, MRes &), T *obj)
int main(int argc, char **argv)
#define ROS_INFO_THROTTLE(period,...)
virtual bool disconnect()
virtual void control(const std::function< bool(const ros::Time &, const ros::Duration &)> &ros_callback)
virtual bool init(ros::NodeHandle &root_nh, ros::NodeHandle &robot_hw_nh) override
virtual franka::Robot & robot() const
const std::string response