run_vo.cpp
// -------------- test the visual odometry -------------
#include
#include
#include
#include
#include
#include "myslam/config.h"
#include "myslam/visual_odometry.h"
int main ( int argc, char** argv )
//鏈結引數檔案
myslam::config::setparameterfile ( argv[1] );
//構造vo,型別就是在visualodometry類中定義的指向自身型別的指標,然後用new開闢記憶體
myslam::visualodometry::ptr vo ( new myslam::visualodometry );
//讀取資料資料夾位址
string dataset_dir = myslam::config::get ( "dataset_dir" );
cout
<
/讀取資料資料夾中的associate.txt檔案
ifstream fin ( dataset_dir+"/associate.txt" );
//防呆,沒讀取成功的話輸出錯誤
if ( !fin )
//定義名陣列和時間戳陣列,用於存放associate.txt檔案中所示的時間戳對其的rgb影象和depth影象
vector
rgb_files, depth_files;
vector
rgb_times, depth_times;
//迴圈讀取直到檔案末尾
while ( !fin.eof() )
//建立相機
myslam::camera::ptr camera ( new myslam::camera );
// visualization
//視覺化內容,用到opencv中的viz模組
//第一步、創造乙個視覺化視窗,構造引數為視窗名稱
cv::viz::viz3d vis("visual odometry");
//第二步、建立座標系部件,這裡座標系是以widget部件型別存在的,
// 構造引數是座標系長度,也就是可視窗裡的錐形小座標系的長度,下面對座標系部件進行設定
cv::viz::wcoordinatesystem world_coor(1.0), camera_coor(0.5);
//這裡設定座標系部件屬性,然後新增到檢視視窗上去
//首先利用setrenderingproperty()函式設定渲染屬性,
// 第乙個引數是個列舉,對應要渲染的屬性這裡是線寬,後面是屬性值
world_coor.setrenderingproperty(cv::viz::line_width, 2.0);
camera_coor.setrenderingproperty(cv::viz::line_width, 1.0);
//用showwidget()函式將部件新增到視窗內
vis.showwidget( "world", world_coor );
vis.showwidget( "camera", camera_coor );
//至此,視窗中已經顯示了全部需要顯示的東西,就是兩個座標系:世界座標系,相機座標系。
//世界座標系就是寫死不動的了,所以後面也沒有再提起過世界座標系。需要做的就是計算出各個幀的相機座標系位置
//後續的核心就是下面的for迴圈,在迴圈中,不斷的給相機座標系設定新的pose,然後達到動畫的效果。
//第三步、設定視角。這步是非必要步驟,進行設定有利於觀察,
//不設定也會有預設視角,就是可能比較彆扭。而且開始後拖動滑鼠,也可以改變觀察視角。
//構建三個3d點,這裡其實就是構造makecamerapose()函式需要的三個向量:
//相機位置座標、相機焦點座標、相機y軸朝向
//藍色-z,紅色-x,綠色-y
cv::point3d cam_pos( 0, -1, -1 ), cam_focal_point(0,0,0), cam_y_dir(0,1,0);
//由這三個引數,用makecamerapose()函式構造affine3d型別的相機位姿,這裡其實是視角位姿,也就是程式開始時你處在什麼視角看
cv::affine3d cam_pose = cv::viz::makecamerapose( cam_pos, cam_focal_point, cam_y_dir );
//用setviewerpose()設定**視角
vis.setviewerpose( cam_pose );
//輸出rgb影象資訊,共讀到檔案數
cout
<
/整個畫面的快速重新整理呈現動態,由此for迴圈控制。
for ( int i=0; i//讀取影象,建立幀操作
mat color = cv::imread ( rgb_files[i] );
mat depth = cv::imread ( depth_files[i], -1 );
if ( color.data==nullptr || depth.data==nullptr )
break;
myslam::frame::ptr pframe = myslam::frame::createframe();
pframe->camera_ = camera;
pframe->color_ = color;
pframe->depth_ = depth;
pframe->time_stamp_ = rgb_times[i];
//這裡加個每幀的運算時間,看看實時性
boost::timer timer;
//這裡將幀新增進去,進行位姿變換計算
vo->addframe ( pframe );
cout
<
/vo狀態為lost時,跳出迴圈。
if ( vo->state_ == myslam::visualodometry::lost )
break;
//這裡要說一下,視覺化視窗中動的是相機座標系,所以本質上是求取相機座標系下的點在世界座標系下的座標,
//pw=twc*pc;
se3 twc = pframe->t_c_w_.inverse();
//se3 twc = pframe->t_c_w_;
//show the map and the camera pose
//用twc構造affine3d型別的pose所需要的旋轉矩陣和平移矩陣
cv::affine3d::mat3 rmat(
twc.rotation_matrix()(0,0), twc.rotation_matrix()(0,1), twc.rotation_matrix()(0,2),
twc.rotation_matrix()(1,0), twc.rotation_matrix()(1,1), twc.rotation_matrix()(1,2),
twc.rotation_matrix()(2,0), twc.rotation_matrix()(2,1), twc.rotation_matrix()(2,2)
);cv::affine3d::vec3 tvec(twc.translation()(0,0), twc.translation()(1,0), twc.translation()(2,0));
//構造位姿
cv::affine3d pose(rmat,tvec);
//兩視窗同時顯示,乙個是影象
cv::imshow("image", color );
cv::waitkey(1);
//另外乙個就是viz視覺化視窗
看這張執行圖:
小的相機座標系會動,大的世界座標系是不動的。
座標軸顏色對應為:藍色z,紅色x,綠色y。
這個視角就是開始執行時的視角,也就是我們視角設定的效果。可以對應cam_pose,cam_focal,cam_y_dir這三個引數看出分別是設定什麼東西:
cam_pose, 就是觀察者位置,文中設定的是(0, -1, -1),從執行結果圖上看,感覺上你就是站在(0, -1, -1)處。
cam_focal,就是觀察者對準什麼位置看,直觀上也就是整個視窗的正中心顯示什麼,這裡為(0, 0, 0)。所以,主觀感受上是正對著原點瞅,另外原點也很明顯的在視窗正中心。
cam_y_dir,這個不怎麼明白,原始碼上是這麼解釋的:@param y_dir up vector of the camera in global coordinate frame.但是看結果來看,貌似是下方向的指向,因為圖中很明顯(0, 1, 0)是指向下方的。單獨測試更改一下引數看結果,也瞅不出來什麼規律。
第九章測試
單選題 中醫 治未病 的理念體現了中醫藥服務在養老中 的優勢 a.醫 b.養 c.防 防 單選題 我國 9073養老模式 中,提倡90 的老人依靠 養老。a.居家 b.社群 c.機構 d.互助 居家 單選題 我國 9073養老模式 中,提倡7 的老人依靠 養老。a.居家 b.社群 c.機構 d.互助...
網頁製作 第九章測試
第1部分 總題數 5 單選題 2分 下面哪個css屬性是用來改變背景顏色的 a.bgcolor b.text c.background color d.color 本題總得分2分 單選題 2分 怎樣給所有的 h1 標籤新增背景顏色 a.h1 b.h1.all c.h1 d.h1 本題總得分2分 單選...
第九章(筆記)
轉移指令是可以修改ip,或同時修改cs和ip的指令 offset 是用於提取標號偏移位址的操作符 jmp在第2章裡說到時用於修改ip或同時修改cs和ip的轉移指令,這章裡單獨的jmp指令是乙個無條件的轉移指令 jmp short 標號 是實現段內短轉移 jmp near ptr 標號 是實現段內近轉...