Bläddra i källkod

ndt定位,解决gtsam崩溃。

zx 1 år sedan
förälder
incheckning
2a4e7b4081
10 ändrade filer med 443 tillägg och 4051 borttagningar
  1. 3 2
      CMakeLists.txt
  2. 0 3091
      Log/mat_pre.txt
  3. 10 5
      config/horizon.yaml
  4. 13 4
      config/large_velodyne.yaml
  5. 3 0
      config/velodyne16.yaml
  6. 2 0
      package.xml
  7. 12 10
      rviz_cfg/loam_livox.rviz
  8. 112 939
      src/laserMapping.cpp
  9. 225 0
      src/odometry.cpp
  10. 63 0
      src/odometry.h

+ 3 - 2
CMakeLists.txt

@@ -106,9 +106,10 @@ catkin_package(
 # add_executable(fastlio_sam_mapping src/laserMapping.cpp include/ikd-Tree/ikd_Tree.cpp src/preprocess.cpp)
 # target_link_libraries(fastlio_sam_mapping ${catkin_LIBRARIES} ${PCL_LIBRARIES} ${PYTHON_LIBRARIES})
 # target_include_directories(fastlio_sam_mapping PRIVATE ${PYTHON_INCLUDE_DIRS})
-
 add_library(ikd_Tree include/ikd-Tree/ikd_Tree.cpp)
 add_library(preprocess  src/preprocess.cpp)
-add_executable(fastlio_sam_mapping src/laserMapping.cpp src/scancontext/Scancontext.cpp src/keyFramesManager.cpp src/keyFramesManager.h)
+add_executable(fastlio_sam_mapping src/laserMapping.cpp src/scancontext/Scancontext.cpp
+        src/keyFramesManager.cpp src/odometry.cpp
+        src/pclomp/voxel_grid_covariance_omp.cpp src/pclomp/ndt_omp.cpp src/pclomp/gicp_omp.cpp)
 target_link_libraries(fastlio_sam_mapping ${catkin_LIBRARIES} ${PCL_LIBRARIES} ${PYTHON_LIBRARIES}  ikd_Tree preprocess gtsam)  #${GeographicLib_LIBRARIES}
 target_include_directories(fastlio_sam_mapping PRIVATE ${PYTHON_INCLUDE_DIRS})

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 3091
Log/mat_pre.txt


+ 10 - 5
config/horizon.yaml

@@ -9,10 +9,7 @@ preprocess:
     blind: 2                   #4m  point distance<blind   ignored
 max_iteration: 10
 mapping:
-    acc_cov: 0.1
-    gyr_cov: 0.1
-    b_acc_cov: 0.0001
-    b_gyr_cov: 0.0001
+    
     fov_degree:    100
     det_range:     260.0
     extrinsic_est_en:  true      # true: enable the online estimation of IMU-LiDAR extrinsic
@@ -20,6 +17,14 @@ mapping:
     extrinsic_R: [ 1, 0, 0,
                    0, 1, 0,
                    0, 0, 1]
+IMU:
+    freq: 200
+    acc_cov: 0.1
+    gyr_cov: 0.1
+    b_acc_cov: 0.0001
+    b_gyr_cov: 0.0001
+    integration_cov: 0.05
+    integration_length: 30
 
 publish:
     path_en:  true
@@ -79,7 +84,7 @@ recontructKdTree: true
 ndtLoopMatch: true  # false -- icp
 locate_mode: false
 locate:
-    init_pos: [-7.129,1.2,0]
+    init_pos: [0.052092,0.963127,-0.04]
     init_rpy: [0,0,0.00]
 savePCD: true                         # https://github.com/TixiaoShan/LIO-SAM/issues/3
 savePCDDirectory: "/doc/ros_ws/map/zkxy_livox"        # in your home folder, starts and ends with "/". Warning: the code deletes "LOAM" folder then recreates it. See "mapOptimization" for implementation

+ 13 - 4
config/large_velodyne.yaml

@@ -23,10 +23,7 @@ preprocess:
 point_filter_num: 1
 
 mapping:
-    acc_cov: 3.9939570888238808e-03
-    gyr_cov: 1.5636343949698187e-03
-    b_acc_cov: 6.4356659353532566e-05
-    b_gyr_cov:  3.5640318696367613e-05
+    
     fov_degree:    180
     det_range:     100.0
     extrinsic_est_en:  true      # true: enable the online estimation of IMU-LiDAR extrinsic,
@@ -34,6 +31,15 @@ mapping:
     extrinsic_R: [ 1, 0, 0, 
                    0, 1, 0, 
                    0, 0, 1]
+IMU:
+    freq: 500
+    g: 9.804
+    acc_cov: 3.9939570888238808e-03
+    gyr_cov: 1.5636343949698187e-03
+    b_acc_cov: 6.4356659353532566e-01
+    b_gyr_cov:  3.5640318696367613e-02
+    integration_cov: 0.01
+    integration_length: 50
 
 publish:
     path_en:  true
@@ -90,6 +96,9 @@ recontructKdTree: true
 
 # Export settings
 locate_mode: true
+locate:
+    init_pos: [0,0,0]
+    init_rpy: [0,0,0]
 savePCD: true                         # https://github.com/TixiaoShan/LIO-SAM/issues/3
 savePCDDirectory: "/doc/ros_ws/map/large_vlp"        # in your home folder, starts and ends with "/". Warning: the code deletes "LOAM" folder then recreates it. See "mapOptimization" for implementation
 

+ 3 - 0
config/velodyne16.yaml

@@ -89,6 +89,9 @@ recontructKdTree: true
 
 # Export settings
 locate_mode: true
+locate:
+    init_pos: [0,0,0]
+    init_rpy: [0,0,0.00]
 savePCD: true                         # https://github.com/TixiaoShan/LIO-SAM/issues/3
 savePCDDirectory: "/doc/ros_ws/map/vlp16"        # in your home folder, starts and ends with "/". Warning: the code deletes "LOAM" folder then recreates it. See "mapOptimization" for implementation
 

+ 2 - 0
package.xml

@@ -27,6 +27,7 @@
   <build_depend>pcl_ros</build_depend>
   <build_depend>livox_ros_driver</build_depend>
   <build_depend>message_generation</build_depend>
+  <build_depend>ndt_omp</build_depend>
 
   <run_depend>geometry_msgs</run_depend>
   <run_depend>nav_msgs</run_depend>
@@ -38,6 +39,7 @@
   <run_depend>pcl_ros</run_depend>
   <run_depend>livox_ros_driver</run_depend>
   <run_depend>message_runtime</run_depend>
+  <run_depend>ndt_omp</run_depend>
 
   <test_depend>rostest</test_depend>
   <test_depend>rosbag</test_depend>

+ 12 - 10
rviz_cfg/loam_livox.rviz

@@ -8,6 +8,8 @@ Panels:
         - /mapping1
         - /mapping1/surround1
         - /mapping1/currPoints1/Autocompute Value Bounds1
+        - /Odometry1
+        - /Odometry1/Odometry1
         - /Odometry1/Odometry1/Shape1
         - /Odometry1/Odometry1/Covariance1
         - /Odometry1/Odometry1/Covariance1/Position1
@@ -33,7 +35,7 @@ Panels:
   - Class: rviz/Time
     Name: Time
     SyncMode: 0
-    SyncSource: surround
+    SyncSource: kdtreeMap
 Preferences:
   PromptSaveOnExit: true
 Toolbars:
@@ -140,13 +142,13 @@ Visualization Manager:
               Frame: Local
               Offset: 1
               Scale: 1
-              Value: true
+              Value: false
             Position:
               Alpha: 0.30000001192092896
               Color: 204; 51; 204
               Scale: 1
               Value: true
-            Value: true
+            Value: false
           Enabled: true
           Keep: 1
           Name: Odometry
@@ -346,7 +348,7 @@ Visualization Manager:
   Views:
     Current:
       Class: rviz/Orbit
-      Distance: 105.75137329101562
+      Distance: 581.7444458007812
       Enable Stereo Rendering:
         Stereo Eye Separation: 0.05999999865889549
         Stereo Focal Distance: 1
@@ -354,9 +356,9 @@ Visualization Manager:
         Value: false
       Field of View: 0.7853981852531433
       Focal Point:
-        X: 0.25273245573043823
-        Y: 0.24122393131256104
-        Z: -65.51172637939453
+        X: 89.08528137207031
+        Y: 226.02294921875
+        Z: -41.162208557128906
       Focal Shape Fixed Size: true
       Focal Shape Size: 0.05000000074505806
       Invert Z Axis: false
@@ -364,7 +366,7 @@ Visualization Manager:
       Near Clip Distance: 0.009999999776482582
       Pitch: 1.5697963237762451
       Target Frame: global
-      Yaw: 3.110581159591675
+      Yaw: 3.1874172687530518
     Saved: ~
 Window Geometry:
   Displays:
@@ -382,5 +384,5 @@ Window Geometry:
   Views:
     collapsed: true
   Width: 1359
-  X: 0
-  Y: 27
+  X: 158
+  Y: 44

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 112 - 939
src/laserMapping.cpp


+ 225 - 0
src/odometry.cpp

@@ -0,0 +1,225 @@
+//
+// Created by zx on 23-8-25.
+//
+
+#include "odometry.h"
+
+using gtsam::symbol_shorthand::X; // Pose3 (x,y,z,r,p,y)
+using gtsam::symbol_shorthand::V; // Vel   (xdot,ydot,zdot)
+using gtsam::symbol_shorthand::B; // Bias  (ax,ay,az,gx,gy,gz)
+OdometryOpt::OdometryOpt(int length){
+  inited_=false;
+  key_=0;
+  length_=length;
+  isam_param_.factorization = gtsam::ISAM2Params::QR;
+  isam_param_.relinearizeThreshold=0.1;
+  isam_param_.relinearizeSkip=1;
+  isam_=new gtsam::ISAM2(isam_param_);
+
+}
+
+OdometryOpt::~OdometryOpt(){
+  if(isam_){
+    delete isam_;
+    isam_= nullptr;
+  }
+  if(imu_preint_){
+    delete imu_preint_;
+    imu_preint_= nullptr;
+  }
+}
+
+
+void OdometryOpt::init(gtsam::Pose3 lidar2imu,double imu_freq,double accN,double gryN,double integrationN,
+                                double imuAccBias,double imuGryBias){
+  lidar2Imu_=lidar2imu;
+  imu_freq_=imu_freq;
+  imuAccN_=accN;
+  imuGryN_=gryN;
+  imuIntegrationN_=integrationN;
+  imuAccBiasN_=imuAccBias;
+  imuGyrBiasN_=imuGryBias;
+
+  boost::shared_ptr<gtsam::PreintegrationParams> p = gtsam::PreintegrationParams::MakeSharedU(9.804);
+  p->accelerometerCovariance  = gtsam::Matrix33::Identity(3,3) * pow(imuAccN_, 2); // acc white noise in continuous
+  p->gyroscopeCovariance      = gtsam::Matrix33::Identity(3,3) * pow(imuGryN_, 2); // gyro white noise in continuous
+  p->integrationCovariance    = gtsam::Matrix33::Identity(3,3) * pow(imuIntegrationN_, 2); // error committed in integrating position from velocities
+
+  gtsam::imuBias::ConstantBias prior_imu_bias((gtsam::Vector(6) << 0, 0, 0, 0, 0, 0).finished());; // assume zero initial bias
+  imu_preint_=new gtsam::PreintegratedImuMeasurements(p,prior_imu_bias);
+  lidar2Imu_ = gtsam::Pose3(gtsam::Rot3(1, 0, 0, 0), gtsam::Point3(0,0,0));
+}
+
+bool failureDetection(const gtsam::Vector3& velCur, const gtsam::imuBias::ConstantBias& biasCur)
+{
+  Eigen::Vector3f vel(velCur.x(), velCur.y(), velCur.z());
+  if (vel.norm() > 30)
+  {
+    printf("Large velocity, reset IMU-preintegration!\n");
+    return true;
+  }
+
+  Eigen::Vector3f ba(biasCur.accelerometer().x(), biasCur.accelerometer().y(), biasCur.accelerometer().z());
+  Eigen::Vector3f bg(biasCur.gyroscope().x(), biasCur.gyroscope().y(), biasCur.gyroscope().z());
+  if (ba.norm() > 1.0 || bg.norm() > 1.0)
+  {
+    printf("Large bias, reset IMU-preintegration!\n");
+    return true;
+  }
+
+  return false;
+}
+
+gtsam::Pose3 OdometryOpt::update(gtsam::Pose3 lidarPose,gtsam::noiseModel::Diagonal::shared_ptr priorPoseNoise,
+                                 std::deque<ImuData>& imuQueue) {
+  static int N=0;
+  printf(" frame : %d ,  Key :%d >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n",N++,key_);
+  if (inited_ == false) { //第一帧
+    reset_opt();
+    // initial pose
+    prevPose_ = lidarPose.compose(lidar2Imu_);
+    gtsam::noiseModel::Diagonal::shared_ptr firstPoseNoise = gtsam::noiseModel::Diagonal::Sigmas(
+        (gtsam::Vector(6) << 0.1, 0.1, 0.1, 0.1, 0.1, 0.1).finished()); // rad,rad,rad,m, m, m
+    gtsam::PriorFactor<gtsam::Pose3> priorPose(X(0), prevPose_, firstPoseNoise);
+    graph_.add(priorPose);
+    // initial velocity
+    prevVel_ = gtsam::Vector3(0, 0, 0);
+    gtsam::noiseModel::Diagonal::shared_ptr priorVelNoise = gtsam::noiseModel::Isotropic::Sigma(3, 1e4); // m/s
+    gtsam::PriorFactor<gtsam::Vector3> priorVel(V(0), prevVel_, priorVelNoise);
+    graph_.add(priorVel);
+    // initial bias
+    prevBias_ = gtsam::imuBias::ConstantBias(gtsam::Vector3(0,0,0),gtsam::Vector3(0,0,0));
+    gtsam::noiseModel::Diagonal::shared_ptr priorBiasNoise = gtsam::noiseModel::Isotropic::Sigma(6, 1);
+    gtsam::PriorFactor<gtsam::imuBias::ConstantBias> priorBias(B(0), prevBias_, priorBiasNoise);
+    graph_.add(priorBias);
+    // add values
+    values_.insert(X(0), prevPose_);
+    values_.insert(V(0), prevVel_);
+    values_.insert(B(0), prevBias_);
+
+    // optimize once
+    isam_->update(graph_, values_);
+    printf(" frame 0 int pose:%f %f %f,%f %f %f, V:%f %f %f, \nBias : %f %f %f,%f %f %f\n",
+           prevPose_.x(),prevPose_.y(),prevPose_.z(),
+           prevPose_.rotation().roll(), prevPose_.rotation().pitch(), prevPose_.rotation().yaw(),
+           prevVel_.x(),prevVel_.y(),prevVel_.z(),
+           prevBias_.vector()[0],prevBias_.vector()[1],prevBias_.vector()[2],
+           prevBias_.vector()[3],prevBias_.vector()[4],prevBias_.vector()[5]);
+    graph_.resize(0);
+    values_.clear();
+    key_ = 1;
+    inited_ = true;
+    imu_preint_->resetIntegrationAndSetBias(prevBias_);
+    return prevPose_;
+  }
+  if (key_ == length_) {
+    gtsam::noiseModel::Gaussian::shared_ptr updatedPoseNoise = gtsam::noiseModel::Gaussian::Covariance(
+        isam_->marginalCovariance(X(key_ - 1)));
+    gtsam::noiseModel::Gaussian::shared_ptr updatedVelNoise = gtsam::noiseModel::Gaussian::Covariance(
+        isam_->marginalCovariance(V(key_ - 1)));
+    gtsam::noiseModel::Gaussian::shared_ptr updatedBiasNoise = gtsam::noiseModel::Gaussian::Covariance(
+        isam_->marginalCovariance(B(key_ - 1)));
+    reset_opt();
+    // initial pose
+    gtsam::PriorFactor<gtsam::Pose3> priorPose(X(0), prevPose_, updatedPoseNoise);
+    gtsam::PriorFactor<gtsam::Vector3> priorVel(V(0), prevVel_, updatedVelNoise);
+    gtsam::PriorFactor<gtsam::imuBias::ConstantBias> priorBias(B(0), prevBias_, updatedBiasNoise);
+    graph_.add(priorPose);
+    graph_.add(priorVel);
+    graph_.add(priorBias);
+    // add values
+    values_.insert(X(0), prevPose_);
+    values_.insert(V(0), prevVel_);
+    values_.insert(B(0), prevBias_);
+
+    // optimize once
+    isam_->update(graph_, values_);
+    graph_.resize(0);
+    values_.clear();
+    key_ = 1;
+
+  }
+  int queue_size=imuQueue.size();
+  double lastTime = -1;
+  while (!imuQueue.empty()) {
+    ImuData imu = imuQueue.front();
+    double dt = (lastTime < 0) ? 1.0 / imu_freq_ : imu.time - lastTime;
+    imu_preint_->integrateMeasurement(imu.acc, imu.angular, dt);
+    lastTime = imu.time;
+    imuQueue.pop_front();
+    /*printf("imu_preint_->integrateMeasurement(gtsam::Vector3(%f,%f,%f),gtsam::Vector3(%f,%f,%f),%f);\n",
+           imu.acc[0],imu.acc[1],imu.acc[2], imu.angular[0],imu.angular[1],imu.angular[2],dt);*/
+    if(dt<1e-6){
+      printf("error >>>>>>>>  dt ===  %f\n",dt);
+    }
+  }
+
+  // insert predicted values
+  gtsam::NavState prevState(prevPose_,prevVel_);
+  gtsam::NavState propState = imu_preint_->predict(prevState, prevBias_);
+  // add pose factor
+  gtsam::Pose3 curPose = lidarPose.compose(lidar2Imu_);
+  gtsam::PriorFactor<gtsam::Pose3> pose_factor(X(key_), curPose, priorPoseNoise);
+  graph_.add(pose_factor);
+
+  gtsam::noiseModel::Diagonal::shared_ptr priorVelNoise = gtsam::noiseModel::Isotropic::Sigma(3, 0.1); // m/s
+  gtsam::PriorFactor<gtsam::Vector3> velFactor(V(key_),propState.v(),priorVelNoise);
+  graph_.add(velFactor);
+
+  gtsam::Vector noiseModelBetweenBias = (gtsam::Vector(6)
+      << imuAccBiasN_, imuAccBiasN_, imuAccBiasN_, imuGyrBiasN_, imuGyrBiasN_, imuGyrBiasN_).finished();
+
+  graph_.add(gtsam::BetweenFactor<gtsam::imuBias::ConstantBias>(B(key_ - 1), B(key_), gtsam::imuBias::ConstantBias(),
+                                                                gtsam::noiseModel::Diagonal::Sigmas(
+                                                                    imu_preint_->deltaTij() * noiseModelBetweenBias)));
+
+  // add imu factor to graph
+  const gtsam::PreintegratedImuMeasurements &preint_imu = dynamic_cast<const gtsam::PreintegratedImuMeasurements &>(*imu_preint_);
+  gtsam::ImuFactor imu_factor(X(key_ - 1), V(key_ - 1), X(key_), V(key_), B(key_ - 1), preint_imu);
+  graph_.add(imu_factor);
+
+  gtsam::Pose3 lidar_preint=propState.pose().compose(lidar2Imu_.inverse());
+
+  printf(" frame %d init pose:%f %f %f,%f %f %f, V:%f %f %f, \nBias : %f %f %f,%f %f %f\n",N,
+         propState.pose().x(),propState.pose().y(),propState.pose().z(),
+         propState.pose().rotation().roll(), propState.pose().rotation().pitch(), propState.pose().rotation().yaw(),
+         propState.v().x(),propState.v().y(),propState.v().z(),
+         prevBias_.vector()[0],prevBias_.vector()[1],prevBias_.vector()[2],
+         prevBias_.vector()[3],prevBias_.vector()[4],prevBias_.vector()[5]);
+  values_.insert(X(key_), propState.pose());
+  values_.insert(V(key_), propState.v());
+  values_.insert(B(key_), prevBias_);
+
+  // optimize
+  isam_->update(graph_, values_);
+  isam_->update();
+
+  // Overwrite the beginning of the preintegration for the next step.
+  gtsam::Values result = isam_->calculateEstimate();
+  prevPose_ = result.at<gtsam::Pose3>(X(key_));
+  prevVel_ = result.at<gtsam::Vector3>(V(key_));
+  prevState_ = gtsam::NavState(prevPose_, prevVel_);
+  prevBias_ = result.at<gtsam::imuBias::ConstantBias>(B(key_));
+
+  /*printf("  vel:%f %f %f,Bias:%f %f %f,%f %f %f\n",prevVel_.x(),prevVel_.y(),prevVel_.z(),
+         prevBias_.vector()[0],prevBias_.vector()[1],prevBias_.vector()[2],
+         prevBias_.vector()[3],prevBias_.vector()[4],prevBias_.vector()[5]);*/
+  // Reset the optimization preintegration object.
+  imu_preint_->resetIntegrationAndSetBias(prevBias_);
+  ++key_;
+  graph_.resize(0);
+  values_.clear();
+  return prevPose_;
+}
+
+void OdometryOpt::reset_opt(){
+  if(isam_){
+    delete isam_;
+  }
+  isam_ = new gtsam::ISAM2(isam_param_);
+  gtsam::NonlinearFactorGraph newGraphFactors;
+  graph_ = newGraphFactors;
+  gtsam::Values NewGraphValues;
+  values_ = NewGraphValues;
+  key_=1;
+}

+ 63 - 0
src/odometry.h

@@ -0,0 +1,63 @@
+//
+// Created by zx on 23-8-25.
+//
+
+#ifndef FAST_LIO_SAM_ODOMETRY_H
+#define FAST_LIO_SAM_ODOMETRY_H
+
+#include <gtsam/geometry/Rot3.h>
+#include <gtsam/geometry/Pose3.h>
+#include <gtsam/slam/PriorFactor.h>
+#include <gtsam/slam/BetweenFactor.h>
+#include <gtsam/navigation/GPSFactor.h>
+#include <gtsam/navigation/ImuFactor.h>
+#include <gtsam/navigation/CombinedImuFactor.h>
+#include <gtsam/nonlinear/NonlinearFactorGraph.h>
+#include <gtsam/nonlinear/LevenbergMarquardtOptimizer.h>
+#include <gtsam/nonlinear/Marginals.h>
+#include <gtsam/nonlinear/Values.h>
+#include <gtsam/inference/Symbol.h>
+#include <gtsam/nonlinear/ISAM2.h>
+#include <deque>
+typedef struct{
+    gtsam::Vector3 acc;
+    gtsam::Vector3 angular;
+    double time;
+}ImuData;
+
+class OdometryOpt {
+public:
+    OdometryOpt(int length);
+    ~OdometryOpt();
+    void init(gtsam::Pose3 lidar2imu,double imu_freq,double accN,double gryN,double integrationN,double imuAccBias,double imuGryBisa);
+    gtsam::Pose3 update(gtsam::Pose3 lidarPose,gtsam::noiseModel::Diagonal::shared_ptr priorPoseNoise,
+                        std::deque<ImuData>& imuQueue);
+protected:
+    void reset_opt();
+    static bool failureDetection(const gtsam::Vector3& velCur, const gtsam::imuBias::ConstantBias& biasCur);
+protected:
+    gtsam::Pose3 lidar2Imu_;
+    int key_=1;
+    bool inited_;
+    int length_;
+    gtsam::ISAM2Params isam_param_;
+    gtsam::ISAM2* isam_;
+    gtsam::NonlinearFactorGraph graph_;
+    gtsam::PreintegratedImuMeasurements* imu_preint_;
+    gtsam::Values values_;
+
+    gtsam::Pose3 prevPose_;
+    gtsam::Vector3 prevVel_;
+    gtsam::NavState prevState_;
+    gtsam::imuBias::ConstantBias prevBias_;
+
+    double imu_freq_;
+    double imuAccN_;
+    double imuGryN_;
+    double imuIntegrationN_;
+    double imuAccBiasN_;
+    double imuGyrBiasN_;
+
+};
+
+#endif //FAST_LIO_SAM_ODOMETRY_H