mirror of
https://github.com/odriverobotics/ODrive.git
synced 2026-08-23 00:38:25 +08:00
48 lines
1.6 KiB
Python
Executable File
48 lines
1.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Example usage of the ODrive python library to monitor and control ODrive devices
|
|
"""
|
|
|
|
from __future__ import print_function
|
|
|
|
import odrive.core
|
|
import time
|
|
import math
|
|
|
|
# Find a connected ODrive (this will block until you connect one)
|
|
my_drive = odrive.core.find_any(consider_usb=True, consider_serial=False, printer=print)
|
|
|
|
# The above call returns a python object with a dynamically generated type. The
|
|
# type hierarchy will correspond to the endpoint list in `MotorControl/protocol.cpp`.
|
|
# You can also inspect the object using the dir-function:
|
|
#print(dir(my_drive))
|
|
#print(dir(my_drive.motor0))
|
|
# TODO: maybe provide an introspection method that dumps the whole type hierarchy at once
|
|
|
|
# To read a value, simply read the property
|
|
print("Bus voltage is " + str(my_drive.vbus_voltage) + "V")
|
|
|
|
# Or to change a value, just assign to the property
|
|
my_drive.motor0.pos_setpoint = 3.14
|
|
print("Position setpoint is " + str(my_drive.motor0.pos_setpoint))
|
|
|
|
# And this is how function calls are done:
|
|
my_drive.motor0.set_pos_setpoint(0.0, 0.0, 0.0)
|
|
|
|
# A little sine wave to test
|
|
t0 = time.monotonic()
|
|
while True:
|
|
setpoint = 10000.0 * math.sin((time.monotonic() - t0)*2)
|
|
print("goto " + str(int(setpoint)))
|
|
my_drive.motor0.set_pos_setpoint(setpoint, 0.0, 0.0)
|
|
time.sleep(0.01)
|
|
|
|
|
|
# Some more things you can try:
|
|
|
|
# Write to a read-only property:
|
|
my_drive.vbus_voltage = 11.0 # fails with `AttributeError: can't set attribute`
|
|
|
|
# Assign an incompatible value:
|
|
my_drive.motor0.pos_setpoint = "I like trains" # fails with `ValueError: could not convert string to float`
|