327 std::string robotFile =
328 finder.
getDataDir() +
"/armar6_rt/robotmodel/Armar6-SH/Armar6-SH.xml";
332 VirtualRobot::RobotNodeSetPtr rns_R = robot->getRobotNodeSet(
"RightArm");
333 VirtualRobot::RobotNodeSetPtr rns_L = robot->getRobotNodeSet(
"LeftArm");
335 VirtualRobot::RobotNodePtr sho1_R = rns_R->getNode(1);
336 VirtualRobot::RobotNodePtr sho1_L = rns_L->getNode(1);
338 VirtualRobot::RobotNodePtr elb_R = rns_R->getNode(4);
339 VirtualRobot::RobotNodePtr wri1_R = rns_R->getNode(6);
340 VirtualRobot::RobotNodePtr tcp_R = rns_R->getTCP();
343 float upper_arm_length =
344 (sho1_R->getPositionInRootFrame() - elb_R->getPositionInRootFrame()).norm();
346 float lower_arm_length =
347 (elb_R->getPositionInRootFrame() - rns_R->getTCP()->getPositionInRootFrame()).norm();
350 Eigen::Vector3f shoulder_R = sho1_R->getPositionInRootFrame();
351 Eigen::Vector3f shoulder_L = sho1_L->getPositionInRootFrame();
353 Eigen::Vector3f offset = (shoulder_R + shoulder_L) / 2;
368 arm_R.
tcp = rns_R->getTCP();
370 std::vector<NaturalIK::Parameters> ikParamList;
371 std::vector<IKStats> ikStats = {
IKStats(
"NaturalIK"),
386 p.diffIKparams.elbowKp = 1;
387 p.diffIKparams.jointLimitAvoidanceKp = 0.1;
388 p.diffIKparams.ikStepLengthInitial = 1;
389 ikParamList.emplace_back(p);
394 p.diffIKparams.elbowKp = 0;
395 p.diffIKparams.jointLimitAvoidanceKp = 1;
396 ikParamList.emplace_back(p);
403 std::random_device rd;
404 std::mt19937 gen(rd());
405 std::uniform_real_distribution<> dis(0.0, 1.0);
407 std::vector<Eigen::VectorXf> initialConfigurations;
408 for (VirtualRobot::RobotNodePtr rn : rns_R->getAllRobotNodes())
410 if (rn->isLimitless())
412 rn->setJointValue(0);
416 rn->setJointValue((rn->getJointLimitHi() + rn->getJointLimitLo()) / 2);
420 rns_R->getNode(1)->setJointValue(0);
421 rns_R->getNode(3)->setJointValue(0);
422 rns_R->getNode(5)->setJointValue(0);
423 initialConfigurations.emplace_back(rns_R->getJointValuesEigen());
424 rns_R->getNode(1)->setJointValue(0);
425 rns_R->getNode(3)->setJointValue(0);
426 rns_R->getNode(5)->setJointValue(
M_PI);
427 initialConfigurations.emplace_back(rns_R->getJointValuesEigen());
428 rns_R->getNode(1)->setJointValue(0);
429 rns_R->getNode(3)->setJointValue(
M_PI);
430 rns_R->getNode(5)->setJointValue(0);
431 initialConfigurations.emplace_back(rns_R->getJointValuesEigen());
432 rns_R->getNode(1)->setJointValue(0);
433 rns_R->getNode(3)->setJointValue(
M_PI);
434 rns_R->getNode(5)->setJointValue(
M_PI);
435 initialConfigurations.emplace_back(rns_R->getJointValuesEigen());
438 std::vector<Eigen::Matrix4f>
targets;
441 for (
size_t i = 0; i < rns_R->getSize(); i++)
443 if (rns_R->getNode(i)->isLimitless())
445 rns_R->getNode(i)->setJointValue(dis(gen) * 2 *
M_PI);
449 float lo = rns_R->getNode(i)->getJointLimitLo();
450 float hi = rns_R->getNode(i)->getJointLimitHi();
451 rns_R->getNode(i)->setJointValue(dis(gen) * (
hi -
lo) +
lo);
454 Eigen::Vector3f tcpPos = tcp_R->getPositionInRootFrame();
457 targets.emplace_back(tcp_R->getPoseInRootFrame());
463 for (
size_t i = 0; i < ikParamList.size(); i++)
466 for (
size_t n = 0; n <
targets.size(); n++)
468 for (
const Eigen::VectorXf& initjv : initialConfigurations)
470 rns_R->setJointValues(initjv);
475 ikStats.at(i).solved = ikStats.at(i).solved + 1;
476 ikStats.at(i).elbow.emplace_back(elb_R->getPositionInRootFrame());
485 std::vector<VirtualRobot::RobotNodePtr> elbJoints_R;
486 for (
int i = 0; i < 4; i++)
488 elbJoints_R.push_back(rns_R->getNode(i));
490 VirtualRobot::RobotNodeSetPtr rnsElb_R = VirtualRobot::RobotNodeSet::createRobotNodeSet(
491 robot,
"ELB_R", elbJoints_R, rns_R->getKinematicRoot(), elb_R);
492 for (
size_t n = 0; n <
targets.size(); n++)
494 rns_R->setJointValues(initialConfigurations.at(0));
495 VirtualRobot::ConstrainedOptimizationIK optIK(robot, rns_R);
498 VirtualRobot::ConstraintPtr posConstraint(
new VirtualRobot::PositionConstraint(
502 math::Helpers::GetPosition(
targets.at(n)),
503 VirtualRobot::IKSolver::CartesianSelection::All));
504 posConstraint->setOptimizationFunctionFactor(1);
506 VirtualRobot::ConstraintPtr oriConstraint(
new VirtualRobot::OrientationConstraint(
510 math::Helpers::GetOrientation(
targets.at(n)),
511 VirtualRobot::IKSolver::CartesianSelection::All,
513 oriConstraint->setOptimizationFunctionFactor(1000);
516 Eigen::Vector3f elbowPos =
519 VirtualRobot::ConstraintPtr elbConstraint(
525 VirtualRobot::IKSolver::CartesianSelection::All));
526 elbConstraint->setOptimizationFunctionFactor(0.01);
532 optIK.addConstraint(posConstraint);
533 optIK.addConstraint(oriConstraint);
537 bool reached = optIK.solve();
540 ikStats.at(2).solved = ikStats.at(2).solved + 1;
541 ikStats.at(2).elbow.emplace_back(elb_R->getPositionInRootFrame());
551 for (
size_t n = 0; n <
targets.size(); n++)
553 rns_R->setJointValues(initialConfigurations.at(0));
554 VirtualRobot::DifferentialIK diffIK(rns_R);
556 bool reached = diffIK.solveIK();
559 ikStats.at(3).solved = ikStats.at(3).solved + 1;
560 ikStats.at(3).elbow.emplace_back(elb_R->getPositionInRootFrame());
566 for (
size_t n = 0; n <
targets.size(); n++)
568 for (
const Eigen::VectorXf& initjv : initialConfigurations)
570 rns_R->setJointValues(initjv);
573 rns_R, tcp_R,
targets.at(n), VirtualRobot::IKSolver::CartesianSelection::All));
577 nsjt->set(2, 0.2, 1);
581 nsjla->setWeight(2, 0);
586 ikStats.at(4).solved = ikStats.at(4).solved + 1;
587 ikStats.at(4).elbow.emplace_back(elb_R->getPositionInRootFrame());
594 for (
size_t i = 0; i < ikStats.size(); i++)
596 ARMARX_IMPORTANT << ikStats.at(i).name <<
" solved: " << ikStats.at(i).solved
597 <<
", T: " << ikStats.at(i).duration;
634 .
file(
"armar6_rt",
"armar6_rt/robotmodel/Armar6-SH/Armar6-SH.xml");
636 layer_robot.
add(vizrobot);
639 std::string robotFile =
640 finder.
getDataDir() +
"/armar6_rt/robotmodel/Armar6-SH/Armar6-SH.xml";
644 VirtualRobot::RobotNodeSetPtr rns_R = robot->getRobotNodeSet(
"RightArm");
645 VirtualRobot::RobotNodeSetPtr rns_L = robot->getRobotNodeSet(
"LeftArm");
647 VirtualRobot::RobotNodePtr sho1_R = rns_R->getNode(1);
648 VirtualRobot::RobotNodePtr sho1_L = rns_L->getNode(1);
650 VirtualRobot::RobotNodePtr elb_R = rns_R->getNode(4);
651 VirtualRobot::RobotNodePtr wri1_R = rns_R->getNode(6);
653 VirtualRobot::RobotNodePtr elb_L = rns_L->getNode(4);
662 float upper_arm_length =
663 (sho1_R->getPositionInRootFrame() - elb_R->getPositionInRootFrame()).norm();
665 float lower_arm_length =
666 (elb_R->getPositionInRootFrame() - rns_R->getTCP()->getPositionInRootFrame()).norm();
674 Eigen::Vector3f shoulder_R = sho1_R->getPositionInRootFrame();
675 Eigen::Vector3f shoulder_L = sho1_L->getPositionInRootFrame();
677 Eigen::Vector3f offset = (shoulder_R + shoulder_L) / 2;
691 arm_R.
tcp = rns_R->getTCP();
696 arm_L.
tcp = rns_L->getTCP();
702 ik.setScale(p.p_R.scale);
704 Eigen::Vector3f vtgt = target;
707 err = target - fwd.
wrist;
708 vtgt = vtgt + 1.0 * err;
713 .
color(viz::Color::fromRGBA(0, 0, 120)));
715 fwd = ik.forwardKinematics(ik.CalculateSoechtingAngles(vtgt));
716 err = target - fwd.
wrist;
722 .position(ik.getShoulderPos())
724 .
color(viz::Color::fromRGBA(255, 0, 0)));
726 viz::Color::fromRGBA(255, 0, 255)));
728 viz::Color::fromRGBA(0, 0, 255)));
730 layer.
add(
viz::Box(
"Target").position(target).size(20).color(
731 viz::Color::fromRGBA(255, 165, 0)));
734 arrUpperArm.
fromTo(ik.getShoulderPos(), fwd.
elbow);
735 arrUpperArm.
color(viz::Color::blue());
739 arrLowerArm.
color(viz::Color::red());
741 layer.
add(arrUpperArm);
742 layer.
add(arrLowerArm);
746 while (!vizTask->isStopped())
750 c.waitForCycleDuration();
754 makeVizSide(layer_R, ik_R, p.p_R.target + offset, p.err_R);
755 makeVizSide(layer_L, ik_L, p.p_L.target + offset, p.err_L);
770 0.036805182695388794,
771 0.22703713178634644);
774 Eigen::AngleAxisf aa_R(p.p_R.targetRotation.norm() / 180 *
M_PI,
775 p.p_R.targetRotation.normalized());
776 Eigen::Matrix3f targetOri_R =
777 referenceOri_R.toRotationMatrix() * aa_R.toRotationMatrix();
778 Eigen::Matrix4f target_R = math::Helpers::Pose(p.p_R.target + offset, targetOri_R);
780 Eigen::AngleAxisf aa_L(p.p_L.targetRotation.norm() / 180 *
M_PI,
781 p.p_L.targetRotation.normalized());
782 Eigen::Matrix3f targetOri_L =
783 referenceOri_L.toRotationMatrix() * aa_L.toRotationMatrix();
784 Eigen::Matrix4f target_L = math::Helpers::Pose(p.p_L.target + offset, targetOri_L);
806 auto calcShoulderAngles = [&](
NaturalIK&
natik, Eigen::Matrix4f target)
809 natik.solveSoechtingIK(math::Helpers::Position(target));
812 elb = Eigen::AngleAxisf(-SE, Eigen::Vector3f::UnitX()) * elb;
813 float SR = std::atan2(elb(0), -elb(2));
814 SR = std::max(-0.1f, SR);
823 VirtualRobot::RobotNodeSetPtr rnsP = robot->getRobotNodeSet(
"PlatformPlanningBothArms");
824 if (p.useCompositeIK)
829 VirtualRobot::IKSolver::CartesianSelection mode_R =
830 p.p_R.setOri ? VirtualRobot::IKSolver::CartesianSelection::All
831 : VirtualRobot::IKSolver::CartesianSelection::Position;
832 VirtualRobot::IKSolver::CartesianSelection mode_L =
833 p.p_L.setOri ? VirtualRobot::IKSolver::CartesianSelection::All
834 : VirtualRobot::IKSolver::CartesianSelection::Position;
850 nsjt->set(
"ArmR2_Sho1", +sa_R.
SE, 1);
851 nsjt->set(
"ArmR3_Sho2", +sa_R.
SR, 2);
852 nsjt->set(
"ArmR4_Sho3", -
M_PI / 4, 0.5f);
854 nsjt->set(
"ArmL2_Sho1", -sa_L.
SE, 1);
855 nsjt->set(
"ArmL3_Sho2", +sa_L.
SR, 2);
856 nsjt->set(
"ArmL4_Sho3", +
M_PI / 4, 0.5f);
858 nsjt->set(
"ArmR1_Cla1", 0, 0.5f);
859 nsjt->set(
"ArmL1_Cla1", 0, 0.5f);
880 nsjla->setWeight(0, 0);
881 nsjla->setWeight(1, 0);
882 nsjla->setWeight(2, 0);
883 nsjla->setWeight(
"ArmR4_Sho3", 0);
884 nsjla->setWeight(
"ArmL4_Sho3", 0);
892 layer_iksteps.
clear();
896 layer_iksteps.
add(
viz::Box(
"tcp_" + std::to_string(i))
899 .
color(viz::Color::blue()));
904 layer_iksteps.
add(
viz::Box(
"tcp_" + std::to_string(i))
907 .
color(viz::Color::blue()));
912 layer_iksteps.
add(
viz::Box(
"elb_" + std::to_string(i))
915 .
color(viz::Color::blue()));
920 layer_iksteps.
add(
viz::Box(
"elb_" + std::to_string(i))
923 .
color(viz::Color::blue()));
929 rnsP->getNode(0)->setJointValue(0);
930 rnsP->getNode(1)->setJointValue(0);
931 rnsP->getNode(2)->setJointValue(0);
935 ikResult = ik_R.
calculateIK(target_R, arm_R, p.p_R.ikparams);
940 math::Helpers::Position(target_R), arm_R, p.p_R.ikparams);
943 layer_iksteps.
clear();
944 std::stringstream ss;
948 ss << s.pdTcp.norm() <<
"; " << s.odTcp.norm() <<
"; " << s.pdElb.norm()
950 layer_iksteps.
add(
viz::Box(
"tcp_" + std::to_string(i))
953 .
color(viz::Color::blue()));
954 layer_iksteps.
add(
viz::Box(
"elb_" + std::to_string(i))
957 .
color(viz::Color::blue()));
964 vizrobot.
joints(rnsP->getJointValueMap());
967 arviz.
commit({layer_R, layer_L, layer_robot, layer_iksteps});
971 c.waitForCycleDuration();