接上一章節提到的**processpointcloudmessage(m->msg)**函式,它傳入乙個const pointcloud::constptr& 型別,即點雲常指標的引用,程式源**如下
void blamslam::processpointcloudmessage(const pointcloud::constptr& msg)
pointcloud::ptr msg_transformed(new pointcloud);
pointcloud::ptr msg_neighbors(new pointcloud);
pointcloud::ptr msg_base(new pointcloud);
pointcloud::ptr msg_fixed(new pointcloud);
// 將當前幀資料通過前面的變換矩陣 轉換到 地圖座標系下
localization_.motionupdate(odometry_.getincrementalestimate());
localization_.transformpointstofixedframe(*msg_filtered,
msg_transformed.get());
// 在地圖座標系下得到當前幀資料對應的最近鄰點
// 最近鄰點轉換回感測器的座標系 與當前幀再進行一次匹配 得到精確的位姿變換矩陣
localization_.transformpointstosensorframe(*msg_neighbors, msg_neighbors.get());
localization_.measurementupdate(msg_filtered, msg_neighbors, msg_base.get());
// 回環檢測
bool new_keyframe;
if (handleloopclosures(msg, &new_keyframe)) else
} // 發布位姿節點,里程計資料等
loop_closure_.publishposegraph();
// 發布當前幀點雲資料
if (base_frame_pcld_pub_.getnumsubscribers() != 0)
}
程式有一點長,不過相對於其他開源雷射slam專案還是挺好理解的。下面就一段段的分析
static int t=0;
ros_info("the times is:%d",t++);
// 進行一些基本的過濾 提高後面運算速度 降低資料儲存量
pointcloud::ptr msg_filtered(new pointcloud);
filter_.filter(msg, msg_filtered);
// 雷射里程計 得到粗略的 變換矩陣 , 第一次執行時候進入if語句初始化地圖
if (!odometry_.updateestimate(*msg_filtered))
filter_.filter(msg, msg_filtered);這裡就是呼叫pcl庫進行一些基本的資料過濾,其配置在config.yaml檔案進行設定,比較見到就不進去看了,不了解的可以去pcl官網教程裡去看一下(
*odometry_.updateestimate(msg_filtered)
odometry_是 odometry類例項化的乙個物件,odometry類定義在point_cloud_odometry這個package下。進入這個函式
bool pointcloudodometry::updateestimate(const pointcloud& points)
// move current query points (acquired last iteration) to reference points.
copypointcloud(*query_, *reference_);
// set the incoming point cloud as the query point cloud.
copypointcloud(points, *query_);
// 有了兩幀資料 執行icp
return updateicp();
}
可以看到這裡是儲存當前幀和上一幀的資料,通過兩幀資料做匹配。下面就進入匹配的函式
bool pointcloudodometry::updateicp() else
// convert pose estimates to ros format and publish.
publishpose(incremental_estimate_, incremental_estimate_pub_); //發布兩幀之間的位姿變換
publishpose(integrated_estimate_, integrated_estimate_pub_); //發布累計的位姿變換
// publish point clouds for visualization.
publishpoints(query_, query_pub_);
publishpoints(reference_, reference_pub_);
// convert transform between fixed frame and odometry frame.
geometry_msgs::transformstamped tf;
tf.transform = gr::torostransform(integrated_estimate_); //發布tf變換
tf.header.stamp = stamp_;
tf.header.frame_id = fixed_frame_id_;
tf.child_frame_id = odometry_frame_id_;
tfbr_.sendtransform(tf);
return true;
}
2D雷射SLAM演算法比較 cartographer
hector slam hector slam利用高斯牛頓方法解決scan matching問題,對感測器要求較高。缺點 需要雷達 lrs 的更新頻率較高,測量雜訊小。所以在製圖過程中,需要robot速度控制在比較低的情況下,建圖效果才會比較理想,這也是它沒有回環 loop close 的乙個後遺症...
Github上的開源專案2
krvideoplayer kxmovie vkvideoplayer ijkplayer android ios video player based on ffmpeg n2.8,with mediacodec,videotoolbox support.eleven eleven player ...
2 go開源cache2go專案筆記 專案介紹
2.go開源cache2go專案筆記 專案介紹 該專案是go物件的快取庫,包含cache過期自動刪除caceh功能等。專案中包含examples資料夾,裡面包含一些使用例子。主目錄就沒有其他資料夾了,剩下的都是go檔案為主了。ps 還有license.txt,readme之類的可以開啟瞅瞅 go檔案...