#include "revolutejoint.h"
#include "point.h"
#include "matrixfun.h"
#include "body.h"
#include "fastmatrixops.h"
RevoluteJoint::RevoluteJoint(){
DimQandU(1);
Vect3 axis;
axis.Zeros();
axis(3) = 1;
SetAxisPK(axis);
}
RevoluteJoint::~RevoluteJoint(){
}
JointType RevoluteJoint::GetType(){
return REVOLUTEJOINT;
}
void RevoluteJoint::SetAxisK(VirtualMatrix& axis){
axis_k = axis;
axis_pk = pk_C_ko*axis_k;
}
void RevoluteJoint::SetAxisPK(VirtualMatrix& axis){
axis_pk = axis;
axis_k = T(pk_C_ko)*axis_pk;
}
bool RevoluteJoint::ReadInJointData(std::istream& in){
Vect3 axis;
in >> axis;
SetAxisPK(axis);
return true;
}
void RevoluteJoint::WriteOutJointData(std::ostream& out){
out << axis_pk;
}
Matrix RevoluteJoint::GetForward_sP(){
Vect3 v_kk;
FastCross(point2->position,axis_k,v_kk);
return Stack(axis_k,v_kk);
}
void RevoluteJoint::UpdateForward_sP( Matrix& sP){
}
Matrix RevoluteJoint::GetBackward_sP(){
Vect3 v_kk;
FastCross(point1->position,axis_pk,v_kk);
return -Stack(axis_pk,v_kk);;
}
void RevoluteJoint::UpdateBackward_sP( Matrix& sP){
}
void RevoluteJoint::ComputeLocalTransform(){
Mat3x3 ko_C_k;
FastSimpleRotation(axis_k,q.BasicGet(0),ko_C_k);
FastMult(pk_C_ko,ko_C_k,pk_C_k);
}
void RevoluteJoint::ForwardKinematics(){
Vect3 result1,result2,result3,result4,result5;
Vect3 pk_w_k;
ComputeForwardTransforms();
FastMult(pk_C_k,point2->position,result1);
FastSubt(point1->position,result1,r12);
FastNegMult(k_C_pk,r12,r21);
FastMult(body1->n_C_k,r12,result1);
FastAdd(body1->r,result1,body2->r);
FastAssign(u,qdot);
double u_double = u.BasicGet(0);
FastMult(u_double,axis_pk,result1);
FastMult(body1->n_C_k,result1,result2);
FastAdd(body1->omega,result2,body2->omega);
FastMult(u_double,axis_k,pk_w_k);
FastTMult(pk_C_k,body1->omega_k,result1);
FastAdd(result1,pk_w_k,body2->omega_k);
FastCross(body1->omega_k,r12,result1);
FastCross(point2->position,pk_w_k,result2);
FastAdd(body1->v_k,result1,result3);
FastTMult(pk_C_k,result3,result4);
FastAdd(result2,result4,body2->v_k);
FastMult(body2->n_C_k,body2->v_k,body2->v);
FastCross(body2->omega_k,pk_w_k,result1);
FastTMult(pk_C_k,body1->alpha_t,result2);
FastAdd(result1,result2,body2->alpha_t);
FastCross(body1->alpha_t,point1->position,result1);
FastCross(body1->omega_k,point1->position,result2);
FastCross(body1->omega_k,result2,result3);
FastTripleSum(body1->a_t,result1,result3,result4);
FastTMult(pk_C_k,result4,result5);
FastCross(point2->position,body2->alpha_t,result1);
FastCross(point2->position,body2->omega_k,result2);
FastCross(body2->omega_k,result2,result3);
FastTripleSum(result5,result1,result3,body2->a_t);
}
void RevoluteJoint::BackwardKinematics(){
Vect3 result1,result2,result3,result4,result5;
Vect3 k_w_pk;
ComputeBackwardTransforms();
FastMult(k_C_pk,point1->position,result1);
FastSubt(point2->position,result1,r21);
FastNegMult(pk_C_k,r21,r12);
FastMult(body2->n_C_k,r21,result1);
FastAdd(body2->r,result1,body1->r);
FastAssign(u,qdot);
double u_double = u.BasicGet(0);
FastMult(-u_double,axis_k,result1);
FastMult(body2->n_C_k,result1,result2);
FastAdd(body2->omega,result2,body1->omega);
FastMult(-u_double,axis_pk,k_w_pk);
FastMult(pk_C_k,body2->omega_k,result1);
FastAdd(result1,k_w_pk,body1->omega_k);
FastCross(body2->omega_k,r21,result1);
FastCross(point1->position,k_w_pk,result2);
FastAdd(body2->v_k,result1,result3);
FastMult(pk_C_k,result3,result4);
FastAdd(result2,result4,body1->v_k);
FastMult(body1->n_C_k,body1->v_k,body1->v);
FastCross(body1->omega_k,k_w_pk,result1);
FastMult(pk_C_k,body2->alpha_t,result2);
FastAdd(result1,result2,body1->alpha_t);
FastCross(body2->alpha_t,point2->position,result1);
FastCross(body2->omega_k,point2->position,result2);
FastCross(body2->omega_k,result2,result3);
FastTripleSum(body2->a_t,result1,result3,result4);
FastMult(pk_C_k,result4,result5);
FastCross(point1->position,body1->alpha_t,result1);
FastCross(point1->position,body1->omega_k,result2);
FastCross(body1->omega_k,result2,result3);
FastTripleSum(result5,result1,result3,body1->a_t);
}