久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

graph slam學(xué)習(xí):g2o

 謝興l4nztpvbdk 2017-07-18

 1. graph_slam 學(xué)習(xí)

      關(guān)于graph-slam的學(xué)習(xí)詳細(xì)參照教材<<Probabilistic Robotics>> 2005版     第11章  

     圖優(yōu)化實(shí)際上是解一種非線(xiàn)性最小二乘問(wèn)題,,主要用于離線(xiàn)的slam優(yōu)化,,也有用在在線(xiàn)的方式的,。 最小二乘解決的就是偏差全局最小的問(wèn)題,,再在原基礎(chǔ)量上

疊加最小偏差量即為最優(yōu)量,。 圖優(yōu)化將問(wèn)題全部抽象成 node(點(diǎn))與edge(邊)的問(wèn)題。,。

1.1 組成:   圖優(yōu)化的圖形簡(jiǎn)化見(jiàn)下圖

     點(diǎn):    每個(gè)t時(shí)刻的機(jī)器人位置robot_pos  2d(x,y,theta),與t時(shí)刻觀(guān)察到的landmark_pos(rou,theta)<極坐標(biāo)的樣式 > 作為點(diǎn),;

     邊:   不同時(shí)刻的robot_pos 之間距離作為邊 (t 時(shí)刻量與t-1時(shí)刻運(yùn)動(dòng)預(yù)測(cè)量偏差),t 時(shí)刻 robot_pos 與 landmark_pos 間的距離作為邊(我稱(chēng)為虛擬邊,,它在后面的矩陣稀疏化過(guò)程中會(huì)簡(jiǎn)化轉(zhuǎn)成 跨時(shí)刻的  robot_pos 相應(yīng)連接關(guān)系)

 1.2 目的:

                 通過(guò)預(yù)測(cè)與觀(guān)測(cè)的比較 : 使得當(dāng)前時(shí)刻 取得的機(jī)器人位置與landmark位置偏差全局最小,。


 1.3  說(shuō)明:

         1)  需要初始的位置,迭代最優(yōu),。

         2) 稀疏矩陣的應(yīng)用: 如圖所示,,每個(gè)格子占據(jù)表示的是robot_pos 與landmark_pos的關(guān)聯(lián)關(guān)系。m3在t=2.3.4的時(shí)刻都可以觀(guān)察到,。robot_pos本來(lái)就有t=2,3間的

關(guān)系,,假如我把m3簡(jiǎn)化調(diào),必須引進(jìn)robot_pos在t=2,,4見(jiàn)的聯(lián)系(x2->x4),,如下右圖。

1.4  圖優(yōu)化的過(guò)程偽代碼:       算法的總體框架如下:


     1) 初始化起始點(diǎn),。運(yùn)動(dòng)預(yù)測(cè)量(運(yùn)動(dòng)模型)

    2)     轉(zhuǎn)化為信息矩陣的形式(具體還沒(méi)弄清為什么轉(zhuǎn)到 information,?,IF有更穩(wěn)定),,建立整個(gè)關(guān)聯(lián)矩陣,。


    3) 矩陣稀疏化。去landmark點(diǎn),,建立Xi與Xj間的聯(lián)系,。

  4) 系統(tǒng)狀態(tài)更新(機(jī)器人狀態(tài)與landmark 狀態(tài)),。

說(shuō)明:詳細(xì)說(shuō)明參見(jiàn)書(shū)本介紹與相應(yīng)的推導(dǎo)。

1.5 圖優(yōu)化相應(yīng)的資源

基于優(yōu)化方法的機(jī)器人同步定位與地圖創(chuàng)建(SLAM)后端(Back-end)設(shè)計(jì)技術(shù)收集

RGBD-SLAM 

論文:

Hierarchical Optimization on Manifolds for Online 2D and 3D Mapping;(2010)

g2o: A General Framework for Graph Optimization;(2011)

Experimental Analysis of Dynamic Covariance Scaling for Robust Map Optimization Under Bad Initial Estimates;(2014)


2.  g2o簡(jiǎn)單turorial:

   論文: g2o: A General Framework for Graph Optimization;(2011)

   開(kāi)源代碼  g2ohttp://www./g2o.html

      g2o的框架結(jié)構(gòu)如下圖所示:

     論文內(nèi)容: 主要圍繞最小二乘與非線(xiàn)性最小二乘的求解進(jìn)行介紹  ,,最后給出一些常用graph-slam的方法結(jié)果比較,。。


3.  g2o 移植使用說(shuō)明

   3.1  g2o 庫(kù)的編譯與安裝

    進(jìn)github ,下載代碼,, cd   ;mkdir build ;   cd build ; cmake .. ;make -j4;  正常通過(guò),。 cd bin ;  ./tutorial_slam2d  測(cè)試執(zhí)行; 

    sudo make install  安裝相應(yīng)的lib 與 頭文件庫(kù) ,執(zhí)行文件; 

說(shuō)明:  1)留意 cmake_modules 文件夾里,。里面的××××.cmake后面會(huì)用到,。  和cmakelists中的如下語(yǔ)句。

  1. set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules/")  
  2. message(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH})  
  3.     


             2)  g2o/examples/里面有相應(yīng)的tutorial例子

  3.2  簡(jiǎn)單介紹tutorial_slam2d

             g2o/examples/tutorial_slam2d  例子是用模擬生成的數(shù)據(jù),,利用g2o的OptimizationAlgorithmGaussNewton方法進(jìn)行更新得到相應(yīng)的優(yōu)化,。

     1)初始化起點(diǎn)

  1. // add the parameter representing the sensor offset  
  2. ParameterSE2Offset* sensorOffset = new ParameterSE2Offset;  
  3. sensorOffset->setOffset(sensorOffsetTransf);  
  4. sensorOffset->setId(0);  
  5. optimizer.addParameter(sensorOffset);  

     2) 添加機(jī)器人位置

  1. cerr << "Optimization: Adding robot poses ... ";  
  2. for (size_t i = 0; i < simulator.poses().size(); ++i) {  
  3.   const Simulator::GridPose& p = simulator.poses()[i];  
  4.   const SE2& t = p.simulatorPose;   
  5.   VertexSE2* robot =  new VertexSE2;  
  6.   robot->setId(p.id);  
  7.   robot->setEstimate(t);  
  8.   optimizer.addVertex(robot);  
  9. }  
    3) 添加里程邊

  1. // second add the odometry constraints  
  2. cerr << "Optimization: Adding odometry measurements ... ";  
  3. for (size_t i = 0; i < simulator.odometry().size(); ++i) {  
  4.   const Simulator::GridEdge& simEdge = simulator.odometry()[i];  
  5.   
  6.   EdgeSE2* odometry = new EdgeSE2;  
  7.   odometry->vertices()[0] = optimizer.vertex(simEdge.from);  
  8.   odometry->vertices()[1] = optimizer.vertex(simEdge.to);  
  9.   odometry->setMeasurement(simEdge.simulatorTransf);  
  10.   odometry->setInformation(simEdge.information);  
  11.   optimizer.addEdge(odometry);  
  12. }  

     4) 添加landmark位置

  1. // add the landmark observations  
  2. cerr << "Optimization: add landmark vertices ... ";  
  3. for (size_t i = 0; i < simulator.landmarks().size(); ++i) {  
  4.   const Simulator::Landmark& l = simulator.landmarks()[i];  
  5.   VertexPointXY* landmark = new VertexPointXY;  
  6.   landmark->setId(l.id);  
  7.   landmark->setEstimate(l.simulatedPose);  
  8.   optimizer.addVertex(landmark);  
  9. }  
  10. cerr << "done." << endl;  

   5) 添加機(jī)器人與landmark 邊位置

  1. cerr << "Optimization: add landmark observations ... ";  
  2. for (size_t i = 0; i < simulator.landmarkObservations().size(); ++i) {  
  3.   const Simulator::LandmarkEdge& simEdge = simulator.landmarkObservations()[i];  
  4.   EdgeSE2PointXY* landmarkObservation =  new EdgeSE2PointXY;  
  5.   landmarkObservation->vertices()[0] = optimizer.vertex(simEdge.from);  
  6.   landmarkObservation->vertices()[1] = optimizer.vertex(simEdge.to);  
  7.   landmarkObservation->setMeasurement(simEdge.simulatorMeas);  
  8.   landmarkObservation->setInformation(simEdge.information);  
  9.   landmarkObservation->setParameterId(0, sensorOffset->id());  
  10.   optimizer.addEdge(landmarkObservation);  
  11. }  
  12. cerr << "done." << endl;  

6)迭代優(yōu)化

  1. // prepare and run the optimization  
  2. // fix the first robot pose to account for gauge freedom  
  3. VertexSE2* firstRobotPose = dynamic_cast<VertexSE2*>(optimizer.vertex(0));  
  4. firstRobotPose->setFixed(true);  
  5. optimizer.setVerbose(true);  
  6.   
  7. cerr << "Optimizing" << endl;  
  8. optimizer.initializeOptimization();  
  9. optimizer.optimize(10);  
  10. cerr << "done." << endl;  
  11.   
  12. optimizer.save("tutorial_after.g2o");  

 3.3  利用g2o庫(kù)進(jìn)行相應(yīng)的開(kāi)發(fā)

    主要講解移植過(guò)程中出現(xiàn)的問(wèn)題,。主要參照的是RGBSLAMV2 與 g2o 兩個(gè)開(kāi)源cmakelists的編寫(xiě),。。

   我的工程結(jié)構(gòu)如下: 以子文件夾的形式在ar中編譯tutorial_slam2d



主要在兩個(gè)點(diǎn)

1) 出現(xiàn)C++11不兼容問(wèn)題的解決

參照:How to activate C++ 11 in CMake 

  1.  include(CheckCXXCompilerFlag)  
  2. CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)  
  3. CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)  
  4. if(COMPILER_SUPPORTS_CXX11)  
  5.     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")  
  6. elseif(COMPILER_SUPPORTS_CXX0X)  
  7.     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")  
  8. else()  
  9.         message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")  
  10. endif()  
  11.   
  12. if(COMMAND cmake_policy)  
  13.   cmake_policy(SET CMP0003 NEW)  
  14. endif(COMMAND cmake_policy)  

2)findpackage找include與lib --->xx.cmake 文件

3)  將 g2o/cmake_modules文件夾復(fù)制到新工程

  1. set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules/")  
  2. message(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH})  
  3. # g2o #######################  
  4. find_package(G2O REQUIRED)  
  5. include_directories(${G2O_INCLUDE_DIR})  
  6. message("G2O_INCLUDE_DIRS ${G2O_INCLUDE_DIR}")  
  7. link_directories(${G2O_LIBRARY_DIRS})  
  8. link_libraries(${G2O_LIBRARIES})  
  9. message("G2o-libraries ${G2O_LIBRARIES}")  
  10.   
  11. <pre name="code" class="html">         # CSparse #######################  
  12.   find_package(CSparse REQUIRED)  
  13.   include_directories(${CSPARSE_INCLUDE_DIR})  
  14.   message("CSPARSE_INCLUDE_DIRS"${CSPARSE_INCLUDE_DIR})  
  15.   link_directories(${CSparse_LIBRARY_DIRS})  
  16.   link_libraries(${CSPARSE_LIBRARY})  
  17.   message("CSparse-libraries ${CSPARSE_LIBRARY}")  



以下是我的cmakelists文件:

  1. cmake_minimum_required(VERSION 2.8)  
  2. project(tutorial_slam2d)  
  3.   
  4.        include(CheckCXXCompilerFlag)  
  5.       CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)  
  6.       CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)  
  7.       if(COMPILER_SUPPORTS_CXX11)  
  8.           set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")  
  9.       elseif(COMPILER_SUPPORTS_CXX0X)  
  10.           set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")  
  11.       else()  
  12.               message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")  
  13.       endif()  
  14.   
  15.       if(COMMAND cmake_policy)  
  16.         cmake_policy(SET CMP0003 NEW)  
  17.       endif(COMMAND cmake_policy)  
  18.   
  19. set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules/")  
  20. message(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH})  
  21. # g2o #######################  
  22. find_package(G2O REQUIRED)  
  23. include_directories(${G2O_INCLUDE_DIR})  
  24. message("G2O_INCLUDE_DIRS ${G2O_INCLUDE_DIR}")  
  25. link_directories(${G2O_LIBRARY_DIRS})  
  26. link_libraries(${G2O_LIBRARIES})  
  27. message("G2o-libraries ${G2O_LIBRARIES}")  
  28.   
  29.          # CSparse #######################  
  30.   find_package(CSparse REQUIRED)  
  31.   include_directories(${CSPARSE_INCLUDE_DIR})  
  32.   message("CSPARSE_INCLUDE_DIRS"${CSPARSE_INCLUDE_DIR})  
  33.   link_directories(${CSparse_LIBRARY_DIRS})  
  34.   link_libraries(${CSPARSE_LIBRARY})  
  35.   message("CSparse-libraries ${CSPARSE_LIBRARY}")  
  36.   
  37.   
  38. INCLUDE_DIRECTORIES(${CSPARSE_INCLUDE_DIR})  
  39.   
  40. file(GLOB_RECURSE HEADERS_AR  
  41.         ${PROJECT_SOURCE_DIR}/class/*.h  
  42.         ${PROJECT_SOURCE_DIR}/class/*.cpp  
  43. )  
  44. message("HEADERS_AR = ${HEADERS_AR}")  
  45. ADD_LIBRARY(tutorial_slam2d_library   SHARED  ${HEADERS_AR})  
  46.   
  47. SET_TARGET_PROPERTIES(tutorial_slam2d_library PROPERTIES OUTPUT_NAME ${LIB_PREFIX}tutorial_slam2d)  
  48.   
  49. TARGET_LINK_LIBRARIES(tutorial_slam2d_library  ${G2O_LIBRARIES} )  
  50.   
  51. ADD_EXECUTABLE(tutorial_slam2d  
  52.   tutorial_slam2d.cpp  
  53. )  
  54.   
  55. SET_TARGET_PROPERTIES(tutorial_slam2d PROPERTIES OUTPUT_NAME tutorial_slam2d${EXE_POSTFIX})  
  56.   
  57. TARGET_LINK_LIBRARIES(tutorial_slam2d tutorial_slam2d_library)  

4)相關(guān)資源 :  g 2 o: A general Framework for (Hyper) Graph Optimization 

g2o: A General Framework for Graph Optimization

說(shuō)明:這些都是個(gè)人簡(jiǎn)單理解,,方便大家入門(mén),。如有問(wèn)題,歡迎留言指正,,不甚感激,。。 

 


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀(guān)點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多