V-LOAM源码解析(四)

转载请注明出处:本文转自zhch_pan的博客http://www.cnblogs.com/zhchp-blog/

本博客为本人之前做项目时做的源码阅读工作,po到网上希望帮助其他人更好的理解V-LOAM的工程实现,有些地方代码做了修改,可能和原工程有出入,但对于该工程的整体流程理解没有妨碍。

源码下载链接:https://github.com/Jinqiang/demo_lidar


节点:stackDepthPoint

功能:将视觉里程计中用于定位的特征点三维坐标分批存储,用于后面的局部BA优化

 1 #include <math.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <ros/ros.h>
 5 
 6 #include "pointDefinition.h"
 7 
 8 const double PI = 3.1415926;
 9 
10 const int keyframeNum = 5;
11 pcl::PointCloud<DepthPoint>::Ptr depthPoints[keyframeNum];
12 double depthPointsTime[keyframeNum];
13 int keyframeCount = 0;
14 int frameCount = 0;
15 
16 pcl::PointCloud<DepthPoint>::Ptr depthPointsStacked(new pcl::PointCloud<DepthPoint>());
17 ros::Publisher *depthPointsPubPointer = NULL;
18 
19 double lastPubTime = 0;
20 
21 void depthPointsHandler(const sensor_msgs::PointCloud2ConstPtr& depthPoints2)
22 {
23   //每隔五帧保留一帧
24   frameCount = (frameCount + 1) % 5;
25   if (frameCount != 0) {
26     return;
27   }
28 
29   pcl::PointCloud<DepthPoint>::Ptr depthPointsCur = depthPoints[0];
30   depthPointsCur->clear();
31   pcl::fromROSMsg(*depthPoints2, *depthPointsCur);
32 
33   for (int i = 0; i < keyframeNum - 1; i++) {
34     depthPoints[i] = depthPoints[i + 1];
35     depthPointsTime[i] = depthPointsTime[i + 1];
36   }
37   depthPoints[keyframeNum - 1] = depthPointsCur;
38   depthPointsTime[keyframeNum - 1] = depthPoints2->header.stamp.toSec();
39 
40   keyframeCount++;
41   if (keyframeCount >= keyframeNum && depthPointsTime[0] >= lastPubTime) {
42     depthPointsStacked->clear();
43     for (int i = 0; i < keyframeNum; i++) {
44       *depthPointsStacked += *depthPoints[i];
45     }
46 
47     sensor_msgs::PointCloud2 depthPoints3;
48     pcl::toROSMsg(*depthPointsStacked, depthPoints3);
49     depthPoints3.header.frame_id = "camera";
50     depthPoints3.header.stamp = depthPoints2->header.stamp;
51     depthPointsPubPointer->publish(depthPoints3);
52 
53     lastPubTime = depthPointsTime[keyframeNum - 1];
54   }
55 }
56 
57 int main(int argc, char** argv)
58 {
59   ros::init(argc, argv, "stackDepthPoint");
60   ros::NodeHandle nh;
61 
62   for (int i = 0; i < keyframeNum; i++) {
63     pcl::PointCloud<DepthPoint>::Ptr depthPointsTemp(new pcl::PointCloud<DepthPoint>());
64     depthPoints[i] = depthPointsTemp;
65   }
66 
67   ros::Subscriber depthPointsSub = nh.subscribe<sensor_msgs::PointCloud2>
68                                    ("/depth_points_last", 5, depthPointsHandler);
69 
70   ros::Publisher depthPointsPub = nh.advertise<sensor_msgs::PointCloud2> ("/depth_points_stacked", 1);
71   depthPointsPubPointer = &depthPointsPub;
72 
73   ros::spin();
74 
75   return 0;
76 }
原文地址:https://www.cnblogs.com/zhchp-blog/p/8735264.html