28 double cycle = (now - this->
last_time_).toSec();
34 Eigen::MatrixXd particular_solution = damped_pinv * in_cart_velocities;
36 Eigen::MatrixXd ident = Eigen::MatrixXd::Identity(pinv.rows(), this->
jacobian_data_.cols());
39 Eigen::MatrixXd projector_i = Eigen::MatrixXd::Identity(this->jacobian_data_.cols(), this->jacobian_data_.cols());
40 Eigen::VectorXd q_i = Eigen::VectorXd::Zero(this->jacobian_data_.cols());
41 Eigen::MatrixXd qdots_out = Eigen::MatrixXd::Zero(this->jacobian_data_.cols(), 1);
43 Eigen::VectorXd sum_of_gradient = Eigen::VectorXd::Zero(this->jacobian_data_.cols());
50 predict_jnts_vel.
q(i) = particular_solution(i, 0) * cycle + joint_states.
current_q_(i);
51 predict_jnts_vel.qdot(i) = particular_solution(i, 0);
55 double inv_sum_of_prionums = 0.0;
58 (*it)->update(joint_states, predict_jnts_vel, this->jacobian_data_);
59 const double constr_prio = (*it)->getPriorityAsNum();
60 if ((*it)->getState().getCurrent() ==
DANGER)
69 this->
processState(it, projector, particular_solution, inv_sum_of_prionums, sum_of_gradient);
72 sum_of_gradient = this->
params_.
k_H * sum_of_gradient;
92 Eigen::MatrixXd J_task = it->task_jacobian_;
93 Eigen::MatrixXd J_temp = J_task * projector_i;
94 Eigen::VectorXd v_task = it->task_;
96 q_i = q_i + J_temp_inv * (v_task - J_task * q_i);
97 projector_i = projector_i - J_temp_inv * J_temp;
100 qdots_out.col(0) = q_i + projector_i * sum_of_gradient;
106 const Eigen::MatrixXd& projector,
107 const Eigen::MatrixXd& particular_solution,
108 double inv_sum_of_prios,
109 Eigen::VectorXd& sum_of_gradient)
111 Eigen::VectorXd q_dot_0 = (*it)->getPartialValues();
112 const double activation_gain = (*it)->getActivationGain();
113 Eigen::MatrixXd tmp_projection = projector * q_dot_0;
114 const double magnitude = (*it)->getSelfMotionMagnitude(particular_solution, tmp_projection);
117 const double constr_prio = (*it)->getPriorityAsNum();
120 const double gpm_weighting = inv_constr_prio / inv_sum_of_prios;
127 Task_t t = (*it)->createTask();
128 double factor = activation_gain * std::abs(magnitude);
136 sum_of_gradient += gpm_weighting * activation_gain * magnitude * q_dot_0;
147 Task_t t = (*it)->createTask();
148 double factor = activation_gain * std::abs(magnitude);
154 sum_of_gradient += gpm_weighting * activation_gain * magnitude * q_dot_0;
EN_ConstraintStates global_constraint_state_
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).
virtual Eigen::MatrixXd solve(const Vector6d_t &in_cart_velocities, const JointStates &joint_states)
void processState(std::set< ConstraintBase_t >::iterator &it, const Eigen::MatrixXd &projector, const Eigen::MatrixXd &particular_solution, double inv_sum_of_prios, Eigen::VectorXd &sum_of_gradient)
TwistControllerParams tcp_
void addTask(Task< PRIO > t)
geometry_msgs::TransformStamped t
void activateTask(std::string task_id)
unsigned int rows() const
PInvBySVD pinv_calc_
The currently set damping method.
std::vector< Task< PRIO > >::iterator getTasksEnd()
double in_cart_vel_damping_
const TwistControllerParams & params_
Set of constraints.
void deactivateTask(typename std::vector< Task< PRIO > >::iterator it)
std::set< ConstraintBase_t > constraints_
set inserts sorted (default less operator); if element has already been added it returns an iterator ...
std::vector< Task< PRIO > >::iterator beginTaskIter()
bool isTransition() const
std::vector< Task< PRIO > >::iterator nextActiveTask()
EN_ConstraintStates getCurrent() const
virtual Eigen::MatrixXd calculate(const Eigen::MatrixXd &jacobian) const
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
TaskStackController_t & task_stack_controller_
An instance that helps solving the inverse of the Jacobian.
std::vector< Task_t >::iterator TaskSetIter_t