SLAM代碼(SVO ros )

SVO ros 節點解讀

測試執行

  • 使用作者給出的bag文件,運行以下指令
rosbag play airground_rig_s3_2013-03-18_21-38-48.bag

這樣會在ros環境中廣播/camera/image_raw 圖像message, svo節點重映射該message到cam_topic,並訂閱該topoic。運行該節點程序

roslaunch svo_ros test_rig3.launch 

可視化輸出結果

rosrun rviz rviz -d src/rpg_svo/svo_ros/rviz_config.rviz 

svo節點的輸出節點通過一個tf變換和2個marker,這樣可以可視化在rviz中。2個marker其中一個是point顯示的相機的位置(svo/points),另外一個是(表示相機位姿的五面體(/svo/keyframe))
這裏寫圖片描述
如圖所示爲svo節點廣播的topic,其中svo/points和/svo/keyframe均爲/visualization_msgs/marker類型的message.

運行結果

這裏寫圖片描述
我使用同一段視頻跑了2遍,發現所走的軌跡基本是完全一樣的,從圖中可以看出所用的背景很複雜,很有利於提取角點,有很多distinctive feature points。

ros node init

  • 創建ROS句柄
  • 訂閱camera topic(svo/cam_topic)同時指定camera topic的回調函數
  • 指定廣播的topics(可視化marker)
  • 訂閱remote key用戶輸入,指定回調函數

VO的構造函數

vo節點的成員中包含FrameHandlerMono成員,該類完成svo的核心功能,其中包括image sparse alignment, feature alignment, pose and Structure Optimization

另一個是visualizer,負責輸出message至rviz可視化顯示計算結果,可以借鑑。廣播的信息如下

pub_frames_ = pnh_.advertise<visualization_msgs::Marker>("keyframes", 10);
pub_points_ = pnh_.advertise<visualization_msgs::Marker>("points", 1000);
pub_pose_ = pnh_.advertise<geometry_msgs::PoseWithCovarianceStamped>("pose",10);

初始化(設置)marker的代碼位於vikit中。
parameter設置,首先讀取相機的內參數,使用分別讀取了參數

cam_model: Pinhole
cam_width: 752
cam_height: 480
cam_fx: 414.536145
cam_fy: 414.284429
cam_cx: 348.804988
cam_cy: 240.076451
cam_d0: -0.283076
cam_d1: 0.066674
cam_d2: 0.000896
cam_d3: 0.000778

讀取方法是

 getParam<int>(ns+"/cam_width"),

其中ns爲參數的外層命名空間(svo)。
其次是讀取相機的初始位姿。參數格式如下

<param name="init_rx" value="3.14" />
<param name="init_ry" value="0.00" />
<param name="init_rz" value="0.00" />

事實上,並不需要在launch文件中難過給出全部6D數據,因爲如果從參數服務器中讀不到的時候會返回一個默認值0.0.

圖像的回調函數

ROS中首先sensor圖像數據類型轉化爲opencv Mat類型,其次是處理用戶輸入,然後在vo中增加當前傳入的圖像(該該函數中分階段處理圖像(首幀,前2幀,和普通幀,重定位幀)),之後就是發佈可視化message。

具體的流程如下
這裏寫圖片描述

相關類簡介

類 FrameHandlerMono(VO entity)

函數 輸入 輸出
構造函數 抽象相機類 -
增加圖像 Mat,時間戳 -
設置首幀圖像 FramePtr -
讀取末幀圖像 FramePtr

初始化

  • 構造特徵檢測子
  • 指定深度濾波器回調函數
  • 構造深度濾波器
  • 開啓深度濾波器線程

processFirstFrame

  • 初始化機體到世界的齊次變化(4x4矩陣)
  • 單應矩陣得到第一幀圖像
  • 增加keyframe
  • 增加新幀
  • 指示階段變動

processSecondFrame

  • 單應矩陣增加第二幀圖像
  • 兩視圖bundle adjustment
  • 添加新幀
  • 得到景深
  • 增加關鍵幀
  • 單應矩陣歸零

processFrame

  • 獲取上幀圖像計算單應矩陣
  • 稀疏圖像對齊 spase image alignment
  • Feature alignment
  • 如果重建誤差大於預設閾值,那麼丟棄計算所得變換,標註當前的計算是無效的.(map reprojection & feature alignment)
  • 位姿最優化,optimizeGaussNewton
  • 結構優化,optimizeStructure
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章