franky 1.1.4
A High-Level Motion API for Franka
Loading...
Searching...
No Matches
torque_control_utils.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <cmath>
5#include <optional>
6#include <stdexcept>
7#include <string>
8
9#include "franky/types.hpp"
10
11namespace franky {
12
16inline void validateNonNegativeFinite(double value, const char *name) {
17 if (!std::isfinite(value) || value < 0.0) {
18 throw std::invalid_argument(std::string(name) + " must be finite and non-negative");
19 }
20}
21
25template <typename Derived>
26inline void validateFinite(const Eigen::MatrixBase<Derived> &values, const char *name) {
27 if (!values.allFinite()) {
28 throw std::invalid_argument(std::string(name) + " must contain only finite values");
29 }
30}
31
35inline void validateNonNegativeFinite(const Vector7d &values, const char *name) {
36 for (int i = 0; i < values.size(); ++i) {
37 if (!std::isfinite(values[i]) || values[i] < 0.0) {
38 throw std::invalid_argument(std::string(name) + " must contain only finite, non-negative values");
39 }
40 }
41}
42
45 double max_delta_tau{1.0};
46
48 std::optional<Vector7d> lower_joint_limits{};
49
51 std::optional<Vector7d> upper_joint_limits{};
52
55
58
61
64};
65
68
74
76 Vector7d coulomb{Vector7d::Zero()};
77
79 Vector7d viscous{Vector7d::Zero()};
80
82 Vector7d max_torque{Vector7d::Ones()};
83
85 double velocity_epsilon{0.03};
86
92 void validate() const {
93 validateNonNegativeFinite(coulomb, "friction.coulomb");
94 validateNonNegativeFinite(viscous, "friction.viscous");
95 validateNonNegativeFinite(max_torque, "friction.max_torque");
96 if (!std::isfinite(velocity_epsilon) || velocity_epsilon <= 0.0) {
97 throw std::invalid_argument("friction.velocity_epsilon must be finite and positive");
98 }
99 }
100};
101
103 const Vector7d &tau_d_calculated, const Vector7d &tau_reference, double max_delta_tau) {
105 for (size_t i = 0; i < 7; i++) {
106 const double difference = tau_d_calculated[i] - tau_reference[i];
107 tau_d_saturated[i] = tau_reference[i] + std::max(std::min(difference, max_delta_tau), -max_delta_tau);
108 }
109 return tau_d_saturated;
110}
111
113 const Vector7d &q, const Vector7d &dq, const Vector7d &lower_joint_limits, const Vector7d &upper_joint_limits,
114 double joint_limit_activation_distance, double joint_limit_stiffness, double joint_limit_damping,
115 double joint_limit_max_torque) {
116 Vector7d tau_limit = Vector7d::Zero();
117 const double activation_distance = std::max(joint_limit_activation_distance, 1e-6);
118
119 for (size_t i = 0; i < 7; i++) {
120 const double lower_soft_limit = lower_joint_limits[i] + activation_distance;
121 const double upper_soft_limit = upper_joint_limits[i] - activation_distance;
122
123 if (q[i] < lower_soft_limit) {
124 const double penetration = (lower_soft_limit - q[i]) / activation_distance;
125 double tau = joint_limit_stiffness * (std::exp(penetration) - 1.0);
126 if (dq[i] < 0.0) tau += joint_limit_damping * (-dq[i]);
127 tau_limit[i] = std::min(tau, joint_limit_max_torque);
128 } else if (q[i] > upper_soft_limit) {
129 const double penetration = (q[i] - upper_soft_limit) / activation_distance;
130 double tau = -joint_limit_stiffness * (std::exp(penetration) - 1.0);
131 if (dq[i] > 0.0) tau -= joint_limit_damping * dq[i];
132 tau_limit[i] = std::max(tau, -joint_limit_max_torque);
133 }
134 }
135
136 return tau_limit;
137}
138
140 Vector7d tau = Vector7d::Zero();
141 const double epsilon = std::max(params.velocity_epsilon, 1e-9);
142 for (int i = 0; i < 7; ++i) {
143 const double limit = std::max(params.max_torque[i], 0.0);
144 const double uncompensated = params.coulomb[i] * std::tanh(dq[i] / epsilon) + params.viscous[i] * dq[i];
145 tau[i] = std::clamp(uncompensated, -limit, limit);
146 }
147 return tau;
148}
149
150} // namespace franky
Definition dynamics_limit.cpp:8
std::array< double, dims > toStdD(const Eigen::Matrix< double, dims, 1 > &vector)
Definition util.hpp:18
Eigen::Vector< double, 7 > Vector7d
Definition types.hpp:11
void validateNonNegativeFinite(double value, const char *name)
Throw std::invalid_argument if value is negative or non-finite.
Definition torque_control_utils.hpp:16
Vector7d computeFrictionCompensation(const Vector7d &dq, const FrictionCompensationParams &params)
Definition torque_control_utils.hpp:139
void validateFinite(const Eigen::MatrixBase< Derived > &values, const char *name)
Throw std::invalid_argument if any element of values is non-finite.
Definition torque_control_utils.hpp:26
Vector7d saturateTorqueRate(const Vector7d &tau_d_calculated, const Vector7d &tau_reference, double max_delta_tau)
Definition torque_control_utils.hpp:102
Vector7d computeJointLimitTorque(const Vector7d &q, const Vector7d &dq, const Vector7d &lower_joint_limits, const Vector7d &upper_joint_limits, double joint_limit_activation_distance, double joint_limit_stiffness, double joint_limit_damping, double joint_limit_max_torque)
Definition torque_control_utils.hpp:112
Definition torque_control_utils.hpp:66
Vector7d max_torque
Definition torque_control_utils.hpp:82
Vector7d viscous
Definition torque_control_utils.hpp:79
double velocity_epsilon
Definition torque_control_utils.hpp:85
void validate() const
Throw std::invalid_argument if any parameter is out of range.
Definition torque_control_utils.hpp:92
Vector7d coulomb
Definition torque_control_utils.hpp:76
FrictionCompensationParams(const Vector7d &coulomb, const Vector7d &viscous, const Vector7d &max_torque, double velocity_epsilon=0.03)
Definition torque_control_utils.hpp:69
Definition torque_control_utils.hpp:43
double joint_limit_max_torque
Definition torque_control_utils.hpp:63
double joint_limit_damping
Definition torque_control_utils.hpp:60
double max_delta_tau
Definition torque_control_utils.hpp:45
std::optional< Vector7d > lower_joint_limits
Definition torque_control_utils.hpp:48
double joint_limit_stiffness
Definition torque_control_utils.hpp:57
double joint_limit_activation_distance
Definition torque_control_utils.hpp:54
std::optional< Vector7d > upper_joint_limits
Definition torque_control_utils.hpp:51