CartesianNaturalPositionControllerProxy.h
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T),
5  * Karlsruhe Institute of Technology (KIT), all rights reserved.
6  *
7  * ArmarX is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  *
11  * ArmarX is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  *
19  * @author armar-user (armar-user at kit dot edu)
20  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
21  * GNU General Public License
22  */
23 
24 #pragma once
25 
26 #include <memory>
27 
28 #include <RobotAPI/interface/aron.h>
29 #include <RobotAPI/interface/units/RobotUnit/NJointCartesianNaturalPositionController.h>
30 #include <RobotAPI/interface/units/RobotUnit/RobotUnitInterface.h>
31 
32 #include "NaturalIK.h"
33 
34 namespace armarx
35 {
36  typedef std::shared_ptr<class CartesianNaturalPositionControllerProxy>
38 
40  {
41  public:
42  struct DynamicKp
43  {
44  bool enabled = false;
45  float maxKp = 1;
46  float sigmaMM = 50;
47  void calculate(float error, float& KpElb, float& KpJla);
48  };
49 
51  {
52  float baseKpTcpPos;
53  float baseKpTcpOri;
54  float baseKpElbPos;
55  float baseKpJla;
56  float baseKpNs;
60  };
61 
63  {
64  float scaleTcpPosVel = 1;
65  float scaleTcpOriVel = 1;
66  float scaleElbPosVel = 1;
69 
70  Ice::FloatSeq baseJointVelocity;
71  float basePosVel;
72  float baseOriVel;
73  };
74 
76  {
79  float rad2mmFactor = 100 / M_PI;
80  //float thresholdTcpOriReached;
81  };
82 
84  {
87  std::optional<float> minElbowHeight = std::nullopt;
88  std::vector<float> userNullspaceTargets;
89  };
90 
91  //typedef std::shared_ptr<class Waypoint> WaypointPtr;
92  class Waypoint
93  {
94  public:
97  //bool offsetFTonEnter = false;
98  //bool resetFTonExit = false;
99  //float forceTheshold = -1;
100 
101  bool reached(const VirtualRobot::RobotNodePtr& tcp);
103  Waypoint& setNullspaceTargets(const std::vector<float>& userNullspaceTargets);
104 
105  //aron::AronObjectPtr toAron();
106  //void fromAron(aron::AronObjectPtr aron);
107  };
108 
110  {
111  public:
112  ScopedJointValueRestore(const VirtualRobot::RobotNodeSetPtr& rns);
114 
115  private:
116  std::vector<float> jointValues;
117  VirtualRobot::RobotNodeSetPtr rns;
118  };
119 
121  const NaturalIK& _ik,
122  const NaturalIK::ArmJoints& arm,
123  const RobotUnitInterfacePrx& _robotUnit,
124  const std::string& _controllerName,
125  NJointCartesianNaturalPositionControllerConfigPtr _config);
126  static NJointCartesianNaturalPositionControllerConfigPtr
127  MakeConfig(const std::string& rns, const std::string& elbowNode);
128 
129  void init();
130 
131  bool setTarget(const Eigen::Matrix4f& tcpTarget,
132  NaturalDiffIK::Mode setOri,
133  std::optional<float> minElbowHeight = std::nullopt);
134  void setNullspaceTarget(const std::vector<float>& nullspaceTargets);
135 
136  Eigen::Vector3f getCurrentTargetPosition();
137  Eigen::Vector3f getCurrentElbowTargetPosition();
138 
139  float getTcpPositionError();
140  float getTcpOrientationError();
141  float getElbPositionError();
142 
143  bool isFinalWaypointReached();
144 
145  void useCurrentFTasOffset();
146  void enableFTLimit(float force, float torque, bool useCurrentFTasOffset);
147  void disableFTLimit();
148  FTSensorValue getCurrentFTValue(bool substactOffset);
149  FTSensorValue getAverageFTValue(bool substactOffset);
150  void stopClear();
151 
152 
153  void setRuntimeConfig(CartesianNaturalPositionControllerConfig runCfg);
154  CartesianNaturalPositionControllerConfig getRuntimeConfig();
155 
156  void addWaypoint(const Waypoint& waypoint);
157  Waypoint createWaypoint(const Eigen::Vector3f& tcpTarget,
158  const std::vector<float>& userNullspaceTargets,
159  std::optional<float> minElbowHeight = std::nullopt);
160  Waypoint createWaypoint(const Eigen::Vector3f& tcpTarget,
161  std::optional<float> minElbowHeight = std::nullopt);
162  Waypoint createWaypoint(const Eigen::Matrix4f& tcpTarget,
163  std::optional<float> minElbowHeight = std::nullopt);
164  void clearWaypoints();
165  void setDefaultWaypointConfig(const WaypointConfig& config);
166 
167 
168  std::string getStatusText();
169 
170  //void setTargetVelocity(const Eigen::VectorXf& cv);
171 
172  //void setNullSpaceControl(bool enabled);
173 
174  static std::vector<float>
175  CalculateMaxJointVelocity(const VirtualRobot::RobotNodeSetPtr& rns, float maxPosVel);
176 
177  void setMaxVelocities(float referencePosVel);
178  void updateBaseKpValues(const CartesianNaturalPositionControllerConfig& runCfg);
179 
180  bool update();
182  bool isLastWaypoint();
183 
184  void cleanup();
185 
186 
187  NJointCartesianNaturalPositionControllerInterfacePrx getInternalController();
188 
189  void setDynamicKp(DynamicKp dynamicKp);
191  static std::vector<float> ScaleVec(const std::vector<float>& vec, float scale);
192 
194 
195  private:
196  void updateDynamicKp();
197  void updateNullspaceTargets();
198 
199  bool onWaypointChanged();
200 
201  NaturalIK _ik;
202  RobotUnitInterfacePrx _robotUnit;
203  std::string _side;
204  std::string _controllerName;
205  NJointCartesianNaturalPositionControllerConfigPtr _config;
206  CartesianNaturalPositionControllerConfig _runCfg;
207  bool _controllerCreated = false;
208  NJointCartesianNaturalPositionControllerInterfacePrx _controller;
209  DynamicKp _dynamicKp;
210  Eigen::Matrix4f _tcpTarget;
211  Eigen::Matrix4f _elbTarget;
212  NaturalDiffIK::Mode _setOri;
214  VelocityBaseSettings _velocityBaseSettings;
215  KpBaseSettings _kpBaseSettings;
217  std::vector<Waypoint> _waypoints;
218  size_t _currentWaypointIndex = 0;
219  NaturalIK::Parameters _natikParams;
220  std::vector<float> _userNullspaceTargets;
221  std::vector<float> _naturalNullspaceTargets;
222  std::vector<VirtualRobot::RobotNodePtr> _rnsToElb;
223  bool _setJointNullspaceFromNaturalIK = true;
224 
225  std::map<std::string, WaypointConfig> _defaultWaypointConfigs;
226  bool _waypointChanged = false;
227  FTSensorValue _ftOffset;
228  bool _activateControllerOnInit = false;
229  };
230 } // namespace armarx
armarx::CartesianNaturalPositionControllerProxy::KpBaseSettings::baseKpNs
float baseKpNs
Definition: CartesianNaturalPositionControllerProxy.h:56
armarx::CartesianNaturalPositionControllerProxy::setTarget
bool setTarget(const Eigen::Matrix4f &tcpTarget, NaturalDiffIK::Mode setOri, std::optional< float > minElbowHeight=std::nullopt)
Definition: CartesianNaturalPositionControllerProxy.cpp:111
armarx::CartesianNaturalPositionControllerProxy::cleanup
void cleanup()
Definition: CartesianNaturalPositionControllerProxy.cpp:461
armarx::CartesianNaturalPositionControllerProxy
Definition: CartesianNaturalPositionControllerProxy.h:39
armarx::CartesianNaturalPositionControllerProxy::KpBaseSettings::maxPositionAcceleration
float maxPositionAcceleration
Definition: CartesianNaturalPositionControllerProxy.h:57
armarx::CartesianNaturalPositionControllerProxy::WaypointConfig::rad2mmFactor
float rad2mmFactor
Definition: CartesianNaturalPositionControllerProxy.h:79
armarx::NaturalIK::Parameters
Definition: NaturalIK.h:55
armarx::CartesianNaturalPositionControllerProxy::getRuntimeConfig
CartesianNaturalPositionControllerConfig getRuntimeConfig()
Definition: CartesianNaturalPositionControllerProxy.cpp:300
armarx::CartesianNaturalPositionControllerProxy::VelocityBaseSettings::scaleTcpPosVel
float scaleTcpPosVel
Definition: CartesianNaturalPositionControllerProxy.h:64
armarx::CartesianNaturalPositionControllerProxy::enableFTLimit
void enableFTLimit(float force, float torque, bool useCurrentFTasOffset)
Definition: CartesianNaturalPositionControllerProxy.cpp:199
armarx::CartesianNaturalPositionControllerProxy::WaypointTargets::setOri
NaturalDiffIK::Mode setOri
Definition: CartesianNaturalPositionControllerProxy.h:86
armarx::CartesianNaturalPositionControllerProxy::WaypointConfig
Definition: CartesianNaturalPositionControllerProxy.h:75
armarx::CartesianNaturalPositionControllerProxy::WaypointTargets::minElbowHeight
std::optional< float > minElbowHeight
Definition: CartesianNaturalPositionControllerProxy.h:87
armarx::CartesianNaturalPositionControllerProxy::isFinalWaypointReached
bool isFinalWaypointReached()
Definition: CartesianNaturalPositionControllerProxy.cpp:186
GfxTL::Matrix4f
MatrixXX< 4, 4, float > Matrix4f
Definition: MatrixXX.h:650
armarx::CartesianNaturalPositionControllerProxy::getInternalController
NJointCartesianNaturalPositionControllerInterfacePrx getInternalController()
Definition: CartesianNaturalPositionControllerProxy.cpp:524
armarx::CartesianNaturalPositionControllerProxy::ScopedJointValueRestore::~ScopedJointValueRestore
~ScopedJointValueRestore()
Definition: CartesianNaturalPositionControllerProxy.cpp:612
armarx::CartesianNaturalPositionControllerProxy::VelocityBaseSettings::basePosVel
float basePosVel
Definition: CartesianNaturalPositionControllerProxy.h:71
armarx::NaturalDiffIK::Mode
Mode
Definition: NaturalDiffIK.h:34
armarx::CartesianNaturalPositionControllerProxy::VelocityBaseSettings::scaleNullspaceVelocities
float scaleNullspaceVelocities
Definition: CartesianNaturalPositionControllerProxy.h:68
armarx::CartesianNaturalPositionControllerProxy::DynamicKp::sigmaMM
float sigmaMM
Definition: CartesianNaturalPositionControllerProxy.h:46
armarx::CartesianNaturalPositionControllerProxy::VelocityBaseSettings::baseJointVelocity
Ice::FloatSeq baseJointVelocity
Definition: CartesianNaturalPositionControllerProxy.h:70
armarx::CartesianNaturalPositionControllerProxy::DynamicKp::calculate
void calculate(float error, float &KpElb, float &KpJla)
Definition: CartesianNaturalPositionControllerProxy.cpp:282
armarx::CartesianNaturalPositionControllerProxy::getCurrentElbowTargetPosition
Eigen::Vector3f getCurrentElbowTargetPosition()
Definition: CartesianNaturalPositionControllerProxy.cpp:158
armarx::CartesianNaturalPositionControllerProxy::clearWaypoints
void clearWaypoints()
Definition: CartesianNaturalPositionControllerProxy.cpp:352
armarx::CartesianNaturalPositionControllerProxy::KpBaseSettings
Definition: CartesianNaturalPositionControllerProxy.h:50
armarx::NaturalIK::ArmJoints
Definition: NaturalIK.h:65
armarx::CartesianNaturalPositionControllerProxy::currentWaypoint
Waypoint & currentWaypoint()
Definition: CartesianNaturalPositionControllerProxy.cpp:511
armarx::CartesianNaturalPositionControllerProxy::DynamicKp
Definition: CartesianNaturalPositionControllerProxy.h:42
armarx::CartesianNaturalPositionControllerProxy::getCurrentTargetPosition
Eigen::Vector3f getCurrentTargetPosition()
Definition: CartesianNaturalPositionControllerProxy.cpp:152
armarx::CartesianNaturalPositionControllerProxy::VelocityBaseSettings::scaleElbPosVel
float scaleElbPosVel
Definition: CartesianNaturalPositionControllerProxy.h:66
armarx::CartesianNaturalPositionControllerProxy::WaypointTargets
Definition: CartesianNaturalPositionControllerProxy.h:83
armarx::CartesianNaturalPositionControllerProxy::VelocityBaseSettings::baseOriVel
float baseOriVel
Definition: CartesianNaturalPositionControllerProxy.h:72
armarx::CartesianNaturalPositionControllerProxy::Waypoint::reached
bool reached(const VirtualRobot::RobotNodePtr &tcp)
Definition: CartesianNaturalPositionControllerProxy.cpp:543
armarx::CartesianNaturalPositionControllerProxy::DynamicKp::maxKp
float maxKp
Definition: CartesianNaturalPositionControllerProxy.h:45
armarx::NaturalIK
The NaturalIK class.
Definition: NaturalIK.h:52
armarx::CartesianNaturalPositionControllerProxy::setMaxVelocities
void setMaxVelocities(float referencePosVel)
Definition: CartesianNaturalPositionControllerProxy.cpp:423
cxxopts::value
std::shared_ptr< Value > value()
Definition: cxxopts.hpp:855
M_PI
#define M_PI
Definition: MathTools.h:17
armarx::CartesianNaturalPositionControllerProxy::addWaypoint
void addWaypoint(const Waypoint &waypoint)
Definition: CartesianNaturalPositionControllerProxy.cpp:306
armarx::CartesianNaturalPositionControllerProxy::Waypoint::setConfig
Waypoint & setConfig(const WaypointConfig &config)
Definition: CartesianNaturalPositionControllerProxy.cpp:554
armarx::CartesianNaturalPositionControllerProxy::VelocityBaseSettings::scaleJointVelocities
float scaleJointVelocities
Definition: CartesianNaturalPositionControllerProxy.h:67
armarx::CartesianNaturalPositionControllerProxy::WaypointConfig::referencePosVel
float referencePosVel
Definition: CartesianNaturalPositionControllerProxy.h:77
armarx::CartesianNaturalPositionControllerProxy::updateBaseKpValues
void updateBaseKpValues(const CartesianNaturalPositionControllerConfig &runCfg)
Definition: CartesianNaturalPositionControllerProxy.cpp:447
armarx::CartesianNaturalPositionControllerProxy::getStatusText
std::string getStatusText()
Definition: CartesianNaturalPositionControllerProxy.cpp:366
armarx::CartesianNaturalPositionControllerProxy::VelocityBaseSettings
Definition: CartesianNaturalPositionControllerProxy.h:62
armarx::CartesianNaturalPositionControllerProxy::WaypointTargets::userNullspaceTargets
std::vector< float > userNullspaceTargets
Definition: CartesianNaturalPositionControllerProxy.h:88
armarx::CartesianNaturalPositionControllerProxy::disableFTLimit
void disableFTLimit()
Definition: CartesianNaturalPositionControllerProxy.cpp:211
armarx::CartesianNaturalPositionControllerProxy::getCurrentFTValue
FTSensorValue getCurrentFTValue(bool substactOffset)
Definition: CartesianNaturalPositionControllerProxy.cpp:218
armarx::CartesianNaturalPositionControllerProxy::update
bool update()
Definition: CartesianNaturalPositionControllerProxy.cpp:477
armarx::CartesianNaturalPositionControllerProxy::Waypoint::setNullspaceTargets
Waypoint & setNullspaceTargets(const std::vector< float > &userNullspaceTargets)
Definition: CartesianNaturalPositionControllerProxy.cpp:562
armarx::CartesianNaturalPositionControllerProxy::getDynamicKp
DynamicKp getDynamicKp()
Definition: CartesianNaturalPositionControllerProxy.cpp:537
armarx::CartesianNaturalPositionControllerProxy::KpBaseSettings::baseKpElbPos
float baseKpElbPos
Definition: CartesianNaturalPositionControllerProxy.h:54
armarx::CartesianNaturalPositionControllerProxy::KpBaseSettings::baseKpTcpPos
float baseKpTcpPos
Definition: CartesianNaturalPositionControllerProxy.h:52
armarx::CartesianNaturalPositionControllerProxy::createWaypoint
Waypoint createWaypoint(const Eigen::Vector3f &tcpTarget, const std::vector< float > &userNullspaceTargets, std::optional< float > minElbowHeight=std::nullopt)
Definition: CartesianNaturalPositionControllerProxy.cpp:317
armarx::CartesianNaturalPositionControllerProxy::ScaleVec
static std::vector< float > ScaleVec(const std::vector< float > &vec, float scale)
Definition: CartesianNaturalPositionControllerProxy.cpp:406
armarx::CartesianNaturalPositionControllerProxy::DynamicKp::enabled
bool enabled
Definition: CartesianNaturalPositionControllerProxy.h:44
armarx::CartesianNaturalPositionControllerProxy::getElbPositionError
float getElbPositionError()
Definition: CartesianNaturalPositionControllerProxy.cpp:180
armarx::CartesianNaturalPositionControllerProxy::setNullspaceTarget
void setNullspaceTarget(const std::vector< float > &nullspaceTargets)
Definition: CartesianNaturalPositionControllerProxy.cpp:143
armarx::CartesianNaturalPositionControllerProxy::MakeConfig
static NJointCartesianNaturalPositionControllerConfigPtr MakeConfig(const std::string &rns, const std::string &elbowNode)
Definition: CartesianNaturalPositionControllerProxy.cpp:77
armarx::CartesianNaturalPositionControllerProxy::getTcpOrientationError
float getTcpOrientationError()
Definition: CartesianNaturalPositionControllerProxy.cpp:170
armarx::CartesianNaturalPositionControllerProxy::Waypoint::targets
WaypointTargets targets
Definition: CartesianNaturalPositionControllerProxy.h:95
armarx::CartesianNaturalPositionControllerProxy::WaypointConfig::thresholdTcpPosReached
float thresholdTcpPosReached
Definition: CartesianNaturalPositionControllerProxy.h:78
armarx::CartesianNaturalPositionControllerProxy::useCurrentFTasOffset
void useCurrentFTasOffset()
Definition: CartesianNaturalPositionControllerProxy.cpp:192
armarx::CartesianNaturalPositionControllerProxy::VelocityBaseSettings::scaleTcpOriVel
float scaleTcpOriVel
Definition: CartesianNaturalPositionControllerProxy.h:65
armarx::CartesianNaturalPositionControllerProxy::stopClear
void stopClear()
Definition: CartesianNaturalPositionControllerProxy.cpp:242
armarx::CartesianNaturalPositionControllerProxy::KpBaseSettings::maxNullspaceAcceleration
float maxNullspaceAcceleration
Definition: CartesianNaturalPositionControllerProxy.h:59
armarx::CartesianNaturalPositionControllerProxy::Waypoint::config
WaypointConfig config
Definition: CartesianNaturalPositionControllerProxy.h:96
armarx::CartesianNaturalPositionControllerProxy::init
void init()
Definition: CartesianNaturalPositionControllerProxy.cpp:88
IceInternal::ProxyHandle<::IceProxy::armarx::RobotUnitInterface >
armarx::CartesianNaturalPositionControllerProxy::Waypoint
Definition: CartesianNaturalPositionControllerProxy.h:92
armarx::CartesianNaturalPositionControllerProxy::setDynamicKp
void setDynamicKp(DynamicKp dynamicKp)
Definition: CartesianNaturalPositionControllerProxy.cpp:530
armarx::NaturalIK::SoechtingForwardPositions
Definition: NaturalIK.h:94
armarx::CartesianNaturalPositionControllerProxy::setRuntimeConfig
void setRuntimeConfig(CartesianNaturalPositionControllerConfig runCfg)
Definition: CartesianNaturalPositionControllerProxy.cpp:292
armarx::CartesianNaturalPositionControllerProxy::setDefaultWaypointConfig
void setDefaultWaypointConfig(const WaypointConfig &config)
Definition: CartesianNaturalPositionControllerProxy.cpp:359
armarx::CartesianNaturalPositionControllerProxy::isLastWaypoint
bool isLastWaypoint()
Definition: CartesianNaturalPositionControllerProxy.cpp:518
armarx::CartesianNaturalPositionControllerProxy::getTcpPositionError
float getTcpPositionError()
Definition: CartesianNaturalPositionControllerProxy.cpp:164
armarx::CartesianNaturalPositionControllerProxyPtr
std::shared_ptr< class CartesianNaturalPositionControllerProxy > CartesianNaturalPositionControllerProxyPtr
Definition: CartesianNaturalPositionControllerProxy.h:37
armarx::CartesianNaturalPositionControllerProxy::WaypointTargets::tcpTarget
Eigen::Matrix4f tcpTarget
Definition: CartesianNaturalPositionControllerProxy.h:85
armarx::CartesianNaturalPositionControllerProxy::getAverageFTValue
FTSensorValue getAverageFTValue(bool substactOffset)
Definition: CartesianNaturalPositionControllerProxy.cpp:230
armarx::CartesianNaturalPositionControllerProxy::KpBaseSettings::baseKpTcpOri
float baseKpTcpOri
Definition: CartesianNaturalPositionControllerProxy.h:53
armarx::CartesianNaturalPositionControllerProxy::CalculateMaxJointVelocity
static std::vector< float > CalculateMaxJointVelocity(const VirtualRobot::RobotNodeSetPtr &rns, float maxPosVel)
Definition: CartesianNaturalPositionControllerProxy.cpp:377
armarx::CartesianNaturalPositionControllerProxy::ScopedJointValueRestore
Definition: CartesianNaturalPositionControllerProxy.h:109
armarx::CartesianNaturalPositionControllerProxy::CartesianNaturalPositionControllerProxy
CartesianNaturalPositionControllerProxy(const NaturalIK &_ik, const NaturalIK::ArmJoints &arm, const RobotUnitInterfacePrx &_robotUnit, const std::string &_controllerName, NJointCartesianNaturalPositionControllerConfigPtr _config)
Definition: CartesianNaturalPositionControllerProxy.cpp:39
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::CartesianNaturalPositionControllerProxy::KpBaseSettings::baseKpJla
float baseKpJla
Definition: CartesianNaturalPositionControllerProxy.h:55
armarx::CartesianNaturalPositionControllerProxy::KpBaseSettings::maxOrientationAcceleration
float maxOrientationAcceleration
Definition: CartesianNaturalPositionControllerProxy.h:58
armarx::CartesianNaturalPositionControllerProxy::setActivateControllerOnInit
void setActivateControllerOnInit(bool value)
Definition: CartesianNaturalPositionControllerProxy.cpp:417
NaturalIK.h
armarx::CartesianNaturalPositionControllerProxy::ScopedJointValueRestore::ScopedJointValueRestore
ScopedJointValueRestore(const VirtualRobot::RobotNodeSetPtr &rns)
Definition: CartesianNaturalPositionControllerProxy.cpp:606