16 #include <SpaceVecAlg/SpaceVecAlg>
27 Eigen::Matrix3<T>
QuatToE(
const std::vector<T> & q);
102 void makeMimic(
const std::string &
name,
double multiplier,
double offset);
148 const std::string &
name()
const
168 return mimicMultiplier_;
189 sva::PTransform<T>
pose(
const std::vector<T> & q)
const;
196 sva::MotionVecd
motion(
const std::vector<double> & alpha)
const;
203 sva::MotionVecd
tanAccel(
const std::vector<double> & alphaD)
const;
213 std::vector<double>
zeroDof()
const;
221 sva::PTransformd
sPose(
const std::vector<double> & q)
const;
229 sva::MotionVecd
sMotion(
const std::vector<double> & alpha)
const;
237 sva::MotionVecd
sTanAccel(
const std::vector<double> & alphaD)
const;
241 return name_ == b.name_;
246 return name_ != b.name_;
261 void constructJoint(
Type t,
const Eigen::Vector3d & a);
265 Eigen::Matrix<double, 6, Eigen::Dynamic> S_;
273 bool isMimic_ =
false;
274 std::string mimicName_ =
"";
275 double mimicMultiplier_ = 1.0;
276 double mimicOffset_ = 0.0;
281 out <<
"Joint: " << b.
name();
288 : dir_(forward ? 1. : -1), params_(0), dof_(0), name_(name)
293 constructJoint(
Rev, Eigen::Vector3d::UnitX());
296 constructJoint(
Rev, Eigen::Vector3d::UnitY());
299 constructJoint(
Rev, Eigen::Vector3d::UnitZ());
302 constructJoint(
Prism, Eigen::Vector3d::UnitX());
305 constructJoint(
Prism, Eigen::Vector3d::UnitY());
308 constructJoint(
Prism, Eigen::Vector3d::UnitZ());
311 constructJoint(
Fixed, Eigen::Vector3d::Zero());
316 inline Joint::Joint(
Type type,
const Eigen::Vector3d & axis,
bool forward, std::string name)
317 : dir_(forward ? 1. : -1), params_(0), dof_(0), name_(name)
319 constructJoint(
type, axis);
323 : dir_(forward ? 1. : -1), params_(0), dof_(0), name_(name)
325 constructJoint(
type, Eigen::Vector3d::UnitZ());
328 inline Joint::Joint(std::string name) : dir_(1), params_(0), dof_(0), name_(name)
330 constructJoint(Joint::Type::Fixed, Eigen::Vector3d::UnitZ());
337 mimicMultiplier_ = multiplier;
338 mimicOffset_ = offset;
342 inline sva::PTransform<T>
Joint::pose(
const std::vector<T> & q)
const
344 Eigen::Matrix3<T> rot;
349 return sva::PTransform<T>(Eigen::AngleAxis<T>(-q[0], S_.block<3, 1>(0, 0).cast<T>()).matrix());
351 return sva::PTransform<T>(Eigen::Vector3<T>(S_.block<3, 1>(3, 0).cast<T>() * q[0]));
353 return sva::PTransform<T>(Eigen::Quaternion<T>(q[0], dir_ * q[1], dir_ * q[2], dir_ * q[3]).inverse());
355 rot = sva::RotZ(q[0]);
358 return sva::PTransform<T>(rot, rot.transpose() * Eigen::Vector3<T>(q[1], q[2], 0.));
362 return sva::PTransform<T>(rot, rot.transpose() * Eigen::Vector3<T>(q[1], q[2], 0.)).inv();
365 return sva::PTransform<T>(Eigen::AngleAxis<T>(-q[0], S_.col(0).head<3>().cast<T>()).matrix(),
366 S_.col(1).tail<3>().cast<T>() * q[1]);
371 return sva::PTransform<T>(rot, Eigen::Vector3<T>(q[4], q[5], q[6]));
375 return sva::PTransform<T>(rot, Eigen::Vector3<T>(q[4], q[5], q[6])).inv();
379 return sva::PTransform<T>::Identity();
383 inline sva::MotionVecd
Joint::motion(
const std::vector<double> & alpha)
const
388 return sva::MotionVecd(
389 (Eigen::Vector6d() << S_.block<3, 1>(0, 0) * alpha[0], Eigen::Vector3d::Zero()).finished());
391 return sva::MotionVecd(
392 (Eigen::Vector6d() << Eigen::Vector3d::Zero(), S_.block<3, 1>(3, 0) * alpha[0]).finished());
394 return sva::MotionVecd(S_ * Eigen::Vector3d(alpha[0], alpha[1], alpha[2]));
396 return sva::MotionVecd(S_ * Eigen::Vector3d(alpha[0], alpha[1], alpha[2]));
398 return sva::MotionVecd(S_ * Eigen::Vector2d(alpha[0], alpha[1]));
400 return sva::MotionVecd(
401 S_ * (Eigen::Vector6d() << alpha[0], alpha[1], alpha[2], alpha[3], alpha[4], alpha[5]).finished());
404 return sva::MotionVecd(Eigen::Vector6d::Zero());
413 return sva::MotionVecd(
414 (Eigen::Vector6d() << S_.block<3, 1>(0, 0) * alphaD[0], Eigen::Vector3d::Zero()).finished());
416 return sva::MotionVecd(
417 (Eigen::Vector6d() << Eigen::Vector3d::Zero(), S_.block<3, 1>(3, 0) * alphaD[0]).finished());
419 return sva::MotionVecd(S_ * Eigen::Vector3d(alphaD[0], alphaD[1], alphaD[2]));
421 return sva::MotionVecd(S_ * Eigen::Vector3d(alphaD[0], alphaD[1], alphaD[2]));
423 return sva::MotionVecd(S_ * Eigen::Vector2d(alphaD[0], alphaD[1]));
425 return sva::MotionVecd(
426 S_ * (Eigen::Vector6d() << alphaD[0], alphaD[1], alphaD[2], alphaD[3], alphaD[4], alphaD[5]).finished());
429 return sva::MotionVecd(Eigen::Vector6d::Zero());
451 inline sva::PTransformd
Joint::sPose(
const std::vector<double> & q)
const
453 if(q.size() !=
static_cast<unsigned int>(params_))
455 std::ostringstream str;
456 str <<
"Wrong number of generalized position variable: expected " << params_ <<
" gived " << q.size();
457 throw std::domain_error(str.str());
464 if(alpha.size() !=
static_cast<unsigned int>(dof_))
466 std::ostringstream str;
467 str <<
"Wrong number of generalized speed variable: expected " << params_ <<
" gived " << alpha.size();
468 throw std::domain_error(str.str());
475 if(alphaD.size() !=
static_cast<unsigned int>(dof_))
477 std::ostringstream str;
478 str <<
"Wrong number of generalized acceleration variable: expected " << params_ <<
" gived " << alphaD.size();
479 throw std::domain_error(str.str());
492 return {1., 0., 0., 0.};
498 return {1., 0., 0., 0., 0., 0., 0.};
519 return {0., 0., 0., 0., 0., 0.};
526 inline void Joint::constructJoint(Type t,
const Eigen::Vector3d & a)
533 S_ = dir_ * (Eigen::Vector6d() << a, Eigen::Vector3d::Zero()).finished();
538 S_ = dir_ * (Eigen::Vector6d() << Eigen::Vector3d::Zero(), a).finished();
543 S_ = Eigen::Matrix<double, 6, 3>::Zero();
544 S_.block<3, 3>(0, 0).setIdentity();
550 S_ = Eigen::Matrix<double, 6, 3>::Zero();
551 S_.block<3, 3>(2, 0).setIdentity();
557 S_ = Eigen::Matrix<double, 6, 2>::Zero();
558 S_.col(0).head<3>() = a;
559 S_.col(1).tail<3>() = a;
565 S_ = dir_ * Eigen::Matrix6d::Identity();
571 S_ = Eigen::Matrix<double, 6, 0>::Zero();
579 inline Eigen::Matrix3<T>
QuatToE(
const std::vector<T> & q)
595 T p0s = std::pow(p0, 2);
596 T p1s = std::pow(p1, 2);
597 T p2s = std::pow(p2, 2);
598 T p3s = std::pow(p3, 2);
601 * (Eigen::Matrix3<T>() << p0s + p1s - 0.5, p1p2 + p0p3, p1p3 - p0p2, p1p2 - p0p3, p0s + p2s - 0.5, p2p3 + p0p1,
602 p1p3 + p0p2, p2p3 - p0p1, p0s + p3s - 0.5)