Calico
A visual-inertial calibration library designed for rapid problem construction and debugging.
typedefs.h
1 #ifndef CALICO_TYPEDEFS_H_
2 #define CALICO_TYPEDEFS_H_
3 
4 #include <iostream>
5 
6 #include "Eigen/Dense"
7 
8 namespace Eigen {
9 
10 template <typename T>
11 using Vector2 = Matrix<T, 2, 1>;
12 
13 template <typename T>
14 using Vector3 = Matrix<T, 3, 1>;
15 
16 template <typename T>
17 using Vector4 = Matrix<T, 4, 1>;
18 
19 template <typename T>
20 using VectorX = Matrix<T, Dynamic, 1>;
21 
22 template <typename T>
23 using MatrixX = Matrix<T, Dynamic, Dynamic>;
24 
25 template <typename T>
26 using Matrix3 = Matrix<T, 3, 3>;
27 
28 template <typename T, int N>
29 using Vector = Matrix<T, N, 1>;
30 
31 } // namespace Eigen
32 
33 namespace calico {
34 
37 template <typename T>
38 class Pose3 {
39  public:
40  Pose3() {
41  q_.setIdentity();
42  t_.setZero();
43  }
44 
45  Pose3(const Eigen::Quaternion<T>& q, const Eigen::Vector3<T>& t)
46  : q_(q), t_(t) {}
47 
49  Eigen::Quaternion<T>& rotation() { return q_; }
50  const Eigen::Quaternion<T>& rotation() const { return q_; }
51 
53  Eigen::Vector3<T>& translation() { return t_; }
54  const Eigen::Vector3<T>& translation() const { return t_; }
55 
58  void SetRotation(const Eigen::Vector4<T>& q) {
59  const Eigen::Vector4<T> qn = q.normalized();
60  q_.w() = qn(0);
61  q_.x() = qn(1);
62  q_.y() = qn(2);
63  q_.z() = qn(3);
64  }
65 
68  Eigen::Vector4<T> GetRotation() const {
69  return Eigen::Vector4<T>(q_.w(), q_.x(), q_.y(), q_.z());
70  }
71 
73  void SetTranslation(const Eigen::Vector3<T>& t) { t_ = t; }
74 
76  Eigen::Vector3<T> GetTranslation() const { return t_; }
77 
84  Pose3 operator*(const Pose3<T>& T_b_a) const {
85  // this = T_c_b
86  const Eigen::Quaternion<T>& q_c_b = this->rotation();
87  const Eigen::Quaternion<T>& q_b_a = T_b_a.rotation();
88  const Eigen::Vector3<T>& t_c_b = this->translation();
89  const Eigen::Vector3<T>& t_b_a = T_b_a.translation();
90  const Eigen::Quaternion<T> q_c_a = q_c_b * q_b_a;
91  const Eigen::Vector3<T> t_c_a = q_c_b * t_b_a + t_c_b;
92  return Pose3(q_c_a, t_c_a);
93  }
94 
101  Eigen::Vector3<T> operator*(const Eigen::Vector3<T>& p) const {
102  return this->rotation() * p + this->translation();
103  }
104 
110  Pose3<T> inverse() const {
111  const Eigen::Quaternion<T> q_inv = this->rotation().conjugate();
112  const Eigen::Vector3<T> t_inv = -(q_inv * this->translation());
113  return Pose3(q_inv, t_inv);
114  }
115 
117  bool isApprox(const Pose3<T>& pose) const {
118  return (pose.rotation().isApprox(q_) && pose.translation().isApprox(t_));
119  }
120 
127  friend std::ostream& operator<<(std::ostream& os, const Pose3<T>& pose) {
128  os << "q: " << pose.rotation().w() << " " << pose.rotation().x() << " "
129  << pose.rotation().y() << " " << pose.rotation().z()
130  << ", t: " << pose.translation().transpose();
131  return os;
132  }
133 
134  private:
135  Eigen::Quaternion<T> q_;
136  Eigen::Vector3<T> t_;
137 };
138 
139 using Pose3d = Pose3<double>;
140 
141 } // namespace calico
142 
143 #endif // CALICO_TYPEDEFS_H_
Definition: typedefs.h:38
Eigen::Vector3< T > operator*(const Eigen::Vector3< T > &p) const
Definition: typedefs.h:101
Eigen::Vector3< T > GetTranslation() const
Translation getter for python bindings.
Definition: typedefs.h:76
Eigen::Vector3< T > & translation()
Translation accessor.
Definition: typedefs.h:53
Pose3< T > inverse() const
Definition: typedefs.h:110
Pose3 operator*(const Pose3< T > &T_b_a) const
Definition: typedefs.h:84
bool isApprox(const Pose3< T > &pose) const
Convenience method for checking if two poses are close in value.
Definition: typedefs.h:117
Eigen::Quaternion< T > & rotation()
Rotation accessor.
Definition: typedefs.h:49
friend std::ostream & operator<<(std::ostream &os, const Pose3< T > &pose)
Definition: typedefs.h:127
void SetTranslation(const Eigen::Vector3< T > &t)
Translation setter for python bindings.
Definition: typedefs.h:73
void SetRotation(const Eigen::Vector4< T > &q)
Definition: typedefs.h:58
Eigen::Vector4< T > GetRotation() const
Definition: typedefs.h:68
Primary calico namespace.
Definition: __init__.py:1