260 if (!controllerSensorData.updateReadBuffer())
265 double deltaT = controllerSensorData.getReadBuffer().deltaT;
268 Eigen::VectorXf leftTargetVel;
269 leftTargetVel.resize(6);
270 leftTargetVel.setZero();
271 Eigen::VectorXf rightTargetVel;
272 rightTargetVel.resize(6);
273 rightTargetVel.setZero();
275 std::vector<tsvmp::TaskSpaceDMPControllerPtr> currentControlGroup;
276 Eigen::Matrix4f currentLeaderPose;
277 Eigen::Matrix4f currentFollowerPose;
278 Eigen::VectorXf currentLeaderTwist;
279 Eigen::VectorXf currentFollowerTwist;
280 if (leaderName ==
"Left")
282 currentControlGroup = leftGroup;
283 currentLeaderPose = controllerSensorData.getReadBuffer().currentLeftPose;
284 currentFollowerPose = controllerSensorData.getReadBuffer().currentRightPose;
285 currentLeaderTwist = controllerSensorData.getReadBuffer().currentLeftTwist;
286 currentFollowerTwist = controllerSensorData.getReadBuffer().currentRightTwist;
288 else if (leaderName ==
"right")
290 currentControlGroup = rightGroup;
291 currentLeaderPose = controllerSensorData.getReadBuffer().currentRightPose;
292 currentFollowerPose = controllerSensorData.getReadBuffer().currentLeftPose;
293 currentLeaderTwist = controllerSensorData.getReadBuffer().currentRightTwist;
294 currentFollowerTwist = controllerSensorData.getReadBuffer().currentLeftTwist;
298 currentControlGroup = bothLeaderGroup;
302 leaderDMPleft->flow(deltaT,
303 controllerSensorData.getReadBuffer().currentLeftPose,
304 controllerSensorData.getReadBuffer().currentLeftTwist);
305 leaderDMPright->flow(deltaT,
306 controllerSensorData.getReadBuffer().currentRightPose,
307 controllerSensorData.getReadBuffer().currentRightTwist);
309 Eigen::VectorXf leftTargetVel = leaderDMPleft->getTargetVelocity();
310 Eigen::Matrix4f leftTargetPose = leaderDMPleft->getTargetPoseMat();
311 Eigen::VectorXf rightTargetVel = leaderDMPright->getTargetVelocity();
312 Eigen::Matrix4f rightTargetPose = leaderDMPright->getTargetPoseMat();
314 virtualtimer = leaderDMPleft->canVal;
327 virtualtimer = leaderDMP->canVal;
329 if (virtualtimer < 1e-8)
335 leaderDMP->flow(deltaT, currentLeaderPose, currentLeaderTwist);
337 Eigen::Matrix4f currentFollowerLocalPose;
338 currentFollowerLocalPose.block<3, 3>(0, 0) =
339 currentLeaderPose.block<3, 3>(0, 0).inverse() * currentFollowerPose.block<3, 3>(0, 0);
340 currentFollowerLocalPose.block<3, 1>(0, 3) =
341 currentLeaderPose.block<3, 3>(0, 0).inverse() *
342 (currentFollowerPose.block<3, 1>(0, 3) - currentLeaderPose.block<3, 1>(0, 3));
343 followerDMP->flow(deltaT, currentFollowerLocalPose, currentFollowerTwist);
345 Eigen::VectorXf leaderTargetVel = leaderDMP->getTargetVelocity();
346 Eigen::Matrix4f leaderTargetPose = leaderDMP->getTargetPoseMat();
347 Eigen::Matrix4f followerLocalTargetPose = followerDMP->getTargetPoseMat();
348 std::vector<double> followerLocalTargetPoseVec = followerDMP->getTargetPose();
350 Eigen::Matrix4f followerTargetPose;
351 followerTargetPose.block<3, 3>(0, 0) =
352 currentLeaderPose.block<3, 3>(0, 0) * followerLocalTargetPose.block<3, 3>(0, 0);
353 followerTargetPose.block<3, 1>(0, 3) =
354 currentLeaderPose.block<3, 3>(0, 0) * followerLocalTargetPose.block<3, 1>(0, 3) +
355 currentLeaderPose.block<3, 1>(0, 3);
358 Eigen::VectorXf followerLocalTargetVel = followerDMP->getTargetVelocity();
359 Eigen::VectorXf followerTargetVel = followerLocalTargetVel;
360 followerTargetVel.setZero();
371 std::vector<double> leftDMPTarget;
372 std::vector<double> rightDMPTarget;
374 Eigen::Matrix4f leftTargetPose;
375 Eigen::Matrix4f rightTargetPose;
380 if (leaderName ==
"Left")
382 leftTargetVel = leaderTargetVel;
383 rightTargetVel = followerTargetVel;
385 leftDMPTarget = leaderDMP->getTargetPose();
386 rightDMPTarget = followerLocalTargetPoseVec;
389 leftTargetPose = leaderTargetPose;
390 rightTargetPose = followerTargetPose;
392 else if (leaderName ==
"right")
394 rightTargetVel = leaderTargetVel;
395 leftTargetVel = followerTargetVel;
397 rightDMPTarget = leaderDMP->getTargetPose();
398 leftDMPTarget = followerLocalTargetPoseVec;
400 rightTargetPose = leaderTargetPose;
401 leftTargetPose = followerTargetPose;
443 const IceUtil::Time& timeSinceLastIteration)
445 double deltaT = timeSinceLastIteration.toSecondsDouble();
448 interfaceData.getWriteBuffer().currentLeftPose = tcpLeft->getPoseInRootFrame();
449 interfaceData.getWriteBuffer().currentRightPose = tcpRight->getPoseInRootFrame();
450 interfaceData.commitWrite();
452 controllerSensorData.getWriteBuffer().currentLeftPose = tcpLeft->getPoseInRootFrame();
453 controllerSensorData.getWriteBuffer().currentRightPose = tcpRight->getPoseInRootFrame();
454 controllerSensorData.getWriteBuffer().deltaT = deltaT;
455 controllerSensorData.getWriteBuffer().currentTime += deltaT;
458 Eigen::MatrixXf I = Eigen::MatrixXf::Identity(leftTargets.size(), leftTargets.size());
460 Eigen::MatrixXf jacobiL =
461 leftIK->getJacobianMatrix(tcpLeft, VirtualRobot::IKSolver::CartesianSelection::All);
463 Eigen::VectorXf leftqpos;
464 Eigen::VectorXf leftqvel;
465 leftqpos.resize(leftPositionSensors.size());
466 leftqvel.resize(leftVelocitySensors.size());
467 for (
size_t i = 0; i < leftVelocitySensors.size(); ++i)
469 leftqpos(i) = leftPositionSensors[i]->position;
470 leftqvel(i) = leftVelocitySensors[i]->velocity;
473 Eigen::MatrixXf jacobiR =
474 rightIK->getJacobianMatrix(tcpRight, VirtualRobot::IKSolver::CartesianSelection::All);
477 Eigen::VectorXf rightqpos;
478 Eigen::VectorXf rightqvel;
479 rightqpos.resize(rightPositionSensors.size());
480 rightqvel.resize(rightVelocitySensors.size());
482 for (
size_t i = 0; i < rightVelocitySensors.size(); ++i)
484 rightqpos(i) = rightPositionSensors[i]->position;
485 rightqvel(i) = rightVelocitySensors[i]->velocity;
488 Eigen::VectorXf currentLeftTwist = jacobiL * leftqvel;
489 Eigen::VectorXf currentRightTwist = jacobiR * rightqvel;
491 controllerSensorData.getWriteBuffer().currentLeftTwist = currentLeftTwist;
492 controllerSensorData.getWriteBuffer().currentRightTwist = currentRightTwist;
493 controllerSensorData.commitWrite();
496 jacobiL.block<3, 8>(0, 0) = 0.001 * jacobiL.block<3, 8>(0, 0);
497 jacobiR.block<3, 8>(0, 0) = 0.001 * jacobiR.block<3, 8>(0, 0);
503 Eigen::Matrix4f leftCurrentPose = tcpLeft->getPoseInRootFrame();
504 Eigen::Matrix4f rightCurrentPose = tcpRight->getPoseInRootFrame();
507 float normLinearVelocity = leftTargetVel.block<3, 1>(0, 0).
norm();
508 if (normLinearVelocity > maxLinearVel)
510 leftTargetVel.block<3, 1>(0, 0) =
511 maxLinearVel * leftTargetVel.block<3, 1>(0, 0) / normLinearVelocity;
513 float normAngularVelocity = leftTargetVel.block<3, 1>(3, 0).
norm();
514 if (normAngularVelocity > maxAngularVel)
516 leftTargetVel.block<3, 1>(3, 0) =
517 maxAngularVel * leftTargetVel.block<3, 1>(3, 0) / normAngularVelocity;
521 normLinearVelocity = rightTargetVel.block<3, 1>(0, 0).
norm();
522 if (normLinearVelocity > maxLinearVel)
524 rightTargetVel.block<3, 1>(0, 0) =
525 maxLinearVel * rightTargetVel.block<3, 1>(0, 0) / normLinearVelocity;
527 normAngularVelocity = leftTargetVel.block<3, 1>(3, 0).
norm();
528 if (normAngularVelocity > maxAngularVel)
530 rightTargetVel.block<3, 1>(3, 0) =
531 maxAngularVel * rightTargetVel.block<3, 1>(3, 0) / normAngularVelocity;
540 Eigen::Vector3f targetTCPLinearVelocity;
541 targetTCPLinearVelocity << 0.001 * leftTargetVel(0), 0.001 * leftTargetVel(1),
542 0.001 * leftTargetVel(2);
544 Eigen::Vector3f currentTCPLinearVelocity;
545 currentTCPLinearVelocity << 0.001 * currentLeftTwist(0), 0.001 * currentLeftTwist(1),
546 0.001 * currentLeftTwist(2);
547 Eigen::Vector3f currentTCPAngularVelocity;
548 currentTCPAngularVelocity << currentLeftTwist(3), currentLeftTwist(4),
550 Eigen::Vector3f currentTCPPosition = leftCurrentPose.block<3, 1>(0, 3);
551 Eigen::Vector3f desiredPosition = leftTargetPose.block<3, 1>(0, 3);
553 Eigen::Vector3f tcpDesiredForce =
554 0.001 * leftKpos.cwiseProduct(desiredPosition - currentTCPPosition) +
555 leftDpos.cwiseProduct(targetTCPLinearVelocity - currentTCPLinearVelocity);
556 Eigen::Matrix3f currentRotMat = leftCurrentPose.block<3, 3>(0, 0);
557 Eigen::Matrix3f diffMat = leftTargetPose.block<3, 3>(0, 0) * currentRotMat.inverse();
558 Eigen::Vector3f rpy = VirtualRobot::MathTools::eigen3f2rpy(diffMat);
559 Eigen::Vector3f tcpDesiredTorque =
560 leftKori.cwiseProduct(rpy) - leftDori.cwiseProduct(currentTCPAngularVelocity);
561 leftJointControlWrench << tcpDesiredForce, tcpDesiredTorque;
567 Eigen::Vector3f targetTCPLinearVelocity;
568 targetTCPLinearVelocity << 0.001 * rightTargetVel(0), 0.001 * rightTargetVel(1),
569 0.001 * rightTargetVel(2);
571 Eigen::Vector3f currentTCPLinearVelocity;
572 currentTCPLinearVelocity << 0.001 * currentRightTwist(0), 0.001 * currentRightTwist(1),
573 0.001 * currentRightTwist(2);
574 Eigen::Vector3f currentTCPAngularVelocity;
575 currentTCPAngularVelocity << currentRightTwist(3), currentRightTwist(4),
576 currentRightTwist(5);
577 Eigen::Vector3f currentTCPPosition = rightCurrentPose.block<3, 1>(0, 3);
578 Eigen::Vector3f desiredPosition = rightTargetPose.block<3, 1>(0, 3);
580 Eigen::Vector3f tcpDesiredForce =
581 0.001 * rightKpos.cwiseProduct(desiredPosition - currentTCPPosition) +
582 rightDpos.cwiseProduct(targetTCPLinearVelocity - currentTCPLinearVelocity);
583 Eigen::Matrix3f currentRotMat = rightCurrentPose.block<3, 3>(0, 0);
584 Eigen::Matrix3f diffMat = rightTargetPose.block<3, 3>(0, 0) * currentRotMat.inverse();
585 Eigen::Vector3f rpy = VirtualRobot::MathTools::eigen3f2rpy(diffMat);
586 Eigen::Vector3f tcpDesiredTorque =
587 rightKori.cwiseProduct(rpy) - rightDori.cwiseProduct(currentTCPAngularVelocity);
588 rightJointControlWrench << tcpDesiredForce, tcpDesiredTorque;
624 Eigen::VectorXf leftNullspaceTorque =
625 knull * (leftDesiredJointValues - leftqpos) - dnull * leftqvel;
626 Eigen::VectorXf rightNullspaceTorque =
627 knull * (rightDesiredJointValues - rightqpos) - dnull * rightqvel;
631 Eigen::MatrixXf jtpinvL =
632 leftIK->computePseudoInverseJacobianMatrix(jacobiL.transpose(), lambda);
633 Eigen::MatrixXf jtpinvR =
634 rightIK->computePseudoInverseJacobianMatrix(jacobiR.transpose(), lambda);
635 Eigen::VectorXf leftJointDesiredTorques =
636 jacobiL.transpose() * leftJointControlWrench +
637 (I - jacobiL.transpose() * jtpinvL) *
638 leftNullSpaceCoefs.cwiseProduct(leftNullspaceTorque);
639 Eigen::VectorXf rightJointDesiredTorques =
640 jacobiR.transpose() * rightJointControlWrench +
641 (I - jacobiR.transpose() * jtpinvR) *
642 rightNullSpaceCoefs.cwiseProduct(rightNullspaceTorque);
646 for (
size_t i = 0; i < leftTargets.size(); ++i)
648 float desiredTorque = leftJointDesiredTorques(i);
650 if (isnan(desiredTorque))
655 desiredTorque = (desiredTorque > torqueLimit) ? torqueLimit : desiredTorque;
656 desiredTorque = (desiredTorque < -torqueLimit) ? -torqueLimit : desiredTorque;
658 debugDataInfo.getWriteBuffer().desired_torques[leftJointNames[i]] = desiredTorque;
660 leftTargets.at(i)->torque = desiredTorque;
664 for (
size_t i = 0; i < rightTargets.size(); ++i)
666 float desiredTorque = rightJointDesiredTorques(i);
668 if (isnan(desiredTorque))
673 desiredTorque = (desiredTorque > torqueLimit) ? torqueLimit : desiredTorque;
674 desiredTorque = (desiredTorque < -torqueLimit) ? -torqueLimit : desiredTorque;
676 debugDataInfo.getWriteBuffer().desired_torques[rightJointNames[i]] = desiredTorque;
678 rightTargets.at(i)->torque = desiredTorque;
680 debugDataInfo.getWriteBuffer().leftControlSignal_x = leftJointControlWrench(0);
682 debugDataInfo.getWriteBuffer().leftControlSignal_x = leftJointControlWrench(0);
683 debugDataInfo.getWriteBuffer().leftControlSignal_y = leftJointControlWrench(1);
684 debugDataInfo.getWriteBuffer().leftControlSignal_z = leftJointControlWrench(2);
685 debugDataInfo.getWriteBuffer().leftControlSignal_ro = leftJointControlWrench(3);
686 debugDataInfo.getWriteBuffer().leftControlSignal_pi = leftJointControlWrench(4);
687 debugDataInfo.getWriteBuffer().leftControlSignal_ya = leftJointControlWrench(5);
689 debugDataInfo.getWriteBuffer().rightControlSignal_x = rightJointControlWrench(0);
690 debugDataInfo.getWriteBuffer().rightControlSignal_y = rightJointControlWrench(1);
691 debugDataInfo.getWriteBuffer().rightControlSignal_z = rightJointControlWrench(2);
692 debugDataInfo.getWriteBuffer().rightControlSignal_ro = rightJointControlWrench(3);
693 debugDataInfo.getWriteBuffer().rightControlSignal_pi = rightJointControlWrench(4);
694 debugDataInfo.getWriteBuffer().rightControlSignal_ya = rightJointControlWrench(5);
700 debugDataInfo.getWriteBuffer().leftTargetPose_x = leftTargetPose(0, 3);
701 debugDataInfo.getWriteBuffer().leftTargetPose_y = leftTargetPose(1, 3);
702 debugDataInfo.getWriteBuffer().leftTargetPose_z = leftTargetPose(2, 3);
703 debugDataInfo.getWriteBuffer().leftCurrentPose_x = leftCurrentPose(0, 3);
704 debugDataInfo.getWriteBuffer().leftCurrentPose_y = leftCurrentPose(1, 3);
705 debugDataInfo.getWriteBuffer().leftCurrentPose_z = leftCurrentPose(2, 3);
708 debugDataInfo.getWriteBuffer().rightTargetPose_x = rightTargetPose(0, 3);
709 debugDataInfo.getWriteBuffer().rightTargetPose_y = rightTargetPose(1, 3);
710 debugDataInfo.getWriteBuffer().rightTargetPose_z = rightTargetPose(2, 3);
712 debugDataInfo.getWriteBuffer().rightCurrentPose_x = rightCurrentPose(0, 3);
713 debugDataInfo.getWriteBuffer().rightCurrentPose_y = rightCurrentPose(1, 3);
714 debugDataInfo.getWriteBuffer().rightCurrentPose_z = rightCurrentPose(2, 3);
715 debugDataInfo.getWriteBuffer().virtualTime = virtualtime;
717 debugDataInfo.commitWrite();