Skip to content

Latest commit

History

26 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Python client for the Ouster Lidar OS-1

Compatible with Firmware Version 1.10.0 and python 3

Your milage may vary with other versions, it was tested against a OS1-16 device running 1.10.0

Installing

pip install --upgrade ouster-os1

Quick start

fromos1importOS1fromos1.utilsimportxyz_pointsdefhandler(raw_packet):
"""Takes each packet and log it to a file as xyz points"""withopen('points.csv', 'a') asf:
x, y, z=xyz_points(raw_packet)
forcoordsinzip(x, y, z):
csv_coords=','.join([str(c) forcincoords])
f.write("{}\n".format(csv_coords)
os1=OS1('10.0.0.3', '10.0.0.1', mode='1024x10') # OS1 sensor IP, destination IP, and resolution# Inform the sensor of the destination host and reintialize itos1.start()
# Start the loop which will handle and dispatch each packet to the handler# function for processingos1.run_forever(handler)

You can run the server as threaded with os1.run_forever(handler, threaded=True)

Recipes

Generally speed is a concern since the OS1 is sending 12,608 bytes/packet at a rate of 1280 packets/sec (in 1024x20 or 2048x10 mode). So a multiprocessing producer consumer model works well.

importjsonfrommultiprocessingimportProcess, Queuefromos1importOS1fromos1.utilsimportbuild_trig_table, xyz_pointsOS1_IP='10.0.0.3'HOST_IP='10.0.0.2'unprocessed_packets=Queue()
defhandler(packet):
unprocessed_packets.put(packet)
defworker(queue, beam_altitude_angles, beam_azimuth_angles) :
build_trig_table(beam_altitude_angles, beam_azimuth_angles)
whileTrue:
packet=queue.get()
coords=xyz_points(packet) # do work...defspawn_workers(n, worker, *args, **kwargs):
processes= []
foriinrange(n):
process=Process(
target=worker,
args=args,
kwargs=kwargs
)
process.start()
processes.append(process)
returnprocessesos1=OS1(OS1_IP, HOST_IP)
beam_intrinsics=json.loads(os1.get_beam_intrinsics())
beam_alt_angles=beam_intrinsics['beam_altitude_angles']
beam_az_angles=beam_intrinsics['beam_azimuth_angles']
workers=spawn_workers(4, worker, unprocessed_packets, beam_alt_angles, beam_az_angles)
os1.start()
try:
os1.run_forever(handler)
exceptKeyboardInterrupt:
forwinworkers:
w.terminate()

TCP API Commands

The TCP API commands can be accessed through an instance of the OS1 object.

The following methods are supported:

  • get_config_txt
  • get_sensor_info
  • get_beam_intrinsics
  • get_imu_intrinsics
  • get_lidar_intrinsics
  • get_config_param - Supports querying active and staged parameters. Example: os1.get_config_param('active', 'udp_ip')
  • set_config_param - Supports settings parameters to be staged. Example: os1.set_config_param('udp_ip', '10.0.0.1')
  • reinitialize - Will reinitialize the sensor and apply all staged parameters to be active.

About

Python client for the Ouster Lidar OS-1

Topics

Resources

Stars

12 stars

Watchers

5 watching

Forks

Releases

Packages

Used by

Contributors

Languages