1 #ifndef ROBOTICS_KINEMATIC_CHAIN3D_H 2 #define ROBOTICS_KINEMATIC_CHAIN3D_H 13 enum Type { Revolute, Prismatic, Spherical };
15 void SetRotationJoint(
const Vector3& w);
16 void SetTranslationJoint(
const Vector3& v);
22 void GetLocalTransform(Real qi,
Frame3D& T)
const;
25 void GetVelocity(Real qi,Real dqi,
const Vector3& p,
Vector3& vel)
const;
26 void GetAngularVelocity(Real dqi,
Vector3& omega)
const;
30 void GetOrientationJacobian(
Vector3& Jo)
const;
31 void GetPositionJacobian(Real qi,
const Vector3& p,
Vector3& Jp)
const;
34 void GetJacobian(Real qi,
Frame3D& J)
const;
36 void GetJacobian(Real qi,
const Frame3D& Tj_World,
Frame3D& J)
const;
50 void Initialize(
int numLinks)
52 links.resize(numLinks);
53 parents.resize(numLinks);
54 q.resize(numLinks,Zero);
55 qMin.resize(numLinks,-Inf);
56 qMax.resize(numLinks,Inf);
59 virtual std::string LinkName(
int i)
const 62 sprintf(temp,
"Link[%d]",i);
66 inline bool InJointLimits(
const Vector& q)
const 68 assert(q.n == qMin.n);
69 for(
int i=0;i<qMin.n;i++) {
70 if(qMin[i]>q[i] || q[i]>qMax[i]) {
85 const Matrix3& GetWorldRotation(
int i)
const;
86 void GetWorldRotation_Moment(
int i,
Vector3& m)
const;
89 void GetWorldVelocity(
const Vector3& pi,
int i,
const Vector& dq,
Vector3& dp)
const;
90 void GetWorldAngularVelocity(
int i,
const Vector& dq,
Vector3& omega)
const;
92 bool GetWorldRotationDeriv(
int i,
int j,
Matrix3& dR)
const;
93 bool GetWorldRotationDeriv_Moment(
int i,
int j,
Vector3& dm)
const;
95 bool GetWorldRotationDeriv_Moment(
int i,
int j,
const Vector3& m,
Vector3& dm)
const;
99 bool GetOrientationJacobian(
int i,
int j,
Vector3& dw)
const;
100 bool GetPositionJacobian(
const Vector3& pi,
int i,
int j,
Vector3& dv)
const;
102 void GetFullJacobian(
const Vector3& pi,
int i, Matrix& J)
const;
104 void GetPositionJacobian(
const Vector3& pi,
int i, Matrix& J)
const;
106 std::vector<Link> links;
114 template <
class Link>
125 for(
size_t i=0;i<links.size();i++) {
127 li.GetLocalTransform(q(i),Ti);
130 li.T_World.
mul(li.T0_Parent,Ti);
132 li.T_World.mul(links[pi].T_World,li.T0_Parent);
138 template <
class Link>
141 links[i].T_World.mulPoint(pi,p);
144 template <
class Link>
147 return links[i].T_World.R;
150 template <
class Link>
154 rot.setMatrix(links[i].T_World.R);
158 template <
class Link>
164 links[i].T_World.mulPoint(pi,p);
167 links[j].GetVelocity(q[j],dq[j],p,tempp);
173 template <
class Link>
180 links[j].GetAngularVelocity(dq[j],tempw);
186 template <
class Link>
189 if(IsAncestor(i,j)) {
191 links[j].GetOrientationJacobian(dw);
199 template <
class Link>
202 if(IsAncestor(i,j)) {
204 links[j].GetOrientationJacobian(dw);
212 template <
class Link>
215 if(IsAncestor(i,j)) {
217 links[j].GetOrientationJacobian(dw);
225 template <
class Link>
228 if(IsAncestor(i,j)) {
230 GetWorldPosition(pi,i,p);
231 links[j].GetJacobian(q[j],p,dw,dv);
239 template <
class Link>
242 if(IsAncestor(i,j)) {
243 links[j].GetOrientationJacobian(dw);
250 template <
class Link>
253 if(IsAncestor(i,j)) {
255 GetWorldPosition(pi,i,p);
256 links[j].GetPositionJacobian(q[j],p,dv);
263 template <
class Link>
266 J.resize(6,q.n,Zero);
269 GetWorldPosition(pi,i,p);
272 links[j].GetJacobian(q[j],p,w,v);
273 J(0,j)=w.x; J(1,j)=w.y; J(2,j)=w.z;
274 J(3,j)=v.x; J(4,j)=v.y; J(5,j)=v.z;
279 template <
class Link>
282 J.resize(3,q.n,Zero);
285 GetWorldPosition(pi,i,p);
288 links[j].GetPositionJacobian(q[j],p,v);
289 J(0,j)=v.x; J(1,j)=v.y; J(2,j)=v.z;
A 3D vector class.
Definition: math3d/primitives.h:136
void MomentDerivative(const MomentRotation &m, const Vector3 &z, Vector3 &dm)
Same as above, but specifies R with the moment m.
Definition: Rotation.cpp:277
"Moment", a.k.a. exponential map, 3D rotation parameterization
Definition: rotation.h:99
Definition: KinematicChain3D.h:10
Utility functions for converting between different rotation representations and computing derivatives...
void mul(const RigidTransform &a, const RigidTransform &b)
mul = compose
Definition: math3d/primitives.h:2615
void MatrixDerivative(const Matrix3 &R, const Vector3 &z, Matrix3 &dR)
Derivative dR of the rotation matrix R of a frame as it rotates about the axis z. ...
Definition: Rotation.cpp:261
Definition: KinematicChain3D.h:45
A 3x3 matrix class.
Definition: math3d/primitives.h:469
The logging system used in KrisLibrary.
A tree-based chain structure.
Definition: Chain.h:16