diff --git a/source/RobotAPI/applications/WeissHapticSensor/WeissHapticSensorApp.h b/source/RobotAPI/applications/WeissHapticSensor/WeissHapticSensorApp.h index c5812ade6b568e8aed6571b785ea4f4d58e303f5..ef4be92672a3180801e7f8246fb51950674f5b80 100644 --- a/source/RobotAPI/applications/WeissHapticSensor/WeissHapticSensorApp.h +++ b/source/RobotAPI/applications/WeissHapticSensor/WeissHapticSensorApp.h @@ -1,4 +1,4 @@ -/** +/* * This file is part of ArmarX. * * ArmarX is free software; you can redistribute it and/or modify diff --git a/source/RobotAPI/applications/WeissHapticSensor/main.cpp b/source/RobotAPI/applications/WeissHapticSensor/main.cpp index edff60ba31440bbdcb1e8908eacfd3ebd57ac4fb..6239a8defeecb16baeb50154638ee96924703d27 100644 --- a/source/RobotAPI/applications/WeissHapticSensor/main.cpp +++ b/source/RobotAPI/applications/WeissHapticSensor/main.cpp @@ -1,4 +1,4 @@ -/** +/* * This file is part of ArmarX. * * ArmarX is free software; you can redistribute it and/or modify diff --git a/source/RobotAPI/applications/WeissHapticSensorsUnit/WeissHapticSensorsUnitApp.h b/source/RobotAPI/applications/WeissHapticSensorsUnit/WeissHapticSensorsUnitApp.h index fba3b1a793e7963b95932e033863113ba0630ec8..275ac159957e230ddbe1125f5abd3f451953af30 100644 --- a/source/RobotAPI/applications/WeissHapticSensorsUnit/WeissHapticSensorsUnitApp.h +++ b/source/RobotAPI/applications/WeissHapticSensorsUnit/WeissHapticSensorsUnitApp.h @@ -1,4 +1,4 @@ -/** +/* * This file is part of ArmarX. * * ArmarX is free software; you can redistribute it and/or modify diff --git a/source/RobotAPI/applications/WeissHapticSensorsUnit/main.cpp b/source/RobotAPI/applications/WeissHapticSensorsUnit/main.cpp index 383d05876e7eadfd48ab4faeb807d8443f9fba7f..d2dffa82773301e9539add9c743338a94a70265d 100644 --- a/source/RobotAPI/applications/WeissHapticSensorsUnit/main.cpp +++ b/source/RobotAPI/applications/WeissHapticSensorsUnit/main.cpp @@ -1,4 +1,4 @@ -/** +/* * This file is part of ArmarX. * * ArmarX is free software; you can redistribute it and/or modify diff --git a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp index 5e2ddaeb4920ebc0175c3a451f28f11b7f5ee5e2..be6fc19e0aec5d313af934ceb557c75cf724bfbe 100644 --- a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp +++ b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.cpp @@ -1,4 +1,4 @@ -/** +/* * This file is part of ArmarX. * * ArmarX is free software; you can redistribute it and/or modify diff --git a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h index 11b773cb28684d48825035af867ec7feeca92b53..fa115ec5f3d86b799d95a11e85f8870135a37783 100644 --- a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h +++ b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/WeissHapticSensorListener.h @@ -1,4 +1,4 @@ -/** +/* * This file is part of ArmarX. * * ArmarX is free software; you can redistribute it and/or modify diff --git a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/test/WeissHapticSensorListenerTest.cpp b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/test/WeissHapticSensorListenerTest.cpp index 089961daf9fcd32354f8b52cb28ad509c22503cb..e6da98a3206689f9cf4ea7a1fc2cd1988e1fdb77 100644 --- a/source/RobotAPI/armarx-objects/WeissHapticSensorListener/test/WeissHapticSensorListenerTest.cpp +++ b/source/RobotAPI/armarx-objects/WeissHapticSensorListener/test/WeissHapticSensorListenerTest.cpp @@ -1,4 +1,4 @@ -/** +/* * This file is part of ArmarX. * * ArmarX is free software; you can redistribute it and/or modify diff --git a/source/RobotAPI/core/RobotStatechartContext.h b/source/RobotAPI/core/RobotStatechartContext.h index 6513191b24e053422753eef748cbecaf6c030050..a8ce3d992ddc73a91567be210f6fbfa13598d54c 100644 --- a/source/RobotAPI/core/RobotStatechartContext.h +++ b/source/RobotAPI/core/RobotStatechartContext.h @@ -52,7 +52,8 @@ namespace armarx { defineRequiredProperty<std::string>("KinematicUnitName", "Name of the kinematic unit that should be used"); defineRequiredProperty<std::string>("KinematicUnitObserverName", "Name of the kinematic unit observer that should be used"); - defineOptionalProperty<std::string>("HandUnits", "RightHandUnit", "Name of the comma-seperated hand units that should be used. Unitname for left hand should be LeftHandUnit, and for right hand RightHandUnit"); + //HandUnits should only be changed via config file and default parameter should remain empty + defineOptionalProperty<std::string>("HandUnits", "", "Name of the comma-seperated hand units that should be used. Unitname for left hand should be LeftHandUnit, and for right hand RightHandUnit"); } }; diff --git a/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.cpp b/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.cpp index f71224bfed1f9e0b4bf6452eabe25f7cd3b55cd1..ad7fc94e2f76e0d7356f8b2bb47fc25a3aaabccf 100755 --- a/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.cpp +++ b/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.cpp @@ -1,4 +1,4 @@ -/** +/* * This file is part of ArmarX. * * ArmarX is free software; you can redistribute it and/or modify diff --git a/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.h b/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.h index 078bfe63905991b19026b71856470acf892e7d6a..797a8f4306ab089d3e4af6d47e45320919e9a7ff 100755 --- a/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.h +++ b/source/RobotAPI/drivers/WeissHapticSensor/WeissHapticSensorsUnit.h @@ -1,4 +1,4 @@ -/** +/* * This file is part of ArmarX. * * ArmarX is free software; you can redistribute it and/or modify diff --git a/source/RobotAPI/motioncontrol/MotionControl.cpp b/source/RobotAPI/motioncontrol/MotionControl.cpp index 4804e2bfeec2d22fe01f99d01d1d9d598bc21f3c..becc080f3022e160a8e183d97eacb5fdacf33b5a 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); @@ -422,10 +427,13 @@ 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); + addToInput("jointTargetTolerance", VariantType::Float, false); addToLocal("targetTCPPosition", VariantType::FramedPosition); addToLocal("targetTCPOrientation", VariantType::FramedOrientation); @@ -473,6 +481,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); @@ -487,18 +497,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 @@ -511,7 +555,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>(); @@ -521,15 +565,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; @@ -548,6 +589,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); @@ -579,7 +621,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>(); } @@ -640,6 +683,8 @@ void MotionControlTestStateIK::defineParameters() addToInput("targetPositionDistanceTolerance", VariantType::Float, false); addToInput("targetOrientationDistanceTolerance", VariantType::Float, false); + addToInput("ikWithOrientation", VariantType::Bool, false); + addToInput("timeoutInMs", VariantType::Int, false); @@ -990,6 +1035,7 @@ void CalculateHeadIK::onEnter() { targetPosition = getInput<FramedPosition>("target"); kinematicChainName = getInput<std::string>("headIKKinematicChainName"); + virtualPrismaticJointName = getInput<std::string>("headIKVirtualPrismaticJointName"); } @@ -1005,15 +1051,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); @@ -1038,7 +1102,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 494afd727e225f1409a555dba18b1a68e4eed432..f7a7139e0643cae44b17ce9c6e3ee659110a5f59 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> @@ -378,6 +382,7 @@ namespace MotionControl void run(); FramedPositionPtr targetPosition; std::string kinematicChainName; + std::string virtualPrismaticJointName; }; } // namespace MotionControl