CartesianPositionController.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 <Eigen/Dense>
27
28#include <VirtualRobot/IK/IKSolver.h>
29#include <VirtualRobot/VirtualRobot.h>
30
33
34#include <RobotAPI/interface/core/CartesianPositionControllerConfig.h>
35
36namespace armarx
37{
39 using CartesianPositionControllerPtr = std::shared_ptr<CartesianPositionController>;
40
41 // This is a P-controller. In: Target pose, out Cartesian velocity.
43 {
44 public:
45 CartesianPositionController(const VirtualRobot::RobotNodePtr& tcp,
46 const VirtualRobot::RobotNodePtr& referenceFrame = nullptr);
47
50
51 Eigen::VectorXf calculate(const Eigen::Matrix4f& targetPose,
52 VirtualRobot::IKSolver::CartesianSelection mode) const;
53 Eigen::VectorXf calculatePos(const Eigen::Vector3f& targetPos) const;
54
55 float getPositionError(const Eigen::Matrix4f& targetPose) const;
56 float getOrientationError(const Eigen::Matrix4f& targetPose) const;
57 static float GetPositionError(const Eigen::Matrix4f& targetPose,
58 const VirtualRobot::RobotNodePtr& tcp,
59 const VirtualRobot::RobotNodePtr& referenceFrame = nullptr);
60 static float
61 GetOrientationError(const Eigen::Matrix4f& targetPose,
62 const VirtualRobot::RobotNodePtr& tcp,
63 const VirtualRobot::RobotNodePtr& referenceFrame = nullptr);
64 static bool Reached(const Eigen::Matrix4f& targetPose,
65 const VirtualRobot::RobotNodePtr& tcp,
66 bool checkOri,
67 float thresholdPosReached,
68 float thresholdOriReached,
69 const VirtualRobot::RobotNodePtr& referenceFrame = nullptr);
70 bool reached(const Eigen::Matrix4f& targetPose,
71 VirtualRobot::IKSolver::CartesianSelection mode,
72 float thresholdPosReached,
73 float thresholdOriReached);
74
75 Eigen::Vector3f getPositionDiff(const Eigen::Matrix4f& targetPose) const;
76 Eigen::Vector3f getPositionDiffVec3(const Eigen::Vector3f& targetPosition) const;
77 Eigen::Vector3f getOrientationDiff(const Eigen::Matrix4f& targetPose) const;
78 VirtualRobot::RobotNodePtr getTcp() const;
79
80 float KpPos = 1;
81 float KpOri = 1;
82 float maxPosVel = -1;
83 float maxOriVel = -1;
84
85
86 private:
87 VirtualRobot::RobotNodePtr tcp;
88 VirtualRobot::RobotNodePtr referenceFrame;
89 };
90} // namespace armarx
91
92namespace armarx::VariantType
93{
94 // variant types
96 Variant::addTypeName("::armarx::CartesianPositionControllerConfig");
97} // namespace armarx::VariantType
98
99namespace armarx
100{
101 class CartesianPositionControllerConfig : virtual public CartesianPositionControllerConfigBase
102 {
103 public:
105
106 // inherited from VariantDataClass
107 Ice::ObjectPtr
108 ice_clone() const override
109 {
110 return this->clone();
111 }
112
113 VariantDataClassPtr
114 clone(const Ice::Current& = ::Ice::Current()) const override
115 {
116 return new CartesianPositionControllerConfig(*this);
117 }
118
119 std::string output(const Ice::Current& c = ::Ice::Current()) const override;
120
122 getType(const Ice::Current& = ::Ice::Current()) const override
123 {
125 }
126
127 bool
128 validate(const Ice::Current& = ::Ice::Current()) override
129 {
130 return true;
131 }
132
133 friend std::ostream&
134 operator<<(std::ostream& stream, const CartesianPositionControllerConfig& rhs)
135 {
136 stream << "CartesianPositionControllerConfig: " << std::endl
137 << rhs.output() << std::endl;
138 return stream;
139 }
140
141 public: // serialization
142 void serialize(const armarx::ObjectSerializerBasePtr& serializer,
143 const ::Ice::Current& = ::Ice::Current()) const override;
144 void deserialize(const armarx::ObjectSerializerBasePtr& serializer,
145 const ::Ice::Current& = ::Ice::Current()) override;
146 };
147
150} // namespace armarx
constexpr T c
void deserialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=::Ice::Current()) override
std::string output(const Ice::Current &c=::Ice::Current()) const override
VariantTypeId getType(const Ice::Current &=::Ice::Current()) const override
bool validate(const Ice::Current &=::Ice::Current()) override
VariantDataClassPtr clone(const Ice::Current &=::Ice::Current()) const override
void serialize(const armarx::ObjectSerializerBasePtr &serializer, const ::Ice::Current &=::Ice::Current()) const override
friend std::ostream & operator<<(std::ostream &stream, const CartesianPositionControllerConfig &rhs)
static float GetOrientationError(const Eigen::Matrix4f &targetPose, const VirtualRobot::RobotNodePtr &tcp, const VirtualRobot::RobotNodePtr &referenceFrame=nullptr)
Eigen::Vector3f getPositionDiffVec3(const Eigen::Vector3f &targetPosition) const
float getPositionError(const Eigen::Matrix4f &targetPose) const
CartesianPositionController & operator=(CartesianPositionController &&)=default
Eigen::VectorXf calculatePos(const Eigen::Vector3f &targetPos) const
Eigen::VectorXf calculate(const Eigen::Matrix4f &targetPose, VirtualRobot::IKSolver::CartesianSelection mode) const
static bool Reached(const Eigen::Matrix4f &targetPose, const VirtualRobot::RobotNodePtr &tcp, bool checkOri, float thresholdPosReached, float thresholdOriReached, const VirtualRobot::RobotNodePtr &referenceFrame=nullptr)
CartesianPositionController(const VirtualRobot::RobotNodePtr &tcp, const VirtualRobot::RobotNodePtr &referenceFrame=nullptr)
float getOrientationError(const Eigen::Matrix4f &targetPose) const
Eigen::Vector3f getOrientationDiff(const Eigen::Matrix4f &targetPose) const
CartesianPositionController(CartesianPositionController &&)=default
bool reached(const Eigen::Matrix4f &targetPose, VirtualRobot::IKSolver::CartesianSelection mode, float thresholdPosReached, float thresholdOriReached)
Eigen::Vector3f getPositionDiff(const Eigen::Matrix4f &targetPose) const
VirtualRobot::RobotNodePtr getTcp() const
static float GetPositionError(const Eigen::Matrix4f &targetPose, const VirtualRobot::RobotNodePtr &tcp, const VirtualRobot::RobotNodePtr &referenceFrame=nullptr)
static VariantTypeId addTypeName(const std::string &typeName)
Register a new type for the use in a Variant.
Definition Variant.cpp:869
const VariantTypeId CartesianPositionControllerConfig
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceInternal::Handle< CartesianPositionControllerConfig > CartesianPositionControllerConfigPtr
Ice::Int VariantTypeId
Definition Variant.h:43
std::shared_ptr< CartesianPositionController > CartesianPositionControllerPtr