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
34namespace armarx
35{
36
37
38 typedef std::shared_ptr<class CompositeDiffIK> CompositeDiffIKPtr;
39
41 {
42 public:
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;
74 Eigen::Matrix4f tcpPose;
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,
85 VirtualRobot::IKSolver::CartesianSelection mode);
86
87 VirtualRobot::RobotNodePtr tcp;
88 Eigen::Matrix4f target;
89 VirtualRobot::IKSolver::CartesianSelection mode;
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
141 {
142 Eigen::Vector3f posDiff;
143 Eigen::Vector3f oriDiff;
144 Eigen::Matrix4f tcpPose;
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,
154 VirtualRobot::IKSolver::CartesianSelection mode);
155 VirtualRobot::RobotNodePtr tcp;
156 Eigen::Matrix4f target;
157 VirtualRobot::IKSolver::CartesianSelection mode;
158 Eigen::MatrixXf jacobi;
160 float maxPosError = 10.f;
161 float maxOriError = 0.05f;
162
163 std::vector<TargetStep> ikSteps;
164
165 Eigen::Matrix4f getPoseError() const;
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;
182 Eigen::VectorXf jointLimitMargins;
184 Eigen::Vector3f elbowPosDiff;
185 };
186
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,
206 VirtualRobot::IKSolver::CartesianSelection mode);
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
217 int CartesianSelectionToSize(VirtualRobot::IKSolver::CartesianSelection mode);
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
uint8_t index
virtual void init(Parameters &params)=0
virtual Eigen::VectorXf getGradient(Parameters &params)=0
Eigen::VectorXf getGradient(Parameters &params) override
void setWeights(const VirtualRobot::RobotNodeSetPtr &rns, float weight)
NullspaceJointLimitAvoidance(const VirtualRobot::RobotNodeSetPtr &rns)
Eigen::VectorXf getGradient(Parameters &params) override
NullspaceJointTarget(const VirtualRobot::RobotNodeSetPtr &rns)
void set(int index, float target, float weight)
NullspaceTarget(const VirtualRobot::RobotNodeSetPtr &rns, const VirtualRobot::RobotNodePtr &tcp, const Eigen::Matrix4f &target, VirtualRobot::IKSolver::CartesianSelection mode)
Eigen::VectorXf getGradient(Parameters &params) override
VirtualRobot::IKSolver::CartesianSelection mode
std::vector< NullspaceTargetStep > ikSteps
Target(const VirtualRobot::RobotNodeSetPtr &rns, const VirtualRobot::RobotNodePtr &tcp, const Eigen::Matrix4f &target, VirtualRobot::IKSolver::CartesianSelection mode)
VirtualRobot::IKSolver::CartesianSelection mode
Eigen::Matrix4f getPoseError() const
std::vector< TargetStep > ikSteps
CartesianPositionController pCtrl
Eigen::Vector3f getPosError() const
VirtualRobot::RobotNodePtr tcp
int CartesianSelectionToSize(VirtualRobot::IKSolver::CartesianSelection mode)
Result solve(Parameters params)
static Eigen::MatrixXf CalculateNullspaceLU(const Eigen::Matrix4f &jacobi)
std::shared_ptr< class NullspaceGradient > NullspaceGradientPtr
void addTarget(const TargetPtr &target)
std::shared_ptr< class NullspaceJointTarget > NullspaceJointTargetPtr
std::shared_ptr< class NullspaceJointLimitAvoidance > NullspaceJointLimitAvoidancePtr
static Eigen::MatrixXf CalculateNullspaceSVD(const Eigen::Matrix4f &jacobi)
NullspaceTargetPtr addNullspacePositionTarget(const VirtualRobot::RobotNodePtr &tcp, const Eigen::Vector3f &target)
std::shared_ptr< class NullspaceTarget > NullspaceTargetPtr
void addNullspaceGradient(const NullspaceGradientPtr &gradient)
void step(Parameters &params, SolveState &s, int stepNr)
CompositeDiffIK(const VirtualRobot::RobotNodeSetPtr &rns)
static Eigen::VectorXf LimitInfNormTo(Eigen::VectorXf vec, float maxValue)
std::shared_ptr< Target > TargetPtr
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::shared_ptr< class CompositeDiffIK > CompositeDiffIKPtr