Skip to main content

PyLidar3

Build Status license
PyLidar3 is python 3 package to get data from Lidar device. Currently supports ydlidar from www.ydlidar.com/.

Source code

Source code is available on github's repository.
https://github.com/lakshmanmallidi/PyLidar3/blob/master/PyLidar3/__init.py__

Dependencies

  • pyserial
  • time
  • math
  • enum

Installation

Using Pip
pip install PyLidar3

You can also install using setup.py file from git repository.

Usage

This package consists of multiple classes representing the version of lidar you are using. The class structure is YdLidarX4 where X4 is version name ydlidar. Further contribution are actively accepted.

Class structure:
YdLidarX4

Arguments: port, chunk_size(default:6000).

port: serial port to which device is connected. Example: com4, /dev/ttyAMC0.

chunk_size: Number of bytes of data read from device. Increase in chunk_size results in more averaged angle:distance pairs but increase response time result in slower data acquisition. For faster data acquisition decrease chunk_size.

Note: Calibrate chunk size depends on your application and frequency of device. 
if the chunk size is not enough not all angles are covered. 
  • Connect -- Begin serial connection with Lidar by opening serial port. Return success status True/False.

  • StartScanning -- Begin the lidar and returns a generator which returns a dictionary consisting angle(degrees) and distance(meters).
    Return Format : {angle(0):distance, angle(2):distance,....................,angle(359):distance}

  • StopScanning -- Stops scanning but keeps serial connection alive.

  • GetHealthStatus -- Returns True if Health of lidar is good else returns False

  • GetDeviceInfo -- Returns Information of Lidar version, serial number etc.

  • Reset -- Reboot the lidar

  • Disconnect -- Stop scanning and close serial communication with Lidar.

YdLidarG4

Arguments: port, chunk_size(default:6000).

port: serial port to which device is connected. Example: com4, /dev/ttyAMC0.

chunk_size: Number of bytes of data read from device. Increase in chunk_size results in more averaged angle:distance pairs but increase response time result in slower data acquisition. For faster data acquisition decrease chunk_size.

Note: Calibrate chunk size depends on your application and frequency of device. 
if the chunk size is not enough not all angles are covered. 
  • Connect -- Begin serial connection with Lidar by opening serial port. Return success status True/False.

  • StartScanning -- Begin the lidar and returns a generator which returns a dictionary consisting angle(degrees) and distance(meters).
    Return Format : {angle(0):distance, angle(2):distance,....................,angle(359):distance}

  • StopScanning -- Stops scanning but keeps serial connection alive.

  • GetHealthStatus -- Returns True if Health of lidar is good else returns False

  • GetDeviceInfo -- Returns Information of Lidar version, serial number etc.

  • EnableLowPowerMode -- Enable Low Power Consumption Mode(Turn motor and distance-measuring unit off in StopScanning).

  • DisableLowPowerMode -- Disable Low Power Consumption Mode(Turn motor and distance-measuring unit on StopScanning).

  • GetLowPowerModeStatus -- Return True if Low Power Consumption Mode is Enable else return False.

class FrequencyStep(Enum):
    oneTenthHertz=1
    oneHertz=2
  • IncreaseCurrentFrequency -- Increase current frequency by oneTenth or one depends on enum FrequencyStep.

  • DecreaseCurrentFrequency -- Decrease current frequency by oneTenth or one depends on enum FrequencyStep.

import PyLidar3
port = input("Enter port name which lidar is connected:") #windows
Obj = PyLidar3.YdLidarG4(port)
if(Obj.Connect()):
    print(Obj.GetDeviceInfo())
    print(Obj.GetCurrentFrequency())
    Obj.IncreaseCurrentFrequency(PyLidar3.FrequencyStep.oneTenthHertz)
    print(Obj.GetCurrentFrequency())
    Obj.DecreaseCurrentFrequency(PyLidar3.FrequencyStep.oneHertz)
    print(Obj.GetCurrentFrequency())
    Obj.Disconnect()
else:
    print("Error connecting to device")
  • EnableConstantFrequency -- Enables constant frequency default Enable.

  • DisableConstantFrequency -- Disable constant frequency.

  • SwitchRangingFrequency -- Switch between ranging frequencies 4khz, 8khz and 9khz, default 9khz.

  • GetCurrentRangingFrequency -- Returns current Ranging Frequency in khz.

  • Reset -- Reboot the lidar

  • Disconnect -- Stop scanning and close serial communication with Lidar.

Examples

This Example prints data from lidar

import PyLidar3
import time # Time module
#Serial port to which lidar connected, Get it from device manager windows
#In linux type in terminal -- ls /dev/tty* 
port = input("Enter port name which lidar is connected:") #windows
#port = "/dev/ttyUSB0" #linux
Obj = PyLidar3.YdLidarX4(port) #PyLidar3.your_version_of_lidar(port,chunk_size) 
if(Obj.Connect()):
    print(Obj.GetDeviceInfo())
    gen = Obj.StartScanning()
    t = time.time() # start time 
    while (time.time() - t) < 30: #scan for 30 seconds
        print(next(gen))
        time.sleep(0.5)
    Obj.StopScanning()
    Obj.Disconnect()
else:
    print("Error connecting to device")

This Example plot the data. This example needs matplotlib library.

import threading
import PyLidar3
import matplotlib.pyplot as plt
import math    
import time

def draw():
    global is_plot
    while is_plot:
        plt.figure(1)
        plt.cla()
        plt.ylim(-9000,9000)
        plt.xlim(-9000,9000)
        plt.scatter(x,y,c='r',s=8)
        plt.pause(0.001)
    plt.close("all")


is_plot = True
x=[]
y=[]
for _ in range(360):
    x.append(0)
    y.append(0)

port =  input("Enter port name which lidar is connected:") #windows
Obj = PyLidar3.YdLidarX4(port) #PyLidar3.your_version_of_lidar(port,chunk_size) 
threading.Thread(target=draw).start()
if(Obj.Connect()):
    print(Obj.GetDeviceInfo())
    gen = Obj.StartScanning()
    t = time.time() # start time 
    while (time.time() - t) < 30: #scan for 30 seconds
        data = next(gen)
        for angle in range(0,360):
            if(data[angle]>1000):
                x[angle] = data[angle] * math.cos(math.radians(angle))
                y[angle] = data[angle] * math.sin(math.radians(angle))
    is_plot = False
    Obj.StopScanning()
    Obj.Disconnect()
else:
    print("Error connecting to device")

Testing

A "tesing" branch is maintained in the git repository for testing, debugging and updating the code. Please visit Github repo https://github.com/lakshmanmallidi/PyLidar3 for further information.

Release files for PyLidar3 1.6

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for PyLidar3 1.6
File Size Uploaded
PyLidar3-1.6.tar.gz 5.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for PyLidar3 1.6
File Interpreter ABI Platform
PyLidar3-1.6-py3-none-any.whl Python 3 none any Details

Total release size: 12.7 kB

Release files / PyLidar3-1.6.tar.gz

Download URL PyLidar3-1.6.tar.gz
Size 5.8 kB
Tags Source
SHA-256 checksum
How to use checksums
df77440d60816ecd1e66fa2388603dd6d25e786009bae8f9f3a6d0ee0154b318
BLAKE2b-256 checksum
How to use checksums
aa48b7feefe3619bf213b7b8addb06eb1c9fe94e8607f43e19560e3234c35e6f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3

Release files / PyLidar3-1.6-py3-none-any.whl

Download URL PyLidar3-1.6-py3-none-any.whl
Size 6.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
b2fdf19bc2565608ee69deb23ba5cf46ee05303ead2dbc80c19b0c4fc803012d
BLAKE2b-256 checksum
How to use checksums
3bbabb6aecc7fc070eac42097ec89871c47596f27871ed9973800bb4633f2a8e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.1 CPython/3.7.3

Release history Release notifications | RSS feed

This release

1.6 This release

2 release files

1.5

2 release files

1.4

2 release files

1.3

2 release files

1.2

2 release files

1.1

2 release files

1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page