made all classes that currently have an assert_equal "Testable"

- derive from testable as in class Point2 : Testable<Point2>
- moved print and equal declarations in .h right after the constructor
- similarly, moved implementations after constructors in .cpp file
- removed obsolete assert_equal
release/4.3a0
Brian Law 2009-10-26 19:26:51 +00:00
parent 3b30fe50b0
commit 11f0d04cb6
12 changed files with 97 additions and 174 deletions

View File

@ -43,18 +43,6 @@ bool Cal3_S2::equals(const Cal3_S2& K, double tol) const {
/* ************************************************************************* */ /* ************************************************************************* */
bool assert_equal(const Cal3_S2& actual, const Cal3_S2& expected, double tol) {
bool ret = actual.equals(expected, tol);
if (!ret) {
cout << "Not Equal:" << endl;
actual.print("Actual");
expected.print("Expected");
}
return ret;
}
/* ************************************************************************* */
Point2 uncalibrate(const Cal3_S2& K, const Point2& p) { Point2 uncalibrate(const Cal3_S2& K, const Point2& p) {
return K.uncalibrate(p); return K.uncalibrate(p);
} }

View File

@ -12,7 +12,7 @@
namespace gtsam { namespace gtsam {
/** The most common 5DOF 3D->2D calibration */ /** The most common 5DOF 3D->2D calibration */
class Cal3_S2 { class Cal3_S2: Testable<Cal3_S2> {
private: private:
double fx_, fy_, s_, u0_, v0_; double fx_, fy_, s_, u0_, v0_;
@ -31,6 +31,15 @@ namespace gtsam {
fx_(fx), fy_(fy), s_(s), u0_(u0), v0_(v0) { fx_(fx), fy_(fy), s_(s), u0_(u0), v0_(v0) {
} }
void print(const std::string& s = "") const {
gtsam::print(matrix(), s);
}
/**
* Check if equal up to specified tolerance
*/
bool equals(const Cal3_S2& K, double tol = 10e-9) const;
/** /**
* return DOF, dimensionality of tangent space * return DOF, dimensionality of tangent space
*/ */
@ -82,10 +91,6 @@ namespace gtsam {
return Point2(fx_ * x + s_ * y + u0_, fy_ * y + v0_); return Point2(fx_ * x + s_ * y + u0_, fy_ * y + v0_);
} }
void print(const std::string& s = "") const {
gtsam::print(matrix(), s);
}
std::string dump() const { std::string dump() const {
char buffer[100]; char buffer[100];
buffer[0] = 0; buffer[0] = 0;
@ -93,11 +98,6 @@ namespace gtsam {
return std::string(buffer); return std::string(buffer);
} }
/**
* Check if equal up to specified tolerance
*/
bool equals(const Cal3_S2& K, double tol = 10e-9) const;
/** friends */ /** friends */
friend Matrix Duncalibrate2(const Cal3_S2& K, const Point2& p); friend Matrix Duncalibrate2(const Cal3_S2& K, const Point2& p);
@ -115,11 +115,6 @@ namespace gtsam {
} }
}; };
/**
* assert for unit tests
*/
bool assert_equal(const Cal3_S2& actual, const Cal3_S2& expected, double tol = 1e-8);
/** /**
* convert intrinsic coordinates xy to image coordinates uv * convert intrinsic coordinates xy to image coordinates uv
*/ */

View File

@ -38,24 +38,6 @@ LinearConstraint::LinearConstraint(const std::map<std::string, Matrix>& matrices
{ {
} }
ConstrainedConditionalGaussian::shared_ptr LinearConstraint::eliminate(const std::string& key) {
// check to ensure key is one of constraint nodes
const_iterator it = As.find(key);
if (it == As.end())
throw invalid_argument("Node " + key + " is not in LinearConstraint");
// extract the leading matrix
Matrix A1 = it->second;
// assemble parents
map<string, Matrix> parents = As;
parents.erase(key);
// construct resulting CCG with parts
ConstrainedConditionalGaussian::shared_ptr ccg(new ConstrainedConditionalGaussian(A1, parents, b));
return ccg;
}
void LinearConstraint::print(const string& s) const { void LinearConstraint::print(const string& s) const {
cout << s << ": " << endl; cout << s << ": " << endl;
string key; Matrix A; string key; Matrix A;
@ -85,6 +67,24 @@ bool LinearConstraint::equals(const LinearConstraint& f, double tol) const {
return true; return true;
} }
ConstrainedConditionalGaussian::shared_ptr LinearConstraint::eliminate(const std::string& key) {
// check to ensure key is one of constraint nodes
const_iterator it = As.find(key);
if (it == As.end())
throw invalid_argument("Node " + key + " is not in LinearConstraint");
// extract the leading matrix
Matrix A1 = it->second;
// assemble parents
map<string, Matrix> parents = As;
parents.erase(key);
// construct resulting CCG with parts
ConstrainedConditionalGaussian::shared_ptr ccg(new ConstrainedConditionalGaussian(A1, parents, b));
return ccg;
}
bool LinearConstraint::involves(const std::string& key) const { bool LinearConstraint::involves(const std::string& key) const {
return As.find(key) != As.end(); return As.find(key) != As.end();
} }
@ -104,17 +104,6 @@ string LinearConstraint::dump() const {
return ret; return ret;
} }
bool assert_equal(const LinearConstraint& actual,
const LinearConstraint& expected, double tol) {
bool ret = actual.equals(expected, tol);
if (!ret) {
cout << "Not Equal:" << endl;
actual.print("Actual");
expected.print("Expected");
}
return ret;
}
LinearConstraint::shared_ptr combineConstraints( LinearConstraint::shared_ptr combineConstraints(
const set<LinearConstraint::shared_ptr>& constraints) { const set<LinearConstraint::shared_ptr>& constraints) {
map<string, Matrix> blocks; map<string, Matrix> blocks;

View File

@ -18,7 +18,7 @@ namespace gtsam {
* Linear constraints are similar to factors in structure, but represent * Linear constraints are similar to factors in structure, but represent
* a different problem * a different problem
*/ */
class LinearConstraint { class LinearConstraint: Testable<LinearConstraint> {
public: public:
typedef boost::shared_ptr<LinearConstraint> shared_ptr; typedef boost::shared_ptr<LinearConstraint> shared_ptr;
@ -69,17 +69,6 @@ public:
~LinearConstraint() { ~LinearConstraint() {
} }
/**
* Eliminates the constraint
* Note: Assumes that the constraint will be completely eliminated
* and that the matrix associated with the key is invertible
* @param key is the variable to eliminate
* @return a constrained conditional gaussian for the variable that is a
* function of its parents
*/
ConstrainedConditionalGaussian::shared_ptr
eliminate(const std::string& key);
/** /**
* print * print
* @param s optional string naming the factor * @param s optional string naming the factor
@ -91,6 +80,16 @@ public:
*/ */
bool equals(const LinearConstraint& f, double tol = 1e-9) const; bool equals(const LinearConstraint& f, double tol = 1e-9) const;
/**
* Eliminates the constraint
* Note: Assumes that the constraint will be completely eliminated
* and that the matrix associated with the key is invertible
* @param key is the variable to eliminate
* @return a constrained conditional gaussian for the variable that is a
* function of its parents
*/
ConstrainedConditionalGaussian::shared_ptr
eliminate(const std::string& key);
/** /**
* returns a version of the factor as a string * returns a version of the factor as a string
*/ */
@ -138,10 +137,6 @@ public:
*/ */
LinearConstraint::shared_ptr combineConstraints(const std::set<LinearConstraint::shared_ptr>& constraints); LinearConstraint::shared_ptr combineConstraints(const std::set<LinearConstraint::shared_ptr>& constraints);
/** assert equals for testing - prints when not equal */
bool assert_equal(const LinearConstraint& actual,
const LinearConstraint& expected, double tol = 1e-9);
} }
#endif /* EQUALITYFACTOR_H_ */ #endif /* EQUALITYFACTOR_H_ */

View File

@ -8,6 +8,11 @@
namespace gtsam { namespace gtsam {
/* ************************************************************************* */
bool Point3::equals(const Point3 & q, double tol) const {
return (fabs(x_ - q.x()) < tol && fabs(y_ - q.y()) < tol && fabs(z_ - q.z()) < tol);
}
/* ************************************************************************* */ /* ************************************************************************* */
bool Point3::operator== (const Point3& q) const { bool Point3::operator== (const Point3& q) const {
@ -58,11 +63,6 @@ Matrix Dsub1(const Point3 &p, const Point3 &q) {
Matrix Dsub2(const Point3 &p, const Point3 &q) { Matrix Dsub2(const Point3 &p, const Point3 &q) {
return -eye(3,3); return -eye(3,3);
} }
/* ************************************************************************* */
bool Point3::equals(const Point3 & q, double tol) const {
return (fabs(x_ - q.x()) < tol && fabs(y_ - q.y()) < tol && fabs(z_ - q.z()) < tol);
}
/* ************************************************************************* */ /* ************************************************************************* */
Point3 cross(const Point3 &p, const Point3 &q) Point3 cross(const Point3 &p, const Point3 &q)
{ {
@ -81,14 +81,5 @@ double norm(const Point3 &p)
return sqrt( p.x_*p.x_ + p.y_*p.y_ + p.z_*p.z_ ); return sqrt( p.x_*p.x_ + p.y_*p.y_ + p.z_*p.z_ );
} }
/* ************************************************************************* */ /* ************************************************************************* */
bool assert_equal(const Point3& p, const Point3& q, double tol) {
if(p.equals(q,tol)) return true;
printf("not equal:\n");
p.print("p = ");
q.print("q = ");
(p-q).print("p-q = ");
return false;
}
/* ************************************************************************* */
} // namespace gtsam } // namespace gtsam

View File

@ -13,11 +13,12 @@
#include <boost/serialization/nvp.hpp> #include <boost/serialization/nvp.hpp>
#include "Matrix.h" #include "Matrix.h"
#include "Testable.h"
namespace gtsam { namespace gtsam {
/** A 3D point */ /** A 3D point */
class Point3 { class Point3: Testable<Point3> {
private: private:
double x_, y_, z_; double x_, y_, z_;
@ -27,6 +28,14 @@ namespace gtsam {
Point3(double x, double y, double z): x_(x), y_(y), z_(z) {} Point3(double x, double y, double z): x_(x), y_(y), z_(z) {}
Point3(const Vector& v) : x_(v(0)), y_(v(1)), z_(v(2)) {} Point3(const Vector& v) : x_(v(0)), y_(v(1)), z_(v(2)) {}
/** print with optional string */
void print(const std::string& s = "") const {
std::cout << s << "(" << x_ << ", " << y_ << ", " << z_ << ")" << std::endl;
}
/** equals with an tolerance */
bool equals(const Point3& p, double tol = 1e-9) const;
/** return DOF, dimensionality of tangent space */ /** return DOF, dimensionality of tangent space */
size_t dim() const { return 3;} size_t dim() const { return 3;}
@ -53,19 +62,11 @@ namespace gtsam {
Point3 operator * (double s) const; Point3 operator * (double s) const;
Point3 operator / (double s) const; Point3 operator / (double s) const;
/** print with optional string */
void print(const std::string& s = "") const {
std::cout << s << "(" << x_ << ", " << y_ << ", " << z_ << ")" << std::endl;
}
/** distance between two points */ /** distance between two points */
double dist(const Point3& p2) const { double dist(const Point3& p2) const {
return sqrt(pow(x()-p2.x(),2.0) + pow(y()-p2.y(),2.0) + pow(z()-p2.z(),2.0)); return sqrt(pow(x()-p2.x(),2.0) + pow(y()-p2.y(),2.0) + pow(z()-p2.z(),2.0));
} }
/** equals with an tolerance */
bool equals(const Point3& p, double tol = 1e-9) const;
/** friends */ /** friends */
friend Point3 cross(const Point3 &p1, const Point3 &p2); friend Point3 cross(const Point3 &p1, const Point3 &p2);
friend double dot(const Point3 &p1, const Point3 &p2); friend double dot(const Point3 &p1, const Point3 &p2);
@ -103,7 +104,4 @@ namespace gtsam {
/** dot product */ /** dot product */
double norm(const Point3 &p); double norm(const Point3 &p);
/** equals with an tolerance, prints out message if unequal */
bool assert_equal(const Point3& p, const Point3& q, double tol = 1e-9);
} }

View File

@ -14,11 +14,6 @@ namespace gtsam {
cout << s << "(" << x_ << ", " << y_ << ", " << theta_ << ")" << endl; cout << s << "(" << x_ << ", " << y_ << ", " << theta_ << ")" << endl;
} }
/* ************************************************************************* */
Pose2 Pose2::exmap(const Vector& v) const {
return Pose2(x_ + v(0), y_ + v(1), theta_ + v(2));
}
/* ************************************************************************* */ /* ************************************************************************* */
bool Pose2::equals(const Pose2& q, double tol) const { bool Pose2::equals(const Pose2& q, double tol) const {
return (fabs(x_ - q.x_) < tol && fabs(y_ - q.y_) < tol && fabs(theta_ return (fabs(x_ - q.x_) < tol && fabs(y_ - q.y_) < tol && fabs(theta_
@ -26,12 +21,8 @@ namespace gtsam {
} }
/* ************************************************************************* */ /* ************************************************************************* */
bool assert_equal(const Pose2& A, const Pose2& B, double tol) { Pose2 Pose2::exmap(const Vector& v) const {
if (A.equals(B, tol)) return true; return Pose2(x_ + v(0), y_ + v(1), theta_ + v(2));
printf("not equal:\n");
A.print("A");
B.print("B");
return false;
} }
/* ************************************************************************* */ /* ************************************************************************* */

View File

@ -9,13 +9,14 @@
#pragma once #pragma once
#include "Point2.h" #include "Point2.h"
#include "Testable.h"
namespace gtsam { namespace gtsam {
/** /**
* A 2D pose (x,y,theta) * A 2D pose (x,y,theta)
*/ */
class Pose2 { class Pose2: Testable<Pose2> {
private: private:
double x_, y_, theta_; double x_, y_, theta_;
@ -47,21 +48,18 @@ namespace gtsam {
x_(t.x()), y_(t.y()), theta_(theta) { x_(t.x()), y_(t.y()), theta_(theta) {
} }
/** print with optional string */
void print(const std::string& s = "") const;
/** assert equality up to a tolerance */
bool equals(const Pose2& pose, double tol = 1e-9) const;
/** get functions for x, y, theta */ /** get functions for x, y, theta */
double x() const { return x_;} double x() const { return x_;}
double y() const { return y_;} double y() const { return y_;}
double theta() const { return theta_;} double theta() const { return theta_;}
/** print with optional string */
void print(const std::string& s = "") const;
Pose2 exmap(const Vector& v) const; Pose2 exmap(const Vector& v) const;
/** assert equality up to a tolerance */
bool equals(const Pose2& pose, double tol = 1e-9) const;
}; };
/** assert equality up to a tolerance */
bool assert_equal(const Pose2& A, const Pose2& B, double tol = 1e-9);
} // namespace gtsam } // namespace gtsam

View File

@ -9,6 +9,18 @@ using namespace std;
namespace gtsam { namespace gtsam {
/* ************************************************************************* */
void Pose3::print(const string& s) const {
R_.print(s + ".R");
t_.print(s + ".t");
}
/* ************************************************************************* */
bool Pose3::equals(const Pose3& pose, double tol) const
{
return R_.equals(pose.R_,tol) && t_.equals(pose.t_,tol);
}
/* ************************************************************************* */ /* ************************************************************************* */
// Agrawal06iros, formula (6), seems to suggest this could be wrong: // Agrawal06iros, formula (6), seems to suggest this could be wrong:
Pose3 Pose3::exmap(const Vector& v) const { Pose3 Pose3::exmap(const Vector& v) const {
@ -28,12 +40,6 @@ Matrix Pose3::matrix() const {
return stack(2, &A34, &A14); return stack(2, &A34, &A14);
} }
/* ************************************************************************* */
void Pose3::print(const string& s) const {
R_.print(s + ".R");
t_.print(s + ".t");
}
/* ************************************************************************* */ /* ************************************************************************* */
Point3 transform_from(const Pose3& pose, const Point3& p) { Point3 transform_from(const Pose3& pose, const Point3& p) {
return pose.R_ * p + pose.t_; return pose.R_ * p + pose.t_;
@ -106,22 +112,6 @@ Pose3 Pose3::inverse() const
return Pose3(Rt,-(Rt*t_)); return Pose3(Rt,-(Rt*t_));
} }
/* ************************************************************************* */
bool Pose3::equals(const Pose3& pose, double tol) const
{
return R_.equals(pose.R_,tol) && t_.equals(pose.t_,tol);
}
/* ************************************************************************* */
bool assert_equal(const Pose3& A, const Pose3& B, double tol)
{
if(A.equals(B,tol)) return true;
printf("not equal:\n");
A.print("A");
B.print("B");
return false;
}
/* ************************************************************************* */ /* ************************************************************************* */
Pose3 Pose3::transformPose_to(const Pose3& pose) const Pose3 Pose3::transformPose_to(const Pose3& pose) const
{ {

View File

@ -9,11 +9,12 @@
#include "Point3.h" #include "Point3.h"
#include "Rot3.h" #include "Rot3.h"
#include "Testable.h"
namespace gtsam { namespace gtsam {
/** A 3D pose (R,t) : (Rot3,Point3) */ /** A 3D pose (R,t) : (Rot3,Point3) */
class Pose3 { class Pose3 : Testable<Pose3> {
private: private:
Rot3 R_; Rot3 R_;
Point3 t_; Point3 t_;
@ -51,6 +52,12 @@ namespace gtsam {
t_(V(9), V(10),V(11)) { t_(V(9), V(10),V(11)) {
} }
/** print with optional string */
void print(const std::string& s = "") const;
/** assert equality up to a tolerance */
bool equals(const Pose3& pose, double tol = 1e-9) const;
const Rot3& rotation() const { const Rot3& rotation() const {
return R_; return R_;
} }
@ -81,15 +88,9 @@ namespace gtsam {
/** convert to 4*4 matrix */ /** convert to 4*4 matrix */
Matrix matrix() const; Matrix matrix() const;
/** print with optional string */
void print(const std::string& s = "") const;
/** transforms */ /** transforms */
Pose3 transformPose_to(const Pose3& transform) const; Pose3 transformPose_to(const Pose3& transform) const;
/** assert equality up to a tolerance */
bool equals(const Pose3& pose, double tol = 1e-9) const;
/** friends */ /** friends */
friend Point3 transform_from(const Pose3& pose, const Point3& p); friend Point3 transform_from(const Pose3& pose, const Point3& p);
friend Point3 transform_to(const Pose3& pose, const Point3& p); friend Point3 transform_to(const Pose3& pose, const Point3& p);
@ -131,7 +132,4 @@ namespace gtsam {
*/ */
Matrix DhPose(const Vector& x); Matrix DhPose(const Vector& x);
/** assert equality up to a tolerance */
bool assert_equal(const Pose3& A, const Pose3& B, double tol = 1e-9);
} // namespace gtsam } // namespace gtsam

View File

@ -12,6 +12,11 @@ using namespace std;
namespace gtsam { namespace gtsam {
/* ************************************************************************* */
bool Rot3::equals(const Rot3 & R, double tol) const {
return equal_with_abs_tol(matrix(), R.matrix(), tol);
}
/* ************************************************************************* */ /* ************************************************************************* */
/** faster than below ? */ /** faster than below ? */
/* ************************************************************************* */ /* ************************************************************************* */
@ -77,11 +82,6 @@ namespace gtsam {
return R.unrotate(p); return R.unrotate(p);
} }
/* ************************************************************************* */
bool Rot3::equals(const Rot3 & R, double tol) const {
return equal_with_abs_tol(matrix(), R.matrix(), tol);
}
/* ************************************************************************* */ /* ************************************************************************* */
/** see libraries/caml/geometry/math.lyx, derivative of unrotate */ /** see libraries/caml/geometry/math.lyx, derivative of unrotate */
/* ************************************************************************* */ /* ************************************************************************* */
@ -95,15 +95,6 @@ namespace gtsam {
return R.transpose(); return R.transpose();
} }
/* ************************************************************************* */
bool assert_equal(const Rot3 & A, const Rot3 & B, double tol) {
if(A.equals(B,tol)) return true;
printf("not equal:\n");
A.print("A");
B.print("B");
return false;
}
/* ************************************************************************* */ /* ************************************************************************* */
/** This function receives a rotation 3 by 3 matrix and returns 3 rotation angles. /** This function receives a rotation 3 by 3 matrix and returns 3 rotation angles.
* The implementation is based on the algorithm in multiple view geometry * The implementation is based on the algorithm in multiple view geometry

View File

@ -11,11 +11,12 @@
#pragma once #pragma once
#include "Point3.h" #include "Point3.h"
#include "Testable.h"
namespace gtsam { namespace gtsam {
/* Rotation matrix */ /* Rotation matrix */
class Rot3{ class Rot3: Testable<Rot3> {
private: private:
/** we store columns ! */ /** we store columns ! */
Point3 r1_, r2_, r3_; Point3 r1_, r2_, r3_;
@ -54,6 +55,12 @@ namespace gtsam {
r2_(Point3(R(0,1), R(1,1), R(2,1))), r2_(Point3(R(0,1), R(1,1), R(2,1))),
r3_(Point3(R(0,2), R(1,2), R(2,2))) {} r3_(Point3(R(0,2), R(1,2), R(2,2))) {}
/** print */
void print(const std::string& s="R") const { gtsam::print(matrix(), s);}
/** equals with an tolerance */
bool equals(const Rot3& p, double tol = 1e-9) const;
/** return DOF, dimensionality of tangent space */ /** return DOF, dimensionality of tangent space */
size_t dim() const { return 3;} size_t dim() const { return 3;}
@ -121,12 +128,6 @@ namespace gtsam {
); );
} }
/** print */
void print(const std::string& s="R") const { gtsam::print(matrix(), s);}
/** equals with an tolerance */
bool equals(const Rot3& p, double tol = 1e-9) const;
/** friends */ /** friends */
friend Matrix Dunrotate1(const Rot3& R, const Point3& p); friend Matrix Dunrotate1(const Rot3& R, const Point3& p);
@ -190,8 +191,6 @@ namespace gtsam {
Matrix Dunrotate1(const Rot3& R, const Point3& p); Matrix Dunrotate1(const Rot3& R, const Point3& p);
Matrix Dunrotate2(const Rot3& R); // does not depend on p ! Matrix Dunrotate2(const Rot3& R); // does not depend on p !
bool assert_equal(const Rot3& A, const Rot3& B, double tol=1e-9);
/** receives a rotation 3 by 3 matrix and returns 3 rotation angles.*/ /** receives a rotation 3 by 3 matrix and returns 3 rotation angles.*/
Vector RQ(Matrix R); Vector RQ(Matrix R);