数据持续输出测试
第三节中最后虽然可以读取到雷达的角度和距离数据,但是每次后面读取的数据都会覆盖之前的数据,因此尝试使用动态的文件名,这样每次保存数据都会使用不同的文件名,数据就不会被覆盖。决定使用当前时间作为文件名,也便于后与的判断数据先后问题。参考获取当前系统时间和延迟等相关文章。修改官方提供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维层面,加上纵坐标数据可以实现二维线性雷达的三维扫描。