RPLIDAR思岚雷达学习记录--3--rplidar_ros-master修改保存csv格式数据

rplidar_ros-master

下载rplidar_ros-master包源后在ros工作空间内打开,并编译,详细过程及下载地址见学习记录–1

本文介绍的过于繁琐,考虑到还有一些新接触到ros的同学,大佬勿怪

在这里插入图片描述
下载的源码编译后应该没有build文件夹,我在当前目录下在进行编译了一遍所以才出现build文件,launch文件夹内部存放一些我们可以调用的launch文件,rviz就一个rviz配置文件,scripts这个文件我也不知道干啥用的,应该时提供一些规则,sdk是官方提供的sdk我们可以直接调用,不用细看内部代码。后面的src内有两个cpp文件,分别为client.cpp和node.cpp。client中主要定义了一个输出角度和距离信息的scancallback函数:


#include "ros/ros.h"
#include "sensor_msgs/LaserScan.h"
#define RAD2DEG(x) ((x)*180./M_PI)

void scanCallback(const sensor_msgs::LaserScan::ConstPtr& scan)
{
    int count = scan->scan_time / scan->time_increment;//一圈359个点
    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));//输出信息
    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]);//输出角度和距离数据
    }
}

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;
}

而node.cpp中对雷达的工作参数,状态等进行设定,具体可参考文章进行学习。

根据学习记录1我们发现可以通过终端读取到角度和距离数据,其在client函数中主要是下列几行代码:

 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]);//输出角度和距离数据

其中degerr为角度数据,scan->ranges为距离数据,可以在此处添加保存命令对数据进行保存。其中scancallback函数代码作如下修改:

#include "ros/ros.h"
#include "sensor_msgs/LaserScan.h"
/**/#include "fstream"
/**/#include "string"
#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)); 
    /**/ofstream oFile;
    /**/oFile.open("leidadate.csv",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();
}
.........

主函数不需要变动,修改内容已经用/**/进行标注,增加了fstream、string头文件、引入了一个std工作空间,使用ofile命令打开一个csv格式文件,并对数据进行保存

/**/oFile<< degree <<","<< scan->ranges[i] <<endl;

其中“,”为换列,需要endl结尾。然后运行学习记录1中命令后,会生成leidadate.csv格式文件,如果需要txt文件,可以按照类似方式进行修改。

在这里插入图片描述

测试后发现该方法后面的数据会覆盖前面的数据,无论运行多久,leidadate文件中数据只有359个数据,因为每次都通过open打开相同的文件,可以通过增加一个时间戳,并将文件名命名为动态文件名,这样即可保存到运行期间所有的激光雷达数据。由于ros系统还不够熟悉,这部分代码后续更新。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

看那片云

嘿嘿嘿

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

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

打赏作者

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

抵扣说明:

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

余额充值