Program Listing for File robot.hpp

Return to documentation for file (include/franka_hardware/robot.hpp)

// Copyright (c) 2023 Franka Robotics GmbH
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#pragma once

#include <array>
#include <atomic>
#include <iostream>
#include <memory>
#include <mutex>
#include <string>
#include <thread>

#include <franka/active_control.h>
#include <franka/active_control_base.h>
#include <franka/active_motion_generator.h>
#include <franka/active_torque_control.h>

#include <franka/model.h>
#include <franka/robot.h>
#include <franka_hardware/model.hpp>

#include <franka_msgs/srv/set_cartesian_stiffness.hpp>
#include <franka_msgs/srv/set_force_torque_collision_behavior.hpp>
#include <franka_msgs/srv/set_full_collision_behavior.hpp>
#include <franka_msgs/srv/set_joint_stiffness.hpp>
#include <franka_msgs/srv/set_load.hpp>
#include <franka_msgs/srv/set_stiffness_frame.hpp>
#include <franka_msgs/srv/set_tcp_frame.hpp>

#include <rclcpp/logger.hpp>

namespace franka_hardware {

class Robot {
 public:
  explicit Robot(std::unique_ptr<franka::Robot> robot, std::unique_ptr<Model> model);
  explicit Robot(const std::string& robot_ip, const rclcpp::Logger& logger);
  Robot(const Robot&) = delete;
  Robot& operator=(const Robot& other) = delete;
  Robot& operator=(Robot&& other) = delete;
  Robot(Robot&& other) = delete;

  virtual ~Robot();

  virtual void initializeTorqueInterface();

  virtual void initializeJointVelocityInterface();

  virtual void initializeJointPositionInterface();

  virtual void initializeCartesianVelocityInterface();

  virtual void initializeCartesianPoseInterface();

  virtual void stopRobot();

  virtual franka::RobotState readOnce();

  virtual franka_hardware::Model* getModel();

  virtual void writeOnce(const std::array<double, 7>& joint_hardware_command);

  virtual void writeOnce(const std::array<double, 6>& cartesian_velocity_command);

  virtual void writeOnce(const std::array<double, 6>& cartesian_velocity_command,
                         const std::array<double, 2>& elbow_command);

  virtual void writeOnce(const std::array<double, 16>& cartesian_pose_command);

  virtual void writeOnce(const std::array<double, 16>& cartesian_pose_command,
                         const std::array<double, 2>& elbow_command);

  virtual void setJointStiffness(
      const franka_msgs::srv::SetJointStiffness::Request::SharedPtr& req);

  virtual void setCartesianStiffness(
      const franka_msgs::srv::SetCartesianStiffness::Request::SharedPtr& req);

  virtual void setLoad(const franka_msgs::srv::SetLoad::Request::SharedPtr& req);

  virtual void setTCPFrame(const franka_msgs::srv::SetTCPFrame::Request::SharedPtr& req);

  virtual void setStiffnessFrame(
      const franka_msgs::srv::SetStiffnessFrame::Request::SharedPtr& req);

  virtual void setForceTorqueCollisionBehavior(
      const franka_msgs::srv::SetForceTorqueCollisionBehavior::Request::SharedPtr& req);

  virtual void setFullCollisionBehavior(
      const franka_msgs::srv::SetFullCollisionBehavior::Request::SharedPtr& req);

  virtual void automaticErrorRecovery();

 protected:
  Robot() = default;

 private:
  virtual franka::RobotState readOnceActiveControl();

  virtual void writeOnceEfforts(const std::array<double, 7>& efforts);

  virtual void writeOnceJointVelocities(const std::array<double, 7>& joint_velocities);

  virtual void writeOnceJointPositions(const std::array<double, 7>& positions);

  franka::CartesianVelocities preProcessCartesianVelocities(
      const franka::CartesianVelocities& cartesian_velocities);

  franka::CartesianPose preProcessCartesianPose(const franka::CartesianPose& cartesian_pose);

  std::mutex write_mutex_;
  std::mutex control_mutex_;

  std::unique_ptr<franka::Robot> robot_;
  std::unique_ptr<franka::ActiveControlBase> active_control_ = nullptr;
  std::unique_ptr<franka::Model> model_;
  std::unique_ptr<Model> franka_hardware_model_;

  bool effort_interface_active_{false};
  bool joint_velocity_interface_active_{false};
  bool joint_position_interface_active_{false};
  bool cartesian_velocity_interface_active_{false};
  bool cartesian_pose_interface_active_{false};

  bool torque_command_rate_limiter_active_{true};
  bool velocity_command_rate_limit_active_{false};

  bool cartesian_velocity_command_rate_limit_active_{false};
  bool cartesian_velocity_low_pass_filter_active_{false};

  bool cartesian_pose_low_pass_filter_active_{false};
  bool cartesian_pose_command_rate_limit_active_{false};

  bool joint_position_command_rate_limit_active_{false};
  bool joint_position_command_low_pass_filter_active_{false};

  double low_pass_filter_cut_off_freq{100.0};

  franka::RobotState current_state_;
};
}  // namespace franka_hardware