Metadata-Version: 2.1
Name: velodyne-decoder
Version: 1.0.1
Summary: Decoder for raw Velodyne packet data
Home-page: https://github.com/valgur/velodyne_decoder
Author: Martin Valgur
Author-email: martin.valgur@gmail.com
License: UNKNOWN
Keywords: Velodyne,pointcloud,PCL
Platform: UNKNOWN
Classifier: License :: OSI Approved :: BSD License
Classifier: Programming Language :: Python :: 2
Classifier: Programming Language :: Python :: 3
Classifier: Operating System :: OS Independent
Description-Content-Type: text/markdown
Requires-Dist: numpy

# velodyne_decoder [![PyPI](https://img.shields.io/pypi/v/velodyne-decoder)](https://pypi.org/project/velodyne-decoder/) [![Build](https://github.com/valgur/velodyne_decoder/actions/workflows/build.yml/badge.svg?event=push)](https://github.com/valgur/velodyne_decoder/actions/workflows/build.yml)

Python package and C++ library for Velodyne packet decoding. Intended as a light-weight substitute
for [velodyne_driver](http://wiki.ros.org/velodyne_driver) in ROS with minimal external dependencies.

The resulting decoded data is provided as a structured NumPy array in Python and an array of structs in C++.

```python
array([(8.327308, -2.161341, 0.3599853, 85., 17, -0.04960084),
       (8.323784, -2.9578836, 0.27016047, 102., 15, -0.04959854),
       (8.184404, -2.845847, -0.8741639, 39., 2, -0.04959623), ...,
       (8.369528, -2.8161895, 2.307987, 17., 31, 0.00064051),
       (8.377898, -3.2570598, 1.7714221, 104., 30, 0.00064282),
       (8.358282, -2.8030438, 0.31229734, 104., 16, 0.00064282)],
      dtype={'names': ['x', 'y', 'z', 'intensity', 'ring', 'time'],
             'formats': ['<f4', '<f4', '<f4', '<f4', '<u2', '<f4'], 'offsets': [0, 4, 8, 16, 20, 24], 'itemsize': 32})
```

The layout of the structs and the array is identical to the `PointXYZIRT` point clouds output by the ROS driver.

## Installation

Wheels are available from PyPI for Linux, MacOS and Windows. Python versions 2.7 and 3.6+ are supported.

```bash
pip install velodyne-decoder
```

Alternatively, you can build and install the development version from source.

```bash
sudo apt-get install cmake build-essential python3-dev
pip install git+https://github.com/valgur/velodyne_decoder.git
```

## Usage

### Decoding Velodyne data from a ROS bag

```python
from rosbag import Bag
import velodyne_decoder as vd

config = vd.Config()
config.model = '32C'
config.calibration_file = '/opt/ros/noetic/share/velodyne_pointcloud/params/VeloView-VLP-32C.yaml'
config.min_range = 0.3
config.max_range = 130
decoder = vd.ScanDecoder(config)

bagfile = 'xyz.bag'
lidar_topics = ['/velodyne_packets']
cloud_arrays = []
with Bag(bagfile) as bag:
    for topic, scan_msg, ros_time in bag.read_messages(lidar_topics):
        cloud_arrays.append(decoder.decode_message(scan_msg))
```

`config.model` and `config.calibration_file` are required. For a list of supported model IDs see

```python
>> > velodyne_decoder.Config.SUPPORTED_MODELS
['VLP16', '32C', '32E', 'VLS128']
```

For the calibration file you can use the
one [provided with the velodyne driver](https://github.com/ros-drivers/velodyne/tree/master/velodyne_pointcloud/params)
matching your model.

Additional optional config parameters are `min_range` and `max_range` in meters and `min_angle` and `max_angle` in
degrees.

## Authors

* Martin Valgur ([@valgur](https://github.com/valgur)) – this library.

The core functionality has been adapted from the ROS [velodyne driver](https://github.com/ros-drivers/velodyne).

## License

[BSD 3-Clause License](LICENSE)


