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::ObjectCollisionAvoidanceVelConfig&
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: "
81 if (
c.onlyLimitCollDirection)
87 if ((active.projectedJacT(i) < 0.0f and
109 const Eigen::VectorXf& qvelFiltered,
125 if (externalCollisionPairs.empty())
133 if (!
c.enableSelfCollisionAvoidance)
149 if (
c.enableCollisionRecoveryOnStartup and (thresholdInit <
c.recoveryDistanceElapseMeter))
151 thresholdInit =
c.objectDistanceThreshold;
152 for (
const DistanceResult& collisionPair : externalCollisionPairs)
154 float minDist =
static_cast<float>(collisionPair.minDistance);
155 if (minDist < thresholdInit)
157 thresholdInit = std::max(minDist, 0.0f);
161 std::min(
c.objectDistanceThreshold, thresholdInit +
c.recoveryDistanceElapseMeter);
168 for (
const DistanceResult& collisionPair : externalCollisionPairs)
174 "CollisionAvoidanceVelController",
175 "Number of active collision pairs exceeds the allocated memory");
185 if (collisionRobotIndices.count(collisionPair.node1) == 0)
194 externalCollDataVec.minDistance =
static_cast<float>(collisionPair.minDistance);
196 externalCollDataVec.node1 = collisionPair.node1;
197 externalCollDataVec.node2 = collisionPair.node2;
198 externalCollDataVec.point1 = collisionPair.point1->cast<
float>();
199 externalCollDataVec.point2 = collisionPair.point2->cast<
float>();
200 auto node1Type = collisionPair.node1Type;
204 externalCollDataVec.direction = externalCollDataVec.point1 - externalCollDataVec.point2;
206 if (externalCollDataVec.minDistance < 0.0f)
208 externalCollDataVec.minDistance = 0.0f;
211 if (externalCollDataVec.point1.isApprox(externalCollDataVec.point2, 1e-8) and
212 collisionPair.normalVec != std::nullopt)
225 if (node1Type == hpp::fcl::NODE_TYPE::GEOM_SPHERE)
227 externalCollDataVec.direction =
228 -1.0 * collisionPair.normalVec->cast<
float>();
232 externalCollDataVec.direction = collisionPair.normalVec->cast<
float>();
237 externalCollDataVec.direction *= -1.0f;
241 externalCollDataVec.direction.normalize();
247 collisionRobotIndices,
265 const Eigen::VectorXf& qpos,
266 const Eigen::VectorXf& qvelFiltered,
273 dynamicsModel.getInertiaMatrix(qpos.cast<
double>(), rtStatus.
inertia);
280 if (
c.enableSelfCollisionAvoidance)
284 c, rtStatus, rStateSelfColl, collisionPairs, collisionRobotIndices, qvelFiltered, deltaT);
286 if (
c.enableObjectCollisionAvoidance)
290 c, rtStatus, rStateObjColl, externalCollisionPairs, collisionRobotIndices, qvelFiltered, deltaT);
292 if (
c.enableJointLimitAvoidance)
300 if (
c.enableSelfCollisionAvoidance)
305 if (
c.enableObjectCollisionAvoidance)
310 if (
c.enableJointLimitAvoidance)
319 if (
c.filterSafetyValues)
398 controllerHierarchy.clear();
400 if (
c.enableSelfCollisionAvoidance)
402 controllerHierarchy.emplace_back(
c.selfCollisionAvoidancePriority,
406 if (
c.enableObjectCollisionAvoidance)
408 controllerHierarchy.emplace_back(
c.objectCollisionAvoidancePriority,
412 if (
c.enableJointLimitAvoidance)
414 controllerHierarchy.emplace_back(
c.jointLimitAvoidancePriority,
418 controllerHierarchy.emplace_back(
c.impedancePriority,
430 while (
index < controllerHierarchy.size())
432 auto& [priority, torque, nullspace] = controllerHierarchy[
index];
437 while ((
index < controllerHierarchy.size()) &&
438 (std::get<0>(controllerHierarchy[
index]) == priority))
441 rtStatus.
torqueAcc += std::get<1>(controllerHierarchy[
index]).get();
467 std::clamp(rtStatus.
desiredJointVel(i), -velocityLimit, velocityLimit);
472 ObjectCollisionAvoidanceVelController::sortHierarchy()
474 for (
size_t i = 1; i < controllerHierarchy.size(); i++)
476 auto element = controllerHierarchy[i];
477 const unsigned int priority = std::get<0>(element);
480 while (j >= 0 && std::get<0>(controllerHierarchy[j]) < priority)
482 controllerHierarchy[j + 1] = controllerHierarchy[j];
485 controllerHierarchy[j + 1] = element;
#define ARMARX_RT_LOGF_WARN(...)
void update(const Config &c, RtStatusForSafetyStrategy &rtStatus, double deltaT)
float collDistanceThreshold
float collDistanceThresholdInit
internal status of the controller, containing intermediate variables, mutable targets
Eigen::MatrixXf jointLimNullSpace
Eigen::VectorXf finalTorque
Eigen::Vector4f objectCollisionNullSpaceWeights
unsigned int objectCollDataIndex
Eigen::VectorXf torqueAcc
Eigen::MatrixXf jointLimNullSpaceFiltered
Eigen::MatrixXf objectCollTempNullSpaceMatrix
Eigen::VectorXf jointLimitJointVel
Eigen::VectorXf jointLimitVelFiltered
Eigen::MatrixXf objectCollNullSpace
Eigen::VectorXf objectCollisionVelFiltered
Eigen::MatrixXf selfCollNullSpace
intermediate null space matrices ((self-)collision and joint limit avoidance)
Eigen::MatrixXf objectCollNullSpaceFiltered
float objectCollK1
object collision avoidance null space intermediate results
Eigen::VectorXf objectCollNormalizedJacT
Eigen::MatrixXf selfCollNullSpaceFiltered
Eigen::VectorXf desiredJointVel
targets
Eigen::VectorXf selfCollisionJointVel
unsigned int activeCollPairsNum
std::vector< CollisionData > collDataVec
distance results
Eigen::MatrixXd inertia
others
Eigen::MatrixXf inertiaInverse
Eigen::VectorXf trajFollowJointVel
intermediate torque results
Eigen::VectorXf selfCollisionVelFiltered
Eigen::VectorXf objectCollisionJointVel
Eigen::MatrixXf nullSpaceAcc
for generating torques according to priority
Eigen::MatrixXf impedanceNullSpace
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
simox::control::dynamics::RBDLModel DynamicsModel
const simox::control::robot::NodeSetInterface * nodeSet
::simox::control::environment::DistanceResult DistanceResult
std::size_t numNodes() 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::vector< DistanceResult > DistanceResults
std::unordered_map< unsigned int, const simox::control::robot::NodeInterface * > CollisionRobotIndices
CollisionAvoidanceVelController(const simox::control::robot::NodeSetInterface *nodeSet)
void calculateCollisionJointVel(CollisionData &collDataVec, const Config &c, RtStatusForSafetyStrategy &rts, const CollisionRobotIndices &collisionRobotIndices, const Eigen::VectorXf &qvelFiltered, Eigen::VectorXf &jointTorque, float distanceThreshold) const
void calculateObjectCollisionNullspace(const Config &c, RtStatusForSafetyStrategy &rtStatus) const
ObjectCollisionAvoidanceVelController(const simox::control::robot::NodeSetInterface *nodeSet)
void run(const Config &c, RtStatusForSafetyStrategy &robotStatus, RecoveryState &rStateSelfColl, RecoveryState &rStateObjColl, const DistanceResults &collisionPairs, const DistanceResults &externalCollisionPairs, const CollisionRobotIndices &collisionRobotIndices, DynamicsModel &dynamicsModel, const Eigen::VectorXf &qpos, const Eigen::VectorXf &qvelFiltered, float velocityLimit, double deltaT)
------------------------------— main rt-loop ---------------------------------------—
common::control_law::arondto::ObjectCollisionAvoidanceVelConfig Config
void calculateExternalCollisionVel(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.
#define ARMARX_TRACE_LITE