SLAM十四講---前端0.1---相機/幀/地圖點/地圖/配置類的定義

slam十四講——RGBD的視覺里程計

定義了幾個類,分別爲相機類(Camera)、幀類(Frame)、地圖點類(MapPoint)、地圖類(Map)、配置類(Config)

下面給出大綱:

1. 相機類Camera

相機類中儲存了相機內參,以及定義了一些座標系轉換的接口。

類成員變量:

(1)智能指針
typedef std::shared_ptr Ptr;
(2)相機內參
float fx_, fy_, cx_, cy_, depth_scale_; // Camera intrinsics

類成員函數:
(1)無參構造——應該沒啥用
Camera();
(2)有參構造
Camera ( float fx, float fy, float cx, float cy, float depth_scale=0 ) :
fx_ ( fx ), fy_ ( fy ), cx_ ( cx ), cy_ ( cy ), depth_scale_ ( depth_scale )

2. 幀類Frame

幀類中存儲了編號、當前幀位姿、當前幀的RGB圖像和深度圖像

類成員變量:
(1)智能指針
typedef std::shared_ptr Ptr;
(2)幀的編號id
unsigned long id_; // id of this frame
(3)時間戳
double time_stamp_; // when it is recorded
(4)當前幀位姿(世界->相機)
SE3 T_c_w_; // transform from world to camera
(5)相機模型以及需要他其中的一系列座標系轉換的接口
Camera::Ptr camera_; // Pinhole RGBD Camera model 相機模型,得用到當前幀的相機模型,來實現座標系轉換的功能
(5)當前幀的rgb圖像和深度圖
Mat color_, depth_; // color and depth image

類成員函數:
(1)無參構造
Frame();
(2)有參構造
Frame( long id, double time_stamp=0, SE3 T_c_w=SE3(), Camera::Ptr camera=nullptr, Mat color=Mat(), Mat depth=Mat() );
(3)析構
~Frame();
(4)構造一幀
// factory function
static Frame::Ptr createFrame(); // 構造一幀,裏面有id
(5)給2d點,返回深度值
// find the depth in depth map
double findDepth( const cv::KeyPoint& kp ); // 返回深度值
(6)得到當前幀相機光心在世界座標的位置(光心位置)
// Get Camera Center 得到當前幀相機光心在世界座標的位置
Vector3d getCamCenter() const;
(7)判斷某個世界點是否在視野內
// check if a point is in this frame
bool isInFrame( const Vector3d& pt_world ); // 判斷某個點是否在視野內

3. 地圖點類MapPoint

地圖點類存儲了編號、座標、方向、描述子等

這裏有個很重要的概念:需要存儲其描述子

是爲了當推斷相機位姿的時候,提取圖像特徵點後,特徵點的描述子與3d地圖點的描述子進行比較,匹配,可以認爲這個3d點投影到這個位姿相機圖像平面上的時候,就是與之描述子匹配的那個點。

類成員變量:
(1)智能指針
typedef shared_ptr Ptr;
(2)id編號
unsigned long id_; // ID
(3)3d座標
Vector3d pos_; // Position in world
(4)方向
Vector3d norm_; // Normal of viewing direction // 歸一化後的,代表了方向
(5)描述子,爲了匹配用
Mat descriptor_; // Descriptor for matching // 必須有描述子,以便於根據二維圖像中的特徵點進行匹配,從而估計相機的位姿
(6)被觀測到的次數
int observed_times_; // being observed by feature matching algo.
(7)作爲內點的次數
int correct_times_; // being an inliner in pose estimation

類成員函數:
(1)無參構造
MapPoint();
(2)有參構造,輸入id,3d位置,方向
MapPoint( long id, Vector3d position, Vector3d norm );
(3)創建地圖點
// factory function
static MapPoint::Ptr createMapPoint();

4. 地圖類Map

管理所有的地圖點,VO的匹配過程只需要和Map類打交道即可。

成員變量:

(1)智能指針
typedef shared_ptr Ptr;
(2)哈希容器unorderedmap(散列),存儲地圖點,便於隨時添加和刪除
unordered_map<unsigned long, MapPoint::Ptr > map_points_; // all landmarks
(3)哈希容器unorderedmap(散列),存儲關鍵幀,便於隨時添加和刪除
unordered_map<unsigned long, Frame::Ptr > keyframes_; // all key-frames

成員函數:

(1)無參構造
Map() {}
(2)插入關鍵幀
void insertKeyFrame( Frame::Ptr frame );
(3)插入地圖點
void insertMapPoint( MapPoint::Ptr map_point );

從這裏可見,map維護的是一系列關鍵幀(所有普通幀的子集)和一堆地圖點。

5. 配置類Config

負責參數文件的讀取,是一個全局對象。想讀參數的時候就拿它讀一下

成員變量:

(1)智能指針
static std::shared_ptr config_;
(2)理解爲用於數據存取操作的句柄
cv::FileStorage file_;

成員函數:

(1) 析構函數,關閉文件
~Config(); // close the file when deconstructing
(2)讀取文件並賦予句柄 file_;
// set a new config file
static void setParameterFile( const std::string& filename );
(3)根據鍵值獲取參數值
// access the parameter values
template< typename T >
static T get( const std::string& key )
{
return T( Config::config_->file_[key] );
}
獲取參數的方法,在yaml文件中寫入Camera.fx:500
在這裏插入圖片描述

常識補充:
1.講構造函數設置爲私有,是爲了不能讓其在別處建立,以便於其形成“單例模式”(config類中)
2.設置各種智能指針的原因是,能夠自動析構,防止內存泄露(各個類中均有)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章