diff --git a/source/RobotAPI/components/NaturalIKTest/NaturalIKTest.cpp b/source/RobotAPI/components/NaturalIKTest/NaturalIKTest.cpp index 2daf4424e7c5014211bc6a02c8452ea23e96f548..f230c8305809e4d0657b5fea04570c82fd462eec 100644 --- a/source/RobotAPI/components/NaturalIKTest/NaturalIKTest.cpp +++ b/source/RobotAPI/components/NaturalIKTest/NaturalIKTest.cpp @@ -582,6 +582,7 @@ namespace armarx ik_L.setLowerArmLength(lower_arm_length); + NaturalIK::ArmJoints arm_R; arm_R.rns = rns_R; arm_R.elbow = elb_R; @@ -664,6 +665,7 @@ namespace armarx Eigen::Matrix4f target_R = math::Helpers::Pose(p.target + offset, targetOri); + NaturalDiffIK::Result ikResult; if (p.setOri) { @@ -686,6 +688,17 @@ namespace armarx } //ARMARX_IMPORTANT << ss.str(); + CompositeDiffIK cik_R(rns_R); + cik_R.addTarget(arm_R.tcp, target_R, VirtualRobot::IKSolver::CartesianSelection::All); + CompositeDiffIK::NullspaceJointTargetPtr nsjt(new CompositeDiffIK::NullspaceJointTarget(rns_R)); + nsjt->set(2, 0.2, 1); + cik_R.addNullspaceGradient(nsjt); + CompositeDiffIK::NullspaceJointLimitAvoidancePtr nsjla(new CompositeDiffIK::NullspaceJointLimitAvoidance(rns_R)); + nsjla->set(2, 0); + cik_R.addNullspaceGradient(nsjla); + CompositeDiffIK::Paramaters cp; + CompositeDiffIK cikResult = cik_R.solve(cp); + vizrobot.joints(arm_R.rns->getJointValueMap()); diff --git a/source/RobotAPI/libraries/diffik/CompositeDiffIK.cpp b/source/RobotAPI/libraries/diffik/CompositeDiffIK.cpp index daefa367e00fef27f84f71a154f2489d2d1bb312..0e72540bd51656cea2b5695669a1cf6d6ca1c50b 100644 --- a/source/RobotAPI/libraries/diffik/CompositeDiffIK.cpp +++ b/source/RobotAPI/libraries/diffik/CompositeDiffIK.cpp @@ -34,11 +34,16 @@ CompositeDiffIK::CompositeDiffIK(const VirtualRobot::RobotNodeSetPtr& rns) ik.reset(new VirtualRobot::DifferentialIK(rns, rns->getRobot()->getRootNode(), VirtualRobot::JacobiProvider::eSVDDamped)); } -void CompositeDiffIK::addTarget(const CompositeDiffIK::TargetPtr& target) +void CompositeDiffIK::addTarget(const TargetPtr& target) { targets.emplace_back(target); } +void CompositeDiffIK::addTarget(const VirtualRobot::RobotNodePtr& tcp, const Eigen::Matrix4f& target, VirtualRobot::IKSolver::CartesianSelection mode) +{ + addTarget(std::make_shared<Target>(rns, tcp, target, mode)); +} + void CompositeDiffIK::addNullspaceGradient(const CompositeDiffIK::NullspaceGradientPtr& gradient) { nullspaceGradients.emplace_back(gradient); diff --git a/source/RobotAPI/libraries/diffik/CompositeDiffIK.h b/source/RobotAPI/libraries/diffik/CompositeDiffIK.h index f306fb6ed9fe02ba938677f763f94e08c42b8e42..5bf5f383b440df5e719d7c93ca6031c415d3beed 100644 --- a/source/RobotAPI/libraries/diffik/CompositeDiffIK.h +++ b/source/RobotAPI/libraries/diffik/CompositeDiffIK.h @@ -153,6 +153,7 @@ namespace armarx CompositeDiffIK(const VirtualRobot::RobotNodeSetPtr& rns); void addTarget(const TargetPtr& target); + void addTarget(const VirtualRobot::RobotNodePtr& tcp, const Eigen::Matrix4f& target, VirtualRobot::IKSolver::CartesianSelection mode); void addNullspaceGradient(const NullspaceGradientPtr& gradient); Result solve(Parameters params);