3#include <VirtualRobot/Nodes/RobotNode.h>
4#include <VirtualRobot/Robot.h>
5#include <VirtualRobot/RobotNodeSet.h>
7#include <simox/control/environment/CollisionRobot.h>
8#include <simox/control/impl/simox/robot/Robot.h>
19 const std::map<std::string, std::vector<size_t>>& velCtrlIndices) :
28 velCtrlIdx = velCtrlIndices;
31 std::vector<std::string> tcpNodeNames;
32 for (
const auto& pair :
rtCfg.ctrlCfg)
34 const auto nodeset = rtRobot->getRobotNodeSet(pair.first);
35 const std::string tcpName = nodeset->getTCP()->getName();
36 tcpNodeNames.push_back(tcpName);
37 if (pair.second.selfDistanceThreshold > preFilterDistance)
39 preFilterDistance = pair.second.selfDistanceThreshold;
46 ARMARX_CHECK(rtRobot->hasRobotNodeSet(cfg.actuatedRobotNodeSetName));
47 rtRobotNodeSet = rtRobot->getRobotNodeSet(cfg.actuatedRobotNodeSetName);
51 scRobot = std::make_unique<simox::control::simox::robot::Robot>(
53 scRobot->setGlobalPose(Eigen::Isometry3d::Identity());
58 ARMARX_DEBUG <<
"Creating robot model for collision computation using default primitive "
59 "models and models with id "
60 <<
rtCfg.primitiveModelParts;
63 std::make_unique<simox::control::environment::CollisionRobot<hpp::fcl::OBBRSS>>(
65 simox::control::environment::CollisionRobotParams{.loadDefaultPrimitiveModel =
true,
67 rtCfg.primitiveModelParts,
79 const auto node = rtRobot->getRobotNode(nodeName);
80 if (node->isTranslationalJoint())
89 for (
const auto& pair :
rtCfg.ctrlCfg)
97 velCtrlIdx.at(pair.first));
101 ARMARX_DEBUG <<
"Creating index to node mapping for collision robot:";
102 std::unordered_set<unsigned int> consideredIndices;
106 for (
const auto& [
index, node] :
data.collisionRobotIndices)
109 <<
" for limb " << name;
110 consideredIndices.insert(
index);
114 ARMARX_DEBUG <<
"Initial computation of all self collision pairs";
116 selfColAvoidanceArgs =
117 simox::control::environment::CompDistArgs{.updatePose =
false,
118 .nearestPoints =
true,
119 .individualColObjects =
true,
120 .allowIndices = consideredIndices};
126 collisionRobot->computeMinimumSelfCollisionDistance(selfColAvoidanceArgs);
127 const int nElements = distanceResults.size();
129 for (
const auto& distanceResult : distanceResults)
132 <<
collisionRobot->getNodes().at(distanceResult.node1).getName() <<
" and "
134 <<
". Initial distance: " << distanceResult.minDistance <<
"m";
137 ARMARX_DEBUG <<
"Reserving space for " << nElements <<
" collision pairs";
148 const std::string& robotNodeSetName,
152 const std::vector<size_t>& velCtrlIndex) :
154 rtRNS(rtRobot->getRobotNodeSet(robotNodeSetName)),
170 const std::vector<size_t>& velCtrlIndex)
172 rts.reset(
c.ctrlCfg.at(
rtRNS->getName()),
185 pair.second.rts.rtPreActivate(
userCfg.ctrlCfg.at(pair.first));
186 pair.second.rStateSelfColl.reset();
195 pair.second.reset(
rtCfg, velCtrlIdx.at(pair.first));
211 scRobotNodeSet->setJointValues(rtRobotNodeSet->getJointValuesEigen());
215 const auto time = IceUtil::Time::now();
218 const double collisionPairTime = (IceUtil::Time::now() - time).toMicroSecondsDouble();
222 pair.second.rts.collisionPairTime = collisionPairTime;
229 const Eigen::VectorXf& qpos,
230 const Eigen::VectorXf& qvelFiltered,
232 const Eigen::VectorXf& impedanceJointTorque,
235 auto& arm =
collLimb.at(robotNodeSetName);
238 arm.rts.impedanceJointTorque = impedanceJointTorque;
239 arm.controller.run(
rtCfg.ctrlCfg.at(robotNodeSetName),
243 arm.collisionRobotIndices,
249 arm.bufferRTtoPublish.getWriteBuffer() = arm.rts;
250 arm.bufferRTtoPublish.commitWrite();
259 for (
auto& pair : cfg.ctrlCfg)
#define ARMARX_CHECK_NOT_EMPTY(c)
std::vector< std::string > actuatedJointNames
law::CollisionAvoidanceController::DistanceResults DistanceResults
std::vector< unsigned int > translationJointIndex
std::unique_ptr< CollisionRobot > collisionRobot
armarx::TripleBuffer< Config > bufferCfgUserToRT
DistanceResults collisionPairs
Eigen::VectorXd qposActuatedJoints
TODO, rename to actuatedJointNames, Not needed anymore?
virtual void rtCollisionChecking()
std::unique_ptr< SCRobot > scRobot
void rtLimbControllerRun(const std::string &robotNodeSetName, const Eigen::VectorXf &qpos, const Eigen::VectorXf &qvelFiltered, float torqueLimit, const Eigen::VectorXf &impedanceJointTorque, double deltaT)
void setUserCfg(const Config &cfg)
CollisionAvoidanceBase(const VirtualRobot::RobotPtr &rtRobot, const Config &cfg, const std::map< std::string, std::vector< size_t > > &velCtrlIndices)
law::CollisionAvoidanceController::SCRobot SCRobot
law::arondto::CollisionAvoidanceConfigDict Config
void validateConfigData(const Config &cfg)
void updateRtConfigFromUser()
VirtualRobot::RobotNodeSetPtr scRobotNodeSet
virtual ~CollisionAvoidanceBase()
std::map< std::string, NodeSetData > collLimb
#define ARMARX_CHECK_GREATER(lhs, rhs)
This macro evaluates whether lhs is greater (>) than rhs and if it turns out to be false it will thro...
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#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_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
std::shared_ptr< class Robot > RobotPtr
void validateConfigData(const arondto::CollisionAvoidanceConfig &cfg)
This file is part of ArmarX.
RecoveryState rStateSelfColl
VirtualRobot::RobotNodeSetPtr rtRNS
!!!!!!! Note that, all the data below should only be accessed in rt thread !!!!!!!
void reset(const Config &c, const std::vector< size_t > &velCtrlIndex)
std::unique_ptr< DynamicsModel > dynamicsModel
self-collision avoidance
armarx::TripleBuffer< RtStatus > bufferRTtoPublish
NodeSetData(const VirtualRobot::RobotPtr &rtRobot, const std::string &robotNodeSetName, const SCRobot &scRobot, const DistanceResults &collisionPairs, const Config &c, const std::vector< size_t > &velCtrlIndex)
const DistanceResults & collisionPairs