雷达点云数据保存为mat格式

创建功能包

在终端中执行以下命令以创建一个新的ROS功能包:

catkin_create_pkg laser_data_collector_pkg rospy sensor_msgs scipy

这将创建一个名为laser_data_collector_pkg的ROS功能包,并添加了所需的依赖项。

创建src目录并将脚本添加到其中

在功能包的根目录下创建src目录,并将你的Python脚本(比如laser_data_collector.py)复制到该目录。

修改CMakeLists.txt

在功能包的根目录下,找到CMakeLists.txt文件,修改下图163-166行的代码(按照你自己设定)

image-20231125202506476

构建功能包

在你的Catkin工作空间中执行以下命令以构建你的ROS功能包:

catkin_make

运行脚本

赋予py文件运行权限

进入python文件所在目录

chmod +x laser_data_collector.py

运行python

在一个终端中运行roscore,然后在另一个终端中执行以下命令启动你的节点:

source devel/setup.bash
rosrun laser_data_collector_pkg laser_data_collector.py

这将启动你的ROS节点,开始订阅/scan主题,并在收集足够的数据后保存到MAT文件中。

请注意,上述步骤是一种创建ROS节点的简单方式。如果你的功能包需要更复杂的结构或功能,请根据需要进行修改。

保存数据代码

3S数据采集

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
import scipy.io as sio
from sensor_msgs.msg import LaserScan
from datetime import datetime
from collections import deque

class LaserDataCollector:
    def __init__(self):
        rospy.init_node('laser_data_collector')
        self.scan_sub = rospy.Subscriber('/scan', LaserScan, self.scan_callback)
        self.angle_increment = None
        self.angles = None
        self.ranges = None
        self.data_buffer = deque()  # 使用队列来缓存数据
        self.start_time = rospy.get_time()

    def scan_callback(self, data):
        self.angle_increment = data.angle_increment
        self.angles = [data.angle_min + data.angle_increment * i for i in range(len(data.ranges))]
        self.ranges = data.ranges
        self.data_buffer.append((self.angles, self.ranges))

        current_time = rospy.get_time()
        if current_time - self.start_time >= 3:  # 收集3秒的数据
            self.save_to_mat()
            self.start_time = rospy.get_time()  # 重置起始时间
            self.data_buffer.clear()  # 清空数据缓存

    def save_to_mat(self):
        # 生成一个时间戳以用于MAT文件的文件名
        timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
        file_name = 'laser_scan_data_{}.mat'.format(timestamp)

        # 将数据从队列中收集起来
        all_angles, all_ranges = zip(*self.data_buffer)

        # 保存数据为MAT文件
        scan_data = {
            'angleIncrement': self.angle_increment,
            'angles': all_angles,
            'ranges': all_ranges
        }
        sio.savemat(file_name, scan_data)
        rospy.loginfo('Laser scan data saved to {}'.format(file_name))

if __name__ == '__main__':
    try:
        data_collector = LaserDataCollector()
        rospy.spin()  # 这里会一直运行直到数据采集完成
    except rospy.ROSInterruptException:
        pass
最后修改:2023 年 11 月 25 日
如果觉得我的文章对你有用,请随意赞赏