Analyze large datasets of point clouds recorded over time in an efficient way.
.. image:: https://github.com/virtual-vehicle/pointcloudset/actions/workflows/tests_docker.yml/badge.svg :target: https://github.com/virtual-vehicle/pointcloudset/actions/workflows/tests_docker.yml :alt: test status
.. image:: images/coverage.svg :target: https://github.com/virtual-vehicle/pointcloudset/actions/workflows/tests.yml :alt: test coverage
.. image:: https://github.com/virtual-vehicle/pointcloudset/actions/workflows/doc.yml/badge.svg :target: https://virtual-vehicle.github.io/pointcloudset/ :alt: Documentation Status
.. image:: https://github.com/virtual-vehicle/pointcloudset/actions/workflows/docker.yml/badge.svg :target: https://hub.docker.com/repository/docker/tgoelles/pointcloudset :alt: Docker
.. image:: https://badge.fury.io/py/pointcloudset.svg :target: https://badge.fury.io/py/pointcloudset :alt: PyPi badge
.. image:: https://pepy.tech/badge/pointcloudset/month :target: https://pepy.tech/project/pointcloudset :alt: PyPi badge
.. image:: https://joss.theoj.org/papers/10.21105/joss.03471/status.svg :target: https://joss.theoj.org/papers/10.21105/joss.03471# :alt: JOSS badge
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg :target: https://github.com/psf/black :alt: code style black
.. inclusion-marker-do-not-remove
Code
| Documentation
.. _Code: https://github.com/virtual-vehicle/pointcloudset .. _Documentation: https://virtual-vehicle.github.io/pointcloudset/
Features ################################################
.. code-block:: python
newpointcloud = pointcloud.limit("x",-5,5).filter("quantile","reflectivity", ">",0.5)
.. code-block:: python
def isolate_target(frame: PointCloud) -> PointCloud: return frame.limit("x",0,1).limit("y",0,1)
def diff_to_pointcloud(pointcloud: PointCloud, to_compare: PointCloud) -> PointCloud: return pointcloud.diff("pointcloud", to_compare)
result = dataset.apply(isolate_target).apply(diff_to_pointcloud, to_compare=dataset[0])
.. code-block:: python
dataset.agg(["min","max","mean","std"])
.. image:: https://raw.githubusercontent.com/virtual-vehicle/pointcloudset/master/images/dask.gif :width: 600
.. image:: https://raw.githubusercontent.com/virtual-vehicle/pointcloudset/master/images/tree.gif :width: 600
Use case examples ################################################
Installation with pip ################################################
Install python package with pip:
.. code-block:: console
pip install pointcloudset
Installation with Docker ################################################
The easiest way to get started is to use the pre-build docker tgoelles/pointcloudset
_ or use tgoelles/pointcloudset_base
_ to get a container with all dependencies and install pointcloudset there.
.. _tgoelles/pointcloudset_base: https://hub.docker.com/repository/docker/tgoelles/pointcloudset_base .. _tgoelles/pointcloudset: https://hub.docker.com/repository/docker/tgoelles/pointcloudset
Quickstart ################################################
.. code-block:: python
from pointcloudset import Dataset, PointCloud from pathlib import Path import urllib.request
urllib.request.urlretrieve("https://github.com/virtual-vehicle/pointcloudset/raw/master/tests/testdata/test.bag", "test.bag") urllib.request.urlretrieve("https://github.com/virtual-vehicle/pointcloudset/raw/master/tests/testdata/las_files/test_tree.las", "test_tree.las")
dataset = Dataset.from_file(Path("test.bag"), topic="/os1_cloud_node/points", keep_zeros=False) pointcloud = dataset[1] tree = PointCloud.from_file(Path("test_tree.las"))
tree.plot("x", hover_data=True)
This produces the plot from the animation above.
html documentation
_.tutorial notebooks
_ in the documentation folder.. _html documentation: https://virtual-vehicle.github.io/pointcloudset/ .. _tutorial notebooks: https://github.com/virtual-vehicle/pointcloudset/tree/master/doc/sphinx/source/tutorial_notebooks
CLI to convert ROS1 and ROS2 files: pointcloudset convert ##########################################################
The package includes a powerful CLI to convert pointclouds in ROS1 & 2 files into many formats like pointcloudset, csv, las and many more. It is capable of handling both mcap and db3 ROS files.
.. code-block:: console
pointcloudset convert --output-format csv --output-dir converted_csv test.bag
.. image:: https://raw.githubusercontent.com/virtual-vehicle/pointcloudset/master/images/cli_demo.gif :width: 600
You can view PointCloud2 messages with
.. code-block:: console
pointcloudset topics test.bag
Comparison to related packages ################################################
ROS <http://wiki.ros.org/rosbag/Code%20API>
_ - bagfiles can contain many point clouds from different sensors.The downside of the format is that it is only suitable for serial access and not well suited for data analytics and post processing.
pyntcloud <https://github.com/daavoo/pyntcloud>
_ - Only for single point clouds. This package is used as the basis for thePointCloud object.
open3d <https://github.com/intel-isl/Open3D>
_ - Only for single point clouds. Excellent package, which is used for somemethods on the PointCloud.
pdal <https://github.com/PDAL/PDAL>
_ - Works also with pipelines on point clouds but is mostly focused on single point cloud processing.Pointcloudset is purely in python and based on pandas DataFrames. In addition pointcloudset works in parallel to process large datasets.
Citation and contact ################################################
.. |orcid| image:: https://orcid.org/sites/default/files/images/orcid_16x16.png :target: https://orcid.org/0000-0002-3925-6260>
|orcid| Thomas Gölles <https://orcid.org/0000-0002-3925-6260>
_
email: thomas.goelles@v2c2.at
Please cite our JOSS paper
_ if you use pointcloudset.
.. _JOSS paper: https://joss.theoj.org/papers/10.21105/joss.03471#
.. code-block:: bib
@article{Goelles2021,
doi = {10.21105/joss.03471},
url = {https://doi.org/10.21105/joss.03471},
year = {2021},
publisher = {The Open Journal},
volume = {6},
number = {65},
pages = {3471},
author = {Thomas Goelles and Birgit Schlager and Stefan Muckenhuber and Sarah Haas and Tobias Hammer},
title = {pointcloudset
: Efficient Analysis of Large Datasets of Point Clouds Recorded Over Time},
journal = {Journal of Open Source Software}
}