RPLIDAR思岚雷达学习记录--4--雷达数据实时保存

数据持续输出测试

第三节中最后虽然可以读取到雷达的角度和距离数据,但是每次后面读取的数据都会覆盖之前的数据,因此尝试使用动态的文件名,这样每次保存数据都会使用不同的文件名,数据就不会被覆盖。决定使用当前时间作为文件名,也便于后与的判断数据先后问题。参考获取当前系统时间延迟等相关文章。修改官方提供sdk前,先做了一个测试程序test.cpp,如下:

#include <iostream>
#include <fstream>
#include <string>
#include <stdio.h> 
#include <time.h>
#include <unistd.h>

using namespace std;

int main()
{
    for (int j = 0; j < 50; j++){
	    time_t timep;
	    struct tm*p;
	    char name[256]={0};//存储格式化后时间名
	    time(&timep);
	 		p = localtime(&timep);
			//将时间格式化成字符串
			sprintf(name, "%d.%d.%d %d:%02d:%02d.csv",1900+p->tm_year,1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
   			int count = 10;
  		  float tee = 2.333;
  		  ofstream oFile;
    		oFile.open(name, ios::out|ios::trunc);
    		for(int i = 0; i < count; i++){
        		oFile<<"属性1"<<","<<"属性2"<<","<<"结果1"<<","<<"结果2"<<endl;
        		oFile<< tee <<endl;
       		oFile<<"0101"<<","<<"1 2 3"<<","<<"32.2.3;2"<<","<<"1"<<endl;
    		}
    		oFile.close();
			sleep(2); //sleep 2 senconds
    }
}

直接使用g++编译,并运行输出的a.out文件:

g++ test.cpp
./a.out

输出结果如下所示:
在这里插入图片描述

由于本文末尾加了2秒延迟,因此每次获取到的数据时间差为2秒,如果输出数据是通过重复的回调函数获取当下最新数据时,通过该代码改变输出中tee的赋值地址,即可实现数据的实时记录。文件命名格式可根据自身需求改成与时间相关的格式,如果需要每分钟记录一次数据,仅需要将时间精确到分钟即可,如下所示:

sprintf(name, "%d.%d.%d %d:%02d.csv",1900+p->tm_year,1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min);

然后对思岚科技提供的client函数进行修改,代码如下:

#include "ros/ros.h"
#include "sensor_msgs/LaserScan.h"
/**/#include "fstream"
/**/#include "string"
/**/#include <stdio.h> 
/**/#include <time.h>
/**/#include <unistd.h>
#define RAD2DEG(x) ((x)*180./M_PI)

/**/using namespace std;

void scanCallback(const sensor_msgs::LaserScan::ConstPtr& scan)
{
    int count = scan->scan_time / scan->time_increment;
    ROS_INFO("I heard a laser scan %s[%d]:", scan->header.frame_id.c_str(), count);
    ROS_INFO("angle_range, %f, %f", RAD2DEG(scan->angle_min), RAD2DEG(scan->angle_max));
    /**/time_t timep;
    /**/struct tm*p;
    /**/char name[256]={0};
    /**/time(&timep);	
    /**/p = localtime(&timep);
    /**/sprintf(name, "%d.%d.%d %d:%02d:%02d.csv",1900+p->tm_year,1+p->tm_mon,p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec);
    /**/ofstream oFile;
    /**/oFile.open(name,ios::out|ios::trunc);
    for(int i = 0; i < count; i++) {
        float degree = RAD2DEG(scan->angle_min + scan->angle_increment * i);
        ROS_INFO(": [%f, %f]", degree, scan->ranges[i]);
	/**/oFile<< degree <<","<< scan->ranges[i] <<endl;
    }
    oFile.close();
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "rplidar_node_client");
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe<sensor_msgs::LaserScan>("/scan", 1000, scanCallback);
    ros::spin();
    return 0;
}

文中/**/为修改部分,若修改后重命名,需要在cmakelist文件中修改链接。这样一来实现了持续输出二维雷达测量的距离和角度数据,还可以根据需要选择输出的频率,使得二维线性雷达的使用不仅仅局限于2维层面,加上纵坐标数据可以实现二维线性雷达的三维扫描。

  • 10
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

看那片云

嘿嘿嘿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值