AdmittanceTask.h
Go to the documentation of this file.
1 /*
2  * Copyright 2015-2022 CNRS-UM LIRMM, CNRS-AIST JRL
3  */
4 
5 #pragma once
6 
8 
10 
11 namespace mc_tasks
12 {
13 
14 namespace force
15 {
16 
39 {
40 public:
41  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
42 
54  AdmittanceTask(const mc_rbdyn::RobotFrame & frame, double stiffness = 5.0, double weight = 1000.0);
55 
73  AdmittanceTask(const std::string & robotSurface,
74  const mc_rbdyn::Robots & robots,
75  unsigned robotIndex,
76  double stiffness = 5.0,
77  double weight = 1000.0);
78 
86  void reset() override;
87 
91  const sva::ForceVecd & admittance() const { return admittance_; }
92 
98  void admittance(const sva::ForceVecd & admittance) { admittance_ = admittance; }
99 
101  sva::PTransformd surfacePose() const { return frame_->position(); }
102 
104  sva::PTransformd targetPose() { return this->target(); }
105 
111  void targetPose(const sva::PTransformd & X_0_target) { this->target(X_0_target); }
112 
114  sva::PTransformd poseError() { return targetPose() * surfacePose().inv(); }
115 
117  const sva::ForceVecd & targetWrench() const { return targetWrench_; }
118 
123  void targetWrenchW(const sva::ForceVecd & wrenchW) { targetWrench(frame_->position().dualMul(wrenchW)); }
124 
130  void targetWrench(const sva::ForceVecd & wrench) { targetWrench_ = wrench; }
131 
133  sva::ForceVecd measuredWrench() const { return frame_->wrench(); }
134 
136  void maxLinearVel(const Eigen::Vector3d & maxLinearVel)
137  {
138  if((maxLinearVel.array() <= 0.).any())
139  {
140  mc_rtc::log::error("discarding maxLinearVel update as it is not positive");
141  ;
142  return;
143  }
144  maxLinearVel_ = maxLinearVel;
145  }
146 
148  const Eigen::Vector3d & maxLinearVel() const noexcept { return maxLinearVel_; }
149 
151  void maxAngularVel(const Eigen::Vector3d & maxAngularVel)
152  {
153  if((maxAngularVel.array() <= 0.).any())
154  {
155  mc_rtc::log::error("discarding maxAngularVel update as it is not positive");
156  ;
157  return;
158  }
159  maxAngularVel_ = maxAngularVel;
160  }
161 
163  const Eigen::Vector3d & maxAngularVel() const noexcept { return maxAngularVel_; }
164 
169  void velFilterGain(double gain) { velFilterGain_ = mc_filter::utils::clamp(gain, 0, 1); }
170 
172  double velFilterGain() const noexcept { return velFilterGain_; }
173 
187  void refVelB(const sva::MotionVecd & velB) { feedforwardVelB_ = velB; }
188 
190  void load(mc_solver::QPSolver & solver, const mc_rtc::Configuration & config) override;
191 
192 protected:
193  Eigen::Vector3d maxAngularVel_ = {0.1, 0.1, 0.1}; // [rad] / [s]
194  Eigen::Vector3d maxLinearVel_ = {0.1, 0.1, 0.1}; // [m] / [s]
195  double timestep_;
196  double velFilterGain_ = 0.8; //< Gain for the low-pass filter on reference velocity [0..1]
197  sva::ForceVecd admittance_ = sva::ForceVecd(Eigen::Vector6d::Zero());
198  sva::ForceVecd targetWrench_ = sva::ForceVecd(Eigen::Vector6d::Zero());
199  sva::ForceVecd wrenchError_ = sva::ForceVecd(Eigen::Vector6d::Zero());
200  sva::MotionVecd feedforwardVelB_ = sva::MotionVecd(Eigen::Vector6d::Zero());
201  sva::MotionVecd refVelB_ = sva::MotionVecd(Eigen::Vector6d::Zero());
202 
203  void update(mc_solver::QPSolver &) override;
204 
205  void addToGUI(mc_rtc::gui::StateBuilder & gui) override;
206  void addToLogger(mc_rtc::Logger & logger) override;
207 
210 
212  using TransformTask::target;
213 
217  void addToSolver(mc_solver::QPSolver & solver) override;
218 };
219 
220 } // namespace force
221 
222 } // namespace mc_tasks
mc_rtc::Configuration
Simplify access to values hold within a JSON file.
Definition: Configuration.h:165
mc_rbdyn::Robots
Definition: Robots.h:15
mc_tasks::force::AdmittanceTask::maxAngularVel
void maxAngularVel(const Eigen::Vector3d &maxAngularVel)
Set the maximum angular velocity of the task.
Definition: AdmittanceTask.h:151
MC_TASKS_DLLAPI
#define MC_TASKS_DLLAPI
Definition: api.h:50
mc_tasks::force::AdmittanceTask::measuredWrench
sva::ForceVecd measuredWrench() const
Get the measured wrench in the control frame.
Definition: AdmittanceTask.h:133
mc_tasks::force::AdmittanceTask::maxLinearVel
const Eigen::Vector3d & maxLinearVel() const noexcept
Definition: AdmittanceTask.h:148
mc_solver::QPSolver
Definition: QPSolver.h:85
mc_tasks::force::AdmittanceTask::admittance
void admittance(const sva::ForceVecd &admittance)
Set the admittance coefficients of the task.
Definition: AdmittanceTask.h:98
mc_tasks::force::AdmittanceTask::surfacePose
sva::PTransformd surfacePose() const
Get the current pose of the control frame in the inertial frame.
Definition: AdmittanceTask.h:101
mc_tasks::force::AdmittanceTask::targetWrenchW
void targetWrenchW(const sva::ForceVecd &wrenchW)
Set the target wrench in world frame.
Definition: AdmittanceTask.h:123
mc_tasks::force::AdmittanceTask::targetPose
sva::PTransformd targetPose()
Get the target pose of the control frame in the world frame.
Definition: AdmittanceTask.h:104
mc_tasks::force::AdmittanceTask::admittance
const sva::ForceVecd & admittance() const
Get the admittance coefficients of the task.
Definition: AdmittanceTask.h:91
mc_tasks::force::AdmittanceTask::maxLinearVel
void maxLinearVel(const Eigen::Vector3d &maxLinearVel)
Set the maximum translation velocity of the task.
Definition: AdmittanceTask.h:136
mc_tasks::force::AdmittanceTask::targetPose
void targetPose(const sva::PTransformd &X_0_target)
Set target pose (position and orientation) of the frame in the world frame.
Definition: AdmittanceTask.h:111
mc_rtc::Logger
Logs controller data to disk.
Definition: Logger.h:29
mc_tasks::TransformTask::target
virtual sva::PTransformd target() const
Get the task's target.
mc_tasks::force::AdmittanceTask::targetWrench
void targetWrench(const sva::ForceVecd &wrench)
Set the target wrench in the control frame.
Definition: AdmittanceTask.h:130
mc_rbdyn::RobotFrame
Definition: RobotFrame.h:21
mc_rtc::gui::StateBuilder
Definition: StateBuilder.h:27
mc_tasks::TransformTask
Control a frame 6D pose.
Definition: TransformTask.h:15
mc_filter::utils::clamp
double clamp(double value, double lower, double upper)
Definition: clamp.h:29
TransformTask.h
mc_tasks::TransformTask::refVelB
sva::MotionVecd refVelB() const
Get reference velocity in frame coordinates as a motion vector.
Definition: TransformTask.h:192
mc_tasks::force::AdmittanceTask::poseError
sva::PTransformd poseError()
Transform from current frame pose to target.
Definition: AdmittanceTask.h:114
mc_tasks::force::AdmittanceTask::velFilterGain
double velFilterGain() const noexcept
Return the gain of the low-pass filter on the reference velocity.
Definition: AdmittanceTask.h:172
clamp.h
mc_rtc::log::error
void error(Args &&... args)
Definition: logging.h:63
mc_tasks::force::AdmittanceTask::velFilterGain
void velFilterGain(double gain)
Set the gain of the low-pass filter on the reference velocity.
Definition: AdmittanceTask.h:169
mc_tasks::force::AdmittanceTask
Hybrid position-force control on a contacting end-effector.
Definition: AdmittanceTask.h:38
mc_tasks
Definition: StabilizerStandingState.h:11
mc_tasks::force::AdmittanceTask::refVelB
void refVelB(const sva::MotionVecd &velB)
Set the reference body velocity.
Definition: AdmittanceTask.h:187
mc_tasks::force::AdmittanceTask::maxAngularVel
const Eigen::Vector3d & maxAngularVel() const noexcept
Definition: AdmittanceTask.h:163
mc_tasks::force::AdmittanceTask::targetWrench
const sva::ForceVecd & targetWrench() const
Get the target wrench in the control frame.
Definition: AdmittanceTask.h:117
mc_tasks::force::AdmittanceTask::timestep_
double timestep_
Definition: AdmittanceTask.h:195