3#include <simox/control/dynamics/RBDLModel.h>
10 const simox::control::robot::NodeSetInterface*
nodeSet) :
13 controllerHierarchy.reserve(4);
18 const common::control_law::arondto::ObjectCollisionAvoidanceVelConfig&
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: "
79 if (
c.onlyLimitCollDirection)
85 if ((active.projectedJacT(i) < 0.0f and
107 const Eigen::VectorXf& qvelFiltered,
123 if (externalCollisionPairs.empty())
131 if (!
c.enableSelfCollisionAvoidance)
147 if (
c.enableCollisionRecoveryOnStartup and (thresholdInit <
c.recoveryDistanceElapseMeter))
149 thresholdInit =
c.objectDistanceThreshold;
150 for (
const DistanceResult& collisionPair : externalCollisionPairs)
152 float minDist =
static_cast<float>(collisionPair.minDistance);
153 if (minDist < thresholdInit)
155 thresholdInit = std::max(minDist, 0.0f);
159 std::min(
c.objectDistanceThreshold, thresholdInit +
c.recoveryDistanceElapseMeter);
166 for (
const DistanceResult& collisionPair : externalCollisionPairs)
172 "CollisionAvoidanceVelController",
173 "Number of active collision pairs exceeds the allocated memory");
183 if (collisionRobotIndices.count(collisionPair.node1) == 0)
192 externalCollDataVec.minDistance =
static_cast<float>(collisionPair.minDistance);
194 externalCollDataVec.node1 = collisionPair.node1;
195 externalCollDataVec.node2 = collisionPair.node2;
196 externalCollDataVec.point1 = collisionPair.point1->cast<
float>();
197 externalCollDataVec.point2 = collisionPair.point2->cast<
float>();
198 auto node1Type = collisionPair.node1Type;
202 externalCollDataVec.direction = externalCollDataVec.point1 - externalCollDataVec.point2;
204 if (externalCollDataVec.minDistance < 0.0f)
206 externalCollDataVec.minDistance = 0.0f;
209 if (externalCollDataVec.point1.isApprox(externalCollDataVec.point2, 1e-8) and
210 collisionPair.normalVec != std::nullopt)
223 if (node1Type == hpp::fcl::NODE_TYPE::GEOM_SPHERE)
225 externalCollDataVec.direction =
226 -1.0 * collisionPair.normalVec->cast<
float>();
230 externalCollDataVec.direction = collisionPair.normalVec->cast<
float>();
235 externalCollDataVec.direction *= -1.0f;
239 externalCollDataVec.direction.normalize();
245 collisionRobotIndices,
263 const Eigen::VectorXf& qpos,
264 const Eigen::VectorXf& qvelFiltered,
271 dynamicsModel.getInertiaMatrix(qpos.cast<
double>(), rtStatus.
inertia);
278 if (
c.enableSelfCollisionAvoidance)
282 c, rtStatus, rStateSelfColl, collisionPairs, collisionRobotIndices, qvelFiltered, deltaT);
284 if (
c.enableObjectCollisionAvoidance)
288 c, rtStatus, rStateObjColl, externalCollisionPairs, collisionRobotIndices, qvelFiltered, deltaT);
290 if (
c.enableJointLimitAvoidance)
298 if (
c.enableSelfCollisionAvoidance)
303 if (
c.enableObjectCollisionAvoidance)
308 if (
c.enableJointLimitAvoidance)
317 if (
c.filterSafetyValues)
396 controllerHierarchy.clear();
398 if (
c.enableSelfCollisionAvoidance)
400 controllerHierarchy.emplace_back(
c.selfCollisionAvoidancePriority,
404 if (
c.enableObjectCollisionAvoidance)
406 controllerHierarchy.emplace_back(
c.objectCollisionAvoidancePriority,
410 if (
c.enableJointLimitAvoidance)
412 controllerHierarchy.emplace_back(
c.jointLimitAvoidancePriority,
416 controllerHierarchy.emplace_back(
c.impedancePriority,
428 while (
index < controllerHierarchy.size())
430 auto& [priority, torque, nullspace] = controllerHierarchy[
index];
435 while ((
index < controllerHierarchy.size()) &&
436 (std::get<0>(controllerHierarchy[
index]) == priority))
439 rtStatus.
torqueAcc += std::get<1>(controllerHierarchy[
index]).get();
465 std::clamp(rtStatus.
desiredJointVel(i), -velocityLimit, velocityLimit);
470 ObjectCollisionAvoidanceVelController::sortHierarchy()
472 for (
size_t i = 1; i < controllerHierarchy.size(); i++)
474 auto element = controllerHierarchy[i];
475 const unsigned int priority = std::get<0>(element);
478 while (j >= 0 && std::get<0>(controllerHierarchy[j]) < priority)
480 controllerHierarchy[j + 1] = controllerHierarchy[j];
483 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