開源雷射SLAM專案BLAM 2

2021-08-26 15:01:48 字數 3012 閱讀 2632

接上一章節提到的**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檔案...