franky 1.1.4
A High-Level Motion API for Franka
Loading...
Searching...
No Matches
cartesian_impedance_base.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <Eigen/Core>
4#include <Eigen/Eigenvalues>
5#include <array>
6#include <cmath>
7#include <memory>
8#include <optional>
9#include <variant>
10#include <vector>
11
14#include "franky/twist.hpp"
17
18namespace franky {
19
25 Affine target{Affine::Identity()};
26
33 std::optional<Twist> target_twist{};
34
41 std::optional<TwistAcceleration> target_acceleration{};
42
44 void validate() const {
45 validateFinite(target.matrix(), "target");
46 if (target_twist.has_value()) validateFinite(target_twist->vector_repr(), "target_twist");
47 if (target_acceleration.has_value()) validateFinite(target_acceleration->vector_repr(), "target_acceleration");
48 }
49};
50
51inline Matrix6d cartesianGainBlocks(double translational, double rotational) {
52 Matrix6d gains = Matrix6d::Zero();
53 gains.topLeftCorner<3, 3>() = translational * Eigen::Matrix3d::Identity();
54 gains.bottomRightCorner<3, 3>() = rotational * Eigen::Matrix3d::Identity();
55 return gains;
56}
57
59
61 Eigen::SelfAdjointEigenSolver<Matrix6d> solver(stiffness);
62 return 2.0 * solver.operatorSqrt();
63}
64
67
68 explicit CartesianImpedanceGains(Matrix6d stiffness, std::optional<Matrix6d> damping = std::nullopt)
69 : stiffness(std::move(stiffness)), damping(std::move(damping)) {
70 validate();
71 }
72
74 double translational_stiffness, double rotational_stiffness,
75 std::optional<double> translational_damping = std::nullopt,
76 std::optional<double> rotational_damping = std::nullopt) {
78 gains.stiffness = cartesianGainBlocks(translational_stiffness, rotational_stiffness);
79 if (translational_damping.has_value() || rotational_damping.has_value()) {
81 translational_damping.value_or(2.0 * std::sqrt(translational_stiffness)),
82 rotational_damping.value_or(2.0 * std::sqrt(rotational_stiffness)));
83 }
84 gains.validate();
85 return gains;
86 }
87
88 static CartesianImpedanceGains diagonal(const Vector6d &stiffness, std::optional<Vector6d> damping = std::nullopt) {
90 gains.stiffness = stiffness.asDiagonal();
91 if (damping.has_value()) gains.damping = damping->asDiagonal();
92 gains.validate();
93 return gains;
94 }
95
97 std::optional<Matrix6d> damping{std::nullopt};
98
100 void validate() const {
101 validateFinite(stiffness, "stiffness");
102 if (damping.has_value()) validateFinite(*damping, "damping");
103 }
104};
105
110 PostureTask() = default;
111
113 const Vector7d &target, const Vector7d &stiffness, std::optional<Vector7d> damping = std::nullopt,
114 std::optional<double> max_torque = std::nullopt)
116
119 const Vector7d &target, double stiffness, std::optional<double> damping = std::nullopt,
120 std::optional<double> max_torque = std::nullopt)
122 if (damping.has_value()) this->damping = Vector7d::Constant(*damping);
123 }
124
126 Vector7d target{Vector7d::Zero()};
127
135 Vector7d stiffness{Vector7d::Zero()};
136
142 std::optional<Vector7d> damping{std::nullopt};
143
145 std::optional<double> max_torque{std::nullopt};
146};
147
153
154 ManipulabilityTask(double gain, double damping = 0.0, std::optional<double> max_torque = std::nullopt)
156
158 double gain{0.0};
159
161 double damping{0.0};
162
164 std::optional<double> max_torque{std::nullopt};
165};
166
167using NullspaceTask = std::variant<PostureTask, ManipulabilityTask>;
168
173 Vector7d posture_stiffness{Vector7d::Zero()};
174 std::optional<Vector7d> posture_damping{std::nullopt};
175 std::optional<double> posture_max_torque{std::nullopt};
176
179 std::optional<double> manipulability_max_torque{std::nullopt};
180};
181
189class CartesianImpedanceBase : public Motion<franka::Torques> {
190 public:
194 struct Params {
197
199 std::optional<Matrix6d> damping{std::nullopt};
200
208 Eigen::Vector3d translational_error_clip{Eigen::Vector3d::Constant(0.10)};
209
216 Eigen::Vector3d rotational_error_clip{Eigen::Vector3d::Constant(0.25)};
217
219 std::array<std::optional<double>, 6> force_constraints{};
220
227 std::vector<NullspaceTask> nullspace_tasks{};
228
231
234
236 void validate() const {
237 validateFinite(stiffness, "stiffness");
238 if (damping.has_value()) validateFinite(*damping, "damping");
240 }
241 };
242
243 [[nodiscard]] const Affine &target() const { return target_; }
244
246 gains.validate();
247 gains_handle_.set(gains);
248 }
249 [[nodiscard]] CartesianImpedanceGains getGains() const { return gains_handle_.getLastWritten(); }
250
251 void setNullspaceGains(const NullspaceGains &gains) { nullspace_gains_handle_.set(gains); }
252 [[nodiscard]] NullspaceGains getNullspaceGains() const { return nullspace_gains_handle_.getLastWritten(); }
253
254 protected:
261 explicit CartesianImpedanceBase(Affine target, const Params &params, double gains_time_constant = 0.1);
262
263 [[nodiscard]] franka::Torques computeCommand(
264 const RobotState &robot_state, const CartesianReference &reference, double dt);
265
266 [[nodiscard]] inline const Params &base_params() const { return params_; }
267
269
270 private:
271 const Matrix6d &criticalDamping();
272
273 Params params_;
274
276 WaitFreeTripleBuffer<NullspaceGains> nullspace_gains_handle_;
277 double gains_time_constant_;
278 Matrix6d current_stiffness_;
279 Matrix6d current_damping_;
280 NullspaceGains current_nullspace_gains_;
281
283 Matrix6d critical_damping_;
284
289 std::optional<Matrix6d> critical_damping_stiffness_;
290};
291
293
294} // namespace franky
Base class for client-side cartesian impedance motions.
Definition cartesian_impedance_base.hpp:189
const Params & base_params() const
Definition cartesian_impedance_base.hpp:266
const Affine & target() const
Definition cartesian_impedance_base.hpp:243
void setNullspaceGains(const NullspaceGains &gains)
Definition cartesian_impedance_base.hpp:251
Affine target_
Definition cartesian_impedance_base.hpp:268
CartesianImpedanceGains getGains() const
Definition cartesian_impedance_base.hpp:249
franka::Torques computeCommand(const RobotState &robot_state, const CartesianReference &reference, double dt)
Definition cartesian_impedance_base.cpp:195
void setGains(const CartesianImpedanceGains &gains)
Definition cartesian_impedance_base.hpp:245
NullspaceGains getNullspaceGains() const
Definition cartesian_impedance_base.hpp:252
Base class for motions.
Definition motion.hpp:25
Wait-free, Single-Producer Single-Consumer (SPSC) triple buffer.
Definition wait_free_triple_buffer.hpp:17
Definition dynamics_limit.cpp:8
Matrix6d defaultCartesianImpedanceDamping(const Matrix6d &stiffness)
Definition cartesian_impedance_base.hpp:60
Eigen::Vector< double, 7 > Vector7d
Definition types.hpp:11
std::variant< PostureTask, ManipulabilityTask > NullspaceTask
Definition cartesian_impedance_base.hpp:167
Eigen::Matrix< double, 6, 6 > Matrix6d
Definition types.hpp:14
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
Eigen::Vector< double, 6 > Vector6d
Definition types.hpp:10
Matrix6d cartesianGainBlocks(double translational, double rotational)
Definition cartesian_impedance_base.hpp:51
Matrix6d defaultCartesianImpedanceStiffness()
Definition cartesian_impedance_base.hpp:58
Eigen::Affine3d Affine
Definition types.hpp:16
Parameters for the impedance motion.
Definition cartesian_impedance_base.hpp:194
std::array< std::optional< double >, 6 > force_constraints
Definition cartesian_impedance_base.hpp:219
std::optional< Matrix6d > damping
Definition cartesian_impedance_base.hpp:199
Eigen::Vector3d translational_error_clip
Definition cartesian_impedance_base.hpp:208
void validate() const
Throw std::invalid_argument if any parameter is out of range.
Definition cartesian_impedance_base.hpp:236
TorqueSafetyParams safety
Definition cartesian_impedance_base.hpp:230
FrictionCompensationParams friction
Definition cartesian_impedance_base.hpp:233
std::vector< NullspaceTask > nullspace_tasks
Definition cartesian_impedance_base.hpp:227
Eigen::Vector3d rotational_error_clip
Definition cartesian_impedance_base.hpp:216
Matrix6d stiffness
Definition cartesian_impedance_base.hpp:196
Definition cartesian_impedance_base.hpp:65
std::optional< Matrix6d > damping
Definition cartesian_impedance_base.hpp:97
Matrix6d stiffness
Definition cartesian_impedance_base.hpp:96
CartesianImpedanceGains(Matrix6d stiffness, std::optional< Matrix6d > damping=std::nullopt)
Definition cartesian_impedance_base.hpp:68
static CartesianImpedanceGains diagonal(const Vector6d &stiffness, std::optional< Vector6d > damping=std::nullopt)
Definition cartesian_impedance_base.hpp:88
void validate() const
Throw std::invalid_argument if any gain is non-finite.
Definition cartesian_impedance_base.hpp:100
static CartesianImpedanceGains isotropic(double translational_stiffness, double rotational_stiffness, std::optional< double > translational_damping=std::nullopt, std::optional< double > rotational_damping=std::nullopt)
Definition cartesian_impedance_base.hpp:73
Cartesian impedance reference expressed in the base frame.
Definition cartesian_impedance_base.hpp:23
std::optional< TwistAcceleration > target_acceleration
Definition cartesian_impedance_base.hpp:41
void validate() const
Throw std::invalid_argument if any value is non-finite.
Definition cartesian_impedance_base.hpp:44
Affine target
Definition cartesian_impedance_base.hpp:25
std::optional< Twist > target_twist
Definition cartesian_impedance_base.hpp:33
Definition torque_control_utils.hpp:66
void validate() const
Throw std::invalid_argument if any parameter is out of range.
Definition torque_control_utils.hpp:92
Manipulability maximization objective projected into the Cartesian nullspace.
Definition cartesian_impedance_base.hpp:151
ManipulabilityTask(double gain, double damping=0.0, std::optional< double > max_torque=std::nullopt)
Definition cartesian_impedance_base.hpp:154
std::optional< double > max_torque
Definition cartesian_impedance_base.hpp:164
double gain
Definition cartesian_impedance_base.hpp:158
double damping
Definition cartesian_impedance_base.hpp:161
Runtime-adjustable gains for a nullspace task.
Definition cartesian_impedance_base.hpp:172
std::optional< double > posture_max_torque
Definition cartesian_impedance_base.hpp:175
Vector7d posture_stiffness
Definition cartesian_impedance_base.hpp:173
std::optional< Vector7d > posture_damping
Definition cartesian_impedance_base.hpp:174
double manipulability_gain
Definition cartesian_impedance_base.hpp:177
double manipulability_damping
Definition cartesian_impedance_base.hpp:178
std::optional< double > manipulability_max_torque
Definition cartesian_impedance_base.hpp:179
Joint-posture objective projected into the Cartesian nullspace.
Definition cartesian_impedance_base.hpp:109
Vector7d target
Definition cartesian_impedance_base.hpp:126
PostureTask(const Vector7d &target, double stiffness, std::optional< double > damping=std::nullopt, std::optional< double > max_torque=std::nullopt)
Definition cartesian_impedance_base.hpp:118
std::optional< Vector7d > damping
Definition cartesian_impedance_base.hpp:142
Vector7d stiffness
Definition cartesian_impedance_base.hpp:135
std::optional< double > max_torque
Definition cartesian_impedance_base.hpp:145
PostureTask(const Vector7d &target, const Vector7d &stiffness, std::optional< Vector7d > damping=std::nullopt, std::optional< double > max_torque=std::nullopt)
Definition cartesian_impedance_base.hpp:112
Full state of the robot.
Definition robot_state.hpp:40
Definition torque_control_utils.hpp:43