ObjectCollisionAvoidance.cpp
Go to the documentation of this file.
2
3#include <boost/unordered/detail/implementation.hpp>
4
5#include <simox/control/dynamics/RBDLModel.h>
6
8
10{
12 const simox::control::robot::NodeSetInterface* nodeSet) :
14 {
15 controllerHierarchy.reserve(4); // number of torque types to consider
16 }
17
18 void
20 const common::control_law::arondto::ObjectCollisionAvoidanceConfig& c,
21 RtStatusForSafetyStrategy& rtStatus) const
22 {
23 rtStatus.objectCollNullSpace.setIdentity();
24
27
29 rtStatus.objectCollK1 = rtStatus.objectCollisionNullSpaceWeights(0);
30 rtStatus.objectCollK2 = rtStatus.objectCollisionNullSpaceWeights(1);
31 rtStatus.objectCollK3 = rtStatus.objectCollisionNullSpaceWeights(2);
32 rtStatus.objectCollK4 = rtStatus.objectCollisionNullSpaceWeights(3);
33
35
36 for (unsigned int i = rtStatus.objectCollDataIndex; i < rtStatus.activeCollPairsNum; i++)
37 {
38 auto& active = rtStatus.collDataVec[i];
39
40 /// get desired null space value based on proximity to collision
41 if (active.minDistance < c.objectCollActivatorZ1)
42 {
43 /// full locking in direction of collision
44 rtStatus.desiredNullSpace = 0.0f;
45 }
46 else if (c.objectCollActivatorZ1 <= active.minDistance &&
47 active.minDistance <= c.objectCollActivatorZ2)
48 {
49 /// in transition state
50 rtStatus.desiredNullSpace =
51 rtStatus.objectCollK1 * std::pow(active.minDistance, 3) +
52 rtStatus.objectCollK2 * std::pow(active.minDistance, 2) +
53 rtStatus.objectCollK3 * active.minDistance + rtStatus.objectCollK4;
54 if (rtStatus.desiredNullSpace > 1.0f)
55 {
56 ARMARX_WARNING << "desired null space value should not be higher than 1.0, was "
57 << rtStatus.desiredNullSpace
58 << ", in collision null space calulation, weights: "
59 << rtStatus.objectCollK1 << ", " << rtStatus.objectCollK2 << ", "
60 << rtStatus.objectCollK3 << ", " << rtStatus.objectCollK4;
61 }
62 }
63 else
64 {
65 /// unrestricted movement in direction of collision
66 rtStatus.desiredNullSpace = 1.0f;
67 }
68
69 active.desiredNSColl = rtStatus.desiredNullSpace;
70 rtStatus.desiredNullSpace = std::clamp(rtStatus.desiredNullSpace, 0.0f, 1.0f);
72 /// normalize projected Jacobian
73 rtStatus.objectCollNormalizedJacT = active.projectedJacT.normalized();
74
76
79 (rtStatus.objectCollNormalizedJacT * (1.0f - rtStatus.desiredNullSpace) *
80 rtStatus.objectCollNormalizedJacT.transpose());
81
82 if (c.onlyLimitCollDirection)
83 {
84 /// check, whether impedance joint torque acts against the collision direction
85 ARMARX_CHECK_EQUAL(active.projectedJacT.rows(),
86 rtStatus.impedanceJointTorque.rows());
87 for (int i = 0; i < rtStatus.impedanceJointTorque.rows(); ++i)
88 {
89 if ((active.projectedJacT(i) < 0.0f and
90 rtStatus.impedanceJointTorque(i) < 0.0f) ||
91 (active.projectedJacT(i) > 0.0f and
92 rtStatus.impedanceJointTorque(i) > 0.0f))
93 {
94 // if both have the same sign (both negative or both positive), do not limit DoF
95 rtStatus.objectCollTempNullSpaceMatrix(i, i) = 1.0f;
96 }
97 }
98 }
99 /// project desired null space in corresponding direction via the Norm-Jacobian
101 // todo: clamp the diagonal values between 0 and 1
102 }
103 }
104
105 void
107 const Config& c,
109 RecoveryState& rState,
110 const DistanceResults& externalCollisionPairs,
111 const CollisionRobotIndices& collisionRobotIndices,
112 const Eigen::VectorXf& qvelFiltered,
113 double deltaT) const
114 {
115
116 /// collision avoidance algorithm following the methods in Dietrich et al. (2012):
117 ///
118 /// A. Dietrich, T. Wimbock, A. Albu-Schaffer and G. Hirzinger, "Integration of Reactive,
119 /// Torque-Based Self-Collision Avoidance Into a Task Hierarchy," in IEEE Transactions on
120 /// Robotics, vol. 28, no. 6, pp. 1278-1293, Dec. 2012, doi: 10.1109/TRO.2012.2208667.
121 ///
122 /// see: https://ieeexplore.ieee.org/document/6255795
123 ///
124 /// method:
125 ///
126 /// computes the joint torques to avoid collisions -> collisionJointTorque
127
128 if (externalCollisionPairs.empty())
129 {
130 return;
131 }
132
133 /// clear values before new cycle
134 rts.objectCollisionJointTorque.setZero();
135
136 if (!c.enableSelfCollisionAvoidance)
137 {
138 rts.objectCollDataIndex = 0;
139 rts.activeCollPairsNum = 0;
140 }
141
142 // clear values before new cycle, starting from object collision data index
143 for (size_t i = rts.objectCollDataIndex; i < rts.collDataVec.size(); ++i)
144 {
145 rts.collDataVec[i].clearValues();
146 }
147
148 /// when collDistanceThresholdInit is smaller than recoveryDistanceElapseMeter
149 /// (usually means it is zero), we need to initilize it to the smallest collision distance
150 /// plus a recoveryDistanceElapseMeter.
151 float& thresholdInit = rState.collDistanceThresholdInit;
152 if (c.enableCollisionRecoveryOnStartup and (thresholdInit < c.recoveryDistanceElapseMeter))
153 {
154 thresholdInit = c.objectDistanceThreshold;
155 for (const DistanceResult& collisionPair : externalCollisionPairs)
156 {
157 float minDist = static_cast<float>(collisionPair.minDistance);
158 if (minDist < thresholdInit)
159 {
160 thresholdInit = std::max(minDist, 0.0f);
161 }
162 }
163 thresholdInit =
164 std::min(c.objectDistanceThreshold, thresholdInit + c.recoveryDistanceElapseMeter);
165 }
166
167 rState.update(c, rts, deltaT);
168
169
170 /// handling of external collision pairs
171 for (const DistanceResult& collisionPair : externalCollisionPairs)
172 {
173
174 if (rts.activeCollPairsNum >= rts.collDataVec.size())
175 {
177 "CollisionAvoidanceController",
178 "Number of active collision pairs exceeds the allocated memory");
179 break;
180 }
181
182 if (static_cast<float>(collisionPair.minDistance) >= rState.collDistanceThreshold)
183 {
184 continue;
185 }
186
187 /// only node1 is on the robot
188 if (collisionRobotIndices.count(collisionPair.node1) == 0)
189 {
190 continue;
191 }
192
193 ARMARX_CHECK(collisionPair.hasPoints());
194
195 auto& externalCollDataVec = rts.collDataVec[rts.activeCollPairsNum++];
196
197 externalCollDataVec.minDistance = static_cast<float>(collisionPair.minDistance);
198
199 externalCollDataVec.node1 = collisionPair.node1;
200 externalCollDataVec.node2 = collisionPair.node2;
201 externalCollDataVec.point1 = collisionPair.point1->cast<float>();
202 externalCollDataVec.point2 = collisionPair.point2->cast<float>();
203 auto node1Type = collisionPair.node1Type;
204 // auto node2Type = collisionPair.node2Type;
205
206 // direction is pointing away from collision
207 externalCollDataVec.direction = externalCollDataVec.point1 - externalCollDataVec.point2;
208
209 if (externalCollDataVec.minDistance < 0.0f)
210 {
211 externalCollDataVec.minDistance = 0.0f;
212
213 // check for overlapping objects (returned points are exactly the same)
214 if (externalCollDataVec.point1.isApprox(externalCollDataVec.point2, 1e-8) and
215 collisionPair.normalVec != std::nullopt)
216 {
217 /// if the points are the same, normalVec comes with a value
218
219 // todo: how to make sure the normalVec is always pointing away from the
220 // collision, in normally the vector points out from the contact point within
221 // the sphere
222 // issue: if the arm is modeled with a sphere, it will point towards the collision
223 // No faulty behavior has been detected so far, however there is the possibility
224 // to get a direction vector pointing towards the collision
225
226 // solution: check if the node is a sphere, if the repulsive force is
227 // suppose to apply on the sphere, use the negative normal direction
228 if (node1Type == hpp::fcl::NODE_TYPE::GEOM_SPHERE)
229 {
230 externalCollDataVec.direction =
231 -1.0 * collisionPair.normalVec->cast<float>();
232 }
233 else
234 {
235 externalCollDataVec.direction = collisionPair.normalVec->cast<float>();
236 }
237 }
238 else
239 {
240 externalCollDataVec.direction *= -1.0f;
241 }
242 }
243
244 externalCollDataVec.direction.normalize();
245
247 externalCollDataVec,
248 c,
249 rts,
250 collisionRobotIndices,
251 qvelFiltered,
253 c.objectDistanceThreshold,
254 rState.collDistanceThreshold);
255 }
256 }
257
258 /// --------------------------------- main rt-loop ------------------------------------------
259
260 void
263 RecoveryState& rStateSelfColl,
264 RecoveryState& rStateObjColl,
265 const DistanceResults& collisionPairs,
266 const DistanceResults& externalCollisionPairs,
267 const CollisionRobotIndices& collisionRobotIndices,
268 DynamicsModel& dynamicsModel,
269 float torqueLimit,
270 float jointVelLimit,
271 TSCtrlRtStatus& rts)
272 {
273 /// run in rt thread
274 /// ----------------------------- inertia calculations --------------------------------------------------
275 dynamicsModel.getInertiaMatrix(rts.jointPosition.cast<double>(), rtStatus.inertia);
276 rts.inertia = rtStatus.inertia;
277
278 // rtStatus.inertiaInverse = rtStatus.inertia.cast<float>().inverse();
279 // inertia is positive definite matrix
280 rtStatus.inertiaInverse = rtStatus.inertia.cast<float>().llt().solve(getIdentityMat());
281
282 /// ----------------------------- safety constraints --------------------------------------------------
283 if (c.enableSelfCollisionAvoidance)
284 {
285 // calculation of self-collision avoidance torque
286 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
288 rtStatus,
289 rStateSelfColl,
290 collisionPairs,
291 collisionRobotIndices,
292 rts.qvelFiltered,
293 rts.deltaT);
294 rtStatus.collisionTorqueTime =
295 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
296 }
297 if (c.enableObjectCollisionAvoidance)
298 {
299 // calculation of external collision avoidance torque
300 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
302 rtStatus,
303 rStateObjColl,
304 externalCollisionPairs,
305 collisionRobotIndices,
306 rts.qvelFiltered,
307 rts.deltaT);
308 rtStatus.collisionTorqueTime +=
309 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
310 }
311 if (c.enableJointLimitAvoidance)
312 {
313 // calculation of joint limit avoidance torque
314 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
316 rtStatus.jointLimitTorqueTime =
317 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
318 }
319
320 if (!c.samePriority)
321 {
322 if (c.enableSelfCollisionAvoidance)
323 {
324 // calculation of null space matrix for self-collision avoidance
325 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
327 rtStatus.selfCollNullspaceTime =
328 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
329 }
330 if (c.enableObjectCollisionAvoidance)
331 {
332 // calculation of null space matrix for external collision avoidance
333 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
335 rtStatus.objectCollNullspaceTime =
336 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
337 }
338 if (c.enableJointLimitAvoidance)
339 {
340 // calculation of null space matrix for joint limit avoidance
341 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
343 rtStatus.jointLimitNullspaceTime =
344 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
345 }
346 }
348
349 /// --------------------------- apply EMA low pass filter -----------------------------------------------
350 if (c.filterSafetyValues)
351 {
352 /// filter safety constraint values using EMA low pass filter
353 for (int i = 0; i < rtStatus.selfCollisionJointTorque.size(); ++i)
354 {
355 rtStatus.selfCollisionTorqueFiltered(i) =
356 (1 - c.safetyValFilter) * rtStatus.selfCollisionTorqueFiltered(i) +
357 c.safetyValFilter * rtStatus.selfCollisionJointTorque(i);
358 }
359 for (int i = 0; i < rtStatus.objectCollisionJointTorque.size(); ++i)
360 {
362 (1 - c.safetyValFilter) * rtStatus.objectCollisionTorqueFiltered(i) +
363 c.safetyValFilter * rtStatus.objectCollisionJointTorque(i);
364 }
365 for (int i = 0; i < rtStatus.jointLimitJointTorque.size(); ++i)
366 {
367 rtStatus.jointLimitTorqueFiltered(i) =
368 (1 - c.safetyValFilter) * rtStatus.jointLimitTorqueFiltered(i) +
369 c.safetyValFilter * rtStatus.jointLimitJointTorque(i);
370 }
371
372 for (int i = 0; i < rtStatus.selfCollNullSpace.diagonalSize(); ++i)
373 {
374 // the computed values are only on the diagonal, so only these need to be filtered
375 rtStatus.selfCollNullSpaceFiltered(i, i) =
376 (1 - c.safetyValFilter) * rtStatus.selfCollNullSpaceFiltered(i, i) +
377 c.safetyValFilter * rtStatus.selfCollNullSpace(i, i);
378 }
379 for (int i = 0; i < rtStatus.objectCollNullSpace.diagonalSize(); ++i)
380 {
381 // the computed values are only on the diagonal, so only these need to be filtered
382 rtStatus.objectCollNullSpaceFiltered(i, i) =
383 (1 - c.safetyValFilter) * rtStatus.objectCollNullSpaceFiltered(i, i) +
384 c.safetyValFilter * rtStatus.objectCollNullSpace(i, i);
385 }
386 for (int i = 0; i < rtStatus.jointLimNullSpace.diagonalSize(); ++i)
387 {
388 // the computed values are only on the diagonal, so only these need to be filtered
389 rtStatus.jointLimNullSpaceFiltered(i, i) =
390 (1 - c.safetyValFilter) * rtStatus.jointLimNullSpaceFiltered(i, i) +
391 c.safetyValFilter * rtStatus.jointLimNullSpace(i, i);
392 }
393 /// assign filtered values
398
401 }
402
404 /// ----------------------------- hierarchical control --------------------------------------------------
405 /// The following control hierarchies are considered:
406 ///
407 /// there are 4 components generating torque:
408 /// - SelfCollisionAvoidance
409 /// - ObjectCollisionAvoidance
410 /// - JointLimitAvoidance
411 /// - Impedance
412 ///
413 /// For each of the enabled components a priority is loaded from the config.
414 /// The impedance component is always enabled.
415 ///
416 /// The components are processed in descending order from
417 /// low priority (high priority value) ===> high priority (low priority value)
418 ///
419 /// If two components a and b have the same priority value their torques are added and
420 /// their null spaces combined:
421 /// torque_combined = torque_a + torque_b
422 /// null_space_combined = null_space_a * null_space_b
423 ///
424 /// The torques of two component groups a and b (with a representing all components with a higher priority value
425 /// than priority_b and b representing all components with a priority value of priority_b) are calculated like this:
426 /// torque_combined = torque_b + (null_space_b * torque_a)
427 ///
428 /// Iteratively all torques are combined this way.
429
430 // ARMARX_INFO << VAROUT(c.samePriority);
431 controllerHierarchy.clear();
432
433 if (c.enableSelfCollisionAvoidance)
434 {
435 if (rtStatus.selfColAdmInterface.active)
436 {
437 rtStatus.selfColAdmInterface.run(
438 rtStatus.selfCollisionJointTorque, jointVelLimit, rts);
439 controllerHierarchy.emplace_back(c.selfCollisionAvoidancePriority,
440 std::ref(rtStatus.selfColAdmInterface.jointVel),
441 std::ref(rtStatus.selfCollNullSpace));
442 }
443 else
444 {
445 controllerHierarchy.emplace_back(c.selfCollisionAvoidancePriority,
446 std::ref(rtStatus.selfCollisionJointTorque),
447 std::ref(rtStatus.selfCollNullSpace));
448 }
449 }
450 if (c.enableObjectCollisionAvoidance)
451 {
452 if (rtStatus.objColAdmInterface.active)
453 {
454 rtStatus.objColAdmInterface.run(
455 rtStatus.objectCollisionJointTorque, jointVelLimit, rts);
456 controllerHierarchy.emplace_back(c.objectCollisionAvoidancePriority,
457 std::ref(rtStatus.objColAdmInterface.jointVel),
458 std::ref(rtStatus.objectCollNullSpace));
459 }
460 else
461 {
462 controllerHierarchy.emplace_back(c.objectCollisionAvoidancePriority,
463 std::ref(rtStatus.objectCollisionJointTorque),
464 std::ref(rtStatus.objectCollNullSpace));
465 }
466 }
467 if (c.enableJointLimitAvoidance)
468 {
469 if (rtStatus.jointLimAdmInterface.active)
470 {
471 rtStatus.jointLimAdmInterface.run(
472 rtStatus.jointLimitJointTorque, jointVelLimit, rts);
473 controllerHierarchy.emplace_back(c.jointLimitAvoidancePriority,
474 std::ref(rtStatus.jointLimAdmInterface.jointVel),
475 std::ref(rtStatus.jointLimNullSpace));
476 }
477 else
478 {
479 controllerHierarchy.emplace_back(c.jointLimitAvoidancePriority,
480 std::ref(rtStatus.jointLimitJointTorque),
481 std::ref(rtStatus.jointLimNullSpace));
482 }
483 }
484
485 // TODO find a better way to check velocity mode
486 if (rtStatus.selfColAdmInterface.active)
487 {
488 controllerHierarchy.emplace_back(c.impedancePriority,
489 std::ref(rts.desiredJointVelocity),
490 std::ref(rtStatus.impedanceNullSpace));
491 }
492 else
493 {
494 controllerHierarchy.emplace_back(c.impedancePriority,
495 std::ref(rts.desiredJointTorque),
496 std::ref(rtStatus.impedanceNullSpace));
497 }
498
499 // sort inplace according to priority
500 sortHierarchy();
501
502
503 uint32_t index = 0;
504
505 // TODO rename the finalTorque ... variables
506 rtStatus.finalTorque.setZero();
507
508 while (index < controllerHierarchy.size())
509 {
510 auto& [priority, torque, nullspace] = controllerHierarchy[index];
511 rtStatus.nullSpaceAcc = nullspace.get();
512 rtStatus.torqueAcc = torque.get();
513
514 index++;
515 /// If two tasks have the exact same priority, combine them
516 while ((index < controllerHierarchy.size()) &&
517 (std::get<0>(controllerHierarchy[index]) == priority))
518 {
519 rtStatus.nullSpaceAcc *= std::get<2>(controllerHierarchy[index]).get();
520 rtStatus.torqueAcc += std::get<1>(controllerHierarchy[index]).get();
521 index++;
522 }
523
524 /// Otherwise, do the nullspace projection
525 rtStatus.finalTorque =
526 (rtStatus.torqueAcc + (rtStatus.nullSpaceAcc * rtStatus.finalTorque));
527 }
528
529 if (rtStatus.selfColAdmInterface.active)
530 {
531 rts.desiredJointVelocity = rtStatus.finalTorque;
532 /// ----------------------------- write torque target --------------------------------------------------
533 for (int i = 0; i < rts.desiredJointVelocity.rows(); ++i)
534 {
535 rts.desiredJointVelocity(i) =
536 std::clamp(rts.desiredJointVelocity(i), -jointVelLimit, jointVelLimit);
537 }
538 // rtStatus.desiredJointVel = rtStatus.finalTorque;
539 // /// ----------------------------- write torque target --------------------------------------------------
540 // for (int i = 0; i < rtStatus.desiredJointVel.rows(); ++i)
541 // {
542 // rtStatus.desiredJointVel(i) =
543 // std::clamp(rtStatus.desiredJointVel(i), -jointVelLimit, jointVelLimit);
544 // }
545 }
546 else
547 {
548 rts.desiredJointTorque = rtStatus.finalTorque;
549 /// ----------------------------- write torque target --------------------------------------------------
550 for (int i = 0; i < rts.desiredJointTorque.rows(); ++i)
551 {
552 rts.desiredJointTorque(i) =
553 std::clamp(rts.desiredJointTorque(i), -torqueLimit, torqueLimit);
554 }
555 // rtStatus.desiredJointTorques = rtStatus.finalTorque;
556 // /// ----------------------------- write torque target --------------------------------------------------
557 // for (int i = 0; i < rtStatus.desiredJointTorques.rows(); ++i)
558 // {
559 // rtStatus.desiredJointTorques(i) =
560 // std::clamp(rtStatus.desiredJointTorques(i), -torqueLimit, torqueLimit);
561 // }
562 }
564
565 /// ------------------------- write impedance forces to buffer -----------------------------------------
566 // this section is purely for visualization purposes in the viewer
567 // rtStatus.dirErrorImp = rtStatus.poseErrorImp.head<3>().normalized();
568 // rtStatus.totalForceImpedance = rtStatus.forceImpedance.head<3>().norm();
569 // rtStatus.projForceImpedance = rtStatus.jtpinv * rtStatus.projImpedanceJointTorque;
570 // rtStatus.projTotalForceImpedance = rtStatus.projForceImpedance.head<3>().norm();
571 // rtStatus.impForceRatio = rtStatus.projTotalForceImpedance / rtStatus.totalForceImpedance;
572 // rtStatus.impTorqueRatio =
573 // rtStatus.projImpedanceJointTorque.norm() / rtStatus.impedanceJointTorque.norm();
574 }
575
576 void
577 ObjectCollisionAvoidanceController::sortHierarchy()
578 {
579 /// This sorts the controllerHierarchy vector in Descending Order based on the
580 /// priority value (integer). This means controllers with Lower Priority are
581 /// placed at the beginning
582 ///
583 for (size_t i = 1; i < controllerHierarchy.size(); i++)
584 {
585 auto element = controllerHierarchy[i];
586 const unsigned int priority = std::get<0>(element);
587
588 int j = i - 1;
589 while (j >= 0 && std::get<0>(controllerHierarchy[j]) < priority)
590 {
591 controllerHierarchy[j + 1] = controllerHierarchy[j];
592 j--;
593 }
594 controllerHierarchy[j + 1] = element;
595 }
596 }
597
598} // namespace armarx::control::common::control_law
#define ARMARX_RT_LOGF_WARN(...)
uint8_t index
constexpr T c
internal status of the controller, containing intermediate variables, mutable targets
Eigen::MatrixXf selfCollNullSpace
intermediate null space matrices ((self-)collision and joint limit avoidance)
void calculateJointLimitNullspace(const Config &c, RtStatusForSafetyStrategy &rtStatus, const Eigen::VectorXf &qpos) const
::simox::control::environment::DistanceResult DistanceResult
void calculateJointLimitTorque(const Config &c, RtStatusForSafetyStrategy &rtStatus, const Eigen::VectorXf &qpos, const Eigen::VectorXf &qvelFiltered) const
void calculateSelfCollisionNullspace(const Config &c, RtStatusForSafetyStrategy &rtStatus) const
caclulate null spaces
CollisionAvoidanceController(const simox::control::robot::NodeSetInterface *nodeSet)
std::unordered_map< unsigned int, const simox::control::robot::NodeInterface * > CollisionRobotIndices
void calculateCollisionTorque(CollisionData &collDataVec, const Config &c, RtStatusForSafetyStrategy &rts, const CollisionRobotIndices &collisionRobotIndices, const Eigen::VectorXf &qvelFiltered, Eigen::VectorXf &jointTorque, float distanceThresholdRaw, float distanceThreshold) const
void calculateSelfCollisionTorque(const Config &c, RtStatusForSafetyStrategy &rtStatus, RecoveryState &rState, const DistanceResults &collisionPairs, const CollisionRobotIndices &collisionRobotIndices, const Eigen::VectorXf &qvelFiltered, double deltaT) const
avoidance torque methods
void calculateObjectCollisionNullspace(const Config &c, RtStatusForSafetyStrategy &rtStatus) const
ObjectCollisionAvoidanceController(const simox::control::robot::NodeSetInterface *nodeSet)
common::control_law::arondto::ObjectCollisionAvoidanceConfig Config
void run(const Config &c, RtStatusForSafetyStrategy &robotStatus, RecoveryState &rStateSelfColl, RecoveryState &rStateObjColl, const DistanceResults &collisionPairs, const DistanceResults &externalCollisionPairs, const CollisionRobotIndices &collisionRobotIndices, DynamicsModel &dynamicsModel, float torqueLimit, float jointVelLimit, TSCtrlRtStatus &rts)
------------------------------— main rt-loop ---------------------------------------—
void calculateExternalCollisionTorque(const Config &c, RtStatusForSafetyStrategy &rts, RecoveryState &rState, const DistanceResults &externalCollisionPairs, const CollisionRobotIndices &collisionRobotIndices, const Eigen::VectorXf &qvelFiltered, double deltaT) const
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
#define ARMARX_CHECK_NONNEGATIVE(number)
Check whether number is nonnegative (>= 0).
#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_WARNING
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:193
void run(Eigen::VectorXf &jointTorque, float jointVelLimit, const TSCtrlRtStatus &rts)
void update(const Config &c, RtStatusForSafetyStrategy &rtStatus, double deltaT)
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
#define ARMARX_TRACE_LITE
Definition trace.h:98