|
|
#include <armarx/control/common/control_law/ObjectCollisionAvoidance.h>
Inheritance diagram for ObjectCollisionAvoidanceController:Public Types | |
| using | Config = common::control_law::arondto::ObjectCollisionAvoidanceConfig |
Public Types inherited from CollisionAvoidanceController | |
| using | CollisionRobotIndices |
| using | Config = common::control_law::arondto::CollisionAvoidanceConfig |
| using | DistanceResult = ::simox::control::environment::DistanceResult |
| using | DistanceResults = std::vector<DistanceResult> |
| using | DynamicsModel = simox::control::dynamics::RBDLModel |
| using | FTConfig = common::ft::arondto::FTConfig |
| using | SCRobot = simox::control::simox::robot::Robot |
Public Member Functions | |
| void | calculateExternalCollisionTorque (const Config &c, RtStatusForSafetyStrategy &rts, RecoveryState &rState, const DistanceResults &externalCollisionPairs, const CollisionRobotIndices &collisionRobotIndices, const Eigen::VectorXf &qvelFiltered, double deltaT) const |
| void | calculateObjectCollisionNullspace (const Config &c, RtStatusForSafetyStrategy &rtStatus) const |
| ObjectCollisionAvoidanceController (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, float torqueLimit, float jointVelLimit, TSCtrlRtStatus &rts) |
| ------------------------------— main rt-loop ---------------------------------------— | |
Public Member Functions inherited from CollisionAvoidanceController | |
| CollisionAvoidanceController (const simox::control::robot::NodeSetInterface *nodeSet) | |
| const simox::control::robot::NodeSetInterface & | getNodeSet () const |
| std::size_t | numNodes () const |
| void | run (const Config &c, RtStatusForSafetyStrategy &robotStatus, RecoveryState &rStateSelfColl, const DistanceResults &collisionPairs, const CollisionRobotIndices &collisionRobotIndices, DynamicsModel &dynamicsModel, const Eigen::VectorXf &qpos, const Eigen::VectorXf &qvelFiltered, float torqueLimit, double deltaT) |
| ------------------------------— main rt-loop ---------------------------------------— | |
| ~CollisionAvoidanceController () | |
Additional Inherited Members | |
Protected Member Functions inherited from CollisionAvoidanceController | |
| 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 | calculateJointLimitNullspace (const Config &c, RtStatusForSafetyStrategy &rtStatus, const Eigen::VectorXf &qpos) const |
| 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 | |
| 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 | |
| const Eigen::MatrixXf & | getIdentityMat () const |
Definition at line 11 of file ObjectCollisionAvoidance.h.
| using Config = common::control_law::arondto::ObjectCollisionAvoidanceConfig |
Definition at line 16 of file ObjectCollisionAvoidance.h.
| ObjectCollisionAvoidanceController | ( | const simox::control::robot::NodeSetInterface * | nodeSet | ) |
Definition at line 11 of file ObjectCollisionAvoidance.cpp.
Here is the call graph for this function:| void calculateExternalCollisionTorque | ( | const Config & | c, |
| RtStatusForSafetyStrategy & | rts, | ||
| RecoveryState & | rState, | ||
| const DistanceResults & | externalCollisionPairs, | ||
| const CollisionRobotIndices & | collisionRobotIndices, | ||
| const Eigen::VectorXf & | qvelFiltered, | ||
| double | deltaT ) const |
collision avoidance algorithm following the methods in Dietrich et al. (2012):
A. Dietrich, T. Wimbock, A. Albu-Schaffer and G. Hirzinger, "Integration of Reactive, Torque-Based Self-Collision Avoidance Into a Task Hierarchy," in IEEE Transactions on Robotics, vol. 28, no. 6, pp. 1278-1293, Dec. 2012, doi: 10.1109/TRO.2012.2208667.
see: https://ieeexplore.ieee.org/document/6255795
method:
computes the joint torques to avoid collisions -> collisionJointTorque
clear values before new cycle
when collDistanceThresholdInit is smaller than recoveryDistanceElapseMeter (usually means it is zero), we need to initilize it to the smallest collision distance plus a recoveryDistanceElapseMeter.
handling of external collision pairs
only node1 is on the robot
if the points are the same, normalVec comes with a value
Definition at line 106 of file ObjectCollisionAvoidance.cpp.
Here is the call graph for this function:
Here is the caller graph for this function:| void calculateObjectCollisionNullspace | ( | const Config & | c, |
| RtStatusForSafetyStrategy & | rtStatus ) const |
get desired null space value based on proximity to collision
full locking in direction of collision
in transition state
unrestricted movement in direction of collision
normalize projected Jacobian
check, whether impedance joint torque acts against the collision direction
project desired null space in corresponding direction via the Norm-Jacobian
Definition at line 19 of file ObjectCollisionAvoidance.cpp.
Here is the call graph for this function:
Here is the caller graph for this function:| 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 ---------------------------------------—
run in rt thread --------------------------— inertia calculations -----------------------------------------------—
--------------------------— safety constraints -----------------------------------------------—
------------------------— apply EMA low pass filter --------------------------------------------—
filter safety constraint values using EMA low pass filter
assign filtered values
--------------------------— hierarchical control -----------------------------------------------— The following control hierarchies are considered:
there are 4 components generating torque:
For each of the enabled components a priority is loaded from the config. The impedance component is always enabled.
The components are processed in descending order from low priority (high priority value) ===> high priority (low priority value)
If two components a and b have the same priority value their torques are added and their null spaces combined: torque_combined = torque_a + torque_b null_space_combined = null_space_a * null_space_b
The torques of two component groups a and b (with a representing all components with a higher priority value than priority_b and b representing all components with a priority value of priority_b) are calculated like this: torque_combined = torque_b + (null_space_b * torque_a)
Iteratively all torques are combined this way.
If two tasks have the exact same priority, combine them
Otherwise, do the nullspace projection
--------------------------— write torque target -----------------------------------------------—
--------------------------— write torque target -----------------------------------------------—
----------------------— write impedance forces to buffer --------------------------------------—
Definition at line 261 of file ObjectCollisionAvoidance.cpp.
Here is the call graph for this function: