3#include <VirtualRobot/Nodes/RobotNode.h>
4#include <VirtualRobot/RobotNodeSet.h>
6#include <simox/control/environment/CollisionRobot.h>
7#include <simox/control/impl/simox/robot/Robot.h>
33 std::vector<std::string> tcpNodeNames;
34 for (
const auto& pair :
rtCfg.ctrlCfg)
36 const auto nodeset = rtRobot->getRobotNodeSet(pair.first);
37 const std::string tcpName = nodeset->getTCP()->getName();
38 tcpNodeNames.push_back(tcpName);
39 if (pair.second.selfDistanceThreshold > preFilterDistance)
41 preFilterDistance = pair.second.selfDistanceThreshold;
43 if (pair.second.objectDistanceThreshold > preFilterDistance)
45 preFilterDistance = pair.second.objectDistanceThreshold;
52 ARMARX_CHECK(rtRobot->hasRobotNodeSet(cfg.actuatedRobotNodeSetName));
53 rtRobotNodeSet = rtRobot->getRobotNodeSet(cfg.actuatedRobotNodeSetName);
57 scRobot = std::make_unique<simox::control::simox::robot::Robot>(
59 scRobot->setGlobalPose(Eigen::Isometry3d::Identity());
64 ARMARX_DEBUG <<
"Creating robot model for collision computation using default primitive "
65 "models and models with id "
66 <<
rtCfg.primitiveModelParts;
69 std::make_unique<simox::control::environment::CollisionRobot<hpp::fcl::OBBRSS>>(
71 simox::control::environment::CollisionRobotParams{.loadDefaultPrimitiveModel =
true,
73 rtCfg.primitiveModelParts,
85 const auto node = rtRobot->getRobotNode(nodeName);
86 if (node->isTranslationalJoint())
95 for (
const auto& pair :
rtCfg.ctrlCfg)
101 ARMARX_INFO <<
"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,
153 rtRNS(rtRobot->getRobotNodeSet(robotNodeSetName)),
172 rts.objectCollisionNullSpaceWeights =
174 c.ctrlCfg.at(
rtRNS->getName()).objectCollActivatorZ1,
175 c.ctrlCfg.at(
rtRNS->getName()).objectCollActivatorZ2);
185 pair.second.rts.rtPreActivate(
userCfg.ctrlCfg.at(pair.first));
186 pair.second.recoveryStateObjColl.reset();
187 pair.second.recoveryStateSelfColl.reset();
196 pair.second.reset(
rtCfg);
233 scRobotNodeSet->setJointValues(rtRobotNodeSet->getJointValuesEigen());
235 globalPose = rtRobot->getGlobalPose().matrix().cast<
double>();
240 const auto time = IceUtil::Time::now();
244 const double collisionPairTime = (IceUtil::Time::now() - time).toMicroSecondsDouble();
248 pair.second.rts.collisionPairTime = collisionPairTime;
259 const Eigen::VectorXf& qpos,
260 const Eigen::VectorXf& qvelFiltered,
262 const Eigen::VectorXf& trajFollowJointVel,
265 auto& arm =
collLimb.at(robotNodeSetName);
268 arm.rts.trajFollowJointVel = trajFollowJointVel;
269 arm.controller.run(
rtCfg.ctrlCfg.at(robotNodeSetName),
271 arm.recoveryStateSelfColl,
272 arm.recoveryStateObjColl,
275 arm.collisionRobotIndices,
281 arm.bufferRTtoPublish.getWriteBuffer() = arm.rts;
282 arm.bufferRTtoPublish.commitWrite();
284 arm.bufferRecoveryStateSelfColl.getWriteBuffer() = arm.recoveryStateSelfColl;
285 arm.bufferRecoveryStateSelfColl.commitWrite();
294 for (
auto& pair : cfg.ctrlCfg)
322 std::get<0>(writeBuffer).reserve(0);
329 const std::vector<hpp::fcl::CollisionObject>& collisionObjects)
331 const unsigned int nElements =
333 ARMARX_INFO <<
"There are " << collisionObjects.size() <<
" collision objects";
334 ARMARX_INFO <<
"Reserving space for " << nElements <<
" collision pairs";
338 std::get<0>(writeBuffer).reserve(nElements);
339 std::get<1>(writeBuffer) = collisionObjects;
#define ARMARX_CHECK_NOT_EMPTY(c)
std::vector< std::string > actuatedJointNames
const simox::control::environment::CompDistArgs compDistArgs
!
Eigen::Matrix< double, 4, 4 > globalPose
std::vector< unsigned int > translationJointIndex
std::unique_ptr< CollisionRobot > collisionRobot
armarx::TripleBuffer< Config > bufferCfgUserToRT
DistanceResults collisionPairs
void deleteUserCollisionObjects()
Eigen::VectorXd qposActuatedJoints
law::arondto::ObjectCollisionAvoidanceVelConfigDict Config
virtual void rtCollisionChecking()
std::vector< hpp::fcl::CollisionObject > userCollisionObjects
DistanceResults externalCollisionPairs
std::unique_ptr< SCRobot > scRobot
void updateUserCollisionObjects(const std::vector< hpp::fcl::CollisionObject > &)
law::CollisionAvoidanceVelController::DistanceResults DistanceResults
virtual ~ObjectCollisionAvoidanceVelBase()
void setUserCfg(const Config &cfg)
ObjectCollisionAvoidanceVelBase(const VirtualRobot::RobotPtr &rtRobot, const Config &cfg)
void validateConfigData(const Config &cfg)
armarx::TripleBuffer< std::tuple< DistanceResults, std::vector< hpp::fcl::CollisionObject > > > bufferCollisionObjectsUserToRt
void updateRtConfigFromUser()
VirtualRobot::RobotNodeSetPtr scRobotNodeSet
void updateRtCollisionObjects()
law::CollisionAvoidanceVelController::SCRobot SCRobot
void rtLimbControllerRun(const std::string &robotNodeSetName, const Eigen::VectorXf &qpos, const Eigen::VectorXf &qvelFiltered, float velocityLimit, const Eigen::VectorXf &trajFollowJointVel, double deltaT)
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_INFO
The normal logging level.
#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)
Eigen::Vector4f calculateTransitionWeights(float z1, float z2)
helper functions
This file is part of ArmarX.
RecoveryState recoveryStateObjColl
VirtualRobot::RobotNodeSetPtr rtRNS
!!!!!!! Note that, all the data below should only be accessed in rt thread !!!!!!!
std::unique_ptr< DynamicsModel > dynamicsModel
self-collision avoidance
RecoveryState recoveryStateSelfColl
recovery strategy
armarx::TripleBuffer< RtStatus > bufferRTtoPublish
void reset(const Config &c)
const DistanceResults & collisionPairs
NodeSetData(const VirtualRobot::RobotPtr &rtRobot, const std::string &robotNodeSetName, const SCRobot &scRobot, const DistanceResults &collisionPairs, const Config &c)