前段時間寫了一些代碼,但是在運算過程中發現有些代碼可以進行改進以提高運行效率,尤其是與PCL相關的部分,可以進行大幅度提高.特意在此進行記錄,分享給大家,也供自己查看.
pcl::PointCloud< T >點云的加法
比如我有兩個clusters,每個clusters都包括points_這個成員,類型為:
pcl::PointCloud<PointInfoType> points_;
我想要把兩個clusters的points_成員加在一起,PCL是支持點云的加法的,如下所示.
cluster1.points_ = cluster1.points_ + cluster2.points_;
但是這樣會很慢,我們可以通過逐點的push_back來替換,如下所示.
// update the cluster pointsfor(int i=0; i<cluster2.points_.size(); i++){cluster1.points_.push_back(cluster2.points_[i]);}
提前分配空間
比如,我們想對點云進行一個體素下采樣,每個體素中保留一個點且已知體素的數量,那么我們可以提前分配給點云變量對應大小.這樣在填充過程中就不用系統每次內部進行擴充,大大加快處理速度.
如下述代碼中,提前為pl_feat分配了num_voxels大小,后續使用emplace_back函數,逐個添加點.
pl_feat.clear();pl_feat.points.reserve(num_voxels); // 提前分配內存for (const auto& voxel : voxel_map){// pl_feat.points.push_back(voxel.second.points_[0]);pl_feat.points.emplace_back(voxel.second.points_[0]);}pl_feat.width = pl_feat.points.size();pl_feat.height = 1;pl_feat.is_dense = true;
類似的,在構建voxelmap的時候也提前分配好一個比較大的空間,這樣在向voxel_map中添加點云時就會大大加快速度.
std::unordered_map<UNI_VOXEL_LOC, M_POINT> voxel_map;
voxel_map.reserve(50000000);
在實時運行中kdtree最好只構建一次
在面對大量點云,或者說點云在逐漸增加時,最好只對點云構建一次kdtree或者說盡量降低構建kdtree的次數,或者更換其他數據結構,比如ikdtree來解決問題.
pcl中自帶的kdtree構建難以處理大量點云,會非常耗時
// build a kd tree
pcl::KdTreeFLANN<pcl::PointXY> kdtree2d;
kdtree2d.setInputCloud(gnd_data2d);