| Line |
Branch |
Exec |
Source |
| 1 |
|
|
/* |
| 2 |
|
|
* Copyright 2019 |
| 3 |
|
|
* |
| 4 |
|
|
* LAAS-CNRS |
| 5 |
|
|
* |
| 6 |
|
|
* Noƫlie Ramuzat |
| 7 |
|
|
* This file is part of sot-core. |
| 8 |
|
|
* See license file. |
| 9 |
|
|
*/ |
| 10 |
|
|
|
| 11 |
|
|
#ifndef __sot_core_admittance_control_op_point_H__ |
| 12 |
|
|
#define __sot_core_admittance_control_op_point_H__ |
| 13 |
|
|
|
| 14 |
|
|
/* --------------------------------------------------------------------- */ |
| 15 |
|
|
/* --- API ------------------------------------------------------------- */ |
| 16 |
|
|
/* --------------------------------------------------------------------- */ |
| 17 |
|
|
|
| 18 |
|
|
#if defined(WIN32) |
| 19 |
|
|
#if defined(admittance_control_op_point_EXPORTS) |
| 20 |
|
|
#define ADMITTANCECONTROLOPPOINT_EXPORT __declspec(dllexport) |
| 21 |
|
|
#else |
| 22 |
|
|
#define ADMITTANCECONTROLOPPOINT_EXPORT __declspec(dllimport) |
| 23 |
|
|
#endif |
| 24 |
|
|
#else |
| 25 |
|
|
#define ADMITTANCECONTROLOPPOINT_EXPORT |
| 26 |
|
|
#endif |
| 27 |
|
|
|
| 28 |
|
|
/* --------------------------------------------------------------------- */ |
| 29 |
|
|
/* --- INCLUDE --------------------------------------------------------- */ |
| 30 |
|
|
/* --------------------------------------------------------------------- */ |
| 31 |
|
|
|
| 32 |
|
|
#include <dynamic-graph/signal-helper.h> |
| 33 |
|
|
|
| 34 |
|
|
#include <sot/core/matrix-geometry.hh> |
| 35 |
|
|
|
| 36 |
|
|
#include "pinocchio/spatial/force.hpp" |
| 37 |
|
|
#include "pinocchio/spatial/motion.hpp" |
| 38 |
|
|
#include "pinocchio/spatial/se3.hpp" |
| 39 |
|
|
|
| 40 |
|
|
namespace dynamicgraph { |
| 41 |
|
|
namespace sot { |
| 42 |
|
|
namespace core { |
| 43 |
|
|
|
| 44 |
|
|
/* --------------------------------------------------------------------- */ |
| 45 |
|
|
/* --- CLASS ----------------------------------------------------------- */ |
| 46 |
|
|
/* --------------------------------------------------------------------- */ |
| 47 |
|
|
|
| 48 |
|
|
/** |
| 49 |
|
|
* @brief Admittance controller for an operational point wrt to a force sensor. |
| 50 |
|
|
* It can be a point of the model (hand) or not (created operational |
| 51 |
|
|
* point: an object in the hand of the robot) Which is closed to a force sensor |
| 52 |
|
|
* (for instance the right or left wrist ft) |
| 53 |
|
|
* |
| 54 |
|
|
* This entity computes a velocity reference for an operational point based |
| 55 |
|
|
* on the force error in the world frame : |
| 56 |
|
|
* w_dq = integral(Kp(w_forceDes-w_force)) + Kd (w_dq) |
| 57 |
|
|
* |
| 58 |
|
|
*/ |
| 59 |
|
|
class ADMITTANCECONTROLOPPOINT_EXPORT AdmittanceControlOpPoint |
| 60 |
|
|
: public ::dynamicgraph::Entity { |
| 61 |
|
10 |
DYNAMIC_GRAPH_ENTITY_DECL(); |
| 62 |
|
|
|
| 63 |
|
|
public: |
| 64 |
|
|
EIGEN_MAKE_ALIGNED_OPERATOR_NEW |
| 65 |
|
|
|
| 66 |
|
|
/* --- CONSTRUCTOR ---- */ |
| 67 |
|
|
AdmittanceControlOpPoint(const std::string &name); |
| 68 |
|
|
/** |
| 69 |
|
|
* @brief Initialize the entity |
| 70 |
|
|
* |
| 71 |
|
|
* @param[in] dt Time step of the control |
| 72 |
|
|
*/ |
| 73 |
|
|
void init(const double &dt); |
| 74 |
|
|
|
| 75 |
|
|
/* --- SIGNALS --- */ |
| 76 |
|
|
/// \brief Gain (6d) for the integration of the error on the force |
| 77 |
|
|
DECLARE_SIGNAL_IN(Kp, dynamicgraph::Vector); |
| 78 |
|
|
/// \brief Derivative gain (6d) for the error on the force |
| 79 |
|
|
DECLARE_SIGNAL_IN(Kd, dynamicgraph::Vector); |
| 80 |
|
|
/// \brief Value of the saturation to apply on the velocity output |
| 81 |
|
|
DECLARE_SIGNAL_IN(dqSaturation, dynamicgraph::Vector); |
| 82 |
|
|
/// \brief 6d force given by the sensor in its local frame |
| 83 |
|
|
DECLARE_SIGNAL_IN(force, dynamicgraph::Vector); |
| 84 |
|
|
/// \brief 6d desired force of the end-effector in the world frame |
| 85 |
|
|
DECLARE_SIGNAL_IN(w_forceDes, dynamicgraph::Vector); |
| 86 |
|
|
/// \brief Current position (matrixHomogeneous) of the given operational |
| 87 |
|
|
/// point |
| 88 |
|
|
DECLARE_SIGNAL_IN(opPose, dynamicgraph::sot::MatrixHomogeneous); |
| 89 |
|
|
/// \brief Current position (matrixHomogeneous) of the given force sensor |
| 90 |
|
|
DECLARE_SIGNAL_IN(sensorPose, dynamicgraph::sot::MatrixHomogeneous); |
| 91 |
|
|
|
| 92 |
|
|
/// \brief 6d force given by the sensor in the world frame |
| 93 |
|
|
DECLARE_SIGNAL_INNER(w_force, dynamicgraph::Vector); |
| 94 |
|
|
/// \brief Internal intergration computed in the world frame |
| 95 |
|
|
DECLARE_SIGNAL_INNER(w_dq, dynamicgraph::Vector); |
| 96 |
|
|
|
| 97 |
|
|
/// \brief Velocity reference for the end-effector in the local frame |
| 98 |
|
|
DECLARE_SIGNAL_OUT(dq, dynamicgraph::Vector); |
| 99 |
|
|
|
| 100 |
|
|
/* --- COMMANDS --- */ |
| 101 |
|
|
/** |
| 102 |
|
|
* @brief Reset the velocity |
| 103 |
|
|
*/ |
| 104 |
|
|
void resetDq(); |
| 105 |
|
|
|
| 106 |
|
|
/* --- ENTITY INHERITANCE --- */ |
| 107 |
|
|
virtual void display(std::ostream &os) const; |
| 108 |
|
|
|
| 109 |
|
|
protected: |
| 110 |
|
|
/// Dimension of the force signals and of the output |
| 111 |
|
|
int m_n; |
| 112 |
|
|
/// True if the entity has been successfully initialized |
| 113 |
|
|
bool m_initSucceeded; |
| 114 |
|
|
/// Internal state |
| 115 |
|
|
dynamicgraph::Vector m_w_dq; |
| 116 |
|
|
/// Time step of the control |
| 117 |
|
|
double m_dt; |
| 118 |
|
|
// Weight of the end-effector |
| 119 |
|
|
double m_mass; |
| 120 |
|
|
|
| 121 |
|
|
}; // class AdmittanceControlOpPoint |
| 122 |
|
|
|
| 123 |
|
|
} // namespace core |
| 124 |
|
|
} // namespace sot |
| 125 |
|
|
} // namespace dynamicgraph |
| 126 |
|
|
|
| 127 |
|
|
#endif // #ifndef __sot_core_admittance_control_op_point_H__ |
| 128 |
|
|
|