CompositeDiffIK.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 Simon Ottenhaus (simon dot ottenhaus 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 <SimoxUtility/math/distance/delta_angle.h>
29 #include <VirtualRobot/VirtualRobot.h>
30 
33 
34 namespace armarx
35 {
36 
37 
38  typedef std::shared_ptr<class CompositeDiffIK> CompositeDiffIKPtr;
39 
41  {
42  public:
43  struct Parameters
44  {
46  {
47  }
48 
49  // IK params
50  size_t steps = 40;
51 
52  float maxJointAngleStep = 0.2f;
53  float stepSize = 0.5f;
54  bool resetRnsValues = true;
55  bool returnIKSteps = false;
58  };
59 
61  {
62  public:
63  virtual void init(Parameters& params) = 0;
64  virtual Eigen::VectorXf getGradient(Parameters& params) = 0;
65  virtual ~NullspaceGradient() = default;
66  float kP = 1;
67  };
68  typedef std::shared_ptr<class NullspaceGradient> NullspaceGradientPtr;
69 
71  {
72  Eigen::Vector3f posDiff;
73  Eigen::Vector3f oriDiff;
75  Eigen::VectorXf cartesianVel;
76  Eigen::VectorXf jointVel;
77  };
78 
80  {
81  public:
82  NullspaceTarget(const VirtualRobot::RobotNodeSetPtr& rns,
83  const VirtualRobot::RobotNodePtr& tcp,
84  const Eigen::Matrix4f& target,
86 
87  VirtualRobot::RobotNodePtr tcp;
92 
93  void init(Parameters&) override;
94  Eigen::VectorXf getGradient(Parameters& params) override;
95 
96  std::vector<NullspaceTargetStep> ikSteps;
97  };
98  typedef std::shared_ptr<class NullspaceTarget> NullspaceTargetPtr;
99 
101  {
102  public:
103  NullspaceJointTarget(const VirtualRobot::RobotNodeSetPtr& rns);
104  NullspaceJointTarget(const VirtualRobot::RobotNodeSetPtr& rns,
105  const Eigen::VectorXf& target,
106  const Eigen::VectorXf& weight);
107  void set(int index, float target, float weight);
108  void set(const std::string& jointName, float target, float weight);
109  void set(const VirtualRobot::RobotNodePtr& rn, float target, float weight);
110 
111  VirtualRobot::RobotNodeSetPtr rns;
112  Eigen::VectorXf target;
113  Eigen::VectorXf weight;
114 
115  void init(Parameters&) override;
116  Eigen::VectorXf getGradient(Parameters& params) override;
117  };
118  typedef std::shared_ptr<class NullspaceJointTarget> NullspaceJointTargetPtr;
119 
121  {
122  public:
123  NullspaceJointLimitAvoidance(const VirtualRobot::RobotNodeSetPtr& rns);
124  NullspaceJointLimitAvoidance(const VirtualRobot::RobotNodeSetPtr& rns,
125  const Eigen::VectorXf& weight);
126  void setWeight(int index, float weight);
127  void setWeight(const std::string& jointName, float weight);
128  void setWeight(const VirtualRobot::RobotNodePtr& rn, float weight);
129  void setWeights(const VirtualRobot::RobotNodeSetPtr& rns, float weight);
130 
131 
132  VirtualRobot::RobotNodeSetPtr rns;
133  Eigen::VectorXf weight;
134 
135  void init(Parameters&) override;
136  Eigen::VectorXf getGradient(Parameters& params) override;
137  };
138  typedef std::shared_ptr<class NullspaceJointLimitAvoidance> NullspaceJointLimitAvoidancePtr;
139 
140  struct TargetStep
141  {
142  Eigen::Vector3f posDiff;
143  Eigen::Vector3f oriDiff;
145  Eigen::VectorXf cartesianVel;
146  };
147 
148  class Target
149  {
150  public:
151  Target(const VirtualRobot::RobotNodeSetPtr& rns,
152  const VirtualRobot::RobotNodePtr& tcp,
153  const Eigen::Matrix4f& target,
155  VirtualRobot::RobotNodePtr tcp;
158  Eigen::MatrixXf jacobi;
160  float maxPosError = 10.f;
161  float maxOriError = 0.05f;
162 
163  std::vector<TargetStep> ikSteps;
164 
166  Eigen::Vector3f getPosError() const;
167  auto getOriError() const;
168  };
169 
170  typedef std::shared_ptr<Target> TargetPtr;
171 
172  struct Result
173  {
174  Eigen::VectorXf jointValues;
175  Eigen::Vector3f posDiff;
176  Eigen::Vector3f posDiffElbow;
177  Eigen::Vector3f oriDiff;
178  float posError;
180  float oriError;
181  bool reached;
182  Eigen::VectorXf jointLimitMargins;
184  Eigen::Vector3f elbowPosDiff;
185  };
186 
187  struct SolveState
188  {
189  int rows = 0;
190  int cols = 0;
191  Eigen::VectorXf jointRegularization;
192  Eigen::VectorXf cartesianRegularization;
193  Eigen::VectorXf jointValues;
194  Eigen::MatrixXf jacobi;
195  Eigen::MatrixXf invJac;
196  Eigen::MatrixXf nullspace;
197  };
198 
199  static Eigen::VectorXf LimitInfNormTo(Eigen::VectorXf vec, float maxValue);
200 
201  CompositeDiffIK(const VirtualRobot::RobotNodeSetPtr& rns);
202 
203  void addTarget(const TargetPtr& target);
204  TargetPtr addTarget(const VirtualRobot::RobotNodePtr& tcp,
205  const Eigen::Matrix4f& target,
207 
208  void addNullspaceGradient(const NullspaceGradientPtr& gradient);
209  NullspaceTargetPtr addNullspacePositionTarget(const VirtualRobot::RobotNodePtr& tcp,
210  const Eigen::Vector3f& target);
211 
212  Result solve(Parameters params);
213  static Eigen::MatrixXf CalculateNullspaceSVD(const Eigen::Matrix4f& jacobi);
214  static Eigen::MatrixXf CalculateNullspaceLU(const Eigen::Matrix4f& jacobi);
215  void step(Parameters& params, SolveState& s, int stepNr);
216 
218 
219 
220  private:
221  VirtualRobot::RobotNodeSetPtr rns;
222  std::vector<TargetPtr> targets;
223  std::vector<NullspaceGradientPtr> nullspaceGradients;
224  VirtualRobot::DifferentialIKPtr ik;
225  };
226 } // namespace armarx
armarx::CompositeDiffIK::TargetStep
Definition: CompositeDiffIK.h:140
armarx::CompositeDiffIK::Target::Target
Target(const VirtualRobot::RobotNodeSetPtr &rns, const VirtualRobot::RobotNodePtr &tcp, const Eigen::Matrix4f &target, VirtualRobot::IKSolver::CartesianSelection mode)
Definition: CompositeDiffIK.cpp:324
armarx::CompositeDiffIK::NullspaceGradient
Definition: CompositeDiffIK.h:60
armarx::CompositeDiffIK::NullspaceJointTarget::rns
VirtualRobot::RobotNodeSetPtr rns
Definition: CompositeDiffIK.h:111
armarx::CompositeDiffIK::NullspaceTarget::vCtrl
CartesianVelocityController vCtrl
Definition: CompositeDiffIK.h:91
armarx::CompositeDiffIK::Target::getPosError
Eigen::Vector3f getPosError() const
Definition: CompositeDiffIK.cpp:518
armarx::CompositeDiffIK::Target::mode
VirtualRobot::IKSolver::CartesianSelection mode
Definition: CompositeDiffIK.h:157
armarx::CompositeDiffIK::SolveState::jointValues
Eigen::VectorXf jointValues
Definition: CompositeDiffIK.h:193
armarx::CompositeDiffIK::Parameters::resetRnsValues
bool resetRnsValues
Definition: CompositeDiffIK.h:54
index
uint8_t index
Definition: EtherCATFrame.h:59
armarx::CompositeDiffIK::Result::reached
bool reached
Definition: CompositeDiffIK.h:181
armarx::CompositeDiffIK::NullspaceTarget::ikSteps
std::vector< NullspaceTargetStep > ikSteps
Definition: CompositeDiffIK.h:96
armarx::CompositeDiffIK::Target::maxPosError
float maxPosError
Definition: CompositeDiffIK.h:160
armarx::CompositeDiffIK::NullspaceJointLimitAvoidance::init
void init(Parameters &) override
Definition: CompositeDiffIK.cpp:485
armarx::CompositeDiffIK::Parameters::jointRegularizationTranslation
float jointRegularizationTranslation
Definition: CompositeDiffIK.h:56
GfxTL::Matrix4f
MatrixXX< 4, 4, float > Matrix4f
Definition: MatrixXX.h:650
armarx::CompositeDiffIK::NullspaceJointLimitAvoidance::getGradient
Eigen::VectorXf getGradient(Parameters &params) override
Definition: CompositeDiffIK.cpp:490
boost::target
Vertex target(const detail::edge_base< Directed, Vertex > &e, const PCG &)
Definition: point_cloud_graph.h:668
armarx::CompositeDiffIK::NullspaceJointLimitAvoidancePtr
std::shared_ptr< class NullspaceJointLimitAvoidance > NullspaceJointLimitAvoidancePtr
Definition: CompositeDiffIK.h:138
armarx::CompositeDiffIK::NullspaceJointLimitAvoidance::setWeight
void setWeight(int index, float weight)
Definition: CompositeDiffIK.cpp:446
armarx::CompositeDiffIK::NullspaceTargetStep::tcpPose
Eigen::Matrix4f tcpPose
Definition: CompositeDiffIK.h:74
armarx::CompositeDiffIK::Parameters::stepSize
float stepSize
Definition: CompositeDiffIK.h:53
armarx::CompositeDiffIKPtr
std::shared_ptr< class CompositeDiffIK > CompositeDiffIKPtr
Definition: CompositeDiffIK.h:38
armarx::CompositeDiffIK::NullspaceGradient::kP
float kP
Definition: CompositeDiffIK.h:66
armarx::CompositeDiffIK::TargetStep::oriDiff
Eigen::Vector3f oriDiff
Definition: CompositeDiffIK.h:143
armarx::CompositeDiffIK::NullspaceJointTarget::getGradient
Eigen::VectorXf getGradient(Parameters &params) override
Definition: CompositeDiffIK.cpp:427
armarx::CompositeDiffIK::NullspaceJointTarget::set
void set(int index, float target, float weight)
Definition: CompositeDiffIK.cpp:391
armarx::CartesianVelocityController
Definition: CartesianVelocityController.h:36
armarx::CompositeDiffIK::NullspaceTargetStep::oriDiff
Eigen::Vector3f oriDiff
Definition: CompositeDiffIK.h:73
armarx::CompositeDiffIK::SolveState
Definition: CompositeDiffIK.h:187
armarx::CompositeDiffIK::NullspaceTarget::NullspaceTarget
NullspaceTarget(const VirtualRobot::RobotNodeSetPtr &rns, const VirtualRobot::RobotNodePtr &tcp, const Eigen::Matrix4f &target, VirtualRobot::IKSolver::CartesianSelection mode)
Definition: CompositeDiffIK.cpp:333
armarx::CompositeDiffIK::Parameters::steps
size_t steps
Definition: CompositeDiffIK.h:50
armarx::CompositeDiffIK::Result::posErrorElbow
float posErrorElbow
Definition: CompositeDiffIK.h:179
armarx::CompositeDiffIK::NullspaceJointTarget::weight
Eigen::VectorXf weight
Definition: CompositeDiffIK.h:113
armarx::CompositeDiffIK
Definition: CompositeDiffIK.h:40
armarx::CompositeDiffIK::NullspaceGradient::init
virtual void init(Parameters &params)=0
armarx::CompositeDiffIK::solve
Result solve(Parameters params)
Definition: CompositeDiffIK.cpp:80
armarx::CompositeDiffIK::NullspaceTarget::mode
VirtualRobot::IKSolver::CartesianSelection mode
Definition: CompositeDiffIK.h:89
armarx::CompositeDiffIK::NullspaceTargetPtr
std::shared_ptr< class NullspaceTarget > NullspaceTargetPtr
Definition: CompositeDiffIK.h:98
armarx::CompositeDiffIK::NullspaceJointTargetPtr
std::shared_ptr< class NullspaceJointTarget > NullspaceJointTargetPtr
Definition: CompositeDiffIK.h:118
armarx::CompositeDiffIK::addTarget
void addTarget(const TargetPtr &target)
Definition: CompositeDiffIK.cpp:45
armarx::CompositeDiffIK::NullspaceJointTarget::init
void init(Parameters &) override
Definition: CompositeDiffIK.cpp:422
armarx::CompositeDiffIK::NullspaceJointTarget
Definition: CompositeDiffIK.h:100
armarx::CompositeDiffIK::Target
Definition: CompositeDiffIK.h:148
armarx::CompositeDiffIK::SolveState::jacobi
Eigen::MatrixXf jacobi
Definition: CompositeDiffIK.h:194
armarx::CompositeDiffIK::Target::jacobi
Eigen::MatrixXf jacobi
Definition: CompositeDiffIK.h:158
armarx::CompositeDiffIK::SolveState::invJac
Eigen::MatrixXf invJac
Definition: CompositeDiffIK.h:195
armarx::CompositeDiffIK::NullspaceGradient::getGradient
virtual Eigen::VectorXf getGradient(Parameters &params)=0
armarx::NJointTaskSpaceDMPControllerMode::CartesianSelection
CartesianSelection
Definition: ControllerInterface.ice:34
armarx::CompositeDiffIK::step
void step(Parameters &params, SolveState &s, int stepNr)
Definition: CompositeDiffIK.cpp:205
armarx::CompositeDiffIK::TargetPtr
std::shared_ptr< Target > TargetPtr
Definition: CompositeDiffIK.h:170
armarx::CompositeDiffIK::CalculateNullspaceLU
static Eigen::MatrixXf CalculateNullspaceLU(const Eigen::Matrix4f &jacobi)
Definition: CompositeDiffIK.cpp:187
armarx::CompositeDiffIK::SolveState::jointRegularization
Eigen::VectorXf jointRegularization
Definition: CompositeDiffIK.h:191
armarx::CompositeDiffIK::Result::posDiff
Eigen::Vector3f posDiff
Definition: CompositeDiffIK.h:175
armarx::CompositeDiffIK::Target::getPoseError
Eigen::Matrix4f getPoseError() const
Definition: CompositeDiffIK.cpp:512
armarx::CompositeDiffIK::NullspaceTarget
Definition: CompositeDiffIK.h:79
armarx::CompositeDiffIK::Target::tcp
VirtualRobot::RobotNodePtr tcp
Definition: CompositeDiffIK.h:155
armarx::CompositeDiffIK::TargetStep::posDiff
Eigen::Vector3f posDiff
Definition: CompositeDiffIK.h:142
armarx::CompositeDiffIK::Result::oriDiff
Eigen::Vector3f oriDiff
Definition: CompositeDiffIK.h:177
armarx::CompositeDiffIK::NullspaceJointLimitAvoidance::NullspaceJointLimitAvoidance
NullspaceJointLimitAvoidance(const VirtualRobot::RobotNodeSetPtr &rns)
Definition: CompositeDiffIK.cpp:432
armarx::CompositeDiffIK::Result::jointLimitMargins
Eigen::VectorXf jointLimitMargins
Definition: CompositeDiffIK.h:182
armarx::CompositeDiffIK::Target::target
Eigen::Matrix4f target
Definition: CompositeDiffIK.h:156
armarx::CompositeDiffIK::NullspaceJointTarget::target
Eigen::VectorXf target
Definition: CompositeDiffIK.h:112
armarx::CompositeDiffIK::NullspaceTargetStep::cartesianVel
Eigen::VectorXf cartesianVel
Definition: CompositeDiffIK.h:75
armarx::CompositeDiffIK::Result::posDiffElbow
Eigen::Vector3f posDiffElbow
Definition: CompositeDiffIK.h:176
armarx::CompositeDiffIK::SolveState::cols
int cols
Definition: CompositeDiffIK.h:190
armarx::CompositeDiffIK::Result::posError
float posError
Definition: CompositeDiffIK.h:178
armarx::CompositeDiffIK::SolveState::nullspace
Eigen::MatrixXf nullspace
Definition: CompositeDiffIK.h:196
armarx::CompositeDiffIK::LimitInfNormTo
static Eigen::VectorXf LimitInfNormTo(Eigen::VectorXf vec, float maxValue)
Definition: CompositeDiffIK.cpp:366
armarx::CompositeDiffIK::NullspaceGradientPtr
std::shared_ptr< class NullspaceGradient > NullspaceGradientPtr
Definition: CompositeDiffIK.h:68
armarx::CompositeDiffIK::Result::minimumJointLimitMargin
float minimumJointLimitMargin
Definition: CompositeDiffIK.h:183
armarx::CompositeDiffIK::NullspaceJointLimitAvoidance::rns
VirtualRobot::RobotNodeSetPtr rns
Definition: CompositeDiffIK.h:132
CartesianVelocityController.h
CartesianPositionController.h
armarx::CompositeDiffIK::SolveState::rows
int rows
Definition: CompositeDiffIK.h:189
armarx::CompositeDiffIK::CalculateNullspaceSVD
static Eigen::MatrixXf CalculateNullspaceSVD(const Eigen::Matrix4f &jacobi)
Definition: CompositeDiffIK.cpp:179
armarx::CompositeDiffIK::NullspaceTargetStep::posDiff
Eigen::Vector3f posDiff
Definition: CompositeDiffIK.h:72
armarx::CompositeDiffIK::Result::oriError
float oriError
Definition: CompositeDiffIK.h:180
armarx::CompositeDiffIK::NullspaceTarget::getGradient
Eigen::VectorXf getGradient(Parameters &params) override
Definition: CompositeDiffIK.cpp:348
armarx::CompositeDiffIK::Target::ikSteps
std::vector< TargetStep > ikSteps
Definition: CompositeDiffIK.h:163
armarx::CompositeDiffIK::NullspaceTarget::target
Eigen::Matrix4f target
Definition: CompositeDiffIK.h:88
armarx::CompositeDiffIK::NullspaceTarget::init
void init(Parameters &) override
Definition: CompositeDiffIK.cpp:342
armarx::CompositeDiffIK::NullspaceTargetStep::jointVel
Eigen::VectorXf jointVel
Definition: CompositeDiffIK.h:76
armarx::CompositeDiffIK::Parameters::Parameters
Parameters()
Definition: CompositeDiffIK.h:45
armarx::CompositeDiffIK::Result::elbowPosDiff
Eigen::Vector3f elbowPosDiff
Definition: CompositeDiffIK.h:184
armarx::CompositeDiffIK::Result
Definition: CompositeDiffIK.h:172
armarx::CompositeDiffIK::Target::pCtrl
CartesianPositionController pCtrl
Definition: CompositeDiffIK.h:159
armarx::CompositeDiffIK::NullspaceJointLimitAvoidance
Definition: CompositeDiffIK.h:120
armarx::CompositeDiffIK::NullspaceJointLimitAvoidance::weight
Eigen::VectorXf weight
Definition: CompositeDiffIK.h:133
armarx::CompositeDiffIK::TargetStep::cartesianVel
Eigen::VectorXf cartesianVel
Definition: CompositeDiffIK.h:145
armarx::CompositeDiffIK::CartesianSelectionToSize
int CartesianSelectionToSize(VirtualRobot::IKSolver::CartesianSelection mode)
Definition: CompositeDiffIK.cpp:309
armarx::CompositeDiffIK::NullspaceGradient::~NullspaceGradient
virtual ~NullspaceGradient()=default
armarx::CartesianPositionController
Definition: CartesianPositionController.h:42
armarx::CompositeDiffIK::NullspaceTarget::tcp
VirtualRobot::RobotNodePtr tcp
Definition: CompositeDiffIK.h:87
armarx::CompositeDiffIK::Parameters::jointRegularizationRotation
float jointRegularizationRotation
Definition: CompositeDiffIK.h:57
armarx::CompositeDiffIK::NullspaceTarget::pCtrl
CartesianPositionController pCtrl
Definition: CompositeDiffIK.h:90
armarx::CompositeDiffIK::Parameters
Definition: CompositeDiffIK.h:43
armarx::CompositeDiffIK::Parameters::returnIKSteps
bool returnIKSteps
Definition: CompositeDiffIK.h:55
armarx::CompositeDiffIK::Parameters::maxJointAngleStep
float maxJointAngleStep
Definition: CompositeDiffIK.h:52
armarx::CompositeDiffIK::Result::jointValues
Eigen::VectorXf jointValues
Definition: CompositeDiffIK.h:174
armarx::CompositeDiffIK::SolveState::cartesianRegularization
Eigen::VectorXf cartesianRegularization
Definition: CompositeDiffIK.h:192
armarx::CompositeDiffIK::NullspaceJointLimitAvoidance::setWeights
void setWeights(const VirtualRobot::RobotNodeSetPtr &rns, float weight)
Definition: CompositeDiffIK.cpp:475
armarx::CompositeDiffIK::addNullspacePositionTarget
NullspaceTargetPtr addNullspacePositionTarget(const VirtualRobot::RobotNodePtr &tcp, const Eigen::Vector3f &target)
Definition: CompositeDiffIK.cpp:67
armarx::CompositeDiffIK::NullspaceTargetStep
Definition: CompositeDiffIK.h:70
armarx::CompositeDiffIK::CompositeDiffIK
CompositeDiffIK(const VirtualRobot::RobotNodeSetPtr &rns)
Definition: CompositeDiffIK.cpp:38
armarx::ctrlutil::s
double s(double t, double s0, double v0, double a0, double j)
Definition: CtrlUtil.h:33
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::CompositeDiffIK::Target::maxOriError
float maxOriError
Definition: CompositeDiffIK.h:161
armarx::CompositeDiffIK::addNullspaceGradient
void addNullspaceGradient(const NullspaceGradientPtr &gradient)
Definition: CompositeDiffIK.cpp:61
armarx::CompositeDiffIK::TargetStep::tcpPose
Eigen::Matrix4f tcpPose
Definition: CompositeDiffIK.h:144
armarx::CompositeDiffIK::NullspaceJointTarget::NullspaceJointTarget
NullspaceJointTarget(const VirtualRobot::RobotNodeSetPtr &rns)
Definition: CompositeDiffIK.cpp:376
armarx::CompositeDiffIK::Target::getOriError
auto getOriError() const
Definition: CompositeDiffIK.cpp:524