26 #include <VirtualRobot/math/AbstractFunctionR1R6.h>
27 #include <VirtualRobot/math/Helpers.h>
34 const Eigen::VectorXf& handJointsTarget) :
36 handJointsTarget(handJointsTarget),
38 feedForwardPosVelocity(0, 0, 0),
39 feedForwardOriVelocity(0, 0, 0),
40 feedForwardHandJointsVelocity(
Eigen::VectorXf::Zero(handJointsTarget.rows()))
45 const Eigen::VectorXf& handJointsTarget,
47 const Eigen::Vector3f& feedForwardPosVelocity,
48 const Eigen::Vector3f& feedForwardOriVelocity,
49 const Eigen::VectorXf& feedForwardHandJointsVelocity) :
51 handJointsTarget(handJointsTarget),
53 feedForwardPosVelocity(feedForwardPosVelocity),
54 feedForwardOriVelocity(feedForwardOriVelocity),
55 feedForwardHandJointsVelocity(feedForwardHandJointsVelocity)
62 return ::math::Helpers::GetPosition(tcpTarget);
68 return ::math::Helpers::GetOrientation(tcpTarget);
80 Eigen::Vector3f pos0 = ::math::Helpers::GetPosition(prev->tcpTarget);
81 Eigen::Matrix3f ori0 = ::math::Helpers::GetOrientation(prev->tcpTarget);
82 Eigen::VectorXf hnd0 = prev->handJointsTarget;
84 Eigen::Vector3f pos1 = ::math::Helpers::GetPosition(tcpTarget);
86 Eigen::VectorXf hnd1 = handJointsTarget;
88 Eigen::Vector3f dpos = pos1 - pos0;
89 Eigen::Vector3f dori = ::math::Helpers::GetRotationVector(ori0, ori1);
90 Eigen::VectorXf dhnd = hnd1 - hnd0;
93 feedForwardPosVelocity = dpos /
dt;
94 feedForwardOriVelocity = dori /
dt;
95 feedForwardHandJointsVelocity = dhnd /
dt;
99 const Eigen::VectorXf& handJointsStart)
102 keypointMap[0] = keypoints.size();
103 keypoints.push_back(keypoint);
108 const Eigen::VectorXf& handJointsTarget,
114 keypoint->updateVelocities(prev,
dt);
116 keypointMap[t] = keypoints.size();
117 keypoints.push_back(keypoint);
123 return keypoints.size();
129 const Eigen::VectorXf& handJointsTarget,
133 if (index <= 0 || index > keypoints.size())
139 keypoint->updateVelocities(prev,
dt);
140 if (
index < keypoints.size())
143 next->updateVelocities(keypoint, next->dt);
145 keypoints.insert(keypoints.begin() +
index, keypoint);
152 if (index <= 0 || index >= keypoints.size())
156 keypoints.erase(keypoints.begin() +
index);
157 if (
index < keypoints.size())
161 next->updateVelocities(prev, next->dt);
169 const Eigen::VectorXf& handJointsTarget,
173 if (index <= 0 || index >= keypoints.size())
179 keypoint->updateVelocities(prev,
dt);
180 keypoints.at(
index) = keypoint;
187 if (index <= 0 || index >= keypoints.size())
193 keypoint->updateVelocities(prev,
dt);
200 return keypoints.at(keypoints.size() - 1);
206 return keypoints.at(i);
225 std::map<float, size_t>::const_iterator it, prev;
226 it = keypointMap.upper_bound(t);
227 if (it == keypointMap.end())
229 i1 = keypoints.size() - 1;
230 i2 = keypoints.size() - 1;
234 prev = std::prev(it);
237 f = ::math::Helpers::ILerp(prev->first, it->first, t);
246 return ::math::Helpers::Lerp(
257 if (oriVel.squaredNorm() == 0)
261 Eigen::AngleAxisf aa(oriVel.norm(), oriVel.normalized());
263 return aa.toRotationMatrix() *
getKeypoint(i1)->getTargetOrientation();
272 std::vector<Eigen::Matrix4f>
275 std::vector<Eigen::Matrix4f> res;
278 res.emplace_back(keypoint->getTargetPose());
283 std::vector<Eigen::Vector3f>
286 std::vector<Eigen::Vector3f> res;
289 res.emplace_back(keypoint->getTargetPosition());
294 std::vector<Eigen::Matrix3f>
297 std::vector<Eigen::Matrix3f> res;
300 res.emplace_back(keypoint->getTargetOrientation());
348 return getKeypoint(i2)->feedForwardHandJointsVelocity;
354 return keypointMap.rbegin()->first;
361 for (
size_t i = 1; i < keypoints.size(); i++)
366 Eigen::Vector3f pos0 = ::math::Helpers::GetPosition(k0->tcpTarget);
369 Eigen::Vector3f pos1 = ::math::Helpers::GetPosition(k1->tcpTarget);
373 l.
ori += fabs(::math::Helpers::GetAngleAxisFromTo(ori0, ori1).
angle());
381 return keypoints.at(0)->handJointsTarget.rows();
390 getKeypoint(0)->getTargetPose(), translation, rotation),
392 for (
size_t i = 1; i < keypoints.size(); i++)
396 ::math::Helpers::TranslateAndRotatePose(kp->getTargetPose(), translation, rotation),
397 kp->handJointsTarget,
408 for (
size_t i = 1; i < keypoints.size(); i++)
411 traj->addKeypoint(
transform * kp->getTargetPose(), kp->handJointsTarget, kp->dt);
424 const Eigen::Vector3f& handForward)
427 Eigen::Vector3f targetHandForward = ::math::Helpers::TransformDirection(
target, handForward);
428 Eigen::Vector3f trajHandForward = ::math::Helpers::TransformDirection(startPose, handForward);
429 Eigen::Vector3f up(0, 0, 1);
431 float angle = ::math::Helpers::Angle(targetHandForward, trajHandForward, up);
432 Eigen::AngleAxisf aa(
angle, up);
435 -::math::Helpers::GetPosition(startPose),
436 aa.toRotationMatrix(),
437 ::math::Helpers::GetPosition(
target));
443 VirtualRobot::RobotNodePtr tcp,
458 e.
Add(
"dt", keypoint->dt);
459 e.
AddAsArr(
"Pose", keypoint->tcpTarget);
460 e.
AddAsArr(
"HandValues", keypoint->handJointsTarget);
469 std::string packageName =
"armar6_skills";
471 std::string dataDir = finder.
getDataDir() +
"/" + packageName;
473 cnd->executionHints->graspTrajectoryName +
".xml");
489 std::vector<JPathNavigator> rows = nav.
select(
"Pose/*");
490 for (
int i = 0; i < 4; i++)
492 std::vector<JPathNavigator> cells = rows.at(i).select(
"*");
493 for (
int j = 0; j < 4; j++)
495 pose(i, j) = cells.at(j).asFloat();
499 Eigen::Vector3f handValues;
500 std::vector<JPathNavigator> cells = nav.
select(
"HandValues/*");
501 for (
int j = 0; j < 3; j++)
503 handValues(j) = cells.at(j).asFloat();
512 traj->addKeypoint(pose, handValues,
dt);
531 GraspTrajectory::updateKeypointMap()
535 for (
size_t i = 0; i < keypoints.size(); i++)