zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    spring 事物(一)—— 事物详解
    XMPP即时通讯协议使用(十一)——Openfire表结构汇总
    java 关键字汇总
    基于数据库的分布式锁实现
    hibernate 参数一览
    数据库并发及锁机制及Hibernate锁实现
    redis 分布式锁的正确实现方式
    支持跨域的html元素
    九度OJ 上剑指 offer 习题目录
    Leetcode: Palindrome Partition I II
  • 原文地址:https://www.cnblogs.com/zhchp-blog/p/8735264.html
Copyright © 2011-2022 走看看