EigenTools.cpp
Go to the documentation of this file.
00001 #include <EigenTools.hpp>
00002 
00003 namespace telekyb_state {
00004 
00005 inline Eigen::Matrix<double,3,4> EigenTools::gamma(Eigen::Quaterniond q, Eigen::Vector3d v)
00006 {
00007         double q0 = q.w();
00008         Eigen::Vector3d e = q.vec();
00009 
00010         Eigen::Matrix3d evT = e*v.transpose();
00011         Eigen::Matrix3d veT = evT.transpose();
00012         double eTv = evT.trace();
00013 
00014         Eigen::Matrix<double,3,4> out;
00015         out << q0*v+hat(e)*v, evT-veT+eTv*Eigen::Matrix3d::Identity()-q0*hat(v);
00016         return out;
00017 }
00018 
00019 inline Eigen::Matrix3d EigenTools::hat(Eigen::Vector3d v)
00020 {
00021         Eigen::Matrix3d out;
00022         out <<     0, -v(3),  v(2),
00023                 v(3),     0, -v(1),
00024            -v(2),  v(1),     0;
00025         return out;
00026 }
00027 
00028 inline
00029 Eigen::Matrix<double, 4, 3> EigenTools::matW(Eigen::Quaterniond q)
00030 {
00031         double q0 = q.w();
00032         Eigen::Vector3d e = q.vec();
00033 
00034         Eigen::Matrix<double, 4, 3> out;
00035         out <<                                  -e.transpose(),
00036                  q0*Eigen::Matrix3d::Identity()+hat(e);
00037         return out;
00038 }
00039 
00040 inline
00041 Eigen::Matrix<double, 4, 4> EigenTools::qLeft(Eigen::Quaterniond q)
00042 {
00043         double q0 = q.w();
00044         Eigen::Vector3d e = q.vec();
00045 
00046         Eigen::Matrix<double, 4, 4> out;
00047         out(0) = q0;
00048         out.block(1,0,3,1) = e;
00049         out.block(0,1,4,3) = matW(q);
00050         return out;
00051 }
00052 
00053 inline
00054 Eigen::Matrix<double, 3, 4> EigenTools::jacpq(Eigen::Quaterniond q)
00055 {
00056         double q0 = q.w();
00057         Eigen::Vector3d e = q.vec();
00058 
00059         Eigen::Matrix<double, 3, 4> out;
00060         out <<  -e/((1+q0)*(1+q0)), Eigen::Matrix3d::Identity()/(1+q0);
00061         return out;
00062 }
00063 
00064 inline
00065 Eigen::Matrix<double, 4, 3> EigenTools::jacqp(Eigen::Quaterniond q)
00066 {
00067         double q0 = q.w();
00068         Eigen::Vector3d e = q.vec();
00069 
00070         Eigen::Matrix<double, 4, 3> out;
00071         out <<                                                          -(1+q0)*e.transpose(),
00072                         (1+q0)*Eigen::Matrix3d::Identity()-e*e.transpose();
00073         return out;
00074 }
00075 
00076 inline
00077 Eigen::Vector3d EigenTools::toRodrigues(Eigen::Quaterniond q)
00078 {
00079         double q0 = q.w();
00080         Eigen::Vector3d e = q.vec();
00081         return e/(1+q0);
00082 }
00083 
00084 inline
00085 Eigen::Quaterniond EigenTools::toQuaternion(Eigen::Vector3d p)
00086 {
00087         double pTp = p.norm();
00088         double w = (1-pTp)/(1+pTp);
00089         Eigen::Vector3d vec = 2*p/(1+pTp);
00090         Eigen::Quaterniond q(w,vec(0),vec(1),vec(2));
00091         return q;
00092 }
00093 
00094 inline
00095 Eigen::Quaterniond EigenTools::toQuaternion(Eigen::Vector4d v)
00096 {
00097         return Eigen::Quaterniond(v(0),v(1),v(2),v(3));
00098 }
00099 
00100 inline
00101 Eigen::Vector4d EigenTools::toVector(Eigen::Quaterniond q)
00102 {
00103         return Eigen::Vector4d(q.w(),q.x(),q.y(),q.z());
00104 }
00105 
00106 int EigenTools::min(const Eigen::Vector4d& vec, double & step)
00107 {
00108         int k=0;
00109         for (int i=0; i<4; i++)
00110         {
00111                 if (vec(i)<vec(k)) k = i;
00112         }
00113         step = vec(k);
00114         return k;
00115 }
00116 
00117 } /* namespace telekyb_state */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends


tk_state
Author(s): Dr. Antonio Franchi and Martin Riedel
autogenerated on Mon Nov 11 2013 11:13:03