329 std::string robotFile =
330 finder.
getDataDir() +
"/armar6_rt/robotmodel/Armar6-SH/Armar6-SH.xml";
334 VirtualRobot::RobotNodeSetPtr rns_R = robot->getRobotNodeSet(
"RightArm");
335 VirtualRobot::RobotNodeSetPtr rns_L = robot->getRobotNodeSet(
"LeftArm");
337 VirtualRobot::RobotNodePtr sho1_R = rns_R->getNode(1);
338 VirtualRobot::RobotNodePtr sho1_L = rns_L->getNode(1);
340 VirtualRobot::RobotNodePtr elb_R = rns_R->getNode(4);
341 VirtualRobot::RobotNodePtr wri1_R = rns_R->getNode(6);
342 VirtualRobot::RobotNodePtr tcp_R = rns_R->getTCP();
345 float upper_arm_length =
346 (sho1_R->getPositionInRootFrame() - elb_R->getPositionInRootFrame()).norm();
348 float lower_arm_length =
349 (elb_R->getPositionInRootFrame() - rns_R->getTCP()->getPositionInRootFrame()).norm();
352 Eigen::Vector3f shoulder_R = sho1_R->getPositionInRootFrame();
353 Eigen::Vector3f shoulder_L = sho1_L->getPositionInRootFrame();
355 Eigen::Vector3f offset = (shoulder_R + shoulder_L) / 2;
370 arm_R.
tcp = rns_R->getTCP();
372 std::vector<NaturalIK::Parameters> ikParamList;
373 std::vector<IKStats> ikStats = {
IKStats(
"NaturalIK"),
388 p.diffIKparams.elbowKp = 1;
389 p.diffIKparams.jointLimitAvoidanceKp = 0.1;
390 p.diffIKparams.ikStepLengthInitial = 1;
391 ikParamList.emplace_back(p);
396 p.diffIKparams.elbowKp = 0;
397 p.diffIKparams.jointLimitAvoidanceKp = 1;
398 ikParamList.emplace_back(p);
405 std::random_device rd;
406 std::mt19937 gen(rd());
407 std::uniform_real_distribution<> dis(0.0, 1.0);
409 std::vector<Eigen::VectorXf> initialConfigurations;
410 for (VirtualRobot::RobotNodePtr rn : rns_R->getAllRobotNodes())
412 if (rn->isLimitless())
414 rn->setJointValue(0);
418 rn->setJointValue((rn->getJointLimitHi() + rn->getJointLimitLo()) / 2);
422 rns_R->getNode(1)->setJointValue(0);
423 rns_R->getNode(3)->setJointValue(0);
424 rns_R->getNode(5)->setJointValue(0);
425 initialConfigurations.emplace_back(rns_R->getJointValuesEigen());
426 rns_R->getNode(1)->setJointValue(0);
427 rns_R->getNode(3)->setJointValue(0);
428 rns_R->getNode(5)->setJointValue(
M_PI);
429 initialConfigurations.emplace_back(rns_R->getJointValuesEigen());
430 rns_R->getNode(1)->setJointValue(0);
431 rns_R->getNode(3)->setJointValue(
M_PI);
432 rns_R->getNode(5)->setJointValue(0);
433 initialConfigurations.emplace_back(rns_R->getJointValuesEigen());
434 rns_R->getNode(1)->setJointValue(0);
435 rns_R->getNode(3)->setJointValue(
M_PI);
436 rns_R->getNode(5)->setJointValue(
M_PI);
437 initialConfigurations.emplace_back(rns_R->getJointValuesEigen());
440 std::vector<Eigen::Matrix4f>
targets;
443 for (
size_t i = 0; i < rns_R->getSize(); i++)
445 if (rns_R->getNode(i)->isLimitless())
447 rns_R->getNode(i)->setJointValue(dis(gen) * 2 *
M_PI);
451 float lo = rns_R->getNode(i)->getJointLimitLo();
452 float hi = rns_R->getNode(i)->getJointLimitHi();
453 rns_R->getNode(i)->setJointValue(dis(gen) * (
hi -
lo) +
lo);
456 Eigen::Vector3f tcpPos = tcp_R->getPositionInRootFrame();
459 targets.emplace_back(tcp_R->getPoseInRootFrame());
465 for (
size_t i = 0; i < ikParamList.size(); i++)
468 for (
size_t n = 0; n <
targets.size(); n++)
470 for (
const Eigen::VectorXf& initjv : initialConfigurations)
472 rns_R->setJointValues(initjv);
477 ikStats.at(i).solved = ikStats.at(i).solved + 1;
478 ikStats.at(i).elbow.emplace_back(elb_R->getPositionInRootFrame());
487 std::vector<VirtualRobot::RobotNodePtr> elbJoints_R;
488 for (
int i = 0; i < 4; i++)
490 elbJoints_R.push_back(rns_R->getNode(i));
492 VirtualRobot::RobotNodeSetPtr rnsElb_R = VirtualRobot::RobotNodeSet::createRobotNodeSet(
493 robot,
"ELB_R", elbJoints_R, rns_R->getKinematicRoot(), elb_R);
494 for (
size_t n = 0; n <
targets.size(); n++)
496 rns_R->setJointValues(initialConfigurations.at(0));
497 VirtualRobot::ConstrainedOptimizationIK optIK(robot, rns_R);
500 VirtualRobot::ConstraintPtr posConstraint(
new VirtualRobot::PositionConstraint(
504 math::Helpers::GetPosition(
targets.at(n)),
505 VirtualRobot::IKSolver::CartesianSelection::All));
506 posConstraint->setOptimizationFunctionFactor(1);
508 VirtualRobot::ConstraintPtr oriConstraint(
new VirtualRobot::OrientationConstraint(
512 math::Helpers::GetOrientation(
targets.at(n)),
513 VirtualRobot::IKSolver::CartesianSelection::All,
515 oriConstraint->setOptimizationFunctionFactor(1000);
518 Eigen::Vector3f elbowPos =
521 VirtualRobot::ConstraintPtr elbConstraint(
527 VirtualRobot::IKSolver::CartesianSelection::All));
528 elbConstraint->setOptimizationFunctionFactor(0.01);
534 optIK.addConstraint(posConstraint);
535 optIK.addConstraint(oriConstraint);
539 bool reached = optIK.solve();
542 ikStats.at(2).solved = ikStats.at(2).solved + 1;
543 ikStats.at(2).elbow.emplace_back(elb_R->getPositionInRootFrame());
553 for (
size_t n = 0; n <
targets.size(); n++)
555 rns_R->setJointValues(initialConfigurations.at(0));
556 VirtualRobot::DifferentialIK diffIK(rns_R);
558 bool reached = diffIK.solveIK();
561 ikStats.at(3).solved = ikStats.at(3).solved + 1;
562 ikStats.at(3).elbow.emplace_back(elb_R->getPositionInRootFrame());
568 for (
size_t n = 0; n <
targets.size(); n++)
570 for (
const Eigen::VectorXf& initjv : initialConfigurations)
572 rns_R->setJointValues(initjv);
575 rns_R, tcp_R,
targets.at(n), VirtualRobot::IKSolver::CartesianSelection::All));
579 nsjt->set(2, 0.2, 1);
583 nsjla->setWeight(2, 0);
588 ikStats.at(4).solved = ikStats.at(4).solved + 1;
589 ikStats.at(4).elbow.emplace_back(elb_R->getPositionInRootFrame());
596 for (
size_t i = 0; i < ikStats.size(); i++)
598 ARMARX_IMPORTANT << ikStats.at(i).name <<
" solved: " << ikStats.at(i).solved
599 <<
", T: " << ikStats.at(i).duration;
636 .
file(
"armar6_rt",
"armar6_rt/robotmodel/Armar6-SH/Armar6-SH.xml");
638 layer_robot.
add(vizrobot);
641 std::string robotFile =
642 finder.
getDataDir() +
"/armar6_rt/robotmodel/Armar6-SH/Armar6-SH.xml";
646 VirtualRobot::RobotNodeSetPtr rns_R = robot->getRobotNodeSet(
"RightArm");
647 VirtualRobot::RobotNodeSetPtr rns_L = robot->getRobotNodeSet(
"LeftArm");
649 VirtualRobot::RobotNodePtr sho1_R = rns_R->getNode(1);
650 VirtualRobot::RobotNodePtr sho1_L = rns_L->getNode(1);
652 VirtualRobot::RobotNodePtr elb_R = rns_R->getNode(4);
653 VirtualRobot::RobotNodePtr wri1_R = rns_R->getNode(6);
655 VirtualRobot::RobotNodePtr elb_L = rns_L->getNode(4);
664 float upper_arm_length =
665 (sho1_R->getPositionInRootFrame() - elb_R->getPositionInRootFrame()).norm();
667 float lower_arm_length =
668 (elb_R->getPositionInRootFrame() - rns_R->getTCP()->getPositionInRootFrame()).norm();
676 Eigen::Vector3f shoulder_R = sho1_R->getPositionInRootFrame();
677 Eigen::Vector3f shoulder_L = sho1_L->getPositionInRootFrame();
679 Eigen::Vector3f offset = (shoulder_R + shoulder_L) / 2;
693 arm_R.
tcp = rns_R->getTCP();
698 arm_L.
tcp = rns_L->getTCP();
704 ik.setScale(p.p_R.scale);
706 Eigen::Vector3f vtgt = target;
709 err = target - fwd.
wrist;
710 vtgt = vtgt + 1.0 * err;
715 .
color(viz::Color::fromRGBA(0, 0, 120)));
717 fwd = ik.forwardKinematics(ik.CalculateSoechtingAngles(vtgt));
718 err = target - fwd.
wrist;
724 .position(ik.getShoulderPos())
726 .
color(viz::Color::fromRGBA(255, 0, 0)));
728 viz::Color::fromRGBA(255, 0, 255)));
730 viz::Color::fromRGBA(0, 0, 255)));
732 layer.
add(
viz::Box(
"Target").position(target).size(20).color(
733 viz::Color::fromRGBA(255, 165, 0)));
736 arrUpperArm.
fromTo(ik.getShoulderPos(), fwd.
elbow);
737 arrUpperArm.
color(viz::Color::blue());
741 arrLowerArm.
color(viz::Color::red());
743 layer.
add(arrUpperArm);
744 layer.
add(arrLowerArm);
748 while (!vizTask->isStopped())
752 c.waitForCycleDuration();
756 makeVizSide(layer_R, ik_R, p.p_R.target + offset, p.err_R);
757 makeVizSide(layer_L, ik_L, p.p_L.target + offset, p.err_L);
772 0.036805182695388794,
773 0.22703713178634644);
776 Eigen::AngleAxisf aa_R(p.p_R.targetRotation.norm() / 180 *
M_PI,
777 p.p_R.targetRotation.normalized());
778 Eigen::Matrix3f targetOri_R =
779 referenceOri_R.toRotationMatrix() * aa_R.toRotationMatrix();
780 Eigen::Matrix4f target_R = math::Helpers::Pose(p.p_R.target + offset, targetOri_R);
782 Eigen::AngleAxisf aa_L(p.p_L.targetRotation.norm() / 180 *
M_PI,
783 p.p_L.targetRotation.normalized());
784 Eigen::Matrix3f targetOri_L =
785 referenceOri_L.toRotationMatrix() * aa_L.toRotationMatrix();
786 Eigen::Matrix4f target_L = math::Helpers::Pose(p.p_L.target + offset, targetOri_L);
808 auto calcShoulderAngles = [&](
NaturalIK&
natik, Eigen::Matrix4f target)
811 natik.solveSoechtingIK(math::Helpers::Position(target));
814 elb = Eigen::AngleAxisf(-SE, Eigen::Vector3f::UnitX()) * elb;
815 float SR = std::atan2(elb(0), -elb(2));
816 SR = std::max(-0.1f, SR);
825 VirtualRobot::RobotNodeSetPtr rnsP = robot->getRobotNodeSet(
"PlatformPlanningBothArms");
826 if (p.useCompositeIK)
831 VirtualRobot::IKSolver::CartesianSelection mode_R =
832 p.p_R.setOri ? VirtualRobot::IKSolver::CartesianSelection::All
833 : VirtualRobot::IKSolver::CartesianSelection::Position;
834 VirtualRobot::IKSolver::CartesianSelection mode_L =
835 p.p_L.setOri ? VirtualRobot::IKSolver::CartesianSelection::All
836 : VirtualRobot::IKSolver::CartesianSelection::Position;
852 nsjt->set(
"ArmR2_Sho1", +sa_R.
SE, 1);
853 nsjt->set(
"ArmR3_Sho2", +sa_R.
SR, 2);
854 nsjt->set(
"ArmR4_Sho3", -
M_PI / 4, 0.5f);
856 nsjt->set(
"ArmL2_Sho1", -sa_L.
SE, 1);
857 nsjt->set(
"ArmL3_Sho2", +sa_L.
SR, 2);
858 nsjt->set(
"ArmL4_Sho3", +
M_PI / 4, 0.5f);
860 nsjt->set(
"ArmR1_Cla1", 0, 0.5f);
861 nsjt->set(
"ArmL1_Cla1", 0, 0.5f);
882 nsjla->setWeight(0, 0);
883 nsjla->setWeight(1, 0);
884 nsjla->setWeight(2, 0);
885 nsjla->setWeight(
"ArmR4_Sho3", 0);
886 nsjla->setWeight(
"ArmL4_Sho3", 0);
894 layer_iksteps.
clear();
898 layer_iksteps.
add(
viz::Box(
"tcp_" + std::to_string(i))
901 .
color(viz::Color::blue()));
906 layer_iksteps.
add(
viz::Box(
"tcp_" + std::to_string(i))
909 .
color(viz::Color::blue()));
914 layer_iksteps.
add(
viz::Box(
"elb_" + std::to_string(i))
917 .
color(viz::Color::blue()));
922 layer_iksteps.
add(
viz::Box(
"elb_" + std::to_string(i))
925 .
color(viz::Color::blue()));
931 rnsP->getNode(0)->setJointValue(0);
932 rnsP->getNode(1)->setJointValue(0);
933 rnsP->getNode(2)->setJointValue(0);
937 ikResult = ik_R.
calculateIK(target_R, arm_R, p.p_R.ikparams);
942 math::Helpers::Position(target_R), arm_R, p.p_R.ikparams);
945 layer_iksteps.
clear();
946 std::stringstream ss;
950 ss << s.pdTcp.norm() <<
"; " << s.odTcp.norm() <<
"; " << s.pdElb.norm()
952 layer_iksteps.
add(
viz::Box(
"tcp_" + std::to_string(i))
955 .
color(viz::Color::blue()));
956 layer_iksteps.
add(
viz::Box(
"elb_" + std::to_string(i))
959 .
color(viz::Color::blue()));
966 vizrobot.
joints(rnsP->getJointValueMap());
969 arviz.
commit({layer_R, layer_L, layer_robot, layer_iksteps});
973 c.waitForCycleDuration();