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 }