sample.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. //
  2. // Created by zx on 23-8-30.
  3. //
  4. #include <gtsam/geometry/Rot3.h>
  5. #include <gtsam/geometry/Pose3.h>
  6. #include <gtsam/slam/PriorFactor.h>
  7. #include <gtsam/slam/BetweenFactor.h>
  8. #include <gtsam/navigation/GPSFactor.h>
  9. #include <gtsam/navigation/ImuFactor.h>
  10. #include <gtsam/navigation/CombinedImuFactor.h>
  11. #include <gtsam/nonlinear/NonlinearFactorGraph.h>
  12. #include <gtsam/nonlinear/LevenbergMarquardtOptimizer.h>
  13. #include <gtsam/nonlinear/Marginals.h>
  14. #include <gtsam/nonlinear/Values.h>
  15. #include <gtsam/inference/Symbol.h>
  16. #include <gtsam/nonlinear/ISAM2.h>
  17. using gtsam::symbol_shorthand::X; // Pose3 (x,y,z,r,p,y)
  18. using gtsam::symbol_shorthand::V; // Vel (xdot,ydot,zdot)
  19. using gtsam::symbol_shorthand::B; // Bias (ax,ay,az,gx,gy,gz)
  20. typedef struct{
  21. gtsam::Vector3 acc;
  22. gtsam::Vector3 angular;
  23. double time;
  24. }ImuData;
  25. int main(){
  26. gtsam::ISAM2Params isam_param_;
  27. gtsam::ISAM2* isam_;
  28. gtsam::NonlinearFactorGraph graph_;
  29. gtsam::PreintegratedImuMeasurements* imu_preint_;
  30. isam_param_.factorization = gtsam::ISAM2Params::QR;
  31. isam_param_.relinearizeThreshold=0.1;
  32. isam_param_.relinearizeSkip=1;
  33. isam_=new gtsam::ISAM2(isam_param_);
  34. boost::shared_ptr<gtsam::PreintegrationParams> p = gtsam::PreintegrationParams::MakeSharedU(9.804);
  35. p->accelerometerCovariance = gtsam::Matrix33::Identity(3,3) * pow(3.9939570888238808e-03, 2); // acc white noise in continuous
  36. p->gyroscopeCovariance = gtsam::Matrix33::Identity(3,3) * pow(1.5636343949698187e-03, 2); // gyro white noise in continuous
  37. p->integrationCovariance = gtsam::Matrix33::Identity(3,3) * pow(1e-5, 2); // error committed in integrating position from velocities
  38. printf("111111111111\n");
  39. gtsam::imuBias::ConstantBias prior_imu_bias((gtsam::Vector(6) << 0, 0, 0, 0, 0, 0).finished());; // assume zero initial bias
  40. printf("22222222222\n");
  41. imu_preint_=new gtsam::PreintegratedImuMeasurements(p,prior_imu_bias);
  42. gtsam::Rot3 rot1=gtsam::Rot3::RzRyRx(gtsam::Vector3(0.013963,0.000259, 0.007608));
  43. gtsam::Pose3 odom1(rot1,gtsam::Point3(-0.006571,0.098890,-0.001847));
  44. gtsam::noiseModel::Diagonal::shared_ptr firstPoseNoise = gtsam::noiseModel::Diagonal::Sigmas(
  45. (gtsam::Vector(6) << 0.1, 0.1, 0.1, 0.1, 0.1, 0.1).finished()); // rad,rad,rad,m, m, m
  46. gtsam::PriorFactor<gtsam::Pose3> priorPose(X(0), odom1, firstPoseNoise);
  47. graph_.add(priorPose);
  48. // initial velocity
  49. gtsam::noiseModel::Diagonal::shared_ptr priorVelNoise = gtsam::noiseModel::Isotropic::Sigma(3, 1e4); // m/s
  50. gtsam::PriorFactor<gtsam::Vector3> priorVel1(V(0), gtsam::Vector3(0, 0, 0), priorVelNoise);
  51. graph_.add(priorVel1);
  52. // initial bias
  53. gtsam::imuBias::ConstantBias prevBias1 = gtsam::imuBias::ConstantBias(gtsam::Vector3(0,0,0),gtsam::Vector3(0,0,0));
  54. gtsam::noiseModel::Diagonal::shared_ptr priorBiasNoise = gtsam::noiseModel::Isotropic::Sigma(6, 1);
  55. gtsam::PriorFactor<gtsam::imuBias::ConstantBias> priorBias1(B(0), prevBias1, priorBiasNoise);
  56. graph_.add(priorBias1);
  57. // add values
  58. gtsam::Values values1;
  59. values1.insert(X(0), odom1);
  60. values1.insert(V(0), gtsam::Vector3(0, 0, 0));
  61. values1.insert(B(0), prevBias1);
  62. isam_->update(graph_, values1);
  63. printf("33333333333333333333333\n");
  64. //----------------------------------
  65. imu_preint_->integrateMeasurement(gtsam::Vector3(1.030218,-0.420155,9.750587),gtsam::Vector3(-0.011047,0.007924,-0.023697),0.002000);
  66. imu_preint_->integrateMeasurement(gtsam::Vector3(0.897726,-0.491497,9.755317),gtsam::Vector3(-0.010926,0.009534,-0.023994),0.001004);
  67. imu_preint_->integrateMeasurement(gtsam::Vector3(0.827207,-0.540855,9.725967),gtsam::Vector3(-0.008861,0.008472,-0.028502),0.000997);
  68. imu_preint_->integrateMeasurement(gtsam::Vector3(0.922143,-0.452133,9.736796),gtsam::Vector3(-0.002425,0.011689,-0.025543),0.004016);
  69. imu_preint_->integrateMeasurement(gtsam::Vector3(0.962495,-0.422689,9.734901),gtsam::Vector3(-0.007844,0.009144,-0.024148),0.000984);
  70. imu_preint_->integrateMeasurement(gtsam::Vector3(0.827710,-0.500624,9.730005),gtsam::Vector3(-0.008007,0.011182,-0.023402),0.000950);
  71. imu_preint_->integrateMeasurement(gtsam::Vector3(0.860463,-0.433599,9.737790),gtsam::Vector3(-0.007499,0.007286,-0.023085),0.004009);
  72. imu_preint_->integrateMeasurement(gtsam::Vector3(0.964682,-0.399865,9.713343),gtsam::Vector3(-0.004727,0.002974,-0.016032),0.001045);
  73. imu_preint_->integrateMeasurement(gtsam::Vector3(0.833733,-0.482052,9.703702),gtsam::Vector3(-0.007651,0.007997,-0.022628),0.000999);
  74. imu_preint_->integrateMeasurement(gtsam::Vector3(0.784919,-0.498876,9.701908),gtsam::Vector3(-0.006508,0.004443,-0.026508),0.004019);
  75. imu_preint_->integrateMeasurement(gtsam::Vector3(0.919361,-0.416548,9.692280),gtsam::Vector3(-0.005517,0.002733,-0.021557),0.000981);
  76. imu_preint_->integrateMeasurement(gtsam::Vector3(0.935489,-0.360304,9.709715),gtsam::Vector3(-0.007209,0.002510,-0.013403),0.000941);
  77. imu_preint_->integrateMeasurement(gtsam::Vector3(0.777420,-0.476960,9.699254),gtsam::Vector3(-0.008287,-0.000821,-0.013210),0.010026);
  78. imu_preint_->integrateMeasurement(gtsam::Vector3(0.759608,-0.504171,9.676722),gtsam::Vector3(-0.008540,-0.001701,-0.014538),0.001045);
  79. imu_preint_->integrateMeasurement(gtsam::Vector3(0.871459,-0.393245,9.678445),gtsam::Vector3(-0.009490,-0.006492,-0.010146),0.000929);
  80. imu_preint_->integrateMeasurement(gtsam::Vector3(0.779426,-0.450930,9.684661),gtsam::Vector3(-0.007062,-0.008040,-0.012283),0.001067);
  81. imu_preint_->integrateMeasurement(gtsam::Vector3(0.715236,-0.446302,9.701901),gtsam::Vector3(-0.010659,-0.012908,-0.012445),0.000998);
  82. imu_preint_->integrateMeasurement(gtsam::Vector3(0.842707,-0.373925,9.682480),gtsam::Vector3(-0.013231,-0.012922,-0.010434),0.001004);
  83. imu_preint_->integrateMeasurement(gtsam::Vector3(0.854209,-0.415411,9.645583),gtsam::Vector3(-0.013140,-0.017353,-0.003272),0.000951);
  84. imu_preint_->integrateMeasurement(gtsam::Vector3(0.674500,-0.475582,9.687313),gtsam::Vector3(-0.011439,-0.018694,-0.005149),0.000978);
  85. imu_preint_->integrateMeasurement(gtsam::Vector3(0.682276,-0.445558,9.695731),gtsam::Vector3(-0.013350,-0.024521,-0.011790),0.001066);
  86. imu_preint_->integrateMeasurement(gtsam::Vector3(0.876566,-0.322494,9.694254),gtsam::Vector3(-0.015991,-0.027012,-0.005146),0.004012);
  87. imu_preint_->integrateMeasurement(gtsam::Vector3(0.871890,-0.321667,9.709745),gtsam::Vector3(-0.020464,-0.032633,0.001735),0.000934);
  88. imu_preint_->integrateMeasurement(gtsam::Vector3(0.652600,-0.473016,9.703427),gtsam::Vector3(-0.019761,-0.034679,0.001833),0.001030);
  89. imu_preint_->integrateMeasurement(gtsam::Vector3(0.728786,-0.379186,9.736034),gtsam::Vector3(-0.020478,-0.035970,-0.001026),0.004017);
  90. imu_preint_->integrateMeasurement(gtsam::Vector3(0.858471,-0.290078,9.749356),gtsam::Vector3(-0.023504,-0.038637,0.002624),0.000990);
  91. imu_preint_->integrateMeasurement(gtsam::Vector3(0.747279,-0.394640,9.743360),gtsam::Vector3(-0.030160,-0.040991,0.001225),0.001007);
  92. imu_preint_->integrateMeasurement(gtsam::Vector3(0.712789,-0.395489,9.762823),gtsam::Vector3(-0.031004,-0.043510,-0.003281),0.004014);
  93. imu_preint_->integrateMeasurement(gtsam::Vector3(0.848782,-0.306907,9.752598),gtsam::Vector3(-0.033113,-0.046355,0.002112),0.000984);
  94. imu_preint_->integrateMeasurement(gtsam::Vector3(0.804205,-0.341677,9.751830),gtsam::Vector3(-0.035746,-0.051016,0.005141),0.000980);
  95. imu_preint_->integrateMeasurement(gtsam::Vector3(0.700957,-0.404746,9.758069),gtsam::Vector3(-0.040663,-0.051699,-0.002269),0.004012);
  96. imu_preint_->integrateMeasurement(gtsam::Vector3(0.731385,-0.420330,9.742807),gtsam::Vector3(-0.041512,-0.055137,-0.006984),0.000966);
  97. imu_preint_->integrateMeasurement(gtsam::Vector3(0.899754,-0.322278,9.751014),gtsam::Vector3(-0.042045,-0.057319,-0.004849),0.001039);
  98. imu_preint_->integrateMeasurement(gtsam::Vector3(0.872774,-0.397510,9.745684),gtsam::Vector3(-0.043887,-0.058833,-0.000490),0.003997);
  99. imu_preint_->integrateMeasurement(gtsam::Vector3(0.733693,-0.499446,9.732361),gtsam::Vector3(-0.042933,-0.061853,-0.011483),0.001012);
  100. imu_preint_->integrateMeasurement(gtsam::Vector3(0.882428,-0.385174,9.741079),gtsam::Vector3(-0.045303,-0.061822,-0.013289),0.000939);
  101. imu_preint_->integrateMeasurement(gtsam::Vector3(0.919037,-0.400405,9.726874),gtsam::Vector3(-0.046301,-0.060051,-0.015828),0.004067);
  102. imu_preint_->integrateMeasurement(gtsam::Vector3(0.809744,-0.480754,9.730498),gtsam::Vector3(-0.049750,-0.058505,-0.023399),0.000990);
  103. imu_preint_->integrateMeasurement(gtsam::Vector3(0.874894,-0.473431,9.714948),gtsam::Vector3(-0.048886,-0.059212,-0.030573),0.001003);
  104. imu_preint_->integrateMeasurement(gtsam::Vector3(1.009512,-0.419129,9.695473),gtsam::Vector3(-0.049214,-0.061532,-0.028183),0.004017);
  105. imu_preint_->integrateMeasurement(gtsam::Vector3(0.908168,-0.462400,9.725821),gtsam::Vector3(-0.049176,-0.062181,-0.028629),0.000990);
  106. imu_preint_->integrateMeasurement(gtsam::Vector3(0.837434,-0.529312,9.729707),gtsam::Vector3(-0.045532,-0.057796,-0.039177),0.000997);
  107. imu_preint_->integrateMeasurement(gtsam::Vector3(0.934994,-0.524931,9.703054),gtsam::Vector3(-0.045626,-0.054849,-0.052150),0.004013);
  108. imu_preint_->integrateMeasurement(gtsam::Vector3(1.071312,-0.480165,9.702712),gtsam::Vector3(-0.042694,-0.054766,-0.047290),0.000925);
  109. imu_preint_->integrateMeasurement(gtsam::Vector3(0.935572,-0.599491,9.685145),gtsam::Vector3(-0.041888,-0.054443,-0.050481),0.001091);
  110. imu_preint_->integrateMeasurement(gtsam::Vector3(0.886452,-0.601381,9.699040),gtsam::Vector3(-0.040211,-0.051722,-0.063193),0.003927);
  111. imu_preint_->integrateMeasurement(gtsam::Vector3(1.076890,-0.518920,9.674937),gtsam::Vector3(-0.035591,-0.047722,-0.066651),0.001082);
  112. imu_preint_->integrateMeasurement(gtsam::Vector3(1.039718,-0.605801,9.631043),gtsam::Vector3(-0.029952,-0.044489,-0.068591),0.001888);
  113. graph_.resize(0);
  114. gtsam::NavState prevState(odom1,gtsam::Vector3(0, 0, 0));
  115. gtsam::NavState propState = imu_preint_->predict(prevState, prevBias1);
  116. // add pose factor
  117. gtsam::Rot3 rot2=gtsam::Rot3::RzRyRx(gtsam::Vector3(0.016913 ,0.000888 ,0.011003));
  118. gtsam::Pose3 odom2(rot2,gtsam::Point3(0.022109, 0.097983 ,0.011235));
  119. printf("4444444444444444444444\n");
  120. gtsam::noiseModel::Diagonal::shared_ptr lidarPoseNoise = gtsam::noiseModel::Diagonal::Sigmas(
  121. (gtsam::Vector(6) << 0.02, 0.02,0.02, 0.5*M_PI/180.0, 0.5*M_PI/180.0, 0.5*M_PI/180.0).finished());
  122. gtsam::PriorFactor<gtsam::Pose3> pose_factor(X(1), odom2, lidarPoseNoise);
  123. printf("5555555555555555555555555555\n");
  124. graph_.add(pose_factor);
  125. gtsam::noiseModel::Diagonal::shared_ptr priorVelNoise2 = gtsam::noiseModel::Isotropic::Sigma(3, 0.1); // m/s
  126. gtsam::PriorFactor<gtsam::Vector3> velFactor(V(1),propState.v(),priorVelNoise);
  127. graph_.add(velFactor);
  128. double imuAccBias = 6.4356659353532566e-05, imuGyrBias = 3.5640318696367613e-05;
  129. gtsam::Vector noiseModelBetweenBias = (gtsam::Vector(6)
  130. << imuAccBias, imuAccBias, imuAccBias, imuGyrBias, imuGyrBias, imuGyrBias).finished();
  131. printf("666666666666666666666666666666\n");
  132. graph_.add(gtsam::BetweenFactor<gtsam::imuBias::ConstantBias>(B(0), B(1), gtsam::imuBias::ConstantBias(),
  133. gtsam::noiseModel::Diagonal::Sigmas(
  134. 0.1 * noiseModelBetweenBias)));
  135. const gtsam::PreintegratedImuMeasurements &preint_imu = dynamic_cast<const gtsam::PreintegratedImuMeasurements &>(*imu_preint_);
  136. gtsam::ImuFactor imu_factor(X(0), V(0), X(1), V(1), B(0), preint_imu);
  137. graph_.add(imu_factor);
  138. gtsam::Values values2;
  139. printf("777777777777777777777\n");
  140. values2.insert(X(1), propState.pose());
  141. values2.insert(V(1), propState.v());
  142. values2.insert(B(1), prevBias1);
  143. isam_->update(graph_, values2);
  144. isam_->update();
  145. printf("8888888888888888888888888888\n");
  146. gtsam::Values result = isam_->calculateEstimate();
  147. gtsam::Pose3 pose = result.at<gtsam::Pose3>(X(1));
  148. gtsam::Vector3 vel= result.at<gtsam::Vector3>(V(1));
  149. gtsam::imuBias::ConstantBias bias = result.at<gtsam::imuBias::ConstantBias>(B(1));
  150. printf(" vel:%f %f %f,Bias:%f %f %f,%f %f %f\n",vel.x(),vel.y(),vel.z(),
  151. bias.vector()[0],bias.vector()[1],bias.vector()[2],
  152. bias.vector()[3],bias.vector()[4],bias.vector()[5]);
  153. return 0;
  154. }