LeRobot documentation
Telepon
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:
- Perpustakaan WebXR Android:
teleopdi PyPI - Aplikasi iOS: HEBI Mobile I/O
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
B1untuk 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
Movedi halaman WebXR.
- iOS: Tahan
- Kontrol gripper (berfungsi terlepas dari apakah tombol enable ditekan atau tidak):
- iOS: Slider analog
A3mengontrol gripper sebagai input kecepatan — dorong ke atas untuk membuka, tarik ke bawah untuk menutup, dan lepaskan di tengah untuk menahan. - Android: Tombol
AdanBberfungsi seperti increment/decrement (A membuka, B menutup). Anda dapat menyesuaikan kecepatan pada langkahGripperVelocityToJoint.
- iOS: Slider analog
- 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.pymemindahkan 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 olehset_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.
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
B1untuk menangkap pose referensi. - Android: tekan tombol
Movedi 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
SO101dari repo SO-ARM100 keexamples/phone_to_so100/, sehingga file berada diexamples/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/SO101Arahkan skrip ke file lain dengan
--urdfjika 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--idmemilih kalibrasi tersimpan mana yang akan digunakan, dan--urdfmenunjuk 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.pyJalankan contoh ini untuk memutar ulang episode yang direkam:
cd examples/phone_to_so100 python replay.pyJalankan 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_nameke 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
MapPhoneActionToRobotActionmengubah 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 disabledLangkah
EEReferenceAndDeltamengonversi delta target menjadi pose EE absolut yang diinginkan, menyimpan referensi saat diaktifkan, danend_effector_step_sizesadalah 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
EEBoundsAndSafetymembatasi gerakan EE ke dalam ruang kerja dan memeriksa lompatan langkah EE yang besar untuk memastikan keselamatan.end_effector_boundsadalah batas untuk pose EE dan dapat dimodifikasi untuk mengubah ruang kerja.max_ee_step_madalah 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
GripperVelocityToJointmengubah input gripper yang menyerupai kecepatan menjadi posisi gripper absolut menggunakan keadaan terukur saat ini.speed_factoradalah 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=Truesehingga 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=Falsesehingga 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=Truedirekomendasikan untuk kontrol loop tertutup; aturFalseuntuk 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
httpsalih-alihhttp, 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
MapPhoneActionToRobotActionatau 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.