laser scan matcher 筆記
阿新 • • 發佈:2018-11-20
laser scan matcher 筆記
整體流程
-
LaserScanMatcher
類中,先initParams();
初始化引數,然後設定ros
的釋出節點和接受節點 -
然後看雷達資料函式
LaserScanMatcher::scanCallback
,其中呼叫了兩個函式
laserScanToLDP(scan_msg, curr_ldp_scan);
和processScan(curr_ldp_scan, scan_msg->header.stamp);
,我們一個一個看-
laserScanToLDP函式,把ros的laser_scan轉換成本程式定義的雷達格式
struct laser_data
typedef struct laser_data* LDP;
繞了個大彎,這個LDP
中包含了里程計資訊odometry
和真是位置true_pose
estimate
-
processScan函式,把轉換過的雷達格式傳入
- 首先預測根據前後兩幀的變化時間預測
getPrediction
位姿變化 - 然後
createTfFromXYTheta
得到tf轉換,這裡發現個好東西tf::Transform
可以直接運算pr_ch_l = laser_to_base_ * f2b_.inverse() * pr_ch * f2b_ * base_to_laser_ ;
- 這裡才到了最關鍵最重要的地方 ICP,呼叫CSM( C(anonical) Scan Matcher (CSM) )的點到線的ICP演算法
sm_icp(&input_, &output_)
,看了一晚上了,好像看錯了庫 - 後面就是對
sm_icp
求得的結果進行驗證,並轉換成tf,最後整理髮布就完鳥。
- 首先預測根據前後兩幀的變化時間預測
-
-
關鍵的關鍵
sm_icp
sm_icp
一個sm_params
結構體,並返回一個sm_result
,那麼,如果我只想用這個庫來完成我的匹配工作,我就只需要知道這個輸入的結構,然後呼叫就完事了。
sm_params
接下來就實驗一下吧.
星期三, 30. 五月 2018 07:01下午
今天試了一下這個庫,執行不出來,現在在決定要不要放棄自己寫,還是說去改原來的庫檔案。
先自己測試下吧,最後實在是不行的話再改原檔案吧。
先分析一下當前存在的問題,當前的問題聚焦再sm_icp
上面:
- 一方面可能是輸入引數的問題,params
初始化是不是正確,先檢驗這個吧
- 另一方面就是,輸入的sm_result1
的結果的問題
星期三, 30. 五月 2018 08:42下午
c++編碼能力太差了,哎,寫個程式,費死個老勁啊
tf::Transform 的騷操作:
input_.first_guess[0] = pr_ch_l.getOrigin().getX(); // 得到xy
input_.first_guess[1] = pr_ch_l.getOrigin().getY();
input_.first_guess[2] = tf::getYaw(pr_ch_l.getRotation()); //得到水平旋轉角,帥