16#include <SpaceVecAlg/SpaceVecAlg>
27Eigen::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_;
221 sva::PTransform<T>
pose(
const std::vector<T> & q)
const;
228 sva::MotionVecd
motion(
const std::vector<double> & alpha)
const;
235 sva::MotionVecd
tanAccel(
const std::vector<double> & alphaD)
const;
245 std::vector<double>
zeroDof()
const;
253 sva::PTransformd
sPose(
const std::vector<double> & q)
const;
261 sva::MotionVecd
sMotion(
const std::vector<double> & alpha)
const;
269 sva::MotionVecd
sTanAccel(
const std::vector<double> & alphaD)
const;
273 return name_ == b.name_;
278 return name_ != b.name_;
293 void constructJoint(
Type t,
const Eigen::Vector3d & a);
297 Eigen::Matrix<double, 6, Eigen::Dynamic> S_;
305 bool isMimic_ =
false;
306 std::string mimicName_ =
"";
307 double mimicMultiplier_ = 1.0;
308 double mimicOffset_ = 0.0;
316 out <<
"Joint: " << b.
name();
323: dir_(forward ? 1. : -1), params_(0), dof_(0), name_(name)
328 constructJoint(
Rev, Eigen::Vector3d::UnitX());
331 constructJoint(
Rev, Eigen::Vector3d::UnitY());
334 constructJoint(
Rev, Eigen::Vector3d::UnitZ());
337 constructJoint(
Prism, Eigen::Vector3d::UnitX());
340 constructJoint(
Prism, Eigen::Vector3d::UnitY());
343 constructJoint(
Prism, Eigen::Vector3d::UnitZ());
346 constructJoint(
Fixed, Eigen::Vector3d::Zero());
351inline Joint::Joint(
Type type,
const Eigen::Vector3d & axis,
bool forward, std::string name)
352: dir_(forward ? 1. : -1), params_(0), dof_(0), name_(name)
354 constructJoint(
type, axis);
358: dir_(forward ? 1. : -1), params_(0), dof_(0), name_(name)
360 constructJoint(
type, Eigen::Vector3d::UnitZ());
363inline Joint::Joint(std::string name) : dir_(1), params_(0), dof_(0), name_(name)
372 mimicMultiplier_ = multiplier;
373 mimicOffset_ = offset;
377inline sva::PTransform<T>
Joint::pose(
const std::vector<T> & q)
const
379 Eigen::Matrix3<T> rot;
384 return sva::PTransform<T>(Eigen::AngleAxis<T>(-q[0], S_.block<3, 1>(0, 0).cast<T>()).matrix());
386 return sva::PTransform<T>(Eigen::Vector3<T>(S_.block<3, 1>(3, 0).cast<T>() * q[0]));
388 return sva::PTransform<T>(Eigen::Quaternion<T>(q[0], dir_ * q[1], dir_ * q[2], dir_ * q[3]).inverse());
390 rot = sva::RotZ(q[0]);
393 return sva::PTransform<T>(rot, rot.transpose() * Eigen::Vector3<T>(q[1], q[2], 0.));
397 return sva::PTransform<T>(rot, rot.transpose() * Eigen::Vector3<T>(q[1], q[2], 0.)).inv();
400 return sva::PTransform<T>(Eigen::AngleAxis<T>(-q[0], S_.col(0).head<3>().cast<T>()).matrix(),
401 S_.col(1).tail<3>().cast<T>() * q[1]);
406 return sva::PTransform<T>(rot, Eigen::Vector3<T>(q[4], q[5], q[6]));
410 return sva::PTransform<T>(rot, Eigen::Vector3<T>(q[4], q[5], q[6])).inv();
414 return sva::PTransform<T>::Identity();
418inline sva::MotionVecd
Joint::motion(
const std::vector<double> & alpha)
const
423 return sva::MotionVecd(
424 (Eigen::Vector6d() << S_.block<3, 1>(0, 0) * alpha[0], Eigen::Vector3d::Zero()).finished());
426 return sva::MotionVecd(
427 (Eigen::Vector6d() << Eigen::Vector3d::Zero(), S_.block<3, 1>(3, 0) * alpha[0]).finished());
429 return sva::MotionVecd(S_ * Eigen::Vector3d(alpha[0], alpha[1], alpha[2]));
431 return sva::MotionVecd(S_ * Eigen::Vector3d(alpha[0], alpha[1], alpha[2]));
433 return sva::MotionVecd(S_ * Eigen::Vector2d(alpha[0], alpha[1]));
435 return sva::MotionVecd(
436 S_ * (Eigen::Vector6d() << alpha[0], alpha[1], alpha[2], alpha[3], alpha[4], alpha[5]).finished());
439 return sva::MotionVecd(Eigen::Vector6d::Zero());
448 return sva::MotionVecd(
449 (Eigen::Vector6d() << S_.block<3, 1>(0, 0) * alphaD[0], Eigen::Vector3d::Zero()).finished());
451 return sva::MotionVecd(
452 (Eigen::Vector6d() << Eigen::Vector3d::Zero(), S_.block<3, 1>(3, 0) * alphaD[0]).finished());
454 return sva::MotionVecd(S_ * Eigen::Vector3d(alphaD[0], alphaD[1], alphaD[2]));
456 return sva::MotionVecd(S_ * Eigen::Vector3d(alphaD[0], alphaD[1], alphaD[2]));
458 return sva::MotionVecd(S_ * Eigen::Vector2d(alphaD[0], alphaD[1]));
460 return sva::MotionVecd(
461 S_ * (Eigen::Vector6d() << alphaD[0], alphaD[1], alphaD[2], alphaD[3], alphaD[4], alphaD[5]).finished());
464 return sva::MotionVecd(Eigen::Vector6d::Zero());
486inline sva::PTransformd
Joint::sPose(
const std::vector<double> & q)
const
488 if(q.size() !=
static_cast<unsigned int>(params_))
490 std::ostringstream str;
491 str <<
"Wrong number of generalized position variable: expected " << params_ <<
" gived " << q.size();
492 throw std::domain_error(str.str());
499 if(alpha.size() !=
static_cast<unsigned int>(dof_))
501 std::ostringstream str;
502 str <<
"Wrong number of generalized speed variable: expected " << params_ <<
" gived " << alpha.size();
503 throw std::domain_error(str.str());
510 if(alphaD.size() !=
static_cast<unsigned int>(dof_))
512 std::ostringstream str;
513 str <<
"Wrong number of generalized acceleration variable: expected " << params_ <<
" gived " << alphaD.size();
514 throw std::domain_error(str.str());
527 return {1., 0., 0., 0.};
533 return {1., 0., 0., 0., 0., 0., 0.};
554 return {0., 0., 0., 0., 0., 0.};
561inline void Joint::constructJoint(Type t,
const Eigen::Vector3d & a)
568 S_ = dir_ * (Eigen::Vector6d() << a, Eigen::Vector3d::Zero()).finished();
573 S_ = dir_ * (Eigen::Vector6d() << Eigen::Vector3d::Zero(), a).finished();
578 S_ = Eigen::Matrix<double, 6, 3>::Zero();
579 S_.block<3, 3>(0, 0).setIdentity();
585 S_ = Eigen::Matrix<double, 6, 3>::Zero();
586 S_.block<3, 3>(2, 0).setIdentity();
592 S_ = Eigen::Matrix<double, 6, 2>::Zero();
593 S_.col(0).head<3>() = a;
594 S_.col(1).tail<3>() = a;
600 S_ = dir_ * Eigen::Matrix6d::Identity();
606 S_ = Eigen::Matrix<double, 6, 0>::Zero();
614inline Eigen::Matrix3<T>
QuatToE(
const std::vector<T> & q)
630 T p0s = std::pow(p0, 2);
631 T p1s = std::pow(p1, 2);
632 T p2s = std::pow(p2, 2);
633 T p3s = std::pow(p3, 2);
636 * (Eigen::Matrix3<T>() << p0s + p1s - 0.5, p1p2 + p0p3, p1p3 - p0p2, p1p2 - p0p3, p0s + p2s - 0.5, p2p3 + p0p1,
637 p1p3 + p0p2, p2p3 - p0p1, p0s + p3s - 0.5)
double rotorInertia() const
Definition Joint.h:188
void makeMimic(const std::string &name, double multiplier, double offset)
Definition Joint.h:368
double mimicMultiplier() const
Definition Joint.h:166
bool operator==(const Joint &b) const
Definition Joint.h:271
const std::string & name() const
Definition Joint.h:148
double gearRatio() const
Definition Joint.h:204
int dof() const
Definition Joint.h:142
const Eigen::Matrix< double, 6, Eigen::Dynamic > & motionSubspace() const
Definition Joint.h:210
bool operator!=(const Joint &b) const
Definition Joint.h:276
double direction() const
Definition Joint.h:111
const std::string & mimicName() const
Definition Joint.h:160
static std::vector< double > ZeroParam(Type type)
Definition Joint.h:519
sva::MotionVecd tanAccel(const std::vector< double > &alphaD) const
Definition Joint.h:443
double mimicOffset() const
Definition Joint.h:172
static std::vector< double > ZeroDof(Type type)
Definition Joint.h:540
Joint()
Definition Joint.h:320
void setGearRatio(double gr)
Set Gear Ratio.
Definition Joint.h:198
sva::MotionVecd sMotion(const std::vector< double > &alpha) const
Definition Joint.h:497
sva::PTransform< T > pose(const std::vector< T > &q) const
Definition Joint.h:377
sva::MotionVecd motion(const std::vector< double > &alpha) const
Definition Joint.h:418
bool forward() const
Definition Joint.h:117
OldType
Old joint type for Api compatibility.
Definition Joint.h:52
@ PrismY
Prismatique joint about Y axis.
Definition Joint.h:57
@ RevX
Revolute joint about X axis.
Definition Joint.h:53
@ RevY
Revolute joint about Y axis.
Definition Joint.h:54
@ RevZ
Revolute joint about Z axis.
Definition Joint.h:55
@ PrismX
Prismatique joint about X axis.
Definition Joint.h:56
@ PrismZ
Prismatique joint about Z axis.
Definition Joint.h:58
bool isMimic() const
Definition Joint.h:154
std::vector< double > zeroDof() const
Definition Joint.h:481
sva::PTransformd sPose(const std::vector< double > &q) const
Definition Joint.h:486
std::vector< double > zeroParam() const
Definition Joint.h:468
void setRotorInertia(double Ir)
Set Rotor Inertia.
Definition Joint.h:182
sva::MotionVecd sTanAccel(const std::vector< double > &alphaD) const
Definition Joint.h:508
int params() const
Definition Joint.h:133
Type type() const
Definition Joint.h:105
void forward(bool forward)
Definition Joint.h:123
Type
Joint type.
Definition Joint.h:40
@ Cylindrical
Cylindrical joint (Z prismatic, Z revolute).
Definition Joint.h:45
@ Prism
Prismatic joint about an user specified axis.
Definition Joint.h:42
@ Fixed
Fixed joint.
Definition Joint.h:47
@ Spherical
Spherical joint, represented by a quaternion.
Definition Joint.h:43
@ Free
Free joint, represented by a quaternion.
Definition Joint.h:46
@ Planar
Planar joint (2 prismatic(X, Y) and 1 revolute(Z)).
Definition Joint.h:44
@ Rev
Revolute joint about an user specified axis.
Definition Joint.h:41
Eigen::Matrix3< T > QuatToE(const std::vector< T > &q)
Definition Joint.h:614
std::ostream & operator<<(std::ostream &out, const Body &b)
Definition Body.h:69