Giter Site home page Giter Site logo

2013fangwentao / multi_sensor_fusion Goto Github PK

View Code? Open in Web Editor NEW
755.0 44.0 244.0 9.66 MB

Multi-Sensor Fusion (GNSS, IMU, Camera) 多源多传感器融合定位 GPS/INS组合导航 PPP/INS紧组合

License: GNU General Public License v3.0

CMake 1.73% C++ 94.45% Shell 0.10% Python 3.72%
vio multi-sensor navigation imu vision gnss fusion camera gps ppp

multi_sensor_fusion's Introduction

方文涛. 大气增强PPP/MEMS惯导/视觉里程计融合定位研究[D].武汉大学,2020.

pdf版: 大气增强PPP/MEMS惯导/视觉里程计融合定位研究


数据解压密码: 123456

由于个人时间问题,邮件经常看不到,导致很多小伙伴给我邮件我都没有来得及回复数据解压密码,对部分没有收到回复邮件的小伙伴表示抱歉。在此加上数据解压密码,感谢大家的关注


初衷

  • 学习组合导航和VIO相关内容.
  • 希望和有兴趣的小伙伴一起交流

程序依赖

  • glog
  • Eigen
  • OpenCV 3.4
  • Ceres 1.14.0

使用说明

最新稳定测试版本对应为dev分支 Multi-Sensor Fusion使用了submodules形式挂载了tools,因此clone完本程序需要更新tools

git checkout -b dev origin/dev
git submodule init
git submodule update

已经安装完依赖库后,可以直接编译程序

mkdir build && cd build 
cmake .. && make -j3

程序运行方式

./mscnav_bin ${configure_file} ${log_dir}
代码架构简要说明
文件夹名 主要作用
config 示例数据配置文件
doc 一些参考文档
exec 主程序文件
include 头文件,按照不同功能下面包含子文件夹
script 一些脚本工具
src 核心功能的源代码文件
submodules 子模块,目前仅挂载tools基本工具
test 一些测试代码
tools 一些小工具
example_process 示例数据的百度云链接

功能

  • 支持GNSS/INS松组合解算
  • 支持GNSS/INS/Camera融合解算
  • 支持纯惯导推算
  • 支持VIO解算,不过需要利用GNSS数据进行全局的初始化

结果示例

数据说明

  • 采集环境及路线
武汉大学校内林荫环境
  • 卫星观测情况(GPS+BDS)

vio结果

vio测试区间:全长770m

纯惯导和vio定位结果

纯惯导和vio定姿结果

轨迹对比图

结果统计[位置:m,角度:deg]

- North East Down 误差漂移 Roll Pitch Heading
纯惯导推算 -1416.3 -3412.4 -40.6 479.8% 1.300 1.400 1.072
视觉/惯性里程计 -2.594 4.209 1.578 0.67% 0.104 0.106 0.319

GNSS-INS-Camera结果

定位误差图[m] (上:单频PPP定位;中:单频PPP/INS紧组合定位; 下:GNSS-INS-camera定位)

定姿误差图[deg] (上:单频PPP/INS紧组合定姿; 下:GNSS-INS-camera定姿)

结果统计[位置:m,角度:deg]

- H V 3D 提升 Roll Pitch Heading 提升
PPP定位 1.970 4.429 4.847 —— —— —— —— ——
大气增强PPP/INS紧组合 1.658 3.014 3.439 29.04% 0.132 0.198 0.661 ——
大气增强PPP/INS/视觉融合 1.529 2.255 2.725 43.79% 0.131 0.169 0.389 41.10%

如果基于RTK技术实现GNSS定位的话,定位效果肯定好于示例结果,之所以采用PPP技术,因为PPP不依赖于基准站,成本和操作难度都更低


讨论交流

multi_sensor_fusion's People

Contributors

2013fangwentao avatar fangwentaowhu avatar jianglingxin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

multi_sensor_fusion's Issues

The picture in README.md is invalid

Hi! I am also learning the navigation direction. I saw your project, so I want to study it, but the picture in your README.md is invalid. Can I fix it if have time?

有一些关于项目的小疑问

博主您好,这个项目十分清楚和完整,我也十分想学习学习您的工作,想有几点关于项目的疑问,请麻烦您拨冗解答下:
1、当前我看实现的是GNSS+IMU的紧耦合?想请问博主有开展VIO+GNSS的实验研究吗?
2、关于耦合GNSS数据的定位方式可能我不是很懂,想请问下GNSS+IMU的耦合中使用GPS数据是只需要经纬高数据吗?还是需要更基本的例如伪距等其他的数据呢?

关于相机姿态表示的问题

您好,您分享的代码非常具有学习的价值。之前有幸和您做过类似的工作,所以有一个疑问希望您解答一下。我有发现您惯导所采用的机械编排是n系,在相机扩维的时候,所得到的相机姿态为R_c_n,当你在做量测更新的时候,涉及到R_c0_n R_c1_n ~~~R_ck_n这些相机状态量,此时这些相机姿态的上标n已经不再是同一个n,东北天的指向随着运动发生了变化,也就是这些状态量并非表示在同一参考坐标系下,虽然可能在短时间的载体运动不会造成太大的干扰,但我认为这样不是特别的严谨,而把相机姿态扩维在e系下会更好一些。

请教问题

在和SLAM做组合的时候,有文章说用IEKF(invarient extended kf)的效果比EKF好,大神了解IEKF吗?

build fails in macOS Monterey 12.3.1 Apple M1 MacBook Pro

HI, I'm trying to build Multi_Sensor_Fusion but it looks like there is a problem, would you please check and let me know what is the problem ?

amirhosseingholami@Amirhosseins-MacBook-Pro build % cmake .. -DGLOG_INCLUDE_DIR=/opt/homebrew/Cellar/glog/0.5.0/include -DGFLAGS_INCLUDE_DIRS=/opt/homebrew/Cellar/gflags/2.2.2/include -DCERES_INCLUDE_DIRS=/opt/homebrew/Cellar/ceres-solver/2.0.0_4/include -DEIGEN3_INCLUDE_DIRS=/opt/homebrew/Cellar/eigen/3.4.0_1/include
CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


-- The C compiler identification is AppleClang 13.1.6.13160021
-- The CXX compiler identification is AppleClang 13.1.6.13160021
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /opt/homebrew/Cellar/opencv/4.5.5_1 (found version "4.5.5") 
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Success
-- Found Threads: TRUE  
-- Found CXSparse: /opt/homebrew/include (found suitable version "3.2.0", minimum required is "3.2.0") 
-- Found AMD headers in: /opt/homebrew/include
-- Found AMD library: /opt/homebrew/lib/libamd.dylib
-- Found CAMD headers in: /opt/homebrew/include
-- Found CAMD library: /opt/homebrew/lib/libcamd.dylib
-- Found CCOLAMD headers in: /opt/homebrew/include
-- Found CCOLAMD library: /opt/homebrew/lib/libccolamd.dylib
-- Found CHOLMOD headers in: /opt/homebrew/include
-- Found CHOLMOD library: /opt/homebrew/lib/libcholmod.dylib
-- Found COLAMD headers in: /opt/homebrew/include
-- Found COLAMD library: /opt/homebrew/lib/libcolamd.dylib
-- Found SPQR headers in: /opt/homebrew/include
-- Found SPQR library: /opt/homebrew/lib/libspqr.dylib
-- Found Config headers in: /opt/homebrew/include
-- Found Config library: /opt/homebrew/lib/libsuitesparseconfig.dylib
-- Found Intel Thread Building Blocks (TBB) library (2021.5 / ) include location: . Assuming SuiteSparseQR was compiled with TBB.
-- Looking for shm_open in rt
-- Looking for shm_open in rt - not found
-- Could not find librt, but found SuiteSparse_config, assuming that SuiteSparse was compiled without timing.
-- Found METIS: /opt/homebrew/include (found version "5.1.0") 
-- Found SuiteSparse: /opt/homebrew/include (found suitable version "5.12.0", minimum required is "5.11.0") found components: AMD CAMD CCOLAMD CHOLMOD COLAMD SPQR Config 
-- Found required Ceres dependency: Eigen version 3.4.0 in /opt/homebrew/share/eigen3/cmake
-- Found required Ceres dependency: glog
-- Found required Ceres dependency: gflags
-- Found Ceres version: 2.1.0 installed in: /opt/homebrew with components: [EigenSparse, SparseLinearAlgebraLibrary, LAPACK, SuiteSparse, CXSparse, AccelerateSparse, SchurSpecializations, Multithreading]
-- Eigen include: /opt/homebrew/include/eigen3
-- OpenCV include: /opt/homebrew/Cellar/opencv/4.5.5_1/include/opencv4
-- Ceres include: /opt/homebrew/Cellar/ceres-solver/2.0.0_4/include
-- glog include: /opt/homebrew/Cellar/glog/0.5.0/include
CMake Deprecation Warning at submodules/tools/CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


CMake Deprecation Warning at src/filter/CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


CMake Deprecation Warning at src/imu/CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


CMake Deprecation Warning at src/camera/CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


CMake Deprecation Warning at src/data/CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


CMake Deprecation Warning at src/process/CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


CMake Deprecation Warning at test/CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


CMake Deprecation Warning at tools/CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


CMake Deprecation Warning at exec/CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 2.8.12 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


-- Configuring done
CMake Warning (dev):
  Policy CMP0042 is not set: MACOSX_RPATH is enabled by default.  Run "cmake
  --help-policy CMP0042" for policy details.  Use the cmake_policy command to
  set the policy and suppress this warning.

  MACOSX_RPATH is not specified for the following targets:

   camera
   data
   filter
   imu
   process
   tools

This warning is for project developers.  Use -Wno-dev to suppress it.

-- Generating done
-- Build files have been written to: /Users/amirhosseingholami/Git/MMS/Multi_Sensor_Fusion/build
amirhosseingholami@Amirhosseins-MacBook-Pro build % make
[  1%] Building CXX object submodules/tools/CMakeFiles/tools.dir/src/navattitude.cc.o
[  3%] Building CXX object submodules/tools/CMakeFiles/tools.dir/src/navbase.cc.o
[  5%] Building CXX object submodules/tools/CMakeFiles/tools.dir/src/navconfig.cc.o
In file included from /Users/amirhosseingholami/Git/MMS/Multi_Sensor_Fusion/submodules/tools/src/navconfig.cc:1:
/Users/amirhosseingholami/Git/MMS/Multi_Sensor_Fusion/submodules/tools/include/navconfig.hpp:129:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
1 warning generated.
[  6%] Building CXX object submodules/tools/CMakeFiles/tools.dir/src/navearth.cc.o
[  8%] Building CXX object submodules/tools/CMakeFiles/tools.dir/src/navtime.cc.o
/Users/amirhosseingholami/Git/MMS/Multi_Sensor_Fusion/submodules/tools/src/navtime.cc:27:1: warning: non-void function does not return a value [-Wreturn-type]
}
^
1 warning generated.
[ 10%] Linking CXX shared library ../../../bin/libtools.dylib
[ 10%] Built target tools
[ 11%] Building CXX object src/filter/CMakeFiles/filter.dir/navfilter.cc.o
In file included from /Users/amirhosseingholami/Git/MMS/Multi_Sensor_Fusion/src/filter/navfilter.cc:12:
/Users/amirhosseingholami/Git/MMS/Multi_Sensor_Fusion/submodules/tools/include/navconfig.hpp:129:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
/Users/amirhosseingholami/Git/MMS/Multi_Sensor_Fusion/src/filter/navfilter.cc:98:1: warning: non-void function does not return a value in all control paths [-Wreturn-type]
}
^
In file included from /Users/amirhosseingholami/Git/MMS/Multi_Sensor_Fusion/src/filter/navfilter.cc:12:
/Users/amirhosseingholami/Git/MMS/Multi_Sensor_Fusion/submodules/tools/include/navconfig.hpp:73:3: warning: non-void function does not return a value in all control paths [-Wreturn-type]
  }
  ^
/Users/amirhosseingholami/Git/MMS/Multi_Sensor_Fusion/src/filter/navfilter.cc:260:15: note: in instantiation of function template specialization 'utiltool::ConfigInfo::get<int>' requested here
  if (config->get<int>("evaluate_imu_scale") != 0)
              ^
3 warnings generated.
[ 13%] Linking CXX shared library ../../../bin/libfilter.dylib
Undefined symbols for architecture arm64:
  "google::LogMessage::stream()", referenced from:
      mscnav::KalmanFilter::InitialStateCov(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) in navfilter.cc.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > utiltool::ConfigInfo::get<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in navfilter.cc.o
      mscnav::KalmanFilter::TimeUpdate(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, utiltool::NavTime const&) in navfilter.cc.o
      mscnav::KalmanFilter::EliminateIndex(unsigned long, unsigned long) in navfilter.cc.o
      mscnav::KalmanFilter::InsertIndex(unsigned long, std::__1::vector<double, std::__1::allocator<double> >) in navfilter.cc.o
      int utiltool::ConfigInfo::get<int>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in navfilter.cc.o
  "google::LogMessage::LogMessage(char const*, int)", referenced from:
      mscnav::KalmanFilter::InitialStateCov(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) in navfilter.cc.o
  "google::LogMessage::LogMessage(char const*, int, int)", referenced from:
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > utiltool::ConfigInfo::get<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in navfilter.cc.o
      mscnav::KalmanFilter::TimeUpdate(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, utiltool::NavTime const&) in navfilter.cc.o
      mscnav::KalmanFilter::EliminateIndex(unsigned long, unsigned long) in navfilter.cc.o
      mscnav::KalmanFilter::InsertIndex(unsigned long, std::__1::vector<double, std::__1::allocator<double> >) in navfilter.cc.o
      int utiltool::ConfigInfo::get<int>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in navfilter.cc.o
  "google::LogMessage::~LogMessage()", referenced from:
      mscnav::KalmanFilter::InitialStateCov(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) in navfilter.cc.o
      std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > utiltool::ConfigInfo::get<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in navfilter.cc.o
      mscnav::KalmanFilter::TimeUpdate(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, utiltool::NavTime const&) in navfilter.cc.o
      mscnav::KalmanFilter::EliminateIndex(unsigned long, unsigned long) in navfilter.cc.o
      mscnav::KalmanFilter::InsertIndex(unsigned long, std::__1::vector<double, std::__1::allocator<double> >) in navfilter.cc.o
      int utiltool::ConfigInfo::get<int>(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in navfilter.cc.o
  "google::LogMessageFatal::LogMessageFatal(char const*, int)", referenced from:
      mscnav::KalmanFilter::InitialStateCov(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) in navfilter.cc.o
  "google::LogMessageFatal::~LogMessageFatal()", referenced from:
      mscnav::KalmanFilter::InitialStateCov(Eigen::Matrix<double, -1, 1, 0, -1, 1> const&) in navfilter.cc.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [../bin/libfilter.dylib] Error 1
make[1]: *** [src/filter/CMakeFiles/filter.dir/all] Error 2
make: *** [all] Error 2
amirhosseingholami@Amirhosseins-MacBook-Pro build % 

如何用更新tools

你好,我是新手,请问一下如何用更新tools呀?我对submodules不会用

数据

您好,看到您的imu和gps融合的工作,想跑一下您的算法学习一下。算法中没有附带数据,请问数据可以分享一下吗?感谢

感兴趣

最近也在看,希望有机会多交流

GPS coordinate using to fusion

Hi. I'm interesting in your project. I have a question about GPS data.
What type of coordinate are GPS data measurement? I guess it's ENU but there is not available dataset using or proper paper.
Does it need to convert GPS measurement to proper frame before using to update Kalman Filter?

一些疑问和探讨

博主,你真的是太厉害了,目前我正研究mvo+IMU+gps的一个组合定位,虽然已经毕业工作了,但这个方向是刚开始学习,有很多问题想跟你请教。你觉得mvo+imu+gps,完全基于松耦合能做吗?我看一些方法是基于vio+gps做的比如VINS-fusion的双目+gps,单目视觉里程计这块我也刚开始研究没多久。
ps:我在 nvinitialized.cc中加入了头文件#include <numeric>,才能编译成功,这是std::accumulate需要的头文件。博主,我加您qq去啦,有疑问的时候希望能跟您请教。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.