11#include <VirtualRobot/IK/DifferentialIK.h>
12#include <VirtualRobot/IK/JacobiProvider.h>
13#include <VirtualRobot/MathTools.h>
14#include <VirtualRobot/Nodes/RobotNode.h>
15#include <VirtualRobot/Robot.h>
16#include <VirtualRobot/RobotNodeSet.h>
24 template <
typename ConfigType,
typename ConfigDictType>
31 template <
typename ConfigType,
typename ConfigDictType>
34 const std::vector<std::string>& nameList,
35 const std::map<std::string, std::string>& jointControlModeMap)
37 std::set<std::string> validModes = {
"velocity",
"torque"};
39 for (
const auto& pair : jointControlModeMap)
41 if (std::find(nameList.begin(), nameList.end(), pair.first) == nameList.end())
43 ARMARX_ERROR <<
"TaskspaceController: joint name '" << pair.first
44 <<
"' not found in robot node set.";
48 if (validModes.find(pair.second) == validModes.end())
50 ARMARX_ERROR <<
"TaskspaceController: Invalid control mode for joint '"
51 << pair.first <<
"': " << pair.second << std::endl;
59 template <
typename ConfigType,
typename ConfigDictType>
76 if (
c.ftConfig.resetToCurrentPoseOnSafeGuardTrigger)
88 .norm() >
c.safeDistanceMMToGoal or
91 VirtualRobot::MathTools::deg2rad(
c.safeRotAngleDegreeToGoal))
109 template <
typename ConfigType,
typename ConfigDictType>
114 auto nDoF =
static_cast<Eigen::Index
>(rtStatus.
nDoF);
118 ik->updateJacobianMatrix(
119 rtStatus.
jacobi,
rtTCP, VirtualRobot::IKSolver::CartesianSelection::All);
124 rtStatus.
jacobi.block(0, 0, 3, rtStatus.
nDoF) =
125 0.001 * rtStatus.
jacobi.block(0, 0, 3, rtStatus.
nDoF);
128 ik->updatePseudoInverseJacobianMatrix(
129 rtStatus.
jpinv, rtStatus.
jacobi, 0.f, JacPseudoInvRegularization);
135 rtStatus.
jtpinv = ik->computePseudoInverseJacobianMatrix(rtStatus.
jacobi.transpose(),
136 JacPseudoInvRegularization);
141 template <
typename ConfigType,
typename ConfigDictType>
146 auto nDoF =
static_cast<Eigen::Index
>(rtStatus.
nDoF);
157 template <
typename ConfigType,
typename ConfigDictType>
168 rtStatus.
currentPose.block<3, 3>(0, 0).transpose();
178 template <
typename ConfigType,
typename ConfigDictType>
189 template <
typename ConfigType,
typename ConfigDictType>
200 template <
typename ConfigType,
typename ConfigDictType>
206 auto nDoF =
static_cast<Eigen::Index
>(rtStatus.
nDoF);
213 c.kpNullspaceTorque.cwiseProduct(
c.desiredNullspaceJointAngles.value() -
218 template <
typename ConfigType,
typename ConfigDictType>
224 auto nDoF =
static_cast<Eigen::Index
>(rtStatus.
nDoF);
231 c.kpNullspaceVel.cwiseProduct(
c.desiredNullspaceJointAngles.value() -
236 template <
typename ConfigType,
typename ConfigDictType>
241 auto nDoF =
static_cast<Eigen::Index
>(rtStatus.
nDoF);
255 template <
typename ConfigType,
typename ConfigDictType>
261 auto nDoF =
static_cast<Eigen::Index
>(rtStatus.
nDoF);
275 template <
typename ConfigType,
typename ConfigDictType>
278 const bool torqueGuard)
280 ftsensor.enableSafeGuard(forceGuard, torqueGuard);
283 template <
typename ConfigType,
typename ConfigDictType>
292 rtStatus.
desiredPose.block<3, 3>(0, 0).transpose();
311 VirtualRobot::MathTools::rpy2eigen3f(
312 rtStatus.
pos(3), rtStatus.
pos(4), rtStatus.
pos(5)) *
321 rtStatus.
currentPose.block<3, 3>(0, 0).transpose();
331 template <
typename ConfigType,
typename ConfigDictType>
338 size_t m = idx.size();
341 for (
size_t i = 0; i < m; ++i)
343 for (
size_t j = 0; j < m; ++j)
350 double epsilon = 1e-5;
365 template <
typename ConfigType,
typename ConfigDictType>
375 for (
size_t i = 0; i < m; ++i)
385 for (
size_t i = 0; i < m; ++i)
388 std::clamp(rtStatus.
qdVel(i), -
c.velocityLimit,
c.velocityLimit);
392 template <
typename ConfigType,
typename ConfigDictType>
407 if (not
c.enableAdmInterface)
417 if (
c.enableAdmInterface)
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
VirtualRobot::RobotNodePtr rtTCP
common::ft::FTSensor ftsensor
common::control_law::arondto::TSMixImpVelConfig Config
void updateTSError(ConfigType &c, TSCtrlRtStatus &rtStatus)
void computeInertiaInverse(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_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
This file is part of ArmarX.
std::vector< std::vector< T > > transpose(const std::vector< std::vector< T > > &src, Thrower thrower)
Eigen::VectorXf jointVelocity
std::vector< size_t > jointIDVelocityMode
Eigen::VectorXf jointPosition
Eigen::Vector6f virtualAcc
Eigen::Matrix4f virtualPose
Eigen::VectorXf nullspaceVelocity
Eigen::AngleAxisf oriDiffAngleAxis
Eigen::VectorXf desiredJointVelocity
Eigen::Vector6f cartesianVelTarget
for impedance control
Eigen::Vector6f currentTwist
Eigen::Matrix3f poseDiffMatAdm
intermediate results for admittance controller
Eigen::MatrixXf jtpinv
pseudo inverse of the jacobi transpose [6, nDoF], for torque control
Eigen::MatrixXf I
for computing nullspace projection
Eigen::Matrix4f currentPose
Eigen::MatrixXf jpinv
pseudo inverse of the jacobi [nDoF, 6], for vel control
Eigen::MatrixXf jacobi
others jacobi matrix [6, nDoF]
Eigen::Vector6f poseErrorImp
Eigen::MatrixXf IVelCtrlJoint
Eigen::Matrix3f poseDiffMatImp
intermediate results
Eigen::Matrix4f desiredPose
Eigen::VectorXf qvelFiltered
for velocity control
Eigen::MatrixXf inertiaInvVelCtrlJoints
Eigen::VectorXf desiredJointTorque
targets
Eigen::Vector6f poseErrorAdm
Eigen::VectorXf nullspaceTorque
Eigen::MatrixXd inertia
inertia Note, the inertia variables are only used for collision avoidance controllers,...
Eigen::Vector6f forceImpedance
task space variables (command in operation space)
Eigen::Vector6f currentForceTorque
force torque
Eigen::MatrixXd inertiaVelCtrlJoints
Eigen::Matrix4f desiredPoseUnsafe
Eigen::Vector6f virtualVel