common.cpp
Go to the documentation of this file.
2
4
6{
7
8 void
9 RobotStatus::reset(const size_t nJoints,
10 const std::vector<size_t>& jointIDTorqueCtrlMode,
11 const std::vector<size_t>& jointIDVelocityCtrlMode)
12 {
13 jointPosition.setZero(nJoints);
14 jointVelocity.setZero(nJoints);
15 jointTorque.setZero(nJoints);
16
17 deltaT = 0;
18 accumulateTime = 0.0;
19
20 nDoF = nJoints;
21 nDoFTorque = jointIDTorqueCtrlMode.size();
22 nDoFVelocity = jointIDVelocityCtrlMode.size();
23
24 jointIDTorqueMode = jointIDTorqueCtrlMode;
25 jointIDVelocityMode = jointIDVelocityCtrlMode;
27
28 globalPose = Eigen::Matrix4f::Identity();
29 }
30
31 void
32 TSCtrlRtStatus::reset(const size_t numDoF,
33 const std::vector<size_t>& jointIDTorqueMode,
34 const std::vector<size_t>& jointIDVelocityMode)
35 {
36 /// This function should be called BEFORE the RT thread.
37 /// Usually in constructor of the controller
39
40 /// targets
41 desiredJointTorque.setZero(nDoF);
44 nullspaceTorque.setZero(nDoF);
45 nullspaceVelocity.setZero(nDoF);
46
47 /// force torque
48 currentForceTorque.setZero();
49 safeFTGuardOffset.setZero();
50
51 /// task space variables (command in operation space)
52 forceImpedance.setZero();
53 cartesianVelTarget.setZero();
54
55 /// current status
56 qvelFiltered.setZero(nDoF);
57 currentPose.setZero();
58 currentTwist.setZero();
59 desiredPose.setZero();
60 desiredPoseUnsafe.setZero();
61
62 /// intermediate results
63 poseDiffMatImp.setZero();
64 poseErrorImp.setZero();
65 oriDiffAngleAxis = Eigen::AngleAxisf::Identity();
66
67 /// intermediate results for admittance controller
68 poseDiffMatAdm.setZero();
69 poseErrorAdm.setZero();
70 virtualPose.setZero();
71 virtualVel.setZero();
72 virtualAcc.setZero();
73 pos.setZero();
74 vel.setZero();
75 acc.setZero();
76
77 /// inertia
78 inertia.setZero(nDoF, nDoF);
79 inertiaInv.setZero(nDoF, nDoF);
82 IVelCtrlJoint = Eigen::MatrixXf::Identity(nDoFVelocity, nDoFVelocity);
83 qdPos.setZero(nDoFVelocity);
84 qdVel.setZero(nDoFVelocity);
85 qdAcc.setZero(nDoFVelocity);
86 qTemp.setZero(nDoFVelocity);
87
88 /// others
89 jacobi.setZero(6, nDoF);
90 jtpinv.setZero(6, nDoF);
91 jpinv.setZero(nDoF, 6);
92 I = Eigen::MatrixXf::Identity(nDoF, nDoF);
93
94 rtSafe = false; // TODO check default value
95 rtTargetSafe = true;
96 forceTorqueSafe = true;
97 }
98
99 void
100 TSCtrlRtStatus::rtPreActivate(const Eigen::Matrix4f& currentTCPPose)
101 {
102 /// !!!! TO BE UPDATED IN PRE-ACTIVATE !!!!
103 /// only then the up-to-date robot joint information is available
104 currentPose = currentTCPPose;
105 desiredPose = currentTCPPose;
106 accumulateTime = 0.0;
107 }
108
109 Eigen::MatrixXf
110 computeJointLimitWeightMatrix(const Eigen::Ref<const Eigen::VectorXf>& jointAngles,
111 const Eigen::Ref<const Eigen::VectorXf>& jointLimitsLow,
112 const Eigen::Ref<const Eigen::VectorXf>& jointLimitsHigh,
113 Eigen::VectorXf& jointAngleLimitGradient)
114 {
115 // temporally copied from simox control
116 // Based on "A weighted least-norm solution based scheme for avoiding joint limits for redundant joint manipulators", T.F.Chan (1995)
117 int nbJoints = jointAngles.size();
118 Eigen::VectorXf weights(nbJoints);
119 Eigen::VectorXf gradient = Eigen::VectorXf::Zero(nbJoints);
120
121 if (jointAngleLimitGradient.rows() == 0)
122 {
123 jointAngleLimitGradient = Eigen::VectorXf::Zero(nbJoints);
124 }
125
126 for (int i = 0; i < nbJoints; i++)
127 {
128 if ((jointLimitsLow(i) == 0 && jointLimitsHigh(i) == 0) || jointLimitsHigh(i) > 1e8)
129 {
130 // Joint is limitless
131 weights(i) = 1.;
132 }
133 else
134 {
135 gradient(i) = std::pow(jointLimitsHigh(i) - jointLimitsLow(i), 2) *
136 (2 * jointAngles(i) - jointLimitsHigh(i) - jointLimitsLow(i)) /
137 (4 * std::pow(jointLimitsHigh(i) - jointAngles(i), 2) *
138 std::pow(jointAngles(i) - jointLimitsLow(i), 2));
139
140 if ((std::abs(gradient(i)) - std::abs(jointAngleLimitGradient(i))) >= 0.)
141 {
142 // Joint going towards limits
143 weights(i) = 1. / std::sqrt((1. + std::abs(gradient(i))));
144 }
145 else
146 {
147 // Joint going towards the center
148 weights(i) = 1.;
149 }
150 }
151 }
152 jointAngleLimitGradient = gradient;
153 return weights.asDiagonal();
154 }
155
156} // namespace armarx::control::common::control_law
#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::MatrixXf computeJointLimitWeightMatrix(const Eigen::Ref< const Eigen::VectorXf > &jointAngles, const Eigen::Ref< const Eigen::VectorXf > &jointLimitsLow, const Eigen::Ref< const Eigen::VectorXf > &jointLimitsHigh, Eigen::VectorXf &jointAngleLimitGradient)
Definition common.cpp:110
virtual void reset(size_t nJoints, const std::vector< size_t > &jointIDTorqueCtrlMode, const std::vector< size_t > &jointIDVelocityCtrlMode)
Definition common.cpp:9
Eigen::Vector6f cartesianVelTarget
for impedance control
Definition common.h:75
Eigen::Matrix3f poseDiffMatAdm
intermediate results for admittance controller
Definition common.h:90
Eigen::MatrixXf jtpinv
pseudo inverse of the jacobi transpose [6, nDoF], for torque control
Definition common.h:118
Eigen::MatrixXf I
for computing nullspace projection
Definition common.h:124
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
void reset(size_t numDoF, const std::vector< size_t > &jointIDTorqueMode, const std::vector< size_t > &jointIDVelocityMode) override
Definition common.cpp:32
Eigen::Matrix3f poseDiffMatImp
intermediate results
Definition common.h:85
Eigen::VectorXf qvelFiltered
for velocity control
Definition common.h:78
Eigen::MatrixXd inertia
inertia Note, the inertia variables are only used for collision avoidance controllers,...
Definition common.h:104
Eigen::Vector6f forceImpedance
task space variables (command in operation space)
Definition common.h:74
Eigen::Vector6f currentForceTorque
force torque
Definition common.h:70
void rtPreActivate(const Eigen::Matrix4f &currentTCPPose)
Definition common.cpp:100