3#include <simox/control/dynamics/RBDLModel.h>
10 const simox::control::robot::NodeSetInterface* nodeSet) :
13 controllerHierarchy.reserve(4);
18 const common::control_law::arondto::ObjectCollisionAvoidanceConfig&
c,
39 if (active.minDistance <
c.objectCollActivatorZ1)
44 else if (
c.objectCollActivatorZ1 <= active.minDistance &&
45 active.minDistance <=
c.objectCollActivatorZ2)
49 rtStatus.
objectCollK1 * std::pow(active.minDistance, 3) +
50 rtStatus.
objectCollK2 * std::pow(active.minDistance, 2) +
54 ARMARX_WARNING <<
"desired null space value should not be higher than 1.0, was "
56 <<
", in collision null space calulation, weights: "
80 if (
c.onlyLimitCollDirection)
87 if ((active.projectedJacT(i) < 0.0f and
89 (active.projectedJacT(i) > 0.0f and
110 const Eigen::VectorXf& qvelFiltered,
126 if (externalCollisionPairs.empty())
134 if (!
c.enableSelfCollisionAvoidance)
150 if (
c.enableCollisionRecoveryOnStartup and (thresholdInit <
c.recoveryDistanceElapseMeter))
152 thresholdInit =
c.objectDistanceThreshold;
153 for (
const DistanceResult& collisionPair : externalCollisionPairs)
155 float minDist =
static_cast<float>(collisionPair.minDistance);
156 if (minDist < thresholdInit)
158 thresholdInit = std::max(minDist, 0.0f);
162 std::min(
c.objectDistanceThreshold, thresholdInit +
c.recoveryDistanceElapseMeter);
169 for (
const DistanceResult& collisionPair : externalCollisionPairs)
175 "CollisionAvoidanceController",
176 "Number of active collision pairs exceeds the allocated memory");
186 if (collisionRobotIndices.count(collisionPair.node1) == 0)
195 externalCollDataVec.minDistance =
static_cast<float>(collisionPair.minDistance);
197 externalCollDataVec.node1 = collisionPair.node1;
198 externalCollDataVec.node2 = collisionPair.node2;
199 externalCollDataVec.point1 = collisionPair.point1->cast<
float>();
200 externalCollDataVec.point2 = collisionPair.point2->cast<
float>();
201 auto node1Type = collisionPair.node1Type;
205 externalCollDataVec.direction = externalCollDataVec.point1 - externalCollDataVec.point2;
207 if (externalCollDataVec.minDistance < 0.0f)
209 externalCollDataVec.minDistance = 0.0f;
212 if (externalCollDataVec.point1.isApprox(externalCollDataVec.point2, 1e-8) and
213 collisionPair.normalVec != std::nullopt)
226 if (node1Type == hpp::fcl::NODE_TYPE::GEOM_SPHERE)
228 externalCollDataVec.direction =
229 -1.0 * collisionPair.normalVec->cast<
float>();
233 externalCollDataVec.direction = collisionPair.normalVec->cast<
float>();
238 externalCollDataVec.direction *= -1.0f;
242 externalCollDataVec.direction.normalize();
248 collisionRobotIndices,
251 c.objectDistanceThreshold,
281 if (
c.enableSelfCollisionAvoidance)
284 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
289 collisionRobotIndices,
293 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
295 if (
c.enableObjectCollisionAvoidance)
298 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
302 externalCollisionPairs,
303 collisionRobotIndices,
307 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
309 if (
c.enableJointLimitAvoidance)
312 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
315 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
320 if (
c.enableSelfCollisionAvoidance)
323 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
326 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
328 if (
c.enableObjectCollisionAvoidance)
331 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
334 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
336 if (
c.enableJointLimitAvoidance)
339 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
342 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
348 if (
c.filterSafetyValues)
429 controllerHierarchy.clear();
431 if (
c.enableSelfCollisionAvoidance)
437 controllerHierarchy.emplace_back(
c.selfCollisionAvoidancePriority,
443 controllerHierarchy.emplace_back(
c.selfCollisionAvoidancePriority,
448 if (
c.enableObjectCollisionAvoidance)
454 controllerHierarchy.emplace_back(
c.objectCollisionAvoidancePriority,
460 controllerHierarchy.emplace_back(
c.objectCollisionAvoidancePriority,
465 if (
c.enableJointLimitAvoidance)
471 controllerHierarchy.emplace_back(
c.jointLimitAvoidancePriority,
477 controllerHierarchy.emplace_back(
c.jointLimitAvoidancePriority,
486 controllerHierarchy.emplace_back(
c.impedancePriority,
492 controllerHierarchy.emplace_back(
c.impedancePriority,
506 while (
index < controllerHierarchy.size())
508 auto& [priority, torque, nullspace] = controllerHierarchy[
index];
514 while ((
index < controllerHierarchy.size()) &&
515 (std::get<0>(controllerHierarchy[
index]) == priority))
518 rtStatus.
torqueAcc += std::get<1>(controllerHierarchy[
index]).get();
575 ObjectCollisionAvoidanceController::sortHierarchy()
581 for (
size_t i = 1; i < controllerHierarchy.size(); i++)
583 auto element = controllerHierarchy[i];
584 const unsigned int priority = std::get<0>(element);
587 while (j >= 0 && std::get<0>(controllerHierarchy[j]) < priority)
589 controllerHierarchy[j + 1] = controllerHierarchy[j];
592 controllerHierarchy[j + 1] = element;
#define ARMARX_RT_LOGF_WARN(...)
internal status of the controller, containing intermediate variables, mutable targets
Eigen::VectorXf objectCollisionTorqueFiltered
Eigen::MatrixXf jointLimNullSpace
AdmittanceInterface jointLimAdmInterface
double selfCollNullspaceTime
double collisionTorqueTime
AdmittanceInterface objColAdmInterface
Eigen::VectorXf finalTorque
double jointLimitNullspaceTime
Eigen::Vector4f objectCollisionNullSpaceWeights
double jointLimitTorqueTime
AdmittanceInterface selfColAdmInterface
unsigned int objectCollDataIndex
Eigen::VectorXf torqueAcc
Eigen::VectorXf jointLimitJointTorque
double objectCollNullspaceTime
Eigen::MatrixXf jointLimNullSpaceFiltered
Eigen::MatrixXf objectCollTempNullSpaceMatrix
Eigen::VectorXf impedanceJointTorque
intermediate torque results
Eigen::MatrixXf objectCollNullSpace
Eigen::MatrixXf selfCollNullSpace
intermediate null space matrices ((self-)collision and joint limit avoidance)
Eigen::MatrixXf objectCollNullSpaceFiltered
Eigen::VectorXf selfCollisionTorqueFiltered
float objectCollK1
object collision avoidance null space intermediate results
Eigen::VectorXf objectCollNormalizedJacT
Eigen::MatrixXf selfCollNullSpaceFiltered
Eigen::VectorXf selfCollisionJointTorque
unsigned int activeCollPairsNum
std::vector< CollisionData > collDataVec
distance results
Eigen::MatrixXd inertia
others
Eigen::VectorXf jointLimitTorqueFiltered
Eigen::MatrixXf inertiaInverse
Eigen::VectorXf objectCollisionJointTorque
Eigen::MatrixXf nullSpaceAcc
for generating torques according to priority
Eigen::MatrixXf impedanceNullSpace
void calculateJointLimitNullspace(const Config &c, RtStatusForSafetyStrategy &rtStatus, const Eigen::VectorXf &qpos) const
const Eigen::MatrixXf & getIdentityMat() const
simox::control::dynamics::RBDLModel DynamicsModel
::simox::control::environment::DistanceResult DistanceResult
void calculateJointLimitTorque(const Config &c, RtStatusForSafetyStrategy &rtStatus, const Eigen::VectorXf &qpos, const Eigen::VectorXf &qvelFiltered) const
std::size_t numNodes() const
void calculateSelfCollisionNullspace(const Config &c, RtStatusForSafetyStrategy &rtStatus) const
caclulate null spaces
std::vector< DistanceResult > DistanceResults
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.
This file is part of ArmarX.
void run(Eigen::VectorXf &jointTorque, float jointVelLimit, const TSCtrlRtStatus &rts)
void update(const Config &c, RtStatusForSafetyStrategy &rtStatus, double deltaT)
float collDistanceThreshold
float collDistanceThresholdInit
Eigen::VectorXf jointPosition
Eigen::VectorXf desiredJointVelocity
Eigen::VectorXf qvelFiltered
for velocity control
Eigen::VectorXf desiredJointTorque
targets
Eigen::MatrixXd inertia
inertia Note, the inertia variables are only used for collision avoidance controllers,...
#define ARMARX_TRACE_LITE