ZeroTorqueOrVelocityController.cpp
Go to the documentation of this file.
2
3#include <SimoxUtility/math/convert/mat4f_to_quat.h>
4#include <VirtualRobot/IK/DifferentialIK.h>
5#include <VirtualRobot/IK/IKSolver.h>
6#include <VirtualRobot/MathTools.h>
7#include <VirtualRobot/Nodes/RobotNode.h>
8#include <VirtualRobot/Robot.h>
9#include <VirtualRobot/RobotNodeSet.h>
10
12
13#include "../utils.h"
14
16{
17
18 void
19 ZeroTorqueOrVelocityController::initialize(const VirtualRobot::RobotNodeSetPtr& rns,
20 const VirtualRobot::RobotNodeSetPtr& rtRns,
21 const std::vector<size_t>& torqueControlledIndex,
22 const std::vector<size_t>& velocityControlledIndex)
23 {
25 // auto numOfJoints = rns->getSize();
26
27 jointIDTorqueMode = torqueControlledIndex;
28 jointIDVelocityMode = velocityControlledIndex;
29 // ARMARX_CHECK_EQUAL(jointIDTorqueMode.size() + jointIDVelocityMode.size(), numOfJoints);
30 // nDoFTorque = jointIDTorqueMode.size();
31 // nDoFVelocity = jointIDVelocityMode.size();
32
33 tcp = rns->getTCP();
34 rtTCP = rtRns->getTCP();
36 ik.reset(new VirtualRobot::DifferentialIK(
37 rtRns, rtRns->getRobot()->getRootNode(), VirtualRobot::JacobiProvider::eSVDDamped));
38
39
40 // I = Eigen::MatrixXf::Identity(numOfJoints, numOfJoints);
41 }
42
43 void
44 ZeroTorqueOrVelocityController::preactivateInit(const VirtualRobot::RobotNodeSetPtr& rns)
45 {
46 }
47
48 void
53
54 // bool
55 // ZeroTorqueOrVelocityController::isControlModeValid(
56 // const std::vector<std::string>& nameList,
57 // const std::map<std::string, std::string>& jointControlModeMap)
58 // {
59 // std::set<std::string> validModes = {"velocity", "torque"};
60
61 // for (const auto& pair : jointControlModeMap)
62 // {
63 // if (std::find(nameList.begin(), nameList.end(), pair.first) == nameList.end())
64 // {
65 // ARMARX_ERROR << "ZeroTorqueOrVelocityController: joint name '" << pair.first
66 // << "' not found in robot node set.";
67 // return false;
68 // }
69
70 // if (validModes.find(pair.second) == validModes.end())
71 // {
72 // ARMARX_ERROR << "ZeroTorqueOrVelocityController: Invalid control mode for joint '"
73 // << pair.first << "': " << pair.second << std::endl;
74 // return false;
75 // }
76 // }
77
78 // return true;
79 // }
80
81 // void
82 // ZeroTorqueOrVelocityController::updateFT(const ft::arondto::FTConfig& c, RtStatus& rtStatus)
83 // {
84 // /// run in rt thread
85 // ftsensor.updateStatus();
86 // if (c.reCalibrate)
87 // {
88 // ftsensor.calibrated.store(false);
89 // /// TODO how to toggle recalibration?
90 // }
91 // ftsensor.compensateTCPGravity(c);
92 // if (!ftsensor.calibrated.load())
93 // {
94 // if (ftsensor.calibrate(c, rtStatus.deltaT))
95 // {
96 // ftsensor.calibrated.store(true);
97 // }
98 // }
99 // else
100 // {
101 // rtStatus.currentForceTorque = ftsensor.getFilteredForceTorque(c);
102 // }
103 // }
104
105 void
107 {
108 auto nDoF = static_cast<Eigen::Index>(rtStatus.nDoF);
109
110 /// ------------------------------ compute jacobi -------------------------------------------------------------
111 rtStatus.jacobi =
112 ik->getJacobianMatrix(rtTCP, VirtualRobot::IKSolver::CartesianSelection::All);
113 rtStatus.jacobi.block(0, 0, 3, nDoF) =
114 0.001 * rtStatus.jacobi.block(0, 0, 3, nDoF);
115 ARMARX_CHECK_EQUAL(nDoF, rtStatus.jacobi.cols());
116 ARMARX_CHECK_EQUAL(6, rtStatus.jacobi.rows());
117
118 rtStatus.jpinv = ik->computePseudoInverseJacobianMatrix(rtStatus.jacobi, rtStatus.lambda);
119 ARMARX_CHECK_EQUAL(nDoF, rtStatus.jpinv.rows());
120 ARMARX_CHECK_EQUAL(6, rtStatus.jpinv.cols());
121
122 /// ------------------------------ update velocity/twist ------------------------------------------------------
123 ARMARX_CHECK_EQUAL(nDoF, rtStatus.jointPosition.rows());
124 ARMARX_CHECK_EQUAL(nDoF, rtStatus.jointVelocity.rows());
125 ARMARX_CHECK_EQUAL(nDoF, rtStatus.qvelFiltered.rows());
126
127 rtStatus.qvelFiltered =
128 (1 - c.qvelFilter) * rtStatus.qvelFiltered + c.qvelFilter * rtStatus.jointVelocity;
129
130 // current twist is only modelled w.r.t. to two wrist joint
131 rtStatus.currentTwist.setZero();
132 for (size_t i = 0; i < 6; i++)
133 {
134 for (auto j : jointIDVelocityMode)
135 {
136 rtStatus.currentTwist(i) += rtStatus.jacobi(i, j) * rtStatus.qvelFiltered(j);
137 }
138 }
139
140 /// ------------------------------------- Velocity control ---------------------------------------------------
141 /// TODO add doc
142 rtStatus.cartesianVelTarget.setZero();
143 if (rtStatus.currentForceTorque.head<3>().norm() > c.forceAmplitudeDeadZone)
144 {
145 rtStatus.cartesianVelTarget.head<3>() =
146 c.kpCartesianVel.head<3>().cwiseProduct(rtStatus.currentForceTorque.head<3>()) -
147 c.kdCartesianVel.head<3>().cwiseProduct(rtStatus.currentTwist.head<3>());
148 }
149 if (rtStatus.currentForceTorque.tail<3>().norm() > c.torqueAmplitudeDeadZone)
150 {
151 rtStatus.cartesianVelTarget.tail<3>() =
152 c.kpCartesianVel.tail<3>().cwiseProduct(rtStatus.currentForceTorque.tail<3>()) -
153 c.kdCartesianVel.tail<3>().cwiseProduct(rtStatus.currentTwist.tail<3>());
154 }
155
156
157 /// ----------------------------- Map TS target force/velocity to JS --------------------------------------------------
158 ARMARX_CHECK_EQUAL(nDoF, rtStatus.desiredJointTorque.rows());
159 ARMARX_CHECK_EQUAL(nDoF, rtStatus.desiredJointVelocity.rows());
160 rtStatus.desiredJointTorque.setZero();
161 rtStatus.desiredJointVelocity = rtStatus.jpinv * rtStatus.cartesianVelTarget;
162
163 /// ----------------------------- write torque/velocity target --------------------------------------------------
164 for (int i = 0; i < rtStatus.desiredJointVelocity.rows(); ++i)
165 {
166 rtStatus.desiredJointVelocity(i) =
167 std::clamp(rtStatus.desiredJointVelocity(i), -c.velocityLimit, c.velocityLimit);
168 }
169 }
170} // namespace armarx::control::common::control_law
constexpr T c
void initialize(const VirtualRobot::RobotNodeSetPtr &rns, const VirtualRobot::RobotNodeSetPtr &rtRns, const std::vector< size_t > &torqueControlledIndex, const std::vector< size_t > &velocityControlledIndex)
arondto::ZeroTorqueOrVelocityControllerConfig Config
you can set the following values from outside of the rt controller via Ice interfaces
#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...
#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...
Eigen::Vector6f cartesianVelTarget
for impedance control
Definition common.h:75
Eigen::MatrixXf jpinv
pseudo inverse of the jacobi [nDoF, 6], for vel control
Definition common.h:121
Eigen::MatrixXf jacobi
others jacobi matrix [6, nDoF]
Definition common.h:116
Eigen::VectorXf qvelFiltered
for velocity control
Definition common.h:78
float lambda
damping term for pseudo inverse of jacobian
Definition common.h:127
Eigen::Vector6f currentForceTorque
force torque
Definition common.h:70