4.实时存取点云的pcd文件(C++)

发布时间:2024年01月19日

? ? ? ? 本文是在假设可以将雷达系统、ROS和PCL可以结合用的条件下写的,这里主要是在前文的基础上结合了获取实时的时间,并将时间写成 hour_minute_second_mincond.pcd格式,比如"13_20_15_33.pcd",表示13时20分15秒33微秒获取的点云数据,pcd是文件的后缀。

? ? ? ? ?读取雷达的点云数据的方法可以参我写的另一篇博文11.2 PCL从ROS获取激光雷达的点云数据及处理-CSDN博客

下面直接直接写实时存取点云数据的C++代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <sstream>
#include <ctime>
#include <time.h>

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>


#include <ros/ros.h>
#include <pcl/point_cloud.h>
#include <pcl_conversions/pcl_conversions.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl/io/pcd_io.h>

using namespace std;  


void cloudCB(const sensor_msgs::PointCloud2::ConstPtr &input, string &output_path)
{
    pcl::PointCloud<pcl::PointXYZ> cloud;
    pcl::fromROSMsg(input, cloud);
    //pcl::io::savePCDFileASCII (strs, cloud);//"0.pcd"
    
}

 
int main(int argc, char *argv[])
{
    //while无限循环存取pcd文件
    while (1)
    {time_t t = time(nullptr); // 获取1970年到现在的毫秒数
	  struct tm* now = localtime(&t); // 把毫秒转换为日期时间的结构体
 
	  stringstream timeStr;
    
    // 以下依次把年月日的数据加入到字符串中
  	
	  timeStr << now->tm_hour << "_";
	  timeStr << now->tm_min << "_";
	  timeStr << now->tm_sec<< "_";
   
    struct timeval time;
 
    /* 获取时间,理论到us */
    gettimeofday(&time, NULL);
    //printf("s: %ld, ms: %ld\n", time.tv_sec, (time.tv_sec*1000 + time.tv_usec/1000));
    timeStr <<time.tv_usec/1000 << ".pcd";
    
    string strs=timeStr.str();
    cout << strs << endl;//
    
    ros::init (argc, argv, "pcd_write");
    ros::NodeHandle nh;
    ros::Subscriber bat_sub = nh.subscribe<sensor_msgs::PointCloud2>("/livox/lidar", 10, boost::bind(cloudCB, _1, strs));
    
    ros::spin();
    usleep(300000); } //延时   usleep:微秒   sleep:秒
    
    return 0;
    
}

? ? ? ? 思路也比较简单,就是先获取实时时间再将时间写成"13_20_15_33.pcd"格式,再用前面的博文写的保存点云数据的方法,将保持路径由实时时间传参即可。这里我们就可以实时循环保存pcd文件了。

文章来源:https://blog.csdn.net/weixin_71719718/article/details/135702867
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。