Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include <kdl/jacobianframe.hpp>
00029
00030 namespace KDL {
00039 int GetEulerZYX(const Jacobian<Rotation>& JR,
00040 Jacobian<double>& gamma,
00041 Jacobian<double>& beta,
00042 Jacobian<double>& alpha,
00043 double eps) {
00044
00045 JR.value().GetEulerZYX(alpha.value(),beta.value(),gamma.value());
00046 double ca = ::cos(alpha.value());
00047 double sa = ::sin(alpha.value());
00048 double cb = ::cos(beta.value());
00049 double sb = ::sin(beta.value());
00050
00051 assert(gamma.nrOfDeriv()==JR.nrOfDeriv());
00052 assert(beta.nrOfDeriv()==JR.nrOfDeriv());
00053 assert(alpha.nrOfDeriv()==JR.nrOfDeriv());
00054 for (int i=0;i<JR.nrOfDeriv();++i) {
00055 if (JR.hasDeriv(i) ) {
00056 Vector w = JR.deriv(i);
00057 double dgamma = (ca*w[0]+sa*w[1]);
00058 if (fabs(cb) < eps) {
00059 if (fabs(dgamma)< eps) {
00060 dgamma = 0.0;
00061 } else {
00062 return 1;
00063 }
00064 } else {
00065 dgamma /= cb;
00066 }
00067 double dalpha = w[2] + sb*dgamma;
00068 double dbeta = -sa*w[0]+ca*w[1];
00069 gamma.deriv(i)=dgamma;
00070 alpha.deriv(i)=dalpha;
00071 beta.deriv(i) =dbeta;
00072 } else {
00073 gamma.setDeriv(i,false);
00074 beta.setDeriv(i,false);
00075 alpha.setDeriv(i,false);
00076 }
00077 }
00078 return 0;
00079 }
00087 void SetEulerZYX(const Jacobian<double>& gamma,
00088 const Jacobian<double>& beta,
00089 const Jacobian<double>& alpha,
00090 Jacobian<Rotation>& JR) {
00091
00092 JR.value() = Rotation::EulerZYX(alpha.value(),beta.value(),gamma.value());
00093 double ca = ::cos(alpha.value());
00094 double sa = ::sin(alpha.value());
00095 double cb = ::cos(beta.value());
00096 double sb = ::sin(beta.value());
00097
00098 assert(gamma.nrOfDeriv()==JR.nrOfDeriv());
00099 assert(beta.nrOfDeriv()==JR.nrOfDeriv());
00100 assert(alpha.nrOfDeriv()==JR.nrOfDeriv());
00101 for (int i=0;i<gamma.nrOfDeriv();++i) {
00102 if (gamma.hasDeriv(i) || beta.hasDeriv(i) || alpha.hasDeriv(i) ) {
00103 Vector w;
00104 double dalpha = alpha.deriv(i);
00105 double dbeta = beta.deriv(i);
00106 double dgamma = gamma.deriv(i);
00107 w[0] = -sa*dbeta + ca*cb*dgamma;
00108 w[1] = ca*dbeta + sa*cb*dgamma;
00109 w[2] = dalpha - sb*dgamma;
00110 JR.deriv(i) = w;
00111 } else {
00112 JR.setDeriv(i,false);
00113 }
00114 }
00115 }
00116
00117
00118 }