CollisionAvoidanceVel.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 2021
18 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
19 * GNU General Public License
20 */
21
22#pragma once
23
24#include <VirtualRobot/VirtualRobot.h>
25
26#include <simox/control/environment/DistanceResult.h>
27#include <simox/control/impl/simox/robot/Robot.h>
28#include <simox/control/robot/RobotInterface.h>
29
31
32#include <armarx/control/common/control_law/aron/CollisionAvoidanceVelConfig.aron.generated.h>
35#include <armarx/control/common/ft/aron/FTConfig.aron.generated.h>
36
38{
39 namespace collision
40 {
41 void validateConfigData(const arondto::CollisionAvoidanceVelConfig& cfg);
42 }
43
44 /*
45 * This class should be used for one kinematric chain / robot node set
46 */
48 {
49 public:
50 using SCRobot = simox::control::simox::robot::Robot;
51 using DistanceResult = ::simox::control::environment::DistanceResult;
52 using DistanceResults = std::vector<DistanceResult>;
53 using DynamicsModel = simox::control::dynamics::RBDLModel;
54 using FTConfig = common::ft::arondto::FTConfig;
55 using Config = common::control_law::arondto::CollisionAvoidanceVelConfig;
57 std::unordered_map<unsigned int, const simox::control::robot::NodeInterface*>;
58
60 {
61 /// the distances and projected jacobians from the generateSelfCollisionTorque() method
62 /// are needed for the null space calculation
63 unsigned int node1 = 0;
64 unsigned int node2 = 0;
65 Eigen::MatrixXd jacobian;
66 float minDistance = -1.0F;
67
68 // Debugging values
69 // float repulsiveVel = -1.0f; // === changed to repulsiveVel
70 float repulsiveVel = -1.0F;
71 float localStiffness = -1.0F;
72 Eigen::VectorXf projectedJacT;
73 float distanceVelocity = -1.0F;
74 Eigen::Vector3f direction = Eigen::Vector3f::Zero();
75 Eigen::Vector3f point1 = Eigen::Vector3f::Zero();
76 Eigen::Vector3f point2 = Eigen::Vector3f::Zero();
77 float damping = -1.0F;
78 float projectedMass = -1.0F;
79 float desiredNSColl = -1.0F;
80
81 // mapped back from joint space with projectedJac pinv
83
84 CollisionData(unsigned int size) :
85 jacobian(Eigen::MatrixXd::Zero(3, size)), projectedJacT(Eigen::VectorXf::Zero(size))
86 {
87 }
88
89 inline void
91 {
92 node1 = 0;
93 node2 = 0;
94 jacobian.setZero();
95 projectedJacT.setZero();
96 direction.setZero();
97 point1.setZero();
98 point2.setZero();
99 minDistance = -1.0F;
100 repulsiveVel = -1.0F;
101 localStiffness = -1.0F;
102 distanceVelocity = -1.0F;
103 damping = -1.0F;
104 projectedMass = -1.0F;
105 desiredNSColl = -1.0F;
107 }
108 };
109
111 {
112 /// for each joint, that has a limit, based on the config parameters:
113 /// jointRangeBufferZone
114 /// jointRangeBufferZone_z1
115 /// jointRangeBufferZone_z2
116 ///
117 /// the specific values depending on the joint range of each joint have to
118 /// be calculated (and stored, so the calculation is only done in the init)
119 std::string jointName = "";
120 bool isLimitless = false;
121 float qLimLow = 0.0F;
122 float qLimHigh = 0.0F;
123 float thresholdRange = 0.0F;
124 float invThresholdSq = 0.0F;
125 float kRepulsive = 0.0F;
126 float qposThresholdLow = 0.0F; // unique for each joint in rep. torque function
127 float qposThresholdHigh = 0.0F;
128 /// null space parameters
129 float qposZ1Low = 0.0F;
130 float qposZ2Low = 0.0F;
131 float qposZ1High = 0.0F;
132 float qposZ2High = 0.0F;
133 Eigen::Vector4f jointLimitNullSpaceWeightsLow = Eigen::Vector4f::Zero();
134 Eigen::Vector4f jointLimitNullSpaceWeightsHigh = Eigen::Vector4f::Zero();
135 float desiredNSjointLim = 0.0F;
136 // float repulsiveTorque = 0.0f; // === will be replaced by repulsiveVel
137 float repulsiveJointVel = 0.0F;
138 float totalDamping = 0.0F;
139 };
140
141 /// internal status of the controller, containing intermediate variables, mutable targets
143 {
144 public:
145 /// global pose
146 Eigen::Matrix4f globalPose = Eigen::Matrix4f::Identity();
147 /// targets
148 // Eigen::VectorXf desiredJointTorques; // === desiredJointVel;
149 Eigen::VectorXf desiredJointVel;
150
151 /// Adaptive threshold for collision recovery
152 double timeSinceStart = 0.0;
153 bool inRecoveryMode = false;
154
156
157 Eigen::Vector3f dirErrorImp;
161
162 /// intermediate torque results
163 // Eigen::VectorXf impedanceJointTorque; // === trajFollowJointVel;
164 Eigen::VectorXf trajFollowJointVel;
165 // Eigen::VectorXf kdImpedanceTorque; // === not needed
166 // Eigen::VectorXf selfCollisionJointTorque; // === sel
167 Eigen::VectorXf selfCollisionJointVel;
168 // Eigen::VectorXf objectCollisionJointTorque;
169 Eigen::VectorXf objectCollisionJointVel;
170 // Eigen::VectorXf jointLimitJointTorque;
171 Eigen::VectorXf jointLimitJointVel;
172
173 // Eigen::VectorXf selfCollisionTorqueFiltered;
174 // Eigen::VectorXf objectCollisionTorqueFiltered;
175 // Eigen::VectorXf jointLimitTorqueFiltered;
178 Eigen::VectorXf jointLimitVelFiltered;
179
180 /// intermediate projected torques via null space matrices
181 /// ===== to remove the following
182 // Eigen::VectorXf projImpedanceJointTorque;
183 // Eigen::VectorXf projCollJointTorque;
184 // Eigen::VectorXf projJointLimJointTorque;
185
186 /// === todo find out the usage below
189
190 /// intermediate null space matrices ((self-)collision and joint limit avoidance)
191 Eigen::MatrixXf selfCollNullSpace;
192 Eigen::MatrixXf objectCollNullSpace;
193 Eigen::MatrixXf jointLimNullSpace;
194 Eigen::MatrixXf impedanceNullSpace; // === trajFollowNullSpace
196
200
201 /// collision avoidance initialization parameters
204
205 /// distance results
206 std::vector<CollisionData> collDataVec;
207 unsigned int
208 objectCollDataIndex; // from this index, the object collision avoidance data starts
209
210 /// self collision avoidance null space intermediate results
212 Eigen::VectorXf selfCollNormalizedJacT;
214
215 /// object collision avoidance null space intermediate results
219
220 /// joint limit avoidance initialization parameters
221
222 // TODO rename to jointLimitDataVec
223 std::vector<JointRangeBufferZoneData> jointLimitData;
224
225 /// joint limit avoidance intermediate results
226 float jointVel;
228
231
232 float k1Lo, k2Lo, k3Lo, k4Lo;
233 float k1Hi, k2Hi, k3Hi, k4Hi;
234
235 /// others
236 Eigen::MatrixXd inertia;
237 Eigen::MatrixXf inertiaInverse;
238
239 /// time status
247
248 /// collision pair info
249 unsigned int collisionPairsNum;
250 unsigned int activeCollPairsNum;
251
252 /// for generating torques according to priority
253 Eigen::MatrixXf nullSpaceAcc;
254 Eigen::VectorXf torqueAcc;
255 Eigen::VectorXf finalTorque;
256
257 void reset(const Config& c,
258 unsigned int nDoF,
259 unsigned int maxCollisionPairs,
260 VirtualRobot::RobotNodeSetPtr& rns);
261 void rtPreActivate(const Config& c);
262
263 private:
264 void initJointLimtDataVec(const Config& c,
265 unsigned int nDoF,
266 VirtualRobot::RobotNodeSetPtr& rns);
267 };
268
270 {
271 public:
274 void update(const Config& c, RtStatusForSafetyStrategy& rtStatus, double deltaT);
275 void reset();
276 };
277
278 CollisionAvoidanceVelController(const simox::control::robot::NodeSetInterface* nodeSet);
279
281
282 void run(const Config& c,
283 RtStatusForSafetyStrategy& robotStatus,
284 RecoveryState& rStateSelfColl,
285 const DistanceResults& collisionPairs,
286 const CollisionRobotIndices& collisionRobotIndices,
287 DynamicsModel& dynamicsModel,
288 const Eigen::VectorXf& qpos,
289 const Eigen::VectorXf& qvelFiltered,
290 float velocityLimit,
291 double deltaT);
292
293 inline std::size_t
294 numNodes() const
295 {
296 return nodeSet->getSize();
297 }
298
299 inline const simox::control::robot::NodeSetInterface&
301 {
302 return *nodeSet;
303 }
304
305 protected:
306 const simox::control::robot::NodeSetInterface* nodeSet;
307 const Eigen::MatrixXf I;
309
310 /// avoidance torque methods
311 // void calculateSelfCollisionTorque(const Config& c,
314 RecoveryState& rState,
315 const DistanceResults& collisionPairs,
316 const CollisionRobotIndices& collisionRobotIndices,
317 const Eigen::VectorXf& qvelFiltered,
318 double deltaT) const;
319
320 // void calculateJointLimitTorque(const Config& c,
321 void calculateJointLimitVel(const Config& c,
323 const Eigen::VectorXf& qpos,
324 const Eigen::VectorXf& qvelFiltered) const;
325
326 // void calculateCollisionTorque(CollisionData& collDataVec,
328 const Config& c,
330 const CollisionRobotIndices& collisionRobotIndices,
331 const Eigen::VectorXf& qvelFiltered,
332 Eigen::VectorXf& jointTorque,
333 float distanceThreshold) const;
334
335 /// caclulate null spaces
337 RtStatusForSafetyStrategy& rtStatus) const;
340 const Eigen::VectorXf& qpos) const;
341 };
342} // namespace armarx::control::common::control_law
constexpr T c
void update(const Config &c, RtStatusForSafetyStrategy &rtStatus, double deltaT)
internal status of the controller, containing intermediate variables, mutable targets
float impTorqueRatio
intermediate projected torques via null space matrices ===== to remove the following
Eigen::MatrixXf selfCollNullSpace
intermediate null space matrices ((self-)collision and joint limit avoidance)
std::vector< JointRangeBufferZoneData > jointLimitData
joint limit avoidance initialization parameters
void run(const Config &c, RtStatusForSafetyStrategy &robotStatus, RecoveryState &rStateSelfColl, const DistanceResults &collisionPairs, const CollisionRobotIndices &collisionRobotIndices, DynamicsModel &dynamicsModel, const Eigen::VectorXf &qpos, const Eigen::VectorXf &qvelFiltered, float velocityLimit, double deltaT)
------------------------------— main rt-loop ---------------------------------------—
void calculateSelfCollisionVel(const Config &c, RtStatusForSafetyStrategy &rtStatus, RecoveryState &rState, const DistanceResults &collisionPairs, const CollisionRobotIndices &collisionRobotIndices, const Eigen::VectorXf &qvelFiltered, double deltaT) const
avoidance torque methods
void calculateJointLimitNullspace(const Config &c, RtStatusForSafetyStrategy &rtStatus, const Eigen::VectorXf &qpos) const
void calculateSelfCollisionNullspace(const Config &c, RtStatusForSafetyStrategy &rtStatus) const
caclulate null spaces
void calculateJointLimitVel(const Config &c, RtStatusForSafetyStrategy &rtStatus, const Eigen::VectorXf &qpos, const Eigen::VectorXf &qvelFiltered) const
std::unordered_map< unsigned int, const simox::control::robot::NodeInterface * > CollisionRobotIndices
CollisionAvoidanceVelController(const simox::control::robot::NodeSetInterface *nodeSet)
const simox::control::robot::NodeSetInterface & getNodeSet() const
void calculateCollisionJointVel(CollisionData &collDataVec, const Config &c, RtStatusForSafetyStrategy &rts, const CollisionRobotIndices &collisionRobotIndices, const Eigen::VectorXf &qvelFiltered, Eigen::VectorXf &jointTorque, float distanceThreshold) const
common::control_law::arondto::CollisionAvoidanceVelConfig Config
Matrix< float, 6, 1 > Vector6f
void validateConfigData(const arondto::CollisionAvoidanceConfig &cfg)
unsigned int node1
the distances and projected jacobians from the generateSelfCollisionTorque() method are needed for th...
std::string jointName
for each joint, that has a limit, based on the config parameters: jointRangeBufferZone jointRangeBuff...