unified_joint_limit_singularity_solver.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2017 Fraunhofer Institute for Manufacturing Engineering and Automation (IPA)
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9 
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 
19 
24 Eigen::MatrixXd UnifiedJointLimitSingularitySolver::solve(const Vector6d_t& in_cart_velocities,
25  const JointStates& joint_states)
26 {
27 
28  Eigen::JacobiSVD<Eigen::MatrixXd> svd(this->jacobian_data_, Eigen::ComputeThinU | Eigen::ComputeThinV);
29  Eigen::MatrixXd J=this->jacobian_data_;
30  Eigen::MatrixXd J_T=J.transpose();
31  Eigen::MatrixXd U=svd.matrixU();
32  Eigen::MatrixXd U_T =U.transpose();
33 
34  Eigen::MatrixXd Q = this->calculateWeighting(in_cart_velocities, joint_states);
35 
36  Eigen::MatrixXd Wt=Q*svd.matrixV();
37  Eigen::MatrixXd Wt_T=Wt.transpose();
38 /*
39  Eigen::VectorXd singularValues = svd.singularValues();
40  for (int i=0;i<singularValues.rows();i++){
41  singularValues(i)=singularValues(i)*Q(i,i);
42  }
43  Eigen::MatrixXd lambda = damping_->getDampingFactor(singularValues, this->jacobian_data_);
44 
45  Eigen::MatrixXd Ulambda =U*lambda;
46  Eigen::MatrixXd UlambdaUt =Ulambda*U_T;
47 
48  Eigen::MatrixXd WtWt_T= Wt*Wt_T;
49  Eigen::MatrixXd JWtWt_T=J*Wt*Wt_T;
50  Eigen::MatrixXd JWtWt_TJ_T=JWtWt_T*J_T;
51 
52  Eigen::MatrixXd J_robust=JWtWt_TJ_T+UlambdaUt;
53 
54 
55  Eigen::MatrixXd pinv=J_robust.inverse();
56  Eigen::MatrixXd J_Tpinv= J_T*pinv;
57  Eigen::MatrixXd WtWt_TJ_Tpinv= WtWt_T*J_Tpinv;
58  Eigen::MatrixXd qdots_out =WtWt_TJ_Tpinv*in_cart_velocities;*/
59 
60  Eigen::MatrixXd J_robust=J*Wt*Wt_T*J_T;
61  Eigen::MatrixXd pinv=pinv_calc_.calculate(this->params_, this->damping_, J_robust);
62  Eigen::MatrixXd qdots_out =Wt*Wt_T*J_T*pinv*in_cart_velocities;
63 
64  return qdots_out;
65 }
66 
70 Eigen::MatrixXd UnifiedJointLimitSingularitySolver::calculateWeighting(const Vector6d_t& in_cart_velocities, const JointStates& joint_states) const
71 {
72  Eigen::MatrixXd Jinv = pinv_calc_.calculate(this->params_, this->damping_, this->jacobian_data_);
73  Eigen::VectorXd q_dot = Jinv * in_cart_velocities;
74  std::vector<double> limits_min = this->limiter_params_.limits_min;
75  std::vector<double> limits_max = this->limiter_params_.limits_max;
76  uint32_t cols = this->jacobian_data_.cols();
77 
78  Eigen::VectorXd weighting = Eigen::VectorXd::Zero(cols);
79  Eigen::VectorXd weighting_pos = Eigen::VectorXd::Zero(cols);
80  Eigen::VectorXd weighting_speed = Eigen::VectorXd::Zero(cols);
81 
82  KDL::JntArray q = joint_states.current_q_;
83 
84  double sigma = this->params_.ujs_solver_params.sigma;
85  double sigma_speed = this->params_.ujs_solver_params.sigma_speed;
86  double delta_pos = this->params_.ujs_solver_params.delta_pos;
87  double delta_speed = this->params_.ujs_solver_params.delta_speed;
88  for (uint32_t i = 0; i < cols ; ++i)
89  {
90 
91  weighting(i) = (1.0/(1.0+exp(-(q(i)-limits_min[i]-delta_pos)/sigma)))*(1.0/(1.0+exp((q(i)-limits_max[i]+delta_pos)/sigma)))+(1.0/(1.0+exp((q(i)*q_dot(i)+delta_speed)*sigma_speed)));
92 
93  if( (fabs(q(i)-limits_min[i])<params_.limiter_params.limits_tolerance*M_PI/180.0)){
94  ROS_WARN("Joint %i tolerance distance to minimum position %f not respected",i,(fabs(q(i)-limits_min[i])));
95  }
96  if( (fabs(q(i)-limits_max[i])<params_.limiter_params.limits_tolerance*M_PI/180.0) ){
97  ROS_WARN("Joint %i tolerance distance to maximum position %f not respected",i,(fabs(q(i)-limits_max[i])));
98  }
99  if( (fabs(q(i)-limits_min[i])<0.0)){
100  ROS_ERROR("Joint %i distance to minimum position %f not respected",i,(fabs(q(i)-limits_min[i])));
101  }
102  if( (fabs(q(i)-limits_max[i])<0.0)){
103  ROS_ERROR("Joint %i distance to maximum position %f not respected",i,(fabs(q(i)-limits_max[i])));
104  }
105 
106  if(weighting(i)>1.0){
107  weighting(i)=1.0;
108  }
109  }
110 
111  return weighting.asDiagonal();
112 }
std::vector< double > limits_min
const LimiterParams & limiter_params_
References the inv. diff. kin. solver parameters.
boost::shared_ptr< DampingBase > damping_
References the current Jacobian (matrix data only).
Eigen::Matrix< double, 6, 1 > Vector6d_t
Matrix6Xd_t jacobian_data_
References the limiter parameters (up-to-date according to KinematicExtension).
#define ROS_WARN(...)
PInvBySVD pinv_calc_
The currently set damping method.
virtual Eigen::MatrixXd solve(const Vector6d_t &in_cart_velocities, const JointStates &joint_states)
const TwistControllerParams & params_
Set of constraints.
virtual Eigen::MatrixXd calculate(const Eigen::MatrixXd &jacobian) const
INLINE Rall1d< T, V, S > exp(const Rall1d< T, V, S > &arg)
std::vector< double > limits_max
virtual Eigen::MatrixXd calculateWeighting(const Vector6d_t &in_cart_velocities, const JointStates &joint_states) const
#define ROS_ERROR(...)


cob_twist_controller
Author(s): Felix Messmer , Marco Bezzon , Christoph Mark , Francisco Moreno
autogenerated on Thu Apr 8 2021 02:40:01