雷达点云数据保存为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
行的代码(按照你自己设定)
构建功能包
在你的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