Ubuntu20.04上velodyne_msgs/VelodyneScan格式转sensor_msgs/PointCloud2格式

安装velodyne驱动

mkdir -p ~/velodyne_ws/src
cd ~/velodyne_ws/src
git clone https://github.com/ros-drivers/velodyne.git
cd ..
catkin_make
source /deve/setup.bash

将velodyne_msgs/VelodyneScan转换为 /odom 帧的 sensor_msgs/PointCloud2 消息。

同时开4个终端:

1、运行master节点

roscore

2、运行转换节点

rosrun velodyne_pointcloud transform_node _calibration:="/home/wzj/velodyne_ws/src/velodyne/velodyne_pointcloud/params/VLP16db.yaml" _model:="VLP16"
(此时的topic有:/velodyne_packets和/velodyne_points)

3、运行录好的bag,为了和转化节点需要的topic一致,改变bag中的原topic的名称为/velodyne_packets
rosbag play raw_data_core_2023-04-14-14-48-44_0.bag /cmu_rc7/velodyne_packets:=/velodyne_packets

4、录制新的bag,经过转换节点,topic从/velodyne_packets变成 /velodyne_points记录在新的bag中

rosbag record /velodyne_points -O new.bag

import os import struct from argparse import ArgumentParser import av import numpy as np import open3d as o3d import rosbag from sensor_msgs import point_cloud2 as pc2 av.logging.set_level(av.logging.PANIC) codec_ctx = av.codec.Codec('hevc','r') h265_code = codec_ctx.create() def parse_img(msg, dataset_dir): timestamp = int(msg.header.stamp.secs * 1000 + msg.header.stamp.nsecs / 1000000) # os.makedirs(os.path.join(dataset_dir, str(timestamp))) file_path = os.path.join(dataset_dir, str(timestamp)+'{}.jpg'.format(timestamp)) packet = av.packet.Packet(msg.data) try: out = h265_code.decode(packet) for frame in out: if frame.format.name!='rgb24': frame = frame.reformat(format='rgb24') img = frame.to_image() img.save(file_path) except Exception as e: print("{} frame can not trans to jpg".format(timestamp),e) def parse_pcd(msg, dataset_dir): timestamp = int(msg.header.stamp.secs * 1000 + msg.header.stamp.nsecs / 1000000) # os.makedirs(os.path.join(dataset_dir, str(timestamp))) file_path = os.path.join(dataset_dir, str(timestamp)+'{}.pcd'.format(timestamp)) pointclouds = [] points = np.frombuffer(msg.data, dtype=np.float32).reshape(-1, 4)[:, :3] pointclouds.append(points) # 合并所有点云数据 combined_pcd = np.concatenate(pointclouds) pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(combined_pcd) o3d.io.write_point_cloud(file_path, pcd) def parse_params(): parser = ArgumentParser() parser.add_argument('--topic', default = '') # parser.add_argument('--type', default='pcd') return parser.parse_args() def main(): # params = parse_params() output_dir = 'output_data' dataset_dir = os.path.join(output_dir,'dataset') if not os.path.exists(dataset_dir): os.makedirs(dataset_dir) bag_path = "/home/inwinic/Lixu_Pro/fangcheng_data/A3_A4_71/2025-07-14-10-54-53.bag" bag = rosbag.Bag(bag_path,"r") for topic, msg, t in bag.read_messages(): if topic == '/mdc_camera_instance_71': parse_img(msg,os.path.join(dataset_dir,'camrea')) elif topic == '/rs16PtClound_B2': parse_pcd(msg,os.path.join(dataset_dir,'lidar')) if __name__ == '__main__': main()
最新发布
07-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值