31#include <VirtualRobot/IK/CoMIK.h>
32#include <VirtualRobot/IK/ConstrainedOptimizationIK.h>
33#include <VirtualRobot/IK/HierarchicalIK.h>
34#include <VirtualRobot/IK/JointLimitAvoidanceJacobi.h>
35#include <VirtualRobot/IK/constraints/JointLimitAvoidanceConstraint.h>
36#include <VirtualRobot/IK/constraints/OrientationConstraint.h>
37#include <VirtualRobot/IK/constraints/PoseConstraint.h>
38#include <VirtualRobot/IK/constraints/PositionConstraint.h>
39#include <VirtualRobot/MathTools.h>
40#include <VirtualRobot/Nodes/RobotNode.h>
41#include <VirtualRobot/RobotNodeSet.h>
42#include <VirtualRobot/Workspace/Manipulability.h>
43#include <VirtualRobot/Workspace/Reachability.h>
44#include <VirtualRobot/XML/RobotIO.h>
68 throw UserException(
"Could not find robot file " + _robotFile);
72 VirtualRobot::RobotIO::loadRobot(_robotFile, VirtualRobot::RobotIO::eStructure);
74 if (this->_robotModel)
88 std::vector<std::string> spaces =
armarx::Split(spacesStr,
";");
92 std::string spacesFolder =
95 for (
auto&
space : spaces)
97 ARMARX_INFO <<
"Initially loading reachability space '"
98 << (spacesFolder +
"/" +
space) <<
"'";
100 std::string absolutePath;
105 << (spacesFolder +
"/" +
space) <<
"'";
123 std::string robFile_remote = _robotStateComponentPrx->getRobotFilename();
127 if (robFile_remote.compare(_robotFile) != 0)
129 ARMARX_WARNING <<
"The robot state component uses the robot model " << robFile_remote
130 <<
" This component, however, uses " << _robotFile
131 <<
" Both models must be identical!";
134 _synchronizedRobot = _robotStateComponentPrx->getSynchronizedRobot();
151 const FramedPoseBasePtr& tcpPose,
152 armarx::CartesianSelection cs,
155 NameValueMap ikSolution;
156 computeIK(robotNodeSetName, toGlobalPose(tcpPose), cs, ikSolution);
162 const PoseBasePtr& tcpPose,
163 armarx::CartesianSelection cs,
166 NameValueMap ikSolution;
167 Pose globalTcpPose(tcpPose->position, tcpPose->orientation);
168 computeIK(robotNodeSetName, globalTcpPose.
toEigen(), cs, ikSolution);
174 const PoseBasePtr& tcpPose,
175 armarx::CartesianSelection cs,
178 ExtendedIKResult ikSolution;
179 Pose globalTcpPose(tcpPose->position, tcpPose->orientation);
180 computeIK(robotNodeSetName, globalTcpPose.
toEigen(), cs, ikSolution);
186 const CoMIKDescriptor& desc,
190 if (!_robotModel->hasRobotNodeSet(robotNodeSetJoints))
192 return NameValueMap();
195 if (!_robotModel->hasRobotNodeSet(desc.robotNodeSetBodies))
197 return NameValueMap();
200 RobotNodePtr coordSystem = RobotNodePtr();
202 if (desc.coordSysName.size() > 0 && _robotModel->hasRobotNode(desc.coordSysName))
204 coordSystem = _robotModel->getRobotNode(desc.coordSysName);
208 RobotNodeSetPtr joints = _robotModel->getRobotNodeSet(robotNodeSetJoints);
210 joints, _robotModel->getRobotNodeSet(desc.robotNodeSetBodies), coordSystem);
211 Eigen::VectorXf goal(2);
214 comIkSolver.setGoal(goal, desc.tolerance);
217 std::lock_guard<std::recursive_mutex> lock(_modifyRobotModelMutex);
218 bool success = comIkSolver.solveIK();
223 for (
auto& joint : joints->getAllRobotNodes())
225 NameValueMap::value_type jointPair(joint->getName(), joint->getJointValue());
226 result.insert(jointPair);
235 const IKTasks& iktasks,
236 const CoMIKDescriptor& comIK,
238 bool avoidJointLimits,
239 bool enableCenterOfMass,
242 using PriorityJacobiProviderPair = std::pair<int, JacobiProviderPtr>;
243 auto lowerPriorityCompare =
244 [](
const PriorityJacobiProviderPair& a,
const PriorityJacobiProviderPair& b)
245 {
return a.first < b.first; };
246 std::multiset<PriorityJacobiProviderPair,
decltype(lowerPriorityCompare)> jacobiProviders(
247 lowerPriorityCompare);
249 if (!_robotModel->hasRobotNodeSet(robotNodeSetName))
251 throw UserException(
"Unknown robot node set " + robotNodeSetName);
256 RobotNodeSetPtr rns = _robotModel->getRobotNodeSet(robotNodeSetName);
258 for (DifferentialIKDescriptor
const& ikTask : iktasks)
260 if (!_robotModel->hasRobotNode(ikTask.tcpName))
262 throw UserException(
"Unknown TCP: " + ikTask.tcpName);
265 RobotNodePtr coordSystem = RobotNodePtr();
267 if (ikTask.coordSysName.size() > 0 && _robotModel->hasRobotNode(ikTask.coordSysName))
269 coordSystem = _robotModel->getRobotNode(ikTask.coordSysName);
272 DifferentialIKPtr diffIK(
273 new DifferentialIK(rns, coordSystem, convertInverseJacobiMethod(ikTask.ijm)));
274 Pose globalTcpPose(ikTask.tcpGoal->position, ikTask.tcpGoal->orientation);
275 RobotNodePtr tcp = _robotModel->getRobotNode(ikTask.tcpName);
276 diffIK->setGoal(globalTcpPose.
toEigen(), tcp, convertCartesianSelection(ikTask.csel));
277 JacobiProviderPtr jacoProv = diffIK;
278 jacobiProviders.insert(PriorityJacobiProviderPair(ikTask.priority, jacoProv));
282 if (enableCenterOfMass)
284 if (!_robotModel->hasRobotNodeSet(comIK.robotNodeSetBodies))
286 throw UserException(
"Unknown robot node set for bodies: " +
287 comIK.robotNodeSetBodies);
290 RobotNodePtr coordSystem = RobotNodePtr();
292 if (comIK.coordSysName.size() > 0 && _robotModel->hasRobotNode(comIK.coordSysName))
294 coordSystem = _robotModel->getRobotNode(comIK.coordSysName);
297 CoMIKPtr comIkSolver(
298 new CoMIK(rns, _robotModel->getRobotNodeSet(comIK.robotNodeSetBodies)));
299 Eigen::VectorXf goal(2);
302 comIkSolver->setGoal(goal, comIK.tolerance);
303 JacobiProviderPtr jacoProv = comIkSolver;
304 jacobiProviders.insert(PriorityJacobiProviderPair(comIK.priority, jacoProv));
307 std::vector<JacobiProviderPtr> jacobies;
308 for (PriorityJacobiProviderPair
const& pair : jacobiProviders)
310 jacobies.push_back(pair.second);
313 if (avoidJointLimits)
315 JointLimitAvoidanceJacobiPtr avoidanceJacobi(
new JointLimitAvoidanceJacobi(rns));
316 jacobies.push_back(avoidanceJacobi);
319 std::lock_guard<std::recursive_mutex> lock(_modifyRobotModelMutex);
320 HierarchicalIK hik(rns);
321 Eigen::VectorXf delta = hik.computeStep(jacobies, stepSize);
325 for (RobotNodePtr
const& node : rns->getAllRobotNodes())
327 NameValueMap::value_type jointPair(node->getName(), delta(
index));
328 result.insert(jointPair);
336 const std::string& coordinateSystem,
337 float stepTranslation,
339 const WorkspaceBounds& minBounds,
340 const WorkspaceBounds& maxBounds,
344 std::lock_guard<std::recursive_mutex> cacheLock(_accessReachabilityCacheMutex);
346 if (_reachabilities.count(chainName) == 0)
348 if (!_robotModel->hasRobotNodeSet(chainName))
354 VirtualRobot::WorkspaceRepresentationPtr reachability(
new Manipulability(_robotModel));
355 float minBoundsArray[] = {
356 minBounds.x, minBounds.y, minBounds.z, minBounds.ro, minBounds.pi, minBounds.ya};
357 float maxBoundsArray[] = {
358 maxBounds.x, maxBounds.y, maxBounds.z, maxBounds.ro, maxBounds.pi, maxBounds.ya};
360 std::lock_guard<std::recursive_mutex> robotLock(_modifyRobotModelMutex);
363 if (coordinateSystem.size() > 0)
365 if (!_robotModel->hasRobotNode(coordinateSystem))
367 ARMARX_ERROR <<
"Unknown coordinate system " << coordinateSystem;
371 reachability->initialize(_robotModel->getRobotNodeSet(chainName),
376 VirtualRobot::SceneObjectSetPtr(),
377 VirtualRobot::SceneObjectSetPtr(),
378 _robotModel->getRobotNode(coordinateSystem));
382 reachability->initialize(_robotModel->getRobotNodeSet(chainName),
387 ARMARX_WARNING <<
"Using global coordinate system to create reachability space.";
390 reachability->addRandomTCPPoses(numSamples);
391 _reachabilities.insert(ReachabilityCacheType::value_type(chainName, reachability));
399 const NodeNameList& nodes,
400 const std::string& tcpName,
401 const std::string& rootNodeName,
404 auto stringsCompareEqual = [](
const std::string& a,
const std::string& b)
405 {
return a.compare(b) == 0; };
406 auto stringsCompareSmaller = [](
const std::string& a,
const std::string& b)
407 {
return a.compare(b) <= 0; };
410 std::lock_guard<std::recursive_mutex> lock(_editRobotNodeSetsMutex);
412 if (_robotModel->hasRobotNodeSet(name))
415 bool setsIdentical =
true;
416 RobotNodeSetPtr rns = _robotModel->getRobotNodeSet(name);
418 RobotNodePtr tcpNode = rns->getTCP();
419 setsIdentical &= stringsCompareEqual(tcpNode->getName(), tcpName);
421 RobotNodePtr rootNode = rns->getKinematicRoot();
422 setsIdentical &= stringsCompareEqual(rootNode->getName(), rootNodeName);
424 std::vector<std::string> nodeNames;
425 for (RobotNodePtr
const& robotNode : rns->getAllRobotNodes())
427 nodeNames.push_back(robotNode->getName());
430 std::sort(nodeNames.begin(), nodeNames.end(), stringsCompareSmaller);
431 std::vector<std::string> inputNodeNames(nodes);
432 std::sort(inputNodeNames.begin(), inputNodeNames.end(), stringsCompareSmaller);
433 std::pair<std::vector<std::string>::iterator, std::vector<std::string>::iterator>
435 mismatch = std::mismatch(
436 nodeNames.begin(), nodeNames.end(), inputNodeNames.begin(), stringsCompareEqual);
438 mismatch.first == nodeNames.end() && mismatch.second == inputNodeNames.end();
440 return setsIdentical;
444 RobotNodeSetPtr rns =
445 RobotNodeSet::createRobotNodeSet(_robotModel, name, nodes, rootNodeName, tcpName,
true);
446 return _robotModel->hasRobotNodeSet(name);
458 std::lock_guard<std::recursive_mutex> lock(_accessReachabilityCacheMutex);
459 return _reachabilities.count(chainName) > 0;
464 const FramedPoseBasePtr& tcpPose,
465 const Ice::Current&)
const
467 return isReachable(chainName, toReachabilityMapFrame(tcpPose, chainName));
472 const PoseBasePtr& tcpPose,
473 const Ice::Current&)
const
475 Pose globalTcpPose(tcpPose->position, tcpPose->orientation);
476 return isReachable(chainName, globalTcpPose.
toEigen());
482 VirtualRobot::WorkspaceRepresentationPtr newSpace;
488 newSpace.reset(
new Manipulability(_robotModel));
489 newSpace->load(filename);
492 ARMARX_INFO <<
"Map '" << filename <<
"' loaded as Manipulability map";
503 newSpace.reset(
new Reachability(_robotModel));
504 newSpace->load(filename);
507 ARMARX_INFO <<
"Map '" << filename <<
"' loaded as Reachability map";
516 ARMARX_ERROR <<
"Failed to load map '" << filename <<
"'";
522 std::lock_guard<std::recursive_mutex> lock(_accessReachabilityCacheMutex);
523 std::string chainName = newSpace->getNodeSet()->getName();
525 if (_reachabilities.count(chainName) == 0)
527 _reachabilities.insert(ReachabilityCacheType::value_type(chainName, newSpace));
531 ARMARX_WARNING <<
"Reachability map for kinematic chain '" << chainName
532 <<
"' already loaded";
546 const std::string& filename,
547 const Ice::Current&)
const
549 std::lock_guard<std::recursive_mutex> lock(_accessReachabilityCacheMutex);
552 if (_reachabilities.count(robotNodeSet) > 0)
554 ReachabilityCacheType::const_iterator it = _reachabilities.find(robotNodeSet);
558 std::filesystem::path savePath(filename);
559 std::filesystem::create_directories(savePath.parent_path());
560 it->second->save(filename);
574 RobotIK::computeIK(
const std::string& robotNodeSetName,
575 const Eigen::Matrix4f& tcpPose,
576 armarx::CartesianSelection cs,
577 NameValueMap& ikSolution)
579 if (!_robotModel->hasRobotNodeSet(robotNodeSetName))
581 throw UserException(
"The robot model does not contain the robot node set " +
585 RobotNodeSetPtr rns = _robotModel->getRobotNodeSet(robotNodeSetName);
586 computeIK(rns, tcpPose, cs, ikSolution);
590 RobotIK::computeIK(
const std::string& robotNodeSetName,
591 const Eigen::Matrix4f& tcpPose,
592 armarx::CartesianSelection cs,
593 ExtendedIKResult& ikSolution)
595 if (!_robotModel->hasRobotNodeSet(robotNodeSetName))
597 throw UserException(
"The robot model does not contain the robot node set " +
601 RobotNodeSetPtr rns = _robotModel->getRobotNodeSet(robotNodeSetName);
602 computeIK(rns, tcpPose, cs, ikSolution);
606 RobotIK::computeIK(VirtualRobot::RobotNodeSetPtr nodeSet,
607 const Eigen::Matrix4f& tcpPose,
608 armarx::CartesianSelection cs,
609 NameValueMap& ikSolution)
615 std::lock_guard<std::recursive_mutex> lock(_modifyRobotModelMutex);
619 bool success = solveIK(tcpPose, cs, nodeSet);
628 const std::vector<RobotNodePtr> robotNodes = nodeSet->getAllRobotNodes();
629 for (RobotNodePtr
const& rnode : robotNodes)
631 NameValueMap::value_type jointPair(rnode->getName(), rnode->getJointValue());
632 ikSolution.insert(jointPair);
640 RobotIK::solveIK(
const Eigen::Matrix4f& tcpPose,
641 armarx::CartesianSelection cs,
642 VirtualRobot::RobotNodeSetPtr nodeSet)
647 std::lock_guard<std::recursive_mutex> lock(_modifyRobotModelMutex);
648 VirtualRobot::ConstraintPtr posConstraint(
649 new VirtualRobot::PositionConstraint(_robotModel,
652 tcpPose.block<3, 1>(0, 3),
653 convertCartesianSelection(cs)));
654 posConstraint->setOptimizationFunctionFactor(1);
656 VirtualRobot::ConstraintPtr oriConstraint(
657 new VirtualRobot::OrientationConstraint(_robotModel,
660 tcpPose.block<3, 3>(0, 0),
661 convertCartesianSelection(cs),
662 VirtualRobot::MathTools::deg2rad(2)));
663 oriConstraint->setOptimizationFunctionFactor(1000);
665 Eigen::VectorXf jointConfig;
666 nodeSet->getJointValues(jointConfig);
667 VirtualRobot::ConstraintPtr referenceConfigConstraint(
668 new VirtualRobot::ReferenceConfigurationConstraint(_robotModel, nodeSet, jointConfig));
669 referenceConfigConstraint->setOptimizationFunctionFactor(0.1);
671 VirtualRobot::ConstraintPtr jointLimitAvoidanceConstraint(
672 new VirtualRobot::JointLimitAvoidanceConstraint(_robotModel, nodeSet));
673 jointLimitAvoidanceConstraint->setOptimizationFunctionFactor(0.1);
676 VirtualRobot::ConstrainedOptimizationIK ikSolver(_robotModel, nodeSet, 0.5, 0.03);
677 ikSolver.addConstraint(posConstraint);
678 ikSolver.addConstraint(oriConstraint);
679 ikSolver.addConstraint(jointLimitAvoidanceConstraint);
680 ikSolver.addConstraint(referenceConfigConstraint);
682 ikSolver.initialize();
683 bool success = ikSolver.solve();
686 VirtualRobot::ConstrainedOptimizationIK ikSolver(_robotModel, nodeSet, 0.5, 0.03);
687 ikSolver.addConstraint(posConstraint);
688 ikSolver.addConstraint(oriConstraint);
690 ikSolver.initialize();
697 RobotIK::computeIK(VirtualRobot::RobotNodeSetPtr nodeSet,
698 const Eigen::Matrix4f& tcpPose,
699 armarx::CartesianSelection cs,
700 ExtendedIKResult& ikSolution)
702 ikSolution.jointAngles.clear();
705 std::lock_guard<std::recursive_mutex> lock(_modifyRobotModelMutex);
709 bool success = solveIK(tcpPose, cs, nodeSet);
712 const std::vector<RobotNodePtr> robotNodes = nodeSet->getAllRobotNodes();
713 for (RobotNodePtr
const& rnode : robotNodes)
715 NameValueMap::value_type jointPair(rnode->getName(), rnode->getJointValue());
716 ikSolution.jointAngles.insert(jointPair);
720 ikSolution.errorPosition =
721 (nodeSet->getTCP()->getGlobalPose().block<3, 1>(0, 3) - tcpPose.block<3, 1>(0, 3))
723 ikSolution.errorOrientation =
724 Eigen::AngleAxisf(nodeSet->getTCP()->getGlobalPose().block<3, 3>(0, 0) *
725 tcpPose.block<3, 3>(0, 0).inverse())
728 ikSolution.isReachable =
success;
733 RobotIK::toGlobalPose(
const FramedPoseBasePtr& tcpPose)
const
736 tcpPose->position, tcpPose->orientation, tcpPose->frame, tcpPose->agent);
737 FramedPosePtr globalTcpPose = framedTcpPose.toGlobal(_synchronizedRobot);
738 return globalTcpPose->toEigen();
742 RobotIK::toReachabilityMapFrame(
const FramedPoseBasePtr& tcpPose,
743 const std::string& chainName)
const
748 debugDrawer->setPoseDebugLayerVisu(
"Grasp Pose", p_global);
750 std::lock_guard<std::recursive_mutex> lock(_accessReachabilityCacheMutex);
752 if (_reachabilities.count(chainName))
754 ReachabilityCacheType::const_iterator it = _reachabilities.find(chainName);
756 p->changeFrame(_synchronizedRobot, it->second->getBaseNode()->getName());
761 <<
"Could not convert TCP pose to reachability map frame: Map not found.";
768 RobotIK::isReachable(
const std::string& setName,
const Eigen::Matrix4f& tcpPose)
const
770 ARMARX_INFO <<
"Checking reachability for kinematic chain '" <<
setName <<
"': " << tcpPose;
772 std::lock_guard<std::recursive_mutex> lock(_accessReachabilityCacheMutex);
774 if (_reachabilities.count(
setName))
776 ReachabilityCacheType::const_iterator it = _reachabilities.find(
setName);
777 return it->second->isCovered(tcpPose);
787 VirtualRobot::IKSolver::CartesianSelection
788 RobotIK::convertCartesianSelection(armarx::CartesianSelection cs)
const
792 case armarx::CartesianSelection::eX:
793 return VirtualRobot::IKSolver::CartesianSelection::X;
795 case armarx::CartesianSelection::eY:
796 return VirtualRobot::IKSolver::CartesianSelection::Y;
798 case armarx::CartesianSelection::eZ:
799 return VirtualRobot::IKSolver::CartesianSelection::Z;
801 case armarx::CartesianSelection::ePosition:
802 return VirtualRobot::IKSolver::CartesianSelection::Position;
804 case armarx::CartesianSelection::eOrientation:
805 return VirtualRobot::IKSolver::CartesianSelection::Orientation;
807 case armarx::CartesianSelection::eAll:
808 return VirtualRobot::IKSolver::CartesianSelection::All;
811 return VirtualRobot::IKSolver::CartesianSelection::All;
814 VirtualRobot::JacobiProvider::InverseJacobiMethod
815 RobotIK::convertInverseJacobiMethod(armarx::InverseJacobiMethod aenum)
const
819 case armarx::InverseJacobiMethod::eSVD:
820 return VirtualRobot::JacobiProvider::InverseJacobiMethod::eSVD;
822 case armarx::InverseJacobiMethod::eSVDDamped:
823 return VirtualRobot::JacobiProvider::InverseJacobiMethod::eSVDDamped;
825 case armarx::InverseJacobiMethod::eTranspose:
826 return VirtualRobot::JacobiProvider::InverseJacobiMethod::eTranspose;
829 return VirtualRobot::JacobiProvider::InverseJacobiMethod::eSVD;
833 RobotIK::synchRobot()
const
835 std::lock_guard<std::recursive_mutex> lock(_modifyRobotModelMutex);
#define ARMARX_REGISTER_COMPONENT_EXECUTABLE(ComponentT, applicationName)
static bool getAbsolutePath(const std::string &relativeFilename, std::string &storeAbsoluteFilename, const std::vector< std::string > &additionalSearchPaths={}, bool verbose=true)
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Property< PropertyType > getProperty(const std::string &name)
void offeringTopic(const std::string &name)
Registers a topic for retrival after initialization.
TopicProxyType getTopic(const std::string &name)
Returns a proxy of the specified topic.
bool usingProxy(const std::string &name, const std::string &endpoints="")
Registers a proxy for retrieval after initialization and adds it to the dependency list.
Ice::ObjectPrx getProxy(long timeoutMs=0, bool waitForScheduler=true) const
Returns the proxy of this object (optionally it waits for the proxy)
void setName(std::string name)
Override name of well-known object.
virtual Eigen::Matrix4f toEigen() const
static bool synchronizeLocalClone(VirtualRobot::RobotPtr robot, RobotStateComponentInterfacePrx robotStatePrx)
ExtendedIKResult computeExtendedIKGlobalPose(const std::string &robotNodeSetName, const PoseBasePtr &tcpPose, armarx::CartesianSelection cs, const Ice::Current &=Ice::emptyCurrent) override
Computes a single IK solution, error and reachability for the given robot node set and desired global...
void onInitComponent() override
Load and create a VirtualRobot::Robot instance from the RobotFileName property.
NameValueMap computeHierarchicalDeltaIK(const std::string &robotNodeSet, const IKTasks &iktasks, const CoMIKDescriptor &comIK, float stepSize, bool avoidJointLimits, bool enableCenterOfMass, const Ice::Current &=Ice::emptyCurrent) override
Computes a configuration gradient in order to solve several tasks/constraints simultaneously.
bool saveReachabilitySpace(const std::string &robotNodeSet, const std::string &filename, const Ice::Current &=Ice::emptyCurrent) const override
Saves a previously created reachability space of the given robot node set.
void onDisconnectComponent() override
Hook for subclass.
bool loadReachabilitySpace(const std::string &filename, const Ice::Current &=Ice::emptyCurrent) override
Loads the reachability space from the given file.
bool isPoseReachable(const std::string &chainName, const PoseBasePtr &tcpPose, const Ice::Current &=Ice::emptyCurrent) const override
Returns whether a given global pose is currently reachable by the TCP of the given robot node set.
bool createReachabilitySpace(const std::string &chainName, const std::string &coordinateSystem, float stepTranslation, float stepRotation, const WorkspaceBounds &minBounds, const WorkspaceBounds &maxBounds, int numSamples, const Ice::Current &=Ice::emptyCurrent) override
Creates a new reachability space for the given robot node set.
bool isFramedPoseReachable(const std::string &chainName, const FramedPoseBasePtr &tcpPose, const Ice::Current &=Ice::emptyCurrent) const override
Returns whether a given framed pose is currently reachable by the TCP of the given robot node set.
bool hasReachabilitySpace(const std::string &chainName, const Ice::Current &=Ice::emptyCurrent) const override
Returns whether this component has a reachability space for the given robot node set.
virtual std::string getRobotFilename(const Ice::Current &) const
NameValueMap computeCoMIK(const std::string &robotNodeSetJoints, const CoMIKDescriptor &desc, const Ice::Current &=Ice::emptyCurrent) override
Computes an IK solution for the given robot joints such that the center of mass lies above the given ...
void onConnectComponent() override
Pure virtual hook for the subclass.
PropertyDefinitionsPtr createPropertyDefinitions() override
Create an instance of RobotIKPropertyDefinitions.
NameValueMap computeIKGlobalPose(const std::string &robotNodeSetName, const PoseBasePtr &tcpPose, armarx::CartesianSelection cs, const Ice::Current &=Ice::emptyCurrent) override
Computes a single IK solution for the given robot node set and desired global TCP pose.
NameValueMap computeIKFramedPose(const std::string &robotNodeSetName, const FramedPoseBasePtr &tcpPose, armarx::CartesianSelection cs, const Ice::Current &=Ice::emptyCurrent) override
Computes a single IK solution for the given robot node set and desired TCP pose.
bool defineRobotNodeSet(const std::string &name, const NodeNameList &nodes, const std::string &tcpName, const std::string &rootNode, const Ice::Current &=Ice::emptyCurrent) override
Defines a new robot node set.
#define ARMARX_INFO
The normal logging level.
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
#define ARMARX_VERBOSE
The logging level for verbose information.
const VariantTypeId FramedPose
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::vector< std::string > Split(const std::string &source, const std::string &splitBy, bool trimElements=false, bool removeEmptyElements=false)
IceInternal::Handle< Pose > PosePtr
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
IceInternal::Handle< FramedPose > FramedPosePtr