ros2_control - rolling
Loading...
Searching...
No Matches
admittance_rule.hpp
1// Copyright (c) 2021, PickNik, Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14//
16
17#ifndef ADMITTANCE_CONTROLLER__ADMITTANCE_RULE_HPP_
18#define ADMITTANCE_CONTROLLER__ADMITTANCE_RULE_HPP_
19
20#include <Eigen/Core>
21
22#include <memory>
23#include <string>
24#include <vector>
25
26#include "admittance_controller/admittance_controller_parameters.hpp"
27#include "control_msgs/msg/admittance_controller_state.hpp"
28#include "controller_interface/controller_interface_base.hpp"
29#include "kinematics_interface/kinematics_interface.hpp"
30#include "pluginlib/class_loader.hpp"
31#include "trajectory_msgs/msg/joint_trajectory_point.hpp"
32
34{
36{
37 explicit AdmittanceState(size_t num_joints)
38 {
39 admittance_velocity.setZero();
40 admittance_acceleration.setZero();
41 admittance_position.setIdentity();
42 damping.setZero();
43 mass.setOnes();
44 mass_inv.setZero();
45 stiffness.setZero();
46 selected_axes.setZero();
47 auto idx = static_cast<Eigen::Index>(num_joints);
48 current_joint_pos = Eigen::VectorXd::Zero(idx);
49 joint_pos = Eigen::VectorXd::Zero(idx);
50 joint_vel = Eigen::VectorXd::Zero(idx);
51 joint_acc = Eigen::VectorXd::Zero(idx);
52 }
53
54 Eigen::VectorXd current_joint_pos;
55 Eigen::VectorXd joint_pos;
56 Eigen::VectorXd joint_vel;
57 Eigen::VectorXd joint_acc;
58 Eigen::Matrix<double, 6, 1> damping;
59 Eigen::Matrix<double, 6, 1> mass;
60 Eigen::Matrix<double, 6, 1> mass_inv;
61 Eigen::Matrix<double, 6, 1> selected_axes;
62 Eigen::Matrix<double, 6, 1> stiffness;
63 Eigen::Matrix<double, 6, 1> wrench_base;
64 Eigen::Matrix<double, 6, 1> admittance_acceleration;
65 Eigen::Matrix<double, 6, 1> admittance_velocity;
66 Eigen::Isometry3d admittance_position;
67 Eigen::Matrix<double, 3, 3> rot_base_control;
68 Eigen::Isometry3d ref_trans_base_ft;
69 std::string ft_sensor_frame;
70};
71
73{
74public:
75 explicit AdmittanceRule(
76 const std::shared_ptr<admittance_controller::ParamListener> & parameter_handler)
77 {
78 parameter_handler_ = parameter_handler;
79 parameters_ = parameter_handler_->get_params();
80 num_joints_ = parameters_.joints.size();
81 admittance_state_ = AdmittanceState(num_joints_);
82 reset(num_joints_);
83 }
84
86 controller_interface::return_type configure(
87 const std::shared_ptr<rclcpp_lifecycle::LifecycleNode> & node, const size_t num_joint,
88 const std::string & robot_description);
89
91 controller_interface::return_type reset(const size_t num_joints);
92
99
115 controller_interface::return_type update(
116 const trajectory_msgs::msg::JointTrajectoryPoint & current_joint_state,
117 const geometry_msgs::msg::Wrench & measured_wrench,
118 const trajectory_msgs::msg::JointTrajectoryPoint & reference_joint_state,
119 const rclcpp::Duration & period,
120 trajectory_msgs::msg::JointTrajectoryPoint & desired_joint_states);
121
128 const control_msgs::msg::AdmittanceControllerState & get_controller_state();
129
130public:
131 // admittance config parameters
132 std::shared_ptr<admittance_controller::ParamListener> parameter_handler_;
133 admittance_controller::Params parameters_;
134
135protected:
143 bool calculate_admittance_rule(AdmittanceState & admittance_state, double dt);
144
154 const geometry_msgs::msg::Wrench & measured_wrench,
155 const Eigen::Matrix<double, 3, 3> & sensor_world_rot,
156 const Eigen::Matrix<double, 3, 3> & cog_world_rot);
157
158 template <typename T1, typename T2>
159 void vec_to_eigen(const std::vector<T1> & data, T2 & matrix);
160
161 // number of robot joint
162 size_t num_joints_;
163
164 // Kinematics interface plugin loader
165 std::shared_ptr<pluginlib::ClassLoader<kinematics_interface::KinematicsInterface>>
166 kinematics_loader_;
167 std::unique_ptr<kinematics_interface::KinematicsInterface> kinematics_;
168
169 // filtered wrench in world frame
170 Eigen::Matrix<double, 6, 1> wrench_world_;
171
172 // admittance controllers internal state
173 AdmittanceState admittance_state_{0};
174
175 // position of center of gravity in cog_frame
176 Eigen::Vector3d cog_pos_;
177
178 // force applied to sensor due to weight of end effector
179 Eigen::Vector3d end_effector_weight_;
180
181 // ROS
182 control_msgs::msg::AdmittanceControllerState state_message_;
183};
184
185} // namespace admittance_controller
186
187#endif // ADMITTANCE_CONTROLLER__ADMITTANCE_RULE_HPP_
Definition admittance_rule.hpp:73
bool calculate_admittance_rule(AdmittanceState &admittance_state, double dt)
Definition admittance_rule_impl.hpp:226
controller_interface::return_type reset(const size_t num_joints)
Reset all values back to default.
Definition admittance_rule_impl.hpp:90
controller_interface::return_type configure(const std::shared_ptr< rclcpp_lifecycle::LifecycleNode > &node, const size_t num_joint, const std::string &robot_description)
Configure admittance rule memory using number of joints.
Definition admittance_rule_impl.hpp:37
void apply_parameters_update()
Definition admittance_rule_impl.hpp:122
const control_msgs::msg::AdmittanceControllerState & get_controller_state()
Definition admittance_rule_impl.hpp:336
controller_interface::return_type update(const trajectory_msgs::msg::JointTrajectoryPoint &current_joint_state, const geometry_msgs::msg::Wrench &measured_wrench, const trajectory_msgs::msg::JointTrajectoryPoint &reference_joint_state, const rclcpp::Duration &period, trajectory_msgs::msg::JointTrajectoryPoint &desired_joint_states)
Definition admittance_rule_impl.hpp:144
void process_wrench_measurements(const geometry_msgs::msg::Wrench &measured_wrench, const Eigen::Matrix< double, 3, 3 > &sensor_world_rot, const Eigen::Matrix< double, 3, 3 > &cog_world_rot)
Definition admittance_rule_impl.hpp:308
Definition admittance_controller.hpp:39
Definition admittance_rule.hpp:36