LeRobot documentation

Motor

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.6.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Motor

SerialMotorsBus adalah antarmuka tingkat rendah untuk rangkaian servo Feetech atau Dynamixel pada bus serial. Robot menggunakannya untuk membaca posisi dan menulis posisi target; Anda jarang menyentuhnya secara langsung kecuali Anda menambahkan perangkat keras. Model setiap motor dicari di rustypot, yang menyimpan tabel kontrol dan fakta yang berbeda antar keluarga, serta juga memiliki kepemilikan atas port serial. FeetechMotorsBus dan DynamixelMotorsBus adalah alias yang tidak lagi didukung darinya, dipertahankan untuk satu rilis.

Migrasi dari bus berbasis SDK

Alias mempertahankan nama kelas, bukan atribut SDK lama dan tabel model:

  • bus.model_resolution_table[model] menjadi bus.resolution(model); tabel model lainnya (model_ctrl_table, model_number_table, …) kini merupakan definisi servo rustypot.
  • Mode operasi dipilih berdasarkan nama, bus.set_operating_mode("position"), alih-alih menulis nilai OperatingMode ke register Operating_Mode.
  • Port SDK dan handler paket tidak lagi diekspos: rustypot memiliki kendali atas port serial.
  • protocol_version diabaikan: model masing-masing motor memberikan protokolnya.

Lihat Bring Your Own Hardware untuk menambahkan bus baru, serta Updating Feetech Firmware dan Damiao Motors and CAN Bus untuk catatan spesifik perangkat.

SerialMotorsBus

kelas lerobot.motors.SerialMotorsBus

< >

( port: strmotors: dict[str, Motor]calibration: dict[str, MotorCalibration] | None = None )

Baca dan tulis rantai servo yang terhubung secara daisy-chain pada satu port serial, Feetech atau Dynamixel.

rustypot menangani metadata setiap model (tabel kontrol, resolusi, laju baud, mode operasi) dan I/O serial; LeRobot menangani normalisasi, kalibrasi, dan pengaturan yang direkomendasikan. Motor dari beberapa model, seperti STS dan SCS atau XL430 dan XL330, berbagi port.

Untuk menemukan port, jalankan:

lerobot-find-port
>>> Finding all available ports for the MotorsBus.
>>> ["/dev/tty.usbmodem575E0032081", "/dev/tty.usbmodem575E0031751"]
>>> Remove the usb cable from your MotorsBus and press Enter when done.
>>> The port of this MotorsBus is /dev/tty.usbmodem575E0031751.
>>> Reconnect the usb cable.

Contoh untuk satu Feetech sts3215 di bus:

from lerobot.motors import Motor, MotorNormMode, SerialMotorsBus

bus = SerialMotorsBus(
    port="/dev/tty.usbmodem575E0031751",
    motors={"my_motor": Motor(1, "sts3215", MotorNormMode.RANGE_M100_100)},
)
bus.connect()

position = bus.read("Present_Position", "my_motor", normalize=False)

# Move a few motor steps as an example
bus.write("Goal_Position", "my_motor", position + 30, normalize=False)

bus.disconnect()

configure_motors

< >

( return_delay_time: int = 0maximum_acceleration: int = 254acceleration: int = 254 )

Parameter

  • return_delay_time (int, opsional, default 0) — Jeda sebelum motor menjawab, dalam satuan 2 µs; motor keluar dari pabrik dengan nilai 250 (500 µs).
  • maximum_acceleration (int, opsional, default 254) — Batas atas percepatan, pada servo yang memilikinya (Feetech STS), nilai tinggi untuk mempercepat akselerasi dan deselerasi.
  • acceleration (int, opsional, default 254) — Percepatan, pada servo yang memilikinya (Feetech).

Tuliskan pengaturan yang direkomendasikan oleh LeRobot ke setiap motor.

connect

< >

( handshake: bool = True )

Parameter

  • handshake (bool, opsional, default True) — Apakah akan memeriksa bahwa setiap motor menjawab dengan nomor model dari modelnya, dan bahwa motor-motor Feetech dari satu definisi menjalankan satu firmware.

Membuang

DeviceAlreadyConnectedError atau ConnectionError atau RuntimeError

  • DeviceAlreadyConnectedError — Jika port sudah terbuka.
  • ConnectionError — Jika port tidak dapat dibuka.
  • RuntimeError — Jika handshake gagal; port ditutup kembali.

Buka port serial dan periksa motor.

disable_torque

< >

( motors: NameOrID | Sequence[NameOrID] | None = Nonenum_retry: int = 0 )

Parameter

  • motors (str | int | Sequence[str | int], opsional) — Motor yang akan dilepaskan, berdasarkan nama atau id. None memilih semua motor.
  • num_retry (int, opsional, defaultnya 0) — Percobaan tambahan pada setiap motor setelah kegagalan komunikasi.

Membuang

ConnectionError

  • ConnectionError — Jika beberapa motor tidak dapat dijangkau; pesan tersebut menyebutkan nama motor tersebut.

Nonaktifkan torsi motor yang dipilih.

Dengan torsi dimatikan, EEPROM motor dapat ditulis, dan kunci motor Feetech terbuka untuk itu. Setiap motor yang dipilih akan dicoba; kegagalan akan dilaporkan, dan motor yang tidak merespons mungkin tetap dalam keadaan torsi aktif.

putuskan

< >

( disable_torque: bool = True )

Parameter

  • disable_torque (bool, opsional, default True) — Apakah akan menonaktifkan torsi setiap motor sebelum menutup port, sehingga tidak ada motor yang masih memberikan resistensi.

Tutup port serial, secara default dengan torsi setiap motor dimatikan.

Aman untuk dipanggil pada bus yang sudah terputus, dan port dilepaskan bahkan jika penonaktifan torsi gagal.

enable_torque

< >

( motors: NameOrID | Sequence[NameOrID] | None = Nonenum_retry: int = 0 )

Parameter

  • motors (str | int | Sequence[str | int], opsional) — Motor yang akan dipegang, berdasarkan nama atau id. None memilih semua motor.
  • num_retry (int, opsional, defaultnya 0) — Percobaan tambahan pada setiap motor setelah kegagalan komunikasi.

Membuang

ConnectionError

  • ConnectionError — Jika beberapa motor tidak dapat dijangkau; pesan tersebut menyebutkan nama motor tersebut.

Aktifkan torsi motor yang dipilih, dan tutup kunci motor Feetech.

ping

< >

( motor: NameOrIDnum_retry: int = 0 ) → int | None

Parameter

  • motor (str | int) — Motor, berdasarkan nama atau id, salah satu motor dari bus.
  • num_retry (int, opsional, defaultnya 0) — Percobaan tambahan setelah kegagalan komunikasi.

Mengembalikan

int | None

Nomor model, None ketika motor tidak menjawab atau menolak pembacaan.

Nomor model yang dijawab oleh motor.

Membaca Model_Number alih-alih mengirim ping: keberadaan dan identitas kini hanya membutuhkan satu round trip, bukan dua.

baca

< >

( data_name: strmotor: strnormalize: bool = Truenum_retry: int = 0 ) → int | float

Parameter

  • data_name (str) — Nama register, mis. "Present_Position"; huruf besar/kecil tidak berpengaruh.
  • motor (str) — Motor name.
  • normalize (bool, opsional, default True) — Apakah akan menskalakan posisi ke rentang yang didefinisikan oleh kalibrasi dan mode norm-nya.
  • num_retry (int, opsional, defaultnya 0) — Percobaan tambahan setelah kegagalan komunikasi.

Mengembalikan

int | float

Nilai mentah, atau nilai yang dinormalisasi.

Membuang

ConnectionError atau RuntimeError

  • ConnectionError — Jika motor tidak merespons.
  • RuntimeError — Jika motor menolak pembacaan. Alarm pada statusnya, seperti kelebihan beban, tidak memicu error.

Baca register dari satu motor.

read_calibration

< >

( ) → dict[str, MotorCalibration]

Mengembalikan

dict[str, MotorCalibration]

Kalibrasi setiap motor, berdasarkan nama.

Baca kalibrasi setiap motor.

Motor tanpa register offset homing (Feetech SCS) melaporkan 0, dan motor tanpa register Drive_Mode (Feetech) melaporkan mode drive 0.

record_calibration

< >

( mode: strfull_turn_motors: Sequence[str]inverted_motors: Sequence[str] = ()motors: Sequence[str] | None = None ) → dict[str, MotorCalibration]

Parameter

  • mode (str) — Mode operasi motor, misalnya "position".
  • full_turn_motors (Sequence[str]) — Motor yang diberikan seluruh rentang encoder, bukan rentang yang dilaluinya.
  • inverted_motors (Sequence[str], opsional, defaultnya ()) — Motor yang berputar ke arah sebaliknya.
  • motors (Sequence[str], opsional) — Motor yang akan dikalibrasi. None mengkalibrasi semua motor.

Mengembalikan

dict[str, MotorCalibration]

Kalibrasi setiap motor, sesuai urutan bus.

Membuang

ValueError

  • ValueError — Jika sebuah motor tidak berada di bus, atau motor putaran penuh atau motor terbalik bukan salah satu motor yang akan dikalibrasi; tidak ada motor yang disentuh.

Kalibrasi motor yang digerakkan secara manual.

Motor yang dipilih dilepaskan, dimasukkan ke mode operasi, dan diberikan arah: motor dengan register Drive_Mode akan ditulis, dibalik atau tidak, sedangkan pada motor lainnya, sebagai servo Feetech, pembalikan diterapkan secara perangkat lunak saat normalisasi. Pengguna kemudian menahan sendi di tengah rentang geraknya, yang menjadi setengah putaran dari masing-masing motor, dan menggerakkan setiap sendi melalui seluruh rentangnya, direkam hingga ENTER. Motor putaran penuh tidak direkam: ia mencakup seluruh encoder dari modelnya.

Motor membutuhkan mode operasi dan offset homing, yang keduanya tidak dimiliki oleh Feetech SCS0009. Offset homing dan batas posisi mereka ditulis ulang, calibration yang di-cache dibersihkan, dan torsi dibiarkan mati. Kalibrasi yang dikembalikan tidak ditulis ke batas posisi maupun disimpan: ~SerialMotorsBus.write_calibration yang menulisnya, dan perangkat yang menyimpannya.

record_ranges_of_motion

< >

( motors: NameOrID | Sequence[NameOrID] | None = Nonedisplay_values: bool = True ) → tuple[dict[str, int | float], dict[str, int | float]]

Parameter

  • motors (str | int | Sequence[str | int], opsional) — Motor yang akan direkam, berdasarkan nama atau id. None memilih semua motor.
  • display_values (bool, opsional, defaultnya True) — Apakah akan mencetak tabel langsung.

Mengembalikan

tuple[dict[str, int | float], dict[str, int | float]]

Posisi mentah terendah dan tertinggi setiap motor, berdasarkan nama.

Membuang

ValueError

  • ValueError — Jika sebuah motor tidak bergerak: posisi terendah dan tertingginya sama.

Catat rentang pergerakan setiap motor yang dipilih secara manual, hingga ENTER.

Sendi-sendi digerakkan secara manual, dengan torsi dimatikan, sementara tabel langsung menampilkan posisinya.

reset_calibration

< >

( motors: NameOrID | Sequence[NameOrID] | None = None )

Parameter

  • motors (str | int | Sequence[str | int], opsional) — Motor yang akan direset, berdasarkan nama atau id. None memilih semua motor.

Pulihkan kalibrasi pabrik dari motor yang dipilih.

Offset homing diset ke 0 pada motor yang memilikinya, dan batas posisi mencakup seluruh encoder. calibration yang di-cache dibersihkan.

resolusi

< >

( model: str ) → int

Parameter

  • model (str) — Model dari salah satu motor bus, misalnya "sts3215".

Mengembalikan

int

Jumlah langkah per giliran, misalnya 4096 pada encoder 12-bit.

Membuang

ValueError

  • ValueError — Jika model tidak menghitung langkah encoder.

Jumlah langkah encoder per putaran model motor.

set_baudrate

< >

( baudrate: int )

Parameter

  • baudrate (int) — Laju baud, dalam bit per detik.

Ubah laju baud dari port yang terbuka.

Port terbuka pada default_baudrate setiap kali terhubung.

set_half_turn_homings

< >

( motors: NameOrID | Sequence[NameOrID] | None = None ) → dict[str, int]

Parameter

  • motors (str | int | Sequence[str | int], opsional) — Motor yang akan dihoming, berdasarkan nama atau id. None memilih semua motor.

Mengembalikan

dict[str, int]

Offset homing yang ditulis ke setiap motor, berdasarkan nama.

Membuang

ValueError

  • ValueError — Jika motor yang dipilih tidak memiliki homing offset, seperti Feetech SCS.

Jadikan posisi saat ini dari setiap motor yang dipilih setengah putaran.

Kalibrasi motor direset, kemudian masing-masing motor diberikan offset homing yang membawa posisinya saat ini ke setengah nilai enkodernya, misalnya 2047 pada enkoder 12-bit. Setiap motor yang dipilih harus memiliki offset homing, yang diperiksa sebelum register apa pun ditulis.

set_operating_mode

< >

( mode: strmotors: NameOrID | Sequence[NameOrID] | None = None )

Parameter

  • mode (str) — Nama mode operasi, misalnya "position".
  • motors (str | int | Sequence[str | int], opsional) — Motor yang akan diatur, berdasarkan nama atau id. None memilih semua motor.

Membuang

ValueError

  • ValueError — Jika motor yang dipilih tidak memiliki mode tersebut; tidak ada motor yang mengubah mode.

Letakkan motor yang dipilih dalam mode operasi, yang ditentukan berdasarkan nama.

Mode berasal dari definisi masing-masing motor, sehingga bergantung pada model, bukan hanya pada keluarga: Feetech SCS0009 tidak memiliki mode. Mode harus ada untuk setiap motor yang dipilih, yang diperiksa sebelum motor apa pun mengubah mode. Tulis dengan torsi mati.

  • position: menyimpan posisi tujuan dalam satu giliran dan batas-batas posisi.
  • velocity: berputar tanpa henti pada kecepatan target, seperti roda.
  • pwm: menggerakkan tegangan motor secara langsung, open loop.
  • step (Feetech): bergerak sesuai jumlah langkah yang ditulis sebagai posisi tujuan.
  • current (Dynamixel): menyimpan arus target, yaitu torsi, apa pun posisinya.
  • extended_position (Dynamixel): mempertahankan posisi tujuan selama beberapa putaran. Register Min_Position_Limit dan Max_Position_Limit diabaikan dalam mode ini.
  • current_based_position (Dynamixel): mempertahankan posisi target selama beberapa putaran dengan arus yang dibatasi oleh arus target, seperti gripper yang tidak boleh menghancurkan benda yang dipegangnya.

setup_motor

< >

( motor: strinitial_baudrate: int | None = Noneinitial_id: int | None = None )

Parameter

  • motor (str) — Nama motor.
  • initial_baudrate (int, opsional) — Baud rate yang dijawab oleh motor saat ini.
  • initial_id (int, opsional) — Id yang dijawab oleh motor saat ini, digunakan bersama initial_baudrate.

Membuang

RuntimeError atau ConnectionError

  • RuntimeError — Jika motor tidak ditemukan, bukan dari modelnya, atau tidak menjawab sesuai konfigurasi setelah di-setup.
  • ConnectionError — Jika komunikasi dengan motor gagal.

Beri satu motor id dan laju baud default bus.

Motor harus menjadi satu-satunya di bus. Kecuali initial_baudrate dan initial_id keduanya diberikan, motor akan ditemukan terlebih dahulu: pada initial_baudrate jika hanya itu yang diberikan, selain itu di seluruh baud rate modelnya; initial_id yang diberikan sendirian akan diganti dengan id yang ditemukan. rustypot kemudian mematikan torsi, membuka EEPROM, dan menulis id serta baud rate.

setup_motors

< >

( motors: Sequence[str] | None = None )

Parameter

  • motors (Sequence[str], opsional) — Motor dalam urutan mereka disetelkan. None bergerak dari motor terakhir ke yang pertama, dari gripper ke bawah pada lengan.

Setel motor satu per satu, dengan meminta masing-masing untuk sendirian di bus.

sync_read

< >

( data_name: strmotors: NameOrID | Sequence[NameOrID] | None = Nonenormalize: bool = Truenum_retry: int = 0 ) → dict[str, int | float]

Parameter

  • data_name (str) — Nama register, mis. "Present_Position"; huruf besar/kecil tidak berpengaruh.
  • motors (str | int | Sequence[str | int], opsional) — Motor yang akan dibaca, berdasarkan nama atau id. None membaca semua motor.
  • normalize (bool, opsional, default True) — Apakah posisi akan diskalakan ke rentang yang didefinisikan oleh kalibrasi dan mode norm-nya.
  • num_retry (int, opsional, default 0) — Percobaan tambahan setelah kegagalan komunikasi. Retry akan mengirim ulang setiap grup, termasuk yang sebelumnya berhasil; motor atau register yang tidak dikenal tidak pernah di-retry.

Mengembalikan

dict[str, int | float]

Nilai dari setiap motor, berdasarkan nama.

Membuang

ConnectionError atau RuntimeError

  • ConnectionError — Jika sebuah motor tidak menjawab.
  • RuntimeError — Jika sebuah motor menolak pembacaan. Alarm dalam status, seperti beban berlebih, tidak memicu error.

Baca register dari beberapa motor.

rustypot mengirim satu Sync Read per kelompok motor yang berbagi protokol serta alamat dan ukuran register, dan membaca motor servo tanpa Sync Read, seperti Feetech SCS, satu per satu. Oleh karena itu, nilai-nilai tersebut bukan merupakan satu snapshot simultan.

sync_write

< >

( data_name: strvalues: Value | dict[str, Value]normalize: bool = Truenum_retry: int = 0 )

Parameter

  • data_name (str) — Nama register, mis. "Goal_Position"; huruf besar/kecil tidak berpengaruh.
  • values (int | float | dict[str, int | float]) — Satu nilai untuk setiap motor, atau nilai per nama motor.
  • normalize (bool, opsional, default True) — Apakah posisi diberikan dalam rentang yang didefinisikan oleh kalibrasi dan mode norm-nya.
  • num_retry (int, opsional, defaultnya 0) — Percobaan tambahan setelah kegagalan port. Setiap retry akan mengirim ulang setiap grup.

Membuang

ConnectionError

  • ConnectionError — Jika port gagal.

Tulis register untuk beberapa motor, tanpa menunggu jawaban.

Berbeda dengan ~SerialMotorsBus.write, tidak ada motor yang menjawab sync write: lebih cepat, cocok untuk loop kontrol, tetapi paket yang hilang tidak akan terdeteksi. rustypot mengirim satu Sync Write per grup motor yang berbagi protokol serta alamat dan ukuran register.

torque_disabled

< >

( motors: NameOrID | Sequence[NameOrID] | None = None )

Parameter

  • motors (str | int | Sequence[str | int], opsional) — Motor yang akan dilepaskan, berdasarkan nama atau id. None memilih semua motor.

Nonaktifkan torsi motor yang dipilih selama blok with.

Torsi diaktifkan kembali saat keluar, bahkan ketika blok tersebut memicu pengecualian, yang sesuai untuk konfigurasi motor.

Contoh:

>>> with bus.torque_disabled():
...     bus.set_operating_mode("position")

tulis

< >

( data_name: strmotor: strvalue: Valuenormalize: bool = Truenum_retry: int = 0 )

Parameter

  • data_name (str) — Nama register, mis. "Goal_Position"; huruf besar/kecil tidak berpengaruh.
  • motor (str) — Motor name.
  • value (int | float) — Nilai yang akan ditulis, dinormalisasi atau mentah sesuai dengan normalize.
  • normalize (bool, opsional, default True) — Apakah posisi diberikan dalam rentang yang didefinisikan oleh kalibrasi dan mode norm-nya.
  • num_retry (int, opsional, defaultnya 0) — Percobaan tambahan setelah kegagalan komunikasi.

Membuang

ConnectionError atau RuntimeError

  • ConnectionError — Jika motor tidak merespons.
  • RuntimeError — Jika motor menolak penulisan. Alarm pada statusnya, seperti kelebihan beban, tidak akan memicu error.

Tulis register untuk satu motor, dan tunggu jawabannya.

Berbeda dengan ~SerialMotorsBus.sync_write, motor mengakui penulisan, sehingga kegagalan dilaporkan: lebih lambat, tetapi cocok untuk mengonfigurasi motor.

write_calibration

< >

( calibration_dict: dict[str, MotorCalibration]cache: bool = True )

Parameter

  • calibration_dict (dict[str, MotorCalibration]) — Kalibrasi untuk setiap motor, berdasarkan nama, sebagaimana dikembalikan oleh ~SerialMotorsBus.read_calibration.
  • cache (bool, opsional, default True) — Apakah akan menyimpan kalibrasi sebagai calibration bus, yang menormalisasi posisi.

Tulis kalibrasi ke motor, dan secara default simpannya di cache.

Batas posisi ditulis ke setiap motor, dan offset homing ditulis ke motor yang memilikinya. Baik id maupun mode drive tidak ditulis: mode drive Feetech diterapkan secara perangkat lunak saat normalisasi, dan register Drive_Mode Dynamixel diatur secara terpisah.

Motor

kelas lerobot.motors.Motor

< >

( id: intmodel: strnorm_mode: MotorNormModemotor_type_str: str | None = Nonerecv_id: int | None = None )

MotorCalibration

kelas lerobot.motors.MotorCalibration

< >

( id: intdrive_mode: inthoming_offset: intrange_min: intrange_max: int )

MotorNormMode

kelas lerobot.motors.MotorNormMode

< >

( *values )

DriveMode

DriveMode memiliki dua anggota, yaitu NON_INVERTED = 0 dan INVERTED = 1. Gunakan .value di tempat bilangan bulat diharapkan, baik pada register Drive_Mode maupun pada MotorCalibration.drive_mode:

bus.write("Drive_Mode", "elbow_flex", DriveMode.INVERTED.value)

kelas lerobot.motors.DriveMode

< >

( *values )

Nilai register Drive_Mode Dynamixel, dan dari MotorCalibration.drive_mode.

Update on GitHub