LeRobot documentation

Telepon

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

Telepon

Gunakan ponsel Anda (iOS atau Android) untuk mengendalikan robot Anda.

Panduan ini akan mengajarkan Anda:

  • Cara menghubungkan ponsel iOS/Android
  • Bagaimana pose ponsel dipetakan ke target end-effector (EE) robot
  • Cara menyesuaikan batas keamanan, kontrol gripper, dan pengaturan IK

Untuk menggunakan ponsel untuk mengontrol robot Anda, instal dependensi yang relevan dengan:

pip install 'lerobot[phone,kinematics,feetech,core_scripts]'

kinematics menyediakan kinematika invers yang digunakan dalam contoh, feetech untuk motor SO-100/SO-101, dan core_scripts untuk alat perekaman dan visualisasi.

Mulai

Platform yang didukung

  • iOS: Menggunakan aplikasi HEBI Mobile I/O (pose ARKit + tombol). Unduh aplikasi terlebih dahulu, buka aplikasi tersebut, dan contoh akan mendeteksinya di jaringan Anda serta mengalirkan pose ponsel dan input.
  • Android: Menggunakan paket teleop (WebXR). Saat Anda memulai proses Python, URL lokal akan dicetak. Buka tautan tersebut di ponsel Anda, ketuk Start, lalu gunakan Move untuk streaming pose.

Tautan:

Orientasi dan kontrol ponsel

  • Orientasi: pegang ponsel dengan layar menghadap ke atas dan sisi atas mengarah ke arah yang sama dengan gripper robot. Hal ini memastikan kalibrasi menyelaraskan bingkai ponsel dengan bingkai robot sehingga gerakan terasa alami, lihat gambar di bawah sebagai referensi.
  • Aktif/nonaktif — ini adalah sakelar mati, Anda harus terus menekannya selama gerakan berlangsung:
    • iOS: Tahan B1 untuk menggerakkan robot, lepaskan untuk membekukan lengan di posisinya. Setiap penekanan mengait ulang ponsel ke pose saat ini dari lengan, sehingga Anda dapat melepaskan, mengembalikan tangan ke posisi yang nyaman, menekan lagi, dan melanjutkan — robot tidak melompat.
    • Android: Sama dengan tombol Move di halaman WebXR.
  • Kontrol gripper (berfungsi terlepas dari apakah tombol enable ditekan atau tidak):
    • iOS: Slider analog A3 mengontrol gripper sebagai input kecepatan — dorong ke atas untuk membuka, tarik ke bawah untuk menutup, dan lepaskan di tengah untuk menahan.
    • Android: Tombol A dan B berfungsi seperti increment/decrement (A membuka, B menutup). Anda dapat menyesuaikan kecepatan pada langkah GripperVelocityToJoint.
  • Grip: pegang ponsel dengan kedua tangan, satu ibu jari di tombol enable (B1) dan yang lain di slider gripper (A3), sehingga Anda dapat menggerakkan lengan dan gripper secara bersamaan tanpa mengubah pegangan. Jaga agar ponsel tetap datar saat melakukannya — posisinya adalah perintah, sehingga mengubah pegangan di tengah gerakan akan menggerakkan robot.
  • Pose awal robot: teleoperate.py memindahkan lengan ke pose homing saat startup (sebelum ponsel dikalibrasi), dan saat Ctrl+C dipencet, mengembalikannya ke posisi saat skrip dimulai. Perintah homing mengarahkan setiap sendi tubuh ke nilai setengah putaran yang dipusatkan oleh set_half_turn_homings() selama kalibrasi — pose yang ditahan pada diagram kalibrasi — sementara gripper dibiarkan di posisinya agar homing tidak menutupnya pada sesuatu. Hal ini penting karena target diselesaikan dengan IK dari posisi lengan saat tombol enable ditekan — lengan yang terlipat atau teregang penuh memiliki ruang gerak sedikit dan akan mencapai batas sendinya. Skrip contoh lainnya (record.py, evaluate.py, replay.py) tidak melakukan homing pada lengan, jadi posisikan lengan di sana sendiri sebelum memulai skrip tersebut.
Phone teleop orientation

Langkah 1: Pilih platform

Modifikasi contoh-contoh untuk menggunakan PhoneOS.IOS atau PhoneOS.ANDROID di PhoneConfig. API-nya identik di semua platform, hanya sumber input yang berbeda. Semua contoh ada di examples/phone_to_so100/: teleoperate.py, record.py, replay.py, evaluate.py dan rollout.py.

Contoh teleoperasi:

from lerobot.teleoperators.phone import Phone, PhoneConfig
from lerobot.teleoperators.phone.config_phone import PhoneOS

teleop_config = PhoneConfig(phone_os=PhoneOS.IOS)  # or PhoneOS.ANDROID
teleop_device = Phone(teleop_config)

Langkah 2: Hubungkan dan kalibrasi

Saat Phone(teleop_config) dibuat dan connect() dipanggil, kalibrasi akan diminta secara otomatis. Pegang ponsel dalam orientasi yang dijelaskan di atas, kemudian:

  • iOS: tekan dan tahan B1 untuk menangkap pose referensi.
  • Android: tekan tombol Move di halaman WebXR untuk menangkap pose referensi.

Mengapa perlu kalibrasi? Kami menangkap pose saat ini agar pose-pose berikutnya dinyatakan dalam kerangka yang selaras dengan robot. Ketika Anda menekan tombol lagi untuk mengaktifkan kontrol, posisi akan ditangkap ulang untuk menghindari drift saat ponsel Anda diposisikan ulang selama kontrol nonaktif.

Langkah 3: Jalankan contoh

Jalankan salah satu skrip contoh untuk melakukan teleoperasi, merekam dataset, memutar ulang dataset, atau mengevaluasi kebijakan.

Semua skrip mengasumsikan Anda telah mengonfigurasi dan mengkalibrasi robot Anda (misalnya, pengikut SO-100).

Anda harus menyediakan URDF robot. Setiap contoh menyelesaikan inverse kinematics, yang membutuhkan model kinematika lengan, dan URDF tidak disertakan bersama LeRobot.

Untuk SO-100/SO-101 yang digunakan dalam tutorial ini, salin folder SO101 dari repo SO-ARM100 ke examples/phone_to_so100/, sehingga file berada di examples/phone_to_so100/SO101/so101_new_calib.urdf, saat berada di repo LeRobot:

git clone --depth 1 https://github.com/TheRobotStudio/SO-ARM100.git /tmp/SO-ARM100
cp -r /tmp/SO-ARM100/Simulation/SO101 examples/phone_to_so100/SO101

Arahkan skrip ke file lain dengan --urdf jika Anda menyimpannya di tempat lain, atau jika Anda mengoperasikan lengan robot lain.

  • Jalankan contoh ini untuk melakukan teleoperasi, dengan meneruskan port serial lengan pengikut Anda (cari dengan lerobot-find-port):

    cd examples/phone_to_so100
    python teleoperate.py --port /dev/tty.usbmodem5A460814411

    --id memilih kalibrasi tersimpan mana yang akan digunakan, dan --urdf menunjuk ke URDF di atas.

Setelah menjalankan contoh:

  • Android: setelah menjalankan skrip, buka URL lokal yang dicetak di ponsel Anda, ketuk Mulai, lalu tekan dan tahan Gerak.
  • iOS: buka HEBI Mobile I/O terlebih dahulu; tahan B1 untuk menggerakkan robot. A3 mengontrol gripper.

Selain itu, Anda dapat menyesuaikan pemetaan atau batas keamanan dengan mengedit langkah pemroses yang ditunjukkan dalam contoh. Anda juga dapat memetakan ulang input (misalnya, menggunakan input analog yang berbeda) atau menyesuaikan pipeline untuk robot lain (misalnya, LeKiwi) dengan memodifikasi langkah input dan kinematika. Selengkapnya tentang hal ini dapat ditemukan di panduan Processors for Robots and Teleoperators.

  • Jalankan contoh ini untuk merekam dataset, yang menyimpan observasi dan aksi ujung efektor absolut:

    cd examples/phone_to_so100
    python record.py
  • Jalankan contoh ini untuk memutar ulang episode yang direkam:

    cd examples/phone_to_so100
    python replay.py
  • Jalankan contoh ini untuk mengevaluasi kebijakan yang telah dilatih sebelumnya:

    cd examples/phone_to_so100
    python evaluate.py

Langkah dan opsi pipeline penting

  • Kinematika digunakan dalam beberapa langkah. Kami menggunakan Placo, yaitu wrapper di sekitar Pinocchio untuk menangani kinematika kami. Kami membangun objek kinematika dengan meneruskan URDF robot dan target frame. Kami mengatur target_frame_name ke frame gripper.

    kinematics_solver = RobotKinematics(
      urdf_path="./SO101/so101_new_calib.urdf",
      target_frame_name="gripper_frame_link",
      joint_names=list(robot.bus.motors.keys()),
    )
    
  • Langkah MapPhoneActionToRobotAction mengubah pose ponsel yang telah dikalibrasi dan input menjadi delta target serta perintah gripper; di bawah ini ditampilkan output dari langkah tersebut.

    action["enabled"] = enabled
    action["target_x"] = pos[1] if enabled else 0.0
    action["target_y"] = -pos[0] if enabled else 0.0
    action["target_z"] = pos[2] if enabled else 0.0
    action["target_wx"] = rotvec[1] if enabled else 0.0
    action["target_wy"] = -rotvec[0] if enabled else 0.0
    action["target_wz"] = rotvec[2] if enabled else 0.0
    action["gripper_vel"] = gripper_vel  # Still send gripper action when disabled
  • Langkah EEReferenceAndDelta mengonversi delta target menjadi pose EE absolut yang diinginkan, menyimpan referensi saat diaktifkan, dan end_effector_step_sizes adalah ukuran langkah untuk pose EE yang dapat dimodifikasi untuk mengubah kecepatan gerakan.

    EEReferenceAndDelta(
        kinematics=kinematics_solver,
        end_effector_step_sizes={"x": 0.5, "y": 0.5, "z": 0.5},
        motor_names=list(robot.bus.motors.keys()),
        use_latched_reference=True,
    ),
  • Langkah EEBoundsAndSafety membatasi gerakan EE ke dalam ruang kerja dan memeriksa lompatan langkah EE yang besar untuk memastikan keselamatan. end_effector_bounds adalah batas untuk pose EE dan dapat dimodifikasi untuk mengubah ruang kerja. max_ee_step_m adalah batas langkah untuk pose EE dan dapat dimodifikasi untuk mengubah batas keselamatan.

    EEBoundsAndSafety(
        end_effector_bounds={"min": [-1.0, -1.0, -1.0], "max": [1.0, 1.0, 1.0]},
        max_ee_step_m=0.10,
    )
  • Langkah GripperVelocityToJoint mengubah input gripper yang menyerupai kecepatan menjadi posisi gripper absolut menggunakan keadaan terukur saat ini. speed_factor adalah faktor yang mengalikan kecepatan tersebut.

    GripperVelocityToJoint(speed_factor=20.0)

Tebakan awal IK yang berbeda

Kami menggunakan tebakan awal IK yang berbeda pada langkah kinematik. Sebagai tebakan awal, digunakan sendi yang diukur saat ini atau solusi IK sebelumnya.

  • Closed loop (digunakan dalam record/eval): mengatur initial_guess_current_joints=True sehingga IK dimulai dari sendi yang diukur pada setiap frame.

    InverseKinematicsEEToJoints(
        kinematics=kinematics_solver,
        motor_names=list(robot.bus.motors.keys()),
        initial_guess_current_joints=True,  # closed loop
    )
  • Loop terbuka (digunakan dalam replay): mengatur initial_guess_current_joints=False sehingga IK dilanjutkan dari solusi IK sebelumnya, bukan dari keadaan yang diukur. Hal ini menjaga stabilitas aksi saat kami melakukan replay tanpa umpan balik.

    InverseKinematicsEEToJoints(
        kinematics=kinematics_solver,
        motor_names=list(robot.bus.motors.keys()),
        initial_guess_current_joints=False,  # open loop
    )

Penjelasan langkah-langkah Pipeline

  • MapPhoneActionToRobotAction: mengonversi pose ponsel yang dikalibrasi dan masukan menjadi delta target serta perintah gripper. Gerak dikendalikan oleh sinyal aktif (B1 di iOS, Move di Android).
  • EEReferenceAndDelta: mengunci pose EE referensi saat diaktifkan dan menggabungkannya dengan delta target untuk menghasilkan pose EE absolut yang diinginkan setiap frame. Saat dinonaktifkan, ia terus mengirimkan pose yang terakhir diperintahkan.
  • EEBoundsAndSafety: membatasi pose EE ke dalam ruang kerja dan membatasi lonjakan laju demi keamanan. Juga mendeklarasikan fitur action.ee.*.
  • InverseKinematicsEEToJoints: mengubah pose EE menjadi posisi sendi dengan IK. initial_guess_current_joints=True direkomendasikan untuk kontrol loop tertutup; atur False untuk replay loop terbuka demi stabilitas.
  • GripperVelocityToJoint: mengintegrasikan input gripper yang menyerupai kecepatan menjadi posisi gripper absolut menggunakan keadaan terukur saat ini.
  • ForwardKinematicsJointsToEE: menghitung observation.state.ee.* dari sendi yang diamati untuk pencatatan dan pelatihan pada status EE.

Pemecahan Masalah

  • iOS tidak ditemukan: pastikan HEBI Mobile I/O terbuka dan laptop/ponsel Anda berada di jaringan yang sama.
  • URL Android tidak dapat dijangkau: periksa apakah Anda menggunakan https alih-alih http, gunakan IP yang dicetak oleh skrip secara persis, dan izinkan browser Anda untuk masuk serta mengabaikan masalah sertifikat.
  • Gerakan terasa terbalik: periksa satu sumbu pada satu waktu, lalu sesuaikan pembalikan tanda di MapPhoneActionToRobotAction atau tukar sumbu agar sesuai dengan konfigurasi Anda.
  • Lengan hampir tidak bergerak atau melawan batasnya: mulai ulang dari pose awal rentang menengah (lihat di atas) — IK diselesaikan dari konfigurasi saat ini lengan.
Update on GitHub