diff --git a/source/RobotAPI/motioncontrol/MotionControl.cpp b/source/RobotAPI/motioncontrol/MotionControl.cpp index 14d506848359356047eefaa1418e3c904a21f8ce..b984a8545d0bdf5900ea537bb54bcaa3d292adad 100644 --- a/source/RobotAPI/motioncontrol/MotionControl.cpp +++ b/source/RobotAPI/motioncontrol/MotionControl.cpp @@ -244,6 +244,8 @@ void MoveTCPPoseIK::defineParameters() addToInput("targetPositionDistanceTolerance", VariantType::Float, false); addToInput("targetOrientationDistanceTolerance", VariantType::Float, false); + addToInput("ikWithOrientation", VariantType::Bool, false); + addToInput("timeoutInMs", VariantType::Int, false); addToInput("jointTargetTolerance", VariantType::Float, false); @@ -300,8 +302,11 @@ void MoveTCPTrajectory::defineParameters() addToInput("targetPositionDistanceTolerance", VariantType::Float, false); addToInput("targetOrientationDistanceTolerance", VariantType::Float, false); + addToInput("ikWithOrientation", VariantType::Bool, false); + addToInput("timeoutInMs", VariantType::Int, false); + addToInput("jointTargetTolerance", VariantType::Float, false); addToOutput("TCPDistanceToTarget", VariantType::Float, true); addToOutput("TCPOrientationDistanceToTarget", VariantType::Float, true); @@ -424,11 +429,14 @@ void MoveTCPTrajectoryNextPoint::defineParameters() addToInput("targetPositionDistanceTolerance", VariantType::Float, false); addToInput("targetOrientationDistanceTolerance", VariantType::Float, false); + addToInput("ikWithOrientation", VariantType::Bool, false); + addToInput("timeoutInMs", VariantType::Int, false); addToInput("trajectoryPointCounterID", VariantType::ChannelRef, false); addToOutput("trajectoryPointCounterID", VariantType::ChannelRef, false); + addToInput("jointTargetTolerance", VariantType::Float, false); addToLocal("targetTCPPosition", VariantType::FramedPosition); addToLocal("targetTCPOrientation", VariantType::FramedOrientation); @@ -476,6 +484,8 @@ void CalculateJointAngleConfiguration::defineParameters() addToInput("targetTCPPosition", VariantType::FramedPosition, false); addToInput("targetTCPOrientation", VariantType::FramedOrientation, false); addToInput("targetPositionDistanceTolerance", VariantType::Float, false); + addToInput("targetOrientationDistanceTolerance", VariantType::Float, false); + addToInput("ikWithOrientation", VariantType::Bool, false); addToOutput("jointNames", VariantType::List(VariantType::String), true); addToOutput("targetJointValues", VariantType::List(VariantType::Float), true); @@ -490,18 +500,52 @@ void CalculateJointAngleConfiguration::run() // TODO: with the following line, the IK doesn't find a solution, so this terrible hack must be used. Fix it!!! //VirtualRobot::RobotPtr robot = robotPtr->clone("CalculateTCPPoseClone"); - std::string robotModelFile; + //std::string robotModelFile; //ArmarXDataPath::getAbsolutePath("Armar4/data/Armar4/ArmarIV.xml", robotModelFile); - ArmarXDataPath::getAbsolutePath("Armar3/data/robotmodel/ArmarIII.xml", robotModelFile); - VirtualRobot::RobotPtr robot = VirtualRobot::RobotIO::loadRobot(robotModelFile.c_str()); + //ArmarXDataPath::getAbsolutePath("Armar3/data/robotmodel/ArmarIII.xml", robotModelFile); + //VirtualRobot::RobotPtr robot = VirtualRobot::RobotIO::loadRobot(robotModelFile.c_str()); + + std::string kinChainName = getInput<std::string>("kinematicChainName"); + float maxError = getInput<float>("targetPositionDistanceTolerance"); + float maxErrorRot = getInput<float>("targetOrientationDistanceTolerance"); + bool withOrientation = getInput<bool>("ikWithOrientation"); + VirtualRobot::IKSolver::CartesianSelection ikType = VirtualRobot::IKSolver::All; + if (!withOrientation) + ikType = VirtualRobot::IKSolver::Position; + + + RobotStatechartContext* context = getContext<RobotStatechartContext>(); + if (!context) + { + ARMARX_WARNING << "Need a RobotStatechartContext" << flush; + sendEvent<EvFailure>(); + } - VirtualRobot::GenericIKSolverPtr ikSolver(new VirtualRobot::GenericIKSolver(robot->getRobotNodeSet(getInput<std::string>("kinematicChainName")))); + if (!context->robotStateComponent) + { + ARMARX_WARNING << "No RobotStatechartContext->robotStateComponent" << flush; + sendEvent<EvFailure>(); + } + + VirtualRobot::RobotPtr robot = RemoteRobot::createLocalClone(context->robotStateComponent); + if (!robot) + { + ARMARX_WARNING << "Could not create a local clone of RemoteRobot" << flush; + sendEvent<EvFailure>(); + } + if (!robot->hasRobotNodeSet(kinChainName)) + { + ARMARX_WARNING << "Robot does not know kinematic chain with name " << kinChainName << flush; + sendEvent<EvFailure>(); + } + ARMARX_INFO << "Setting up ik solver for kin chain: " << kinChainName << ", max position error:" << maxError << ", max orientation erorr " << maxErrorRot << ", useOrientation:" << withOrientation << armarx::flush; + VirtualRobot::GenericIKSolverPtr ikSolver(new VirtualRobot::GenericIKSolver(robot->getRobotNodeSet(kinChainName), VirtualRobot::JacobiProvider::eSVDDamped)); ikSolver->setVerbose(true); - ikSolver->setMaximumError(getInput<float>("targetPositionDistanceTolerance")); - ikSolver->setupJacobian(0.1, 40); + ikSolver->setMaximumError(maxError,maxErrorRot); + ikSolver->setupJacobian(0.6f, 10); VirtualRobot::LinkedCoordinate target = ArmarPose::createLinkedCoordinate(robot, getInput<FramedPosition>("targetTCPPosition"), getInput<FramedOrientation>("targetTCPOrientation")); - ARMARX_INFO << "target: " << target.getPose() << armarx::flush; + ARMARX_INFO << "IK target: " << target.getPose() << armarx::flush; Eigen::Matrix4f goalInRoot = target.getInFrame(robot->getRootNode()); // // test @@ -514,7 +558,7 @@ void CalculateJointAngleConfiguration::run() ARMARX_INFO << "Calculating IK" << flush; //if (!ikSolver->solve(goalGlobal, VirtualRobot::IKSolver::Position, 50)) - if (!ikSolver->solve(goalGlobal, VirtualRobot::IKSolver::All, 50)) + if (!ikSolver->solve(goalGlobal, ikType, 5)) { ARMARX_WARNING << "IKSolver found no solution! " << flush; sendEvent<EvFailure>(); @@ -524,15 +568,12 @@ void CalculateJointAngleConfiguration::run() SingleTypeVariantList jointNames = SingleTypeVariantList(VariantType::String); SingleTypeVariantList targetJointValues = SingleTypeVariantList(VariantType::Float); - VirtualRobot::RobotNodeSetPtr kinematicChain = robot->getRobotNodeSet(getInput<std::string>("kinematicChainName") ); + VirtualRobot::RobotNodeSetPtr kinematicChain = robot->getRobotNodeSet(kinChainName); for (int i = 0; i < (signed int)kinematicChain->getSize(); i++) { - if (kinematicChain->getNode(i)->getName().compare("VirtualCentralGaze") != 0) - { - jointNames.addVariant(Variant(kinematicChain->getNode(i)->getName())); - targetJointValues.addVariant(Variant(kinematicChain->getNode(i)->getJointValue())); - ARMARX_LOG << " joint: " << kinematicChain->getNode(i)->getName() << " value: " << kinematicChain->getNode(i)->getJointValue() << flush; - } + jointNames.addVariant(Variant(kinematicChain->getNode(i)->getName())); + targetJointValues.addVariant(Variant(kinematicChain->getNode(i)->getJointValue())); + ARMARX_LOG << " joint: " << kinematicChain->getNode(i)->getName() << " value: " << kinematicChain->getNode(i)->getJointValue() << flush; } ARMARX_LOG << "number of joints to be set: " << jointNames.getSize() << flush; ARMARX_LOG << "setting output: jointNames" << flush; @@ -551,6 +592,7 @@ void ValidateJointAngleConfiguration::defineParameters() addToInput("targetTCPOrientation", VariantType::FramedOrientation, false); addToInput("targetPositionDistanceTolerance", VariantType::Float, false); addToInput("targetOrientationDistanceTolerance", VariantType::Float, false); + addToInput("ikWithOrientation", VariantType::Bool, false); addToInput("kinematicChainName", VariantType::String, false); addToOutput("TCPDistanceToTarget", VariantType::Float, true); @@ -582,7 +624,8 @@ void ValidateJointAngleConfiguration::onEnter() setOutput("TCPDistanceToTarget", cartesianDistance); setOutput("TCPOrientationDistanceToTarget", orientationDistance); - if (cartesianDistance <= getInput<float>("targetPositionDistanceTolerance") && orientationDistance <= getInput<float>("targetOrientationDistanceTolerance")) + bool withOri = getInput<bool>("ikWithOrientation"); + if (cartesianDistance <= getInput<float>("targetPositionDistanceTolerance") && (!withOri || orientationDistance <= getInput<float>("targetOrientationDistanceTolerance"))) { sendEvent<EvSuccess>(); } @@ -643,6 +686,8 @@ void MotionControlTestStateIK::defineParameters() addToInput("targetPositionDistanceTolerance", VariantType::Float, false); addToInput("targetOrientationDistanceTolerance", VariantType::Float, false); + addToInput("ikWithOrientation", VariantType::Bool, false); + addToInput("timeoutInMs", VariantType::Int, false); @@ -993,6 +1038,7 @@ void CalculateHeadIK::onEnter() { targetPosition = getInput<FramedPosition>("target"); kinematicChainName = getInput<std::string>("headIKKinematicChainName"); + virtualPrismaticJointName = getInput<std::string>("headIKVirtualPrismaticJointName"); } @@ -1008,15 +1054,33 @@ void CalculateHeadIK::run() VirtualRobot::RobotPtr robot = VirtualRobot::RobotIO::loadRobot(robotModelFile.c_str(), VirtualRobot::RobotIO::eStructure); robot->setConfig(robotSnapshotConfig); + if (!robot) + { + ARMARX_WARNING << "No robot!" << flush; + sendEvent<EvFailure>(); + } + VirtualRobot::RobotNodeSetPtr kinematicChain = robot->getRobotNodeSet(kinematicChainName); - VirtualRobot::RobotNodePrismaticPtr virtualJoint; - for (unsigned int i=0; i<kinematicChain->getSize(); i++) + if (!kinematicChain) + { + ARMARX_WARNING << "No kinematicChain with name " << kinematicChainName << flush; + sendEvent<EvFailure>(); + } + + VirtualRobot::RobotNodePrismaticPtr virtualJoint = boost::dynamic_pointer_cast<VirtualRobot::RobotNodePrismatic>(robot->getRobotNode(virtualPrismaticJointName)); + if (!virtualJoint) + { + ARMARX_WARNING << "No virtualJoint with name " << virtualPrismaticJointName << flush; + sendEvent<EvFailure>(); + } + + /*for (unsigned int i=0; i<kinematicChain->getSize(); i++) { if (kinematicChain->getNode(i)->getName().compare("VirtualCentralGaze") == 0) { virtualJoint = boost::dynamic_pointer_cast<VirtualRobot::RobotNodePrismatic>(kinematicChain->getNode(i)); } - } + }*/ VirtualRobot::GazeIK ikSolver(kinematicChain, virtualJoint); ikSolver.enableJointLimitAvoidance(true); @@ -1041,7 +1105,7 @@ void CalculateHeadIK::run() SingleTypeVariantList targetJointValues = SingleTypeVariantList(VariantType::Float); for (int i = 0; i < (signed int)kinematicChain->getSize(); i++) { - if (kinematicChain->getNode(i)->getName().compare("VirtualCentralGaze") != 0) + if (kinematicChain->getNode(i)->getName().compare(virtualPrismaticJointName) != 0) { jointNames.addVariant(Variant(kinematicChain->getNode(i)->getName())); targetJointValues.addVariant(Variant(kinematicChain->getNode(i)->getJointValue())); diff --git a/source/RobotAPI/motioncontrol/MotionControl.h b/source/RobotAPI/motioncontrol/MotionControl.h index c629105c0f9cc54e91b2ede2107b7260b5910de4..8aff5a0c361d044f90a8a34b982bee2dd0d61931 100644 --- a/source/RobotAPI/motioncontrol/MotionControl.h +++ b/source/RobotAPI/motioncontrol/MotionControl.h @@ -59,6 +59,7 @@ namespace MotionControl - targetTCPOrientation: the target orientation - targetPositionDistanceTolerance: tolerance for the position to decide if the motion was successfull - targetOrientationDistanceTolerance: tolerance for the orientation to decide if the motion was successfull + - ikWithOrientation: Consider orientation for IK computation. if false, the rotation of the TCP is not considered. - timeoutInMs: a timeout after which the motion is aborted Output parameters: - TCPDistanceToTarget: kartesian distance between TCP and target position @@ -72,6 +73,7 @@ namespace MotionControl - targetTCPOrientations: the list of target orientations - targetPositionDistanceTolerance: tolerance for the position to decide if the motion was successfull - targetOrientationDistanceTolerance: tolerance for the orientation to decide if the motion was successfull + - ikWithOrientation: Consider orientation for IK computation. if false, the rotation of the TCP is not considered. - timeoutInMs: a timeout after which the motion is aborted Output parameters: - TCPDistanceToTarget: kartesian distance between TCP and target position @@ -169,6 +171,7 @@ namespace MotionControl * \param targetTCPPosition the target position for the TCP * \param targetTCPOrientation the target orientation * \param targetPositionDistanceTolerance tolerance for the position to decide if the motion was successfull + * \param ikWithOrientation: Consider orientation for IK computation. if false, the rotation of the TCP is not considered. * \param targetOrientationDistanceTolerance tolerance for the orientation to decide if the motion was successfull * \param timeoutInMs a timeout after which the motion is aborted */ @@ -195,6 +198,7 @@ namespace MotionControl * \param targetTCPOrientations the list of target orientations * \param targetPositionDistanceTolerance tolerance for the position to decide if the motion was successfull * \param targetOrientationDistanceTolerance tolerance for the orientation to decide if the motion was successfull + * \param ikWithOrientation: Consider orientation for IK computation. if false, the rotation of the TCP is not considered. * \param timeoutInMs a timeout after which the motion is aborted */ struct MoveTCPTrajectory : StateTemplate<MoveTCPTrajectory> @@ -377,6 +381,7 @@ namespace MotionControl void run(); FramedPositionPtr targetPosition; std::string kinematicChainName; + std::string virtualPrismaticJointName; }; } // namespace MotionControl