diff --git a/cpp/VSLAMFactor.cpp b/cpp/VSLAMFactor.cpp index 1d7002306..b20bbca6a 100644 --- a/cpp/VSLAMFactor.cpp +++ b/cpp/VSLAMFactor.cpp @@ -11,8 +11,9 @@ using namespace std; using namespace gtsam; /* ************************************************************************* */ -VSLAMFactor::VSLAMFactor(const Vector& z, double sigma, int cn, int ln, const Cal3_S2 &K) - : NonlinearFactor(z, sigma) +template +VSLAMFactor::VSLAMFactor(const Vector& z, double sigma, int cn, int ln, const Cal3_S2 &K) + : NonlinearFactor(z, sigma) { cameraFrameNumber_ = cn; landmarkNumber_ = ln; @@ -27,24 +28,27 @@ VSLAMFactor::VSLAMFactor(const Vector& z, double sigma, int cn, int ln, const Ca } /* ************************************************************************* */ -void VSLAMFactor::print(const std::string& s) const { +template +void VSLAMFactor::print(const std::string& s) const { printf("%s %s %s\n", s.c_str(), cameraFrameName_.c_str(), landmarkName_.c_str()); - ::print(z_, s+".z"); + ::print(ConvenientFactor::z_, s+".z"); } /* ************************************************************************* */ -Vector VSLAMFactor::error_vector(const FGConfig& c) const { +template +Vector VSLAMFactor::error_vector(const Config& c) const { Pose3 pose = c[cameraFrameName_]; Point3 landmark = c[landmarkName_]; // Right-hand-side b = (z - h(x))/sigma Vector h = project(SimpleCamera(K_,pose), landmark).vector(); - return (z_ - h); + return (ConvenientFactor::z_ - h); } /* ************************************************************************* */ -LinearFactor::shared_ptr VSLAMFactor::linearize(const FGConfig& c) const +template +LinearFactor::shared_ptr VSLAMFactor::linearize(const Config& c) const { // get arguments from config Pose3 pose = c[cameraFrameName_]; // cast from Vector to Pose3 !!! @@ -58,20 +62,21 @@ LinearFactor::shared_ptr VSLAMFactor::linearize(const FGConfig& c) const // Right-hand-side b = (z - h(x)) Vector h = project(camera, landmark).vector(); - Vector b = z_ - h; + Vector b = ConvenientFactor::z_ - h; // Make new linearfactor, divide by sigma LinearFactor::shared_ptr - p(new LinearFactor(cameraFrameName_, Dh1/sigma_, landmarkName_, Dh2/sigma_, b/sigma_)); + p(new LinearFactor(cameraFrameName_, Dh1/ConvenientFactor::sigma_, landmarkName_, Dh2/ConvenientFactor::sigma_, b/ConvenientFactor::sigma_)); return p; } /* ************************************************************************* */ -bool VSLAMFactor::equals(const NonlinearFactor& f, double tol) const { +template +bool VSLAMFactor::equals(const NonlinearFactor& f, double tol) const { const VSLAMFactor* p = dynamic_cast(&f); if (p == NULL) goto fail; if (cameraFrameNumber_ != p->cameraFrameNumber_ || landmarkNumber_ != p->landmarkNumber_) goto fail; - if (!equal_with_abs_tol(z_,p->z_,tol)) goto fail; + if (!equal_with_abs_tol(ConvenientFactor::z_,p->z_,tol)) goto fail; return true; fail: @@ -81,14 +86,15 @@ bool VSLAMFactor::equals(const NonlinearFactor& f, double tol) const { } /* ************************************************************************* */ -string VSLAMFactor::dump() const +template +string VSLAMFactor::dump() const { int i = getCameraFrameNumber(); int j = getLandmarkNumber(); - Vector z = measurement(); + Vector z = ConvenientFactor::measurement(); char buffer[200]; buffer[0] = 0; - sprintf(buffer, "1 %d %d %f %d", i, j , sigma(), (int)z.size()); + sprintf(buffer, "1 %d %d %f %d", i, j , ConvenientFactor::sigma(), (int)z.size()); for(size_t i = 0; i < z.size(); i++) sprintf(buffer, "%s %f", buffer, z(i)); sprintf(buffer, "%s %s", buffer, K_.dump().c_str()); diff --git a/cpp/VSLAMFactor.h b/cpp/VSLAMFactor.h index f0a2a115d..bbbdf0178 100644 --- a/cpp/VSLAMFactor.h +++ b/cpp/VSLAMFactor.h @@ -14,18 +14,20 @@ namespace gtsam { + /** * Non-linear factor for a constraint derived from a 2D measurement, * i.e. the main building block for visual SLAM. */ -class VSLAMFactor : public NonlinearFactor +template +class VSLAMFactor : public NonlinearFactor { private: int cameraFrameNumber_, landmarkNumber_; std::string cameraFrameName_, landmarkName_; Cal3_S2 K_; // Calibration stored in each factor. FD: need to think about this. - + typedef gtsam::NonlinearFactor ConvenientFactor; public: typedef boost::shared_ptr shared_ptr; // shorthand for a smart pointer to a factor @@ -50,17 +52,17 @@ class VSLAMFactor : public NonlinearFactor /** * calculate the error of the factor */ - Vector error_vector(const FGConfig&) const; + Vector error_vector(const Config&) const; /** * linerarization */ - LinearFactor::shared_ptr linearize(const FGConfig&) const; + LinearFactor::shared_ptr linearize(const Config&) const; /** * equals */ - bool equals(const NonlinearFactor&, double tol=1e-9) const; + bool equals(const NonlinearFactor&, double tol=1e-9) const; int getCameraFrameNumber() const { return cameraFrameNumber_; } int getLandmarkNumber() const { return landmarkNumber_; }