TaskspaceController.h
Go to the documentation of this file.
1/**
2 * This file is part of ArmarX.
3 *
4 * ArmarX is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * ArmarX is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * @author Jianfeng Gao ( jianfeng dot gao at kit dot edu )
17 * @date 2024
18 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
19 * GNU General Public License
20 */
21
22#pragma once
23
24#include <Eigen/Core>
25
26#include <VirtualRobot/IK/DifferentialIK.h>
27#include <VirtualRobot/IK/JacobiProvider.h>
28#include <VirtualRobot/Nodes/RobotNode.h>
29#include <VirtualRobot/Robot.h>
30#include <VirtualRobot/RobotNodeSet.h>
31#include <VirtualRobot/VirtualRobot.h>
32
34// #include <armarx/control/common/control_law/aron/TaskspaceMixedImpedanceVelocityControllerConfig.aron.generated.h>
35// #include <armarx/control/common/control_law/aron/TaskspaceImpedanceControllerConfig.aron.generated.h>
36// #include <armarx/control/common/control_law/aron/TaskspaceAdmittanceControllerConfig.aron.generated.h>
37// #include <armarx/control/common/control_law/aron/TaskspaceVelocityControllerConfig.aron.generated.h>
38#include <armarx/control/common/control_law/aron/TaskspaceControllerConfig.aron.generated.h>
41#include <armarx/control/common/ft/aron/FTConfig.aron.generated.h>
42
44{
45
46 template <typename ConfigType, typename ConfigDictType>
48 {
49 public:
50 using FTConfig = common::ft::arondto::FTConfig;
51 using Config = ConfigType;
52 using ConfigDict = ConfigDictType;
53
54 public:
55 VirtualRobot::RobotNodePtr tcp;
56 VirtualRobot::RobotNodePtr rtTCP;
58
59 bool isControlModeValid(const std::vector<std::string>& nameList,
60 const std::map<std::string, std::string>& jointControlModeMap);
61
62 void initialize(const VirtualRobot::RobotNodeSetPtr& rns,
63 const VirtualRobot::RobotNodeSetPtr& rtRns);
64 // void preactivateInit(const VirtualRobot::RobotNodeSetPtr& rns);
65
66 void validate(ConfigType& c, TSCtrlRtStatus& rtStatus);
67 void updateJacobian(ConfigType& c, TSCtrlRtStatus& rtStatus);
68 void updateTwist(ConfigType& c, TSCtrlRtStatus& rtStatus);
69 void updateTSError(ConfigType& c, TSCtrlRtStatus& rtStatus);
70 void updateTSTwistCommand(ConfigType& c, TSCtrlRtStatus& rtStatus); /// Velocity
71 void updateTSForceCommand(ConfigType& c, TSCtrlRtStatus& rtStatus); /// Impedance
72 void updateTSAdmittanceCommand(ConfigType& c, TSCtrlRtStatus& rtStatus); /// Admittance
73 void updateNullspaceTwistCommand(ConfigType& c, TSCtrlRtStatus& rtStatus);
74 void updateNullspaceForceCommand(ConfigType& c, TSCtrlRtStatus& rtStatus);
75 void applyInverseDynamics(ConfigType& c, TSCtrlRtStatus& rtStatus);
76 void applyInverseKinematics(ConfigType& c, TSCtrlRtStatus& rtStatus);
77 void setForceTorqueGuard(bool forceGuard, bool torqueGuard);
79 void applyAdmittanceInterface(ConfigType& c, TSCtrlRtStatus& rtStatus);
80
81 bool isForceTorqueSafe();
82
83 virtual void run(ConfigType& c, TSCtrlRtStatus& robotStatus) = 0; // pure virtual
84 void firstRun();
85
86 virtual ~TaskspaceController() = default;
87
88 private:
89 VirtualRobot::DifferentialIKPtr ik;
90 Eigen::Vector6f JacPseudoInvRegularization;
91 };
92
93 template <typename ConfigType, typename ConfigDictType>
94 void
96 const VirtualRobot::RobotNodeSetPtr& rns,
97 const VirtualRobot::RobotNodeSetPtr& rtRns)
98 {
100 auto numOfJoints = rns->getSize();
101
102 tcp = rns->getTCP();
103 rtTCP = rtRns->getTCP();
105 ik.reset(new VirtualRobot::DifferentialIK(
106 rtRns, rtRns->getRobot()->getRootNode(), VirtualRobot::JacobiProvider::eSVDDamped));
107 ik->setDampedSvdLambda(0.1f);
108 ik->setJacobiMMRegularization(1.f);
109
110 JacPseudoInvRegularization =
111 ik->getJacobiRegularization(VirtualRobot::IKSolver::CartesianSelection::All);
112 // ARMARX_INFO << VAROUT(JacPseudoInvRegularization);
113 // ARMARX_INFO << "Jacobian Pseudo Inverse regularization: " << JacPseudoInvRegularization;
114 }
115
117 public TaskspaceController<common::control_law::arondto::TSMixImpVelConfig,
118 common::control_law::arondto::TSMixImpVelConfigDict>
119 {
120 public:
121 static constexpr std::string_view TypeName = "TSMixImpVel";
122 static constexpr bool IsCompliant = true;
123 void run(Config& c, TSCtrlRtStatus& robotStatus) override;
124 };
125
127 public TaskspaceController<common::control_law::arondto::TSImpConfig,
128 common::control_law::arondto::TSImpConfigDict>
129 {
130 public:
131 static constexpr std::string_view TypeName = "TSImp";
132 static constexpr bool IsCompliant = true;
133 void run(Config& c, TSCtrlRtStatus& robotStatus) override;
134 };
135
137 public TaskspaceController<common::control_law::arondto::TSVelConfig,
138 common::control_law::arondto::TSVelConfigDict>
139 {
140 public:
141 static constexpr std::string_view TypeName = "TSVel";
142 static constexpr bool IsCompliant = false;
143 void run(Config& c, TSCtrlRtStatus& robotStatus) override;
144 };
145
147 public TaskspaceController<common::control_law::arondto::TSAdmConfig,
148 common::control_law::arondto::TSAdmConfigDict>
149 {
150 public:
151 static constexpr std::string_view TypeName = "TSAdm";
152 static constexpr bool IsCompliant = true;
153 void run(Config& c, TSCtrlRtStatus& robotStatus) override;
154 };
155
156 // class TSMixImpVelController:
157 // public TaskspaceController<
158 // common::control_law::arondto::TaskspaceMixedImpedanceVelocityControllerConfig,
159 // common::control_law::arondto::TaskspaceMixedImpedanceVelocityControllerConfigDict>
160 // {
161 // void run(Config& c, TSCtrlRtStatus& robotStatus) override;
162 // };
163 //
164 // class TSImpController:
165 // public TaskspaceController<
166 // common::control_law::arondto::TaskspaceImpedanceControllerConfig,
167 // common::control_law::arondto::TaskspaceImpedanceControllerConfigDict>
168 // {
169 // void run(Config& c, TSCtrlRtStatus& robotStatus) override;
170 // };
171 //
172 // class TSVelController:
173 // public TaskspaceController<
174 // common::control_law::arondto::TaskspaceVelocityControllerConfig,
175 // common::control_law::arondto::TaskspaceVelocityControllerConfigDict>
176 // {
177 // void run(Config& c, TSCtrlRtStatus& robotStatus) override;
178 // };
179 //
180 // class TSAdmittanceController:
181 // public TaskspaceController<
182 // common::control_law::arondto::TaskspaceAdmittanceControllerConfig,
183 // common::control_law::arondto::TaskspaceAdmittanceControllerConfigDict>
184 // {
185 // void run(Config& c, TSCtrlRtStatus& robotStatus) override;
186 // };
187
188} // namespace armarx::control::common::control_law
constexpr T c
void run(Config &c, TSCtrlRtStatus &robotStatus) override
void run(Config &c, TSCtrlRtStatus &robotStatus) override
void run(Config &c, TSCtrlRtStatus &robotStatus) override
void run(Config &c, TSCtrlRtStatus &robotStatus) override
void initialize(const VirtualRobot::RobotNodeSetPtr &rns, const VirtualRobot::RobotNodeSetPtr &rtRns)
virtual void run(ConfigType &c, TSCtrlRtStatus &robotStatus)=0
void updateTSError(ConfigType &c, TSCtrlRtStatus &rtStatus)
void updateJacobian(ConfigType &c, TSCtrlRtStatus &rtStatus)
void applyAdmittanceInterface(ConfigType &c, TSCtrlRtStatus &rtStatus)
void applyInverseKinematics(ConfigType &c, TSCtrlRtStatus &rtStatus)
void updateNullspaceForceCommand(ConfigType &c, TSCtrlRtStatus &rtStatus)
void updateTSAdmittanceCommand(ConfigType &c, TSCtrlRtStatus &rtStatus)
Impedance.
void updateTSTwistCommand(ConfigType &c, TSCtrlRtStatus &rtStatus)
void setForceTorqueGuard(bool forceGuard, bool torqueGuard)
void updateTSForceCommand(ConfigType &c, TSCtrlRtStatus &rtStatus)
Velocity.
void validate(ConfigType &c, TSCtrlRtStatus &rtStatus)
void applyInverseDynamics(ConfigType &c, TSCtrlRtStatus &rtStatus)
bool isControlModeValid(const std::vector< std::string > &nameList, const std::map< std::string, std::string > &jointControlModeMap)
void updateNullspaceTwistCommand(ConfigType &c, TSCtrlRtStatus &rtStatus)
Admittance.
void updateTwist(ConfigType &c, TSCtrlRtStatus &rtStatus)
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Matrix< float, 6, 1 > Vector6f