3#include <boost/unordered/detail/implementation.hpp>
5#include <simox/control/dynamics/RBDLModel.h>
12 const simox::control::robot::NodeSetInterface* nodeSet) :
15 controllerHierarchy.reserve(4);
20 const common::control_law::arondto::ObjectCollisionAvoidanceConfig&
c,
41 if (active.minDistance <
c.objectCollActivatorZ1)
46 else if (
c.objectCollActivatorZ1 <= active.minDistance &&
47 active.minDistance <=
c.objectCollActivatorZ2)
51 rtStatus.
objectCollK1 * std::pow(active.minDistance, 3) +
52 rtStatus.
objectCollK2 * std::pow(active.minDistance, 2) +
56 ARMARX_WARNING <<
"desired null space value should not be higher than 1.0, was "
58 <<
", in collision null space calulation, weights: "
82 if (
c.onlyLimitCollDirection)
89 if ((active.projectedJacT(i) < 0.0f and
91 (active.projectedJacT(i) > 0.0f and
112 const Eigen::VectorXf& qvelFiltered,
128 if (externalCollisionPairs.empty())
136 if (!
c.enableSelfCollisionAvoidance)
152 if (
c.enableCollisionRecoveryOnStartup and (thresholdInit <
c.recoveryDistanceElapseMeter))
154 thresholdInit =
c.objectDistanceThreshold;
155 for (
const DistanceResult& collisionPair : externalCollisionPairs)
157 float minDist =
static_cast<float>(collisionPair.minDistance);
158 if (minDist < thresholdInit)
160 thresholdInit = std::max(minDist, 0.0f);
164 std::min(
c.objectDistanceThreshold, thresholdInit +
c.recoveryDistanceElapseMeter);
171 for (
const DistanceResult& collisionPair : externalCollisionPairs)
177 "CollisionAvoidanceController",
178 "Number of active collision pairs exceeds the allocated memory");
188 if (collisionRobotIndices.count(collisionPair.node1) == 0)
197 externalCollDataVec.minDistance =
static_cast<float>(collisionPair.minDistance);
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;
207 externalCollDataVec.direction = externalCollDataVec.point1 - externalCollDataVec.point2;
209 if (externalCollDataVec.minDistance < 0.0f)
211 externalCollDataVec.minDistance = 0.0f;
214 if (externalCollDataVec.point1.isApprox(externalCollDataVec.point2, 1e-8) and
215 collisionPair.normalVec != std::nullopt)
228 if (node1Type == hpp::fcl::NODE_TYPE::GEOM_SPHERE)
230 externalCollDataVec.direction =
231 -1.0 * collisionPair.normalVec->cast<
float>();
235 externalCollDataVec.direction = collisionPair.normalVec->cast<
float>();
240 externalCollDataVec.direction *= -1.0f;
244 externalCollDataVec.direction.normalize();
250 collisionRobotIndices,
253 c.objectDistanceThreshold,
283 if (
c.enableSelfCollisionAvoidance)
286 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
291 collisionRobotIndices,
295 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
297 if (
c.enableObjectCollisionAvoidance)
300 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
304 externalCollisionPairs,
305 collisionRobotIndices,
309 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
311 if (
c.enableJointLimitAvoidance)
314 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
317 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
322 if (
c.enableSelfCollisionAvoidance)
325 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
328 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
330 if (
c.enableObjectCollisionAvoidance)
333 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
336 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
338 if (
c.enableJointLimitAvoidance)
341 const double timeMeasure = IceUtil::Time::now().toMicroSecondsDouble();
344 IceUtil::Time::now().toMicroSecondsDouble() - timeMeasure;
350 if (
c.filterSafetyValues)
431 controllerHierarchy.clear();
433 if (
c.enableSelfCollisionAvoidance)
439 controllerHierarchy.emplace_back(
c.selfCollisionAvoidancePriority,
445 controllerHierarchy.emplace_back(
c.selfCollisionAvoidancePriority,
450 if (
c.enableObjectCollisionAvoidance)
456 controllerHierarchy.emplace_back(
c.objectCollisionAvoidancePriority,
462 controllerHierarchy.emplace_back(
c.objectCollisionAvoidancePriority,
467 if (
c.enableJointLimitAvoidance)
473 controllerHierarchy.emplace_back(
c.jointLimitAvoidancePriority,
479 controllerHierarchy.emplace_back(
c.jointLimitAvoidancePriority,
488 controllerHierarchy.emplace_back(
c.impedancePriority,
494 controllerHierarchy.emplace_back(
c.impedancePriority,
508 while (
index < controllerHierarchy.size())
510 auto& [priority, torque, nullspace] = controllerHierarchy[
index];
516 while ((
index < controllerHierarchy.size()) &&
517 (std::get<0>(controllerHierarchy[
index]) == priority))
520 rtStatus.
torqueAcc += std::get<1>(controllerHierarchy[
index]).get();
577 ObjectCollisionAvoidanceController::sortHierarchy()
583 for (
size_t i = 1; i < controllerHierarchy.size(); i++)
585 auto element = controllerHierarchy[i];
586 const unsigned int priority = std::get<0>(element);
589 while (j >= 0 && std::get<0>(controllerHierarchy[j]) < priority)
591 controllerHierarchy[j + 1] = controllerHierarchy[j];
594 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