diff --git a/gtsam/geometry/CameraSet.h b/gtsam/geometry/CameraSet.h index b1bd20c4a..27c0a78f3 100644 --- a/gtsam/geometry/CameraSet.h +++ b/gtsam/geometry/CameraSet.h @@ -30,12 +30,10 @@ namespace gtsam { * Assumes that a camera is laid out as 6 Pose3 parameters then calibration */ template -class CameraSet { +class CameraSet: public std::vector { private: - std::vector cameras_; - /** * 2D measurement and noise model for each of the m views * The order is kept the same as the keys that we use to create the factor. @@ -45,25 +43,8 @@ private: static const int ZDim = traits::dimension; ///< Measurement dimension static const int Dim = traits::dimension; ///< Camera dimension - /// shorthand for this class - typedef CameraSet This; - public: - /// Default Constructor - CameraSet() { - } - - /// Add a new camera - void add(const CAMERA& camera) { - cameras_.push_back(camera); - } - - /// Retrieve ith camera - const CAMERA& operator[](size_t i) const { - return cameras_[i]; - } - /** * print * @param s optional string naming the factor @@ -71,15 +52,17 @@ public: */ void print(const std::string& s = "") const { std::cout << s << "CameraSet, cameras = \n"; - for (size_t k = 0; k < cameras_.size(); ++k) - cameras_[k].print(); + for (size_t k = 0; k < this->size(); ++k) + this->at(k).print(); } /// equals virtual bool equals(const CameraSet& p, double tol = 1e-9) const { + if (this->size() != p.size()) + return false; bool camerasAreEqual = true; - for (size_t i = 0; i < cameras_.size(); i++) { - if (cameras_.at(i).equals(p.cameras_.at(i), tol) == false) + for (size_t i = 0; i < this->size(); i++) { + if (this->at(i).equals(p.at(i), tol) == false) camerasAreEqual = false; break; } @@ -94,26 +77,20 @@ public: boost::none, boost::optional E = boost::none, boost::optional H = boost::none) const { - size_t nrCameras = cameras_.size(); - if (F) - F->resize(ZDim * nrCameras, 6); - if (E) - E->resize(ZDim * nrCameras, 3); - if (H && Dim > 6) - H->resize(ZDim * nrCameras, Dim - 6); + size_t nrCameras = this->size(); + if (F) F->resize(ZDim * nrCameras, 6); + if (E) E->resize(ZDim * nrCameras, 3); + if (H && Dim > 6) H->resize(ZDim * nrCameras, Dim - 6); std::vector z(nrCameras); - for (size_t i = 0; i < cameras_.size(); i++) { + for (size_t i = 0; i < nrCameras; i++) { Eigen::Matrix Fi; Eigen::Matrix Ei; Eigen::Matrix Hi; - z[i] = cameras_[i].project(point, F ? &Fi : 0, E ? &Ei : 0, H ? &Hi : 0); - if (F) - F->block(ZDim * i, 0) = Fi; - if (E) - E->block(ZDim * i, 0) = Ei; - if (H) - H->block(ZDim * i, 0) = Hi; + z[i] = this->at(i).project(point, F ? &Fi : 0, E ? &Ei : 0, H ? &Hi : 0); + if (F) F->block(ZDim * i, 0) = Fi; + if (E) E->block(ZDim * i, 0) = Ei; + if (H) H->block(ZDim * i, 0) = Hi; } return z; } @@ -124,7 +101,7 @@ private: friend class boost::serialization::access; template void serialize(ARCHIVE & ar, const unsigned int version) { - ar & cameras_; + ar & (*this); } }; diff --git a/gtsam/geometry/tests/testCameraSet.cpp b/gtsam/geometry/tests/testCameraSet.cpp index c24ba39b1..42cf0f299 100644 --- a/gtsam/geometry/tests/testCameraSet.cpp +++ b/gtsam/geometry/tests/testCameraSet.cpp @@ -34,13 +34,13 @@ TEST(CameraSet, Pinhole) { typedef vector ZZ; CameraSet set; Camera camera; - set.add(camera); - set.add(camera); + set.push_back(camera); + set.push_back(camera); Point3 p(0, 0, 1); - CHECK(assert_equal(set,set)); + CHECK(assert_equal(set, set)); CameraSet set2 = set; - set2.add(camera); - CHECK(!assert_equal(set,set2)); + set2.push_back(camera); + CHECK(!set.equals(set2)); // Check measurements Point2 expected; @@ -76,20 +76,20 @@ TEST(CameraSet, Stereo) { typedef vector ZZ; CameraSet set; StereoCamera camera; - set.add(camera); - set.add(camera); + set.push_back(camera); + set.push_back(camera); Point3 p(0, 0, 1); - EXPECT_LONGS_EQUAL(6,traits::dimension); + EXPECT_LONGS_EQUAL(6, traits::dimension); // Check measurements - StereoPoint2 expected; + StereoPoint2 expected(0, -1, 0); ZZ z = set.project(p); CHECK(assert_equal(expected, z[0])); CHECK(assert_equal(expected, z[1])); // Calculate expected derivatives using Pinhole - Matrix46 actualF; - Matrix43 actualE; + Matrix66 actualF; + Matrix63 actualE; { Matrix36 F1; Matrix33 E1;