@@ -857,10 +857,10 @@ namespace test_relinearization {
857
857
*/
858
858
static HybridNonlinearFactorGraph CreateFactorGraph (
859
859
const std::vector<double > &means, const std::vector<double > &sigmas,
860
- DiscreteKey &m1, double x0_measurement) {
860
+ DiscreteKey &m1, double x0_measurement, double measurement_noise = 1e-3 ) {
861
861
auto model0 = noiseModel::Isotropic::Sigma (1 , sigmas[0 ]);
862
862
auto model1 = noiseModel::Isotropic::Sigma (1 , sigmas[1 ]);
863
- auto prior_noise = noiseModel::Isotropic::Sigma (1 , 1e-3 );
863
+ auto prior_noise = noiseModel::Isotropic::Sigma (1 , measurement_noise );
864
864
865
865
auto f0 =
866
866
std::make_shared<BetweenFactor<double >>(X (0 ), X (1 ), means[0 ], model0);
@@ -871,7 +871,7 @@ static HybridNonlinearFactorGraph CreateFactorGraph(
871
871
std::vector<NonlinearFactorValuePair> factors{
872
872
{f0, ComputeLogNormalizer (model0)}, {f1, ComputeLogNormalizer (model1)}};
873
873
874
- HybridNonlinearFactor mixtureFactor ({X (0 ), X (1 )}, {m1} , factors);
874
+ HybridNonlinearFactor mixtureFactor ({X (0 ), X (1 )}, m1 , factors);
875
875
876
876
HybridNonlinearFactorGraph hfg;
877
877
hfg.push_back (mixtureFactor);
@@ -968,7 +968,7 @@ TEST(HybridNonlinearFactorGraph, DifferentMeans) {
968
968
* |
969
969
* M1
970
970
*/
971
- TEST_DISABLED (HybridNonlinearFactorGraph, DifferentCovariances) {
971
+ TEST (HybridNonlinearFactorGraph, DifferentCovariances) {
972
972
using namespace test_relinearization ;
973
973
974
974
DiscreteKey m1 (M (1 ), 2 );
@@ -982,8 +982,10 @@ TEST_DISABLED(HybridNonlinearFactorGraph, DifferentCovariances) {
982
982
983
983
// Create FG with HybridNonlinearFactor and prior on X1
984
984
HybridNonlinearFactorGraph hfg = CreateFactorGraph (means, sigmas, m1, x0);
985
- // Linearize and eliminate
986
- auto hbn = hfg.linearize (values)->eliminateSequential ();
985
+ // Linearize
986
+ auto hgfg = hfg.linearize (values);
987
+ // and eliminate
988
+ auto hbn = hgfg->eliminateSequential ();
987
989
988
990
VectorValues cv;
989
991
cv.insert (X (0 ), Vector1 (0.0 ));
@@ -1005,6 +1007,52 @@ TEST_DISABLED(HybridNonlinearFactorGraph, DifferentCovariances) {
1005
1007
EXPECT (assert_equal (expected_m1, actual_m1));
1006
1008
}
1007
1009
1010
+ TEST (HybridNonlinearFactorGraph, Relinearization) {
1011
+ using namespace test_relinearization ;
1012
+
1013
+ DiscreteKey m1 (M (1 ), 2 );
1014
+
1015
+ Values values;
1016
+ double x0 = 0.0 , x1 = 0.8 ;
1017
+ values.insert (X (0 ), x0);
1018
+ values.insert (X (1 ), x1);
1019
+
1020
+ std::vector<double > means = {0.0 , 1.0 }, sigmas = {1e-2 , 1e-2 };
1021
+
1022
+ double prior_sigma = 1e-2 ;
1023
+ // Create FG with HybridNonlinearFactor and prior on X1
1024
+ HybridNonlinearFactorGraph hfg =
1025
+ CreateFactorGraph (means, sigmas, m1, 0.0 , prior_sigma);
1026
+ hfg.push_back (PriorFactor<double >(
1027
+ X (1 ), 1.2 , noiseModel::Isotropic::Sigma (1 , prior_sigma)));
1028
+
1029
+ // Linearize
1030
+ auto hgfg = hfg.linearize (values);
1031
+ // and eliminate
1032
+ auto hbn = hgfg->eliminateSequential ();
1033
+
1034
+ HybridValues delta = hbn->optimize ();
1035
+ values = values.retract (delta.continuous ());
1036
+
1037
+ Values expected_first_result;
1038
+ expected_first_result.insert (X (0 ), 0.0666666666667 );
1039
+ expected_first_result.insert (X (1 ), 1.13333333333 );
1040
+ EXPECT (assert_equal (expected_first_result, values));
1041
+
1042
+ // Re-linearize
1043
+ hgfg = hfg.linearize (values);
1044
+ // and eliminate
1045
+ hbn = hgfg->eliminateSequential ();
1046
+ delta = hbn->optimize ();
1047
+ HybridValues result (delta.continuous (), delta.discrete (),
1048
+ values.retract (delta.continuous ()));
1049
+
1050
+ HybridValues expected_result (
1051
+ VectorValues{{X (0 ), Vector1 (0 )}, {X (1 ), Vector1 (0 )}},
1052
+ DiscreteValues{{M (1 ), 1 }}, expected_first_result);
1053
+ EXPECT (assert_equal (expected_result, result));
1054
+ }
1055
+
1008
1056
/* *************************************************************************
1009
1057
*/
1010
1058
int main () {
0 commit comments