LeRobot documentation
Motorlar
Motorlar
SerialMotorsBus, seri bir bus üzerindeki Feetech veya Dynamixel servo zincirine yönelik düşük seviye arayüzdür. Robotlar, konumları okumak ve hedef konumları yazmak için bunu kullanır; donanım eklemiyorsanız doğrudan elle tutmanız nadiren gerekir. Her motorun modeli, aileler arasındaki farklılıkları ve kontrol tablolarını barındıran ve ayrıca seri portu yöneten rustypot içinde aranır. FeetechMotorsBus ve DynamixelMotorsBus, bir sürüm boyunca korunmak üzere bırakılmış, bunun terk edilmiş takma adlarıdır.
SDK tabanlı otobüslerden geçiş
Takma adlar, eski SDK öznitellerini ve model tablolarını değil, sınıf adlarını korur:
bus.model_resolution_table[model]artıkbus.resolution(model)olur; diğer model tabloları (model_ctrl_table,model_number_table, …) ise artık rustypot servo tanımlarıdır.- Çalışma modları,
Operating_Modekaydına birOperatingModedeğeri yazmak yerine, adla seçilir:bus.set_operating_mode("position"). - SDK portu ve paket işleyicileri artık dışa açılmıyor: rustypot seri portun sahibidir.
protocol_versionyok sayılır: her motorun modeli kendi protokolünü belirtir.
Yeni bir bus eklemek için Kendi Donanımınızı Getirin başlıklı bölümü, cihaza özel notlar için ise Feetech Yazılımını Güncelleme ve Damiao Motorları ve CAN Bus başlıklı bölümleri inceleyin.
SerialMotorsBus
sınıf lerobot.motors.SerialMotorsBus
< source >( port: strmotors: dict[str, Motor]calibration: dict[str, MotorCalibration] | None = None )
Tek bir seri porta daisy-chain (sıralı) olarak bağlanmış Feetech veya Dynamixel servo zincirini okuyun ve yazın.
rustypot, her modelin metadata’sını (kontrol tablosu, çözünürlük, baud hızları, çalışma modları) ve seri I/O’yu yönetir; LeRobot ise normalizasyonu, kalibrasyonu ve önerilen ayarları ele alır. STS ve SCS veya XL430 ve XL330 gibi bazı modellerin motorları portu paylaşır.
Portu bulmak için şunu çalıştırın:
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.Bus üzerindeki tek bir Feetech sts3215 için örnek:
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
< source >( return_delay_time: int = 0maximum_acceleration: int = 254acceleration: int = 254 )
Parametreler
- return_delay_time (
int, isteğe bağlı, varsayılan0) — Bir motorun yanıt vermeden önceki gecikme süresi, 2 µs birimlerinde; motorlar fabrikadan 250 (500 µs) değerinde çıkar. - maximum_acceleration (
int, isteğe bağlı, varsayılan254) — Hızlanma sınırı, hızlanma sınırına sahip servo motorlarda (Feetech STS), hızlanma ve yavaşlamayı hızlandırmak için yüksek değerler kullanılır. - acceleration (
int, isteğe bağlı, varsayılan254) — Bunu destekleyen servo motorlarda (Feetech) ivmelenme.
LeRobot'un önerdiği ayarları her motora yazın.
bağlan
< source >( handshake: bool = True )
Parametreler
- handshake (
bool, isteğe bağlı, varsayılanTrue) — Her motorun kendi model numarasıyla yanıt verdiğini ve bir tanım içindeki Feetech motorlarının aynı yazılımı çalıştırdığını kontrol edip etmeyeceğini belirtir.
Yükseltilen
DeviceAlreadyConnectedError veya ConnectionError veya RuntimeError
DeviceAlreadyConnectedError— Port zaten açıksa.ConnectionError— Port açılamadıysa.RuntimeError— El sıkışma başarısız olursa; port tekrar kapatılır.
Seri portu açın ve motorları kontrol edin.
disable_torque
< source >( motors: NameOrID | Sequence[NameOrID] | None = Nonenum_retry: int = 0 )
Parametreler
- motors (
str | int | Sequence[str | int], isteğe bağlı) — Ad veya kimlik numarasına göre serbest bırakılacak motorlar.Nonetüm motorları seçer. - num_retry (
int, isteğe bağlı, varsayılan0) — Bir iletişim hatası sonrasında her motor için ek denemeler.
Yükseltilen
ConnectionError
ConnectionError— Bazı motorlara ulaşılamadıysa; mesaj bunları adlandırır.
Seçilen motorların torkunu devre dışı bırakın.
Tork kapalıyken, bir motorun EEPROM'una yazılabilir ve Feetech motorunun kilidi açılabilir. Her seçili motor için işlem denenir; hatalar raporlanır ve yanıt vermeyen motorlar tork etkin olarak kalabilir.
bağlantıyı kes
< source >( disable_torque: bool = True )
Serial portu kapatın, varsayılan olarak tüm motorların torku kapalıdır.
Zaten bağlantısı kesilmiş bir otobüste çağrılması güvenlidir ve torkun devre dışı bırakılması başarısız olsa bile port serbest bırakılır.
enable_torque
< source >( motors: NameOrID | Sequence[NameOrID] | None = Nonenum_retry: int = 0 )
Parametreler
- motors (
str | int | Sequence[str | int], isteğe bağlı) — İsim veya kimlik numarasına göre tutulacak motorlar.Nonetüm motorları seçer. - num_retry (
int, isteğe bağlı, varsayılan0) — Bir iletişim hatası sonrasında her motor için ek denemeler.
Yükseltilen
ConnectionError
ConnectionError— Bazı motorlara ulaşılamadıysa; mesaj bunları adlandırır.
Seçilen motorların torkunu etkinleştirin ve Feetech motorlarının kilidini kapatın.
ping
< source >( motor: NameOrIDnum_retry: int = 0 ) → int | None
Bir motorun yanıt olarak verdiği model numarası.
Ping göndermek yerine Model_Number okur: varlık ve kimlik bilgisi artık iki yerine bir gidiş-dönüş maliyetine mal olur.
okuma
< source >( data_name: strmotor: strnormalize: bool = Truenum_retry: int = 0 ) → int | float
Parametreler
- data_name (
str) — Kayıt adı, örn."Present_Position"; büyük/küçük harf fark etmez. - motor (
str) — Motor adı. - normalize (
bool, isteğe bağlı, varsayılanTrue) — Bir konumun, kalibrasyon ve norm modunun tanımladığı aralığa ölçeklenip ölçeklenmeyeceğini belirtir. - num_retry (
int, isteğe bağlı, varsayılan0) — İletişim hatası sonrası ek denemeler.
Dönüş değeri
int | float
Ham değer veya normalize edilmiş değer.
Yükseltilen
ConnectionError veya RuntimeError
ConnectionError— Motor yanıt vermezse.RuntimeError— Motor okumayı reddederse. Durumundaki bir alarm, aşırı yük gibi, bir hata yükseltmez.
Bir motorun kaydını okuyun.
read_calibration
< source >( ) → dict[str, MotorCalibration]
Dönüş değeri
dict[str, MotorCalibration]
Her motorun, adına göre kalibrasyonu.
Her motorun kalibrasyonunu okuyun.
Homing offset kaydı olmayan bir motor (Feetech SCS) 0 raporlar, Drive_Mode kaydı olmayan bir motor (Feetech) ise sürüş modu 0 raporlar.
record_calibration
< source >( mode: strfull_turn_motors: Sequence[str]inverted_motors: Sequence[str] = ()motors: Sequence[str] | None = None ) → dict[str, MotorCalibration]
Parametreler
- mode (
str) — Motorların çalışma modu, örn."position". - full_turn_motors (
Sequence[str]) — Hareket ettirildikleri aralık yerine tüm kodlayıcı aralığı verilen motorlar. - inverted_motors (
Sequence[str], isteğe bağlı, varsayılan()) — Ters yönde dönen motorlar. - motors (
Sequence[str], isteğe bağlı) — Kalibre edilecek motorlar.Nonetüm motorları kalibre eder.
Dönüş değeri
dict[str, MotorCalibration]
Her motorun, otobüs sırasına göre kalibrasyonu.
Yükseltilen
ValueError
ValueError— Bir motor otobüste değilse veya tam tur atan ya da ters çevrilmiş bir motor kalibre edilecek motorlardan biri değilse; o zaman hiçbir motorla etkileşime girilmez.
Elle hareket ettirilen motorları kalibre edin.
Seçilen motorlar serbest bırakılır, çalışma moduna alınır ve yönleri belirlenir: Drive_Mode kaydedecine sahip bir motora, ters çevrilmiş veya çevrilmemiş haliyle yazma işlemi yapılırken, Feetech servo olarak sınıflandırılan diğerlerinde normalleştirme sırasında yazılım düzeyinde bir ters çevirme uygulanır. Kullanıcı ardından eklemeleri hareket aralıklarının ortasında tutar; bu durum her motor için yarım dönüşe karşılık gelir ve her eklemin tüm aralığı boyunca hareket ettirilmesi, ENTER tuşuna basılana kadar kaydedilir. Tam dönüş yapan bir motor kaydedilmez: bu motor, modelinin tüm kodlayıcısını kapsar.
Motorlar çalışma modu ve bir homing ofseti gerektirir, ancak Feetech SCS0009’da bunların hiçbiri yoktur. Homing ofsetleri ve konum sınırları yeniden yazılır, önbelleğe alınan calibration temizlenir ve torkları kapalı bırakılır. Dönen kalibrasyon, konum sınırlarına yazılmaz ve kaydedilmez: ~SerialMotorsBus.write_calibration bunu yazar ve cihaz onu kaydeder.
record_ranges_of_motion
< source >( motors: NameOrID | Sequence[NameOrID] | None = Nonedisplay_values: bool = True ) → tuple[dict[str, int | float], dict[str, int | float]]
Parametreler
- motors (
str | int | Sequence[str | int], isteğe bağlı) — İsim veya kimlik numarasına göre kaydedilecek motorlar.Nonetüm motorları seçer. - display_values (
bool, isteğe bağlı, varsayılanTrue) — Canlı tablonun yazdırılıp yazdırılmayacağı.
Dönüş değeri
tuple[dict[str, int | float], dict[str, int | float]]
Her motorun adıyla, en düşük ve en yüksek ham konumu.
Yükseltilen
ValueError
ValueError— Bir motor hareket etmediyse: en düşük ve en yüksek konumları eşittir.
ENTER'a basılana kadar, her seçilen motorun elle hareket ettirildiği aralığı kaydedin.
Eklem, tork kapalıyken elle hareket ettirilirken canlı bir tablo konumları gösterir.
reset_calibration
< source >( motors: NameOrID | Sequence[NameOrID] | None = None )
Seçilen motorların fabrika kalibrasyonunu geri yükleyin.
Homing offset, varsa, motorlarda 0 olarak ayarlanır ve konum sınırları tüm kodlayıcıyı kapsar. Önbelleğe alınan calibration temizlenir.
çözünürlük
< source >( model: str ) → int
Bir motor modelinin tur başına kodlayıcı adımı.
set_baudrate
< source >( baudrate: int )
Açık portun baud hızını değiştirin.
Port, her bağlantıda default_baudrate hızında açılır.
set_half_turn_homings
< source >( motors: NameOrID | Sequence[NameOrID] | None = None ) → dict[str, int]
Parametreler
- motors (
str | int | Sequence[str | int], isteğe bağlı) — İsme veya kimliğe göre eve döndürülecek motorlar.Nonetüm motorları seçer.
Dönüş değeri
dict[str, int]
İsimlerine göre her motora yazılan homing ofseti.
Yükseltilen
ValueError
ValueError— Seçilen motorun Feetech SCS gibi bir homing offset değeri yoksa.
Seçilen her motorun mevcut konumunu yarım tur yapın.
Motorların kalibrasyonu sıfırlanır, ardından her birine mevcut konumunu kodlayıcısının yarısına getiren ev konumu ofseti atanır, örneğin 12 bitlik bir kodlayıcıda 2047. Seçilen her motorun bir ev konumu ofsetine sahip olması gerekir ve bu, herhangi bir kayda yazım yapılmadan önce kontrol edilir.
set_operating_mode
< source >( mode: strmotors: NameOrID | Sequence[NameOrID] | None = None )
Parametreler
- mode (
str) — Çalışma modunun adı, örn."position". - motors (
str | int | Sequence[str | int], isteğe bağlı) — İsim veya kimlik numarasına göre ayarlanacak motorlar.Nonetüm motorları seçer.
Yükseltilen
ValueError
ValueError— Seçilen motorun böyle bir modu yoksa; o zaman hiçbir motorun modu değiştirilmez.
Seçilen motorları, adla belirtilen bir çalışma moduna koyun.
Modlar, her motorun tanımından gelir; bu nedenle yalnızca aileye değil, modele de bağlıdır: Feetech SCS0009'un hiçbir modu yoktur. Mod, seçilen her motor için mevcut olmalıdır ve bu, herhangi bir motorun modunu değiştirmesinden önce kontrol edilir. Bunu tork kapalıyken yazın.
position: bir tur içindeki hedef konumu ve konum sınırlarını tutar.velocity: bir tekerlek gibi, hedef hızda sonsuza kadar döner.pwm: motor voltajını doğrudan sürer, açık döngü.step(Feetech): hedef konum olarak yazılan adım sayısı kadar hareket eder.current(Dynamixel): konumdan bağımsız olarak bir tork olan hedef akımı tutar.extended_position(Dynamixel): hedef konumu birkaç tur boyunca korur. Bu moddaMin_Position_LimitveMax_Position_Limitkayıtları yok sayılır.current_based_position(Dynamixel): hedef akımın üst sınırıyla akımı sınırlayarak, tuttuğu nesneyi ezmemesi gereken bir kavrama (gripper) gibi, hedef konumu birkaç tur boyunca korur.
setup_motor
< source >( motor: strinitial_baudrate: int | None = Noneinitial_id: int | None = None )
Parametreler
- motor (
str) — Motorun adı. - initial_baudrate (
int, isteğe bağlı) — Motorun şu anda yanıt verdiği baud hızı. - initial_id (
int, isteğe bağlı) — Motorun şu anda yanıt verdiği kimlik,initial_baudrateile kullanılır.
Yükseltilen
RuntimeError veya ConnectionError
RuntimeError— Motor bulunamadığında, modeline ait olmadığında veya yapılandırıldıktan sonra yapılandırıldığı gibi yanıt vermediğinde.ConnectionError— Motorla iletişim başarısız olursa.
Tek bir motorun kimliğini ve otobüsün varsayılan baud hızını verin.
Motor, büsteki tek motor olmalıdır. Hem initial_baudrate hem de initial_id verilmedikçe, motor önce bulunur: yalnızca initial_baudrate verilmişse bu hızda, aksi halde modelinin baud hızları arasında aranır; yalnız başına verilen bir initial_id, bulunan id ile değiştirilir. rustypot ardından torkunu kapatır, EEPROM'unu açar ve id ile baud hızını yazar.
setup_motors
< source >( motors: Sequence[str] | None = None )
Motorları tek tek yapılandırın ve her birinin otobüste yalnız başına olmasını isteyin.
sync_read
< source >( data_name: strmotors: NameOrID | Sequence[NameOrID] | None = Nonenormalize: bool = Truenum_retry: int = 0 ) → dict[str, int | float]
Parametreler
- data_name (
str) — Kayıt adı, örn."Present_Position"; büyük/küçük harf fark etmez. - motors (
str | int | Sequence[str | int], isteğe bağlı) — Ad veya kimlik numarasına göre okunacak motorlar.Nonetüm motorları okur. - normalize (
bool, isteğe bağlı, varsayılanTrue) — Konumların, kalibrasyon ve norm modunun tanımladığı aralığa ölçeklenip ölçeklenmeyeceğini belirtir. - num_retry (
int, isteğe bağlı, varsayılan0) — Bir iletişim hatası sonrasında yapılacak ek denemeler. Bir yeniden deneme, başarılı olanlar dahil olmak üzere tüm grupları tekrar gönderir; bilinmeyen bir motor veya kayıt asla yeniden denenmez.
Dönüş değeri
dict[str, int | float]
Her motorun, adına göre değeri.
Yükseltilen
ConnectionError veya RuntimeError
ConnectionError— Bir motor yanıt vermezse.RuntimeError— Bir motor okumayı reddederse. Aşırı yük gibi bir durum alarmı, hata fırlatmaz.
Birkaç motorun kaydını okuyun.
rustypot, bir protokolü, kaydın adresini ve boyutunu paylaşan motor grupları için grup başına birer Sync Read gönderir ve Feetech SCS gibi servo motorlarını Sync Read olmadan, birbiri ardına okur. Bu nedenle değerler, eşzamanlı bir anlık görüntü değildir.
sync_write
< source >( data_name: strvalues: Value | dict[str, Value]normalize: bool = Truenum_retry: int = 0 )
Parametreler
- data_name (
str) — Kayıt adı, örn."Goal_Position"; büyük/küçük harf fark etmez. - values (
int | float | dict[str, int | float]) — Her motor için tek bir değer veya motor adı başına bir değer. - normalize (
bool, isteğe bağlı, varsayılanTrue) — Konumların, kalibrasyon ve norm modlarının tanımladığı aralıkta verilip verilmediğini belirtir. - num_retry (
int, isteğe bağlı, varsayılan0) — Portun başarısız olması durumunda ek denemeler. Bir yeniden deneme, her grubu tekrar gönderir.
Yükseltilen
ConnectionError
ConnectionError— Port başarısız olursa.
Birkaç motorun kaydını, yanıtı beklemeden yazın.
~SerialMotorsBus.write'nin aksine, senkron yazmaya hiçbir motor yanıt vermez: daha hızlıdır, kontrol döngüleri için uygundur, ancak kaybolan bir paket fark edilmez. rustypot, bir protokolü ve kaydın adresini ve boyutunu paylaşan motor gruplarının her biri için bir Senkron Yazma gönderir.
torque_disabled
< source >( motors: NameOrID | Sequence[NameOrID] | None = None )
Bir with bloğunun süresince seçilen motorların torkunu devre dışı bırakın.
Torque, blok bir hata fırlatsa bile çıkışta yeniden etkinleştirilir; bu durum motor yapılandırması için uygundur.
yaz
< source >( data_name: strmotor: strvalue: Valuenormalize: bool = Truenum_retry: int = 0 )
Parametreler
- data_name (
str) — Kayıt adı, örn."Goal_Position"; büyük/küçük harf fark etmez. - motor (
str) — Motor adı. - value (
int | float) — Value to write, normalised or raw asnormalizesays. - normalize (
bool, isteğe bağlı, varsayılanTrue) — Bir konumun, kalibrasyon ve norm modunun tanımladığı aralıkta verilip verilmediğini belirtir. - num_retry (
int, isteğe bağlı, varsayılan0) — İletişim hatası sonrası ek denemeler.
Yükseltilen
ConnectionError veya RuntimeError
ConnectionError— Motor yanıt vermezse.RuntimeError— Motor yazmayı reddederse. Durumundaki bir alarm, aşırı yük gibi, bir hata yükseltmez.
Bir motorun kaydını yazın ve yanıtını bekleyin.
~SerialMotorsBus.sync_write'nin aksine, motor yazmayı onaylar, bu nedenle bir hata raporlanır: daha yavaştır, ancak motor yapılandırması için uygundur.
write_calibration
< source >( calibration_dict: dict[str, MotorCalibration]cache: bool = True )
Motorlara bir kalibrasyon yazın ve varsayılan olarak bunu önbelleğe alın.
Konum sınırları tüm motorlara, homing ofseti ise buna sahip olan motorlara yazılır. Ne id ne de sürücü modu yazılır: Feetech'in sürücü modu, normalleştirme sırasında yazılımla uygulanır ve Dynamixel'in Drive_Mode kaydı kendi başına ayarlanır.
Motor
sınıf lerobot.motors.Motor
< source >( id: intmodel: strnorm_mode: MotorNormModemotor_type_str: str | None = Nonerecv_id: int | None = None )
MotorCalibration
sınıf lerobot.motors.MotorCalibration
< source >( id: intdrive_mode: inthoming_offset: intrange_min: intrange_max: int )
MotorNormMode
DriveMode
DriveMode iki üyeye sahiptir: NON_INVERTED = 0 ve INVERTED = 1. Tamsayının beklenildiği yerlerde, bir Drive_Mode kaydede veya MotorCalibration.drive_mode içinde .value kullanın:
bus.write("Drive_Mode", "elbow_flex", DriveMode.INVERTED.value)Dynamixel Drive_Mode kaydının ve MotorCalibration.drive_mode'in değeri.