Duplicate measurements are disallowed -> leads to duplicate keys in JacobianFactor

release/4.3a0
Frank Dellaert 2019-06-09 13:23:15 -04:00
parent 30644e9590
commit c007c7715c
4 changed files with 23 additions and 12 deletions

View File

@ -118,14 +118,17 @@ public:
} }
/** /**
* Add a new measurement and pose key * Add a new measurement and pose/camera key
* @param measured_i is the 2m dimensional projection of a single landmark * @param measured is the 2m dimensional projection of a single landmark
* @param poseKey is the index corresponding to the camera observing the landmark * @param key is the index corresponding to the camera observing the landmark
* @param sharedNoiseModel is the measurement noise
*/ */
void add(const Z& measured_i, const Key& cameraKey_i) { void add(const Z& measured, const Key& key) {
this->measured_.push_back(measured_i); if(std::find(keys_.begin(), keys_.end(), key) != keys_.end()) {
this->keys_.push_back(cameraKey_i); throw std::invalid_argument(
"SmartFactorBase::add: adding duplicate measurement for key.");
}
this->measured_.push_back(measured);
this->keys_.push_back(key);
} }
/** /**
@ -133,8 +136,7 @@ public:
*/ */
void add(ZVector& measurements, KeyVector& cameraKeys) { void add(ZVector& measurements, KeyVector& cameraKeys) {
for (size_t i = 0; i < measurements.size(); i++) { for (size_t i = 0; i < measurements.size(); i++) {
this->measured_.push_back(measurements.at(i)); this->add(measurements.at(i), cameraKeys.at(i));
this->keys_.push_back(cameraKeys.at(i));
} }
} }

View File

@ -185,8 +185,13 @@ int main(int argc, char** argv) {
double range = boost::get<2>(triples[k]); double range = boost::get<2>(triples[k]);
if (i > start) { if (i > start) {
if (smart && totalCount < minK) { if (smart && totalCount < minK) {
smartFactors[j]->addRange(i, range); try {
printf("adding range %g for %d on %d",range,(int)j,(int)i);cout << endl; smartFactors[j]->addRange(i, range);
printf("adding range %g for %d on %d",range,(int)j,(int)i);
} catch (const invalid_argument& e) {
printf("warning: omitting duplicate range %g for %d on %d",range,(int)j,(int)i);
}
cout << endl;
} }
else { else {
RangeFactor<Pose2, Point2> factor(i, symbol('L', j), range, RangeFactor<Pose2, Point2> factor(i, symbol('L', j), range,

View File

@ -59,6 +59,10 @@ class SmartRangeFactor: public NoiseModelFactor {
/// Add a range measurement to a pose with given key. /// Add a range measurement to a pose with given key.
void addRange(Key key, double measuredRange) { void addRange(Key key, double measuredRange) {
if(std::find(keys_.begin(), keys_.end(), key) != keys_.end()) {
throw std::invalid_argument(
"SmartRangeFactor::addRange: adding duplicate measurement for key.");
}
keys_.push_back(key); keys_.push_back(key);
measurements_.push_back(measuredRange); measurements_.push_back(measuredRange);
size_t n = keys_.size(); size_t n = keys_.size();

View File

@ -46,7 +46,7 @@ TEST( SmartRangeFactor, constructor ) {
TEST( SmartRangeFactor, addRange ) { TEST( SmartRangeFactor, addRange ) {
SmartRangeFactor f(sigma); SmartRangeFactor f(sigma);
f.addRange(1, 10); f.addRange(1, 10);
f.addRange(1, 12); f.addRange(2, 12);
LONGS_EQUAL(2, f.size()) LONGS_EQUAL(2, f.size())
} }
/* ************************************************************************* */ /* ************************************************************************* */