Launch promotionLidarFlow is free while we launch — no card required
Rosbag to PCD

Convert a rosbag to PCD, online.

“Rosbag to PCD” can mean two very different jobs. Sometimes you want every PointCloud2 frame exported to disk. Other times you really want one mapped point cloud from the whole recording. The right path depends on which of those jobs you are actually doing.

What rosbag to PCD actually means

Frame export and mapped output are not the same thing.

Frame export

One folder of timestamped PCDs.

Local tools like bag_to_pcd read one topic and write a folder of timestamped PCD files. That is great for debugging a sensor stream, checking fields, or handing one frame to another tool.

Mapped output

One point cloud map of the run.

If what you really need is a point cloud map, you still need LiDAR SLAM and, when available, GNSS-backed georeferencing. That is the job LidarFlow is built for.

Register · Map
lowhigh
What you actually get

From rosbag to mapped output, in four browser screens.

/velodyne_points · PointCloud2ok
/gnss/fix · NavSatFixok
/imu/data · Imuok
/tf_static · TFok
Inspect the bag

Before SLAM runs, LidarFlow lists the topics it found and flags the ones it can use.

$ros2 run pcl_ros bag_to_pcd \
$ --ros-args -p bag_path:=bag/
$ -p topic_name:=/pc
$ -p output_directory:=pcds
Skip the CLI dance

Local conversions need a ROS env, the right pcl_ros build, and matching topic names. The browser path skips all three.

slam
Watch the run

SLAM, registration, and georeferencing run with visible queue and worker health instead of opaque logs.

output.pcd248 MB
map.ply112 MB
trajectory.csv1.4 MB
metadata.json12 KB
Download mapped artifacts

You get one mapped point cloud plus PLY, trajectory, and metadata — not a directory of timestamped frames.

Three honest ways to do it

Local CLI, custom Python, or a browser workflow.

1

Upstream CLI

If you are already in a ROS environment and only need per-frame exports, use the upstream tool directly.

ros2 run pcl_ros bag_to_pcd --ros-args \
  -p bag_path:=rosbag2_2025_01_01/ \
  -p topic_name:=/pointcloud \
  -p output_directory:=pcds

Good for timestamped frame exports. Not a full mapping pipeline.

2

Python script

If you need custom filtering, field transforms, or one-off post-processing, a small Python script gives you more control.

import rosbag
from sensor_msgs import point_cloud2

with rosbag.Bag("input.bag") as bag:
    for _, msg, t in bag.read_messages("/pc"):
        points = list(point_cloud2.read_points(msg))
        # write one PCD per frame

Flexible, but you still own the rest of the pipeline.

3

LidarFlow

If you want a mapped output instead of a folder of raw frames, upload the recording through the browser and let LidarFlow handle validation, SLAM, georeferencing, and artifact delivery.

  • Upload .mcap or ROS1 .bag
  • Validate topics before launch
  • Download output.pcd, map.ply, metadata, and trajectory artifacts
Skip the glue
Upload a bag, get the mapped point cloud back in your inbox.
When to use which

Pick the smallest tool that still solves the whole job.

Use the local path when

  • You only need frame-by-frame PCDs for debugging one topic.
  • You want to inspect timestamps, fields, or per-frame coverage before running SLAM.

Use LidarFlow when

  • You need one mapped point cloud and not a directory full of timestamped exports.
  • You want one browser surface for run status, QA, and downloads.
  • You do not want to maintain ROS, SLAM, and storage glue on every operator laptop.
Next step

Need a map, not just a directory of PCD frames?