LeRobot documentation
Isaac Teleop
Isaac Teleop
Điều khiển robot của bạn bằng NVIDIA Isaac Teleop, một
khung teleoperation đa phương thức. Isaac Teleop điều khiển một phiên TeleopSession duy nhất từ nhiều loại thiết bị
đầu vào khác nhau — bộ điều khiển XR (VR), theo dõi bàn tay, theo dõi toàn thân, găng tay Manus, bàn đạp
chân, và nhiều hơn nữa.
Trong LeRobot, Isaac Teleop được đóng gói dưới dạng một ví dụ tự chứa trong examples/isaac_teleop_to_so101/.
Mỗi thiết bị đầu vào của Isaac Teleop là một lớp con Teleoperator riêng trong gói isaac_teleop của ví dụ, chia sẻ chung một vòng đời phiên (xem IsaacTeleopTeleoperator). Các
thiết bị có sẵn hiện tại là XR controller (XRController) và cánh tay dẫn SO-101 leader arm có thể kéo ngược (SO101LeaderArm); găng tay Manus và theo dõi tay/toàn thân là các
thiết bị tiếp theo một cách tự nhiên. Hướng dẫn này tập trung vào XR controller; phần tóm tắt về SO-101 leader nằm dưới Chạy ví dụ.
Trong hướng dẫn này, bạn sẽ học được:
- Cách thiết bị Isaac Teleop điều khiển mục tiêu đầu cuối (EE) của robot
- Cách mà clutch (nút bóp/nắm trên bộ điều khiển XR) kích hoạt điều khiển từ xa mà không làm cánh tay giật
- Cách chạy ví dụ điều khiển từ xa SO‑101 và tinh chỉnh chuyển động / kẹp / IK
Cài đặt
Ví dụ nằm trong kho LeRobot (không phải một phần của gói pip lerobot), vì vậy hãy clone kho và cài đặt từ mã nguồn. Tài liệu tham khảo về cài đặt và sử dụng chính thức, luôn được cập nhật là README.md của ví dụ; tóm lại:
git clone https://github.com/huggingface/lerobot.git
cd lerobot
uv pip install -e ".[feetech,kinematics,dataset]" "huggingface_hub>=1.5"
uv pip install "isaacteleop[cloudxr,retargeters-lite]~=1.3.131" "scipy>=1.14"isaacteleop được phát hành trên PyPI công khai (chỉ hỗ trợ Linux). Extra cloudxr cung cấp các ràng buộc runtime của CloudXR; retargeters-lite là đường dẫn retargeter dựa trên scipy, có thể giải quyết trên cả x86_64 và ARM (trên aarch64 — ví dụ DGX Spark — extra retargeters đầy đủ không thể giải quyết do các ràng buộc dex-retargeting/nlopt của nó, đây là lý do nó không phải là mặc định ở đây). Trên x86_64, bạn có thể cài đặt thêm toàn bộ stack retargeter:
uv pip install "isaacteleop[retargeters]~=1.3.131"Cài đặt CloudXR và kết nối thiết bị đeo
Isaac Teleop truyền trực tiếp dữ liệu từ headset đến máy của bạn qua NVIDIA CloudXR, thành phần cung cấp runtime OpenXR mà phiên làm việc sẽ kết nối tới. Mặc định, LeTeleop tự động khởi chạy runtime CloudXR cho bạn khi bạn gọi teleop_device.connect() — bạn không còn phải chạy python -m isaacteleop.cloudxr và source cloudxr.env trong một shell riêng. Tất cả những gì bạn cần là một headset tương thích đã được kết nối và các cổng firewall của CloudXR được mở. Hãy làm theo Quick Start của Isaac Teleop để biết chi tiết về ghép nối headset và cấu hình firewall.
Chạy lần đầu (EULA). Lần khởi động đầu tiên phải chấp nhận EULA của NVIDIA CloudXR. Việc tự động khởi động sẽ yêu cầu chấp nhận trên stdin, do đó trên máy không có giao diện người dùng, nó sẽ treo chờ nhập liệu. Hãy khởi tạo EULA một lần, tương tác, bằng cách:
python -m isaacteleop.cloudxr --accept-eula # one-time: accept the CloudXR EULASau đó, connect() khởi động runtime theo chế độ không tương tác. Quá trình khởi động chặn trong khoảng 30 giây trong khi runtime được khởi động.
Cấu hình. Hai trường trong IsaacTeleopConfig (được chia sẻ bởi mọi thiết bị) kiểm soát điều này:
auto_launch_cloudxr(mặc địnhTrue) — xác định xemconnect()có khởi động runtime hay không. ĐặtFalsekhi CloudXR đã đang chạy từ bên ngoài.cloudxr_env_file(mặc địnhNone) — một tệp.envtùy chọn chứa hồ sơ thiết bị CloudXR để chọn phương thức truyền tải cho kính thực tế ảo (ví dụ: hồ sơ Apple Vision Pro). Đây là đầu vào của trình khởi chạy; nó không phải là tệp đầu ra~/.cloudxr/run/cloudxr.envmà quy trình thủ công cũ yêu cầu bạnsource.Nonegiữ nguyên hồ sơ auto-WebRTC mặc định — mặc dù ví dụ SO-101 ghi đè nó thànhdefault.envđược cung cấp cùng vớiteleoperate.py, trừ khi bạn truyền--teleop.cloudxr_env_file.
Từ chối. Để bỏ qua việc tự động khởi chạy (CloudXR đã đang chạy), hãy đặt auto_launch_cloudxr=False hoặc xuất:
export LEROBOT_CLOUDXR_SKIP_AUTOLAUNCH=1Biến môi trường có ưu tiên cao hơn trường cấu hình: nếu LEROBOT_CLOUDXR_SKIP_AUTOLAUNCH=1 được
đặt, quá trình tự động khởi động sẽ bị bỏ qua ngay cả khi auto_launch_cloudxr=True. Biến này độc lập với ISAACLAB_CXR_SKIP_AUTOLAUNCH của Isaac Lab — việc đặt một biến không ảnh hưởng đến
biến kia.
Mỗi tiến trình chỉ có một teleoperator. Runtime CloudXR cấu hình môi trường cho toàn bộ tiến trình (một singleton), vì vậy hãy chạy một teleoperator Isaac Teleop duy nhất cho mỗi tiến trình.
Đang tắt. Luôn gọi teleop_device.disconnect() khi thoát — kể cả khi nhấn Ctrl-C. Bọc vòng lặp teleoperation của bạn trong try/finally và gọi disconnect() trong khối finally. Thao tác này sẽ hủy phiên OpenXR trước khi hủy runtime CloudXR, đây là thứ tự bắt buộc; hook atexit của launcher chỉ thu dọn runtime và không chạy __exit__ của phiên, nên nếu không có lệnh disconnect() tường minh, một lần chạy bị gián đoạn sẽ tắt theo thứ tự sai.
teleop_device.connect()
try:
while True:
action = teleop_device.get_action()
# ... drive the robot ...
finally:
teleop_device.disconnect()Xem Yêu cầu hệ thống để biết các phiên bản OS / GPU / CloudXR và thiết bị đeo được hỗ trợ.
Cách hoạt động
The XR controller is one Isaac Teleop input device. XRController is a deliberately thin
reader: it exposes the raw controller grip pose — already statically rebased into the robot
base frame — plus the squeeze and trigger analog values. It has no retargeters and no clutch logic of its own. The clutch (engage latch + delta rebasing onto the EE) and the gripper
mapping live downstream in the example loop, which then feeds LeRobot’s existing closed‑loop
Cartesian IK pipeline — the same one the phone teleoperator uses. The device‑specific pieces are XRController, the loop’s Clutch, and MapXRControllerActionToRobotAction; everything downstream
(EEBoundsAndSafety, InverseKinematicsEEToJoints) is shared, and a future device (e.g. Manus
gloves) would swap in its own teleop_<device>.py + processor while reusing the rest.
XRController._build_pipeline kết nối ControllersSource của Isaac Teleop — được rebase tĩnh vào hệ tọa độ gốc của robot bởi ControllerTransform bản địa (base_T_anchor) — và phơi bày luồng điều khiển đã biến đổi nguyên văn. get_action() đọc tư thế nắm, lực bóp và cò trực tiếp từ luồng đó; phiên luôn được bước ở trạng thái RUNNING (không có bộ retargeter clutch nào để kiểm soát).
Lớp Clutch (trong examples/isaac_teleop_to_so101/isaac_teleop/clutch.py, được điều khiển bởi vòng lặp trong common.py) mô phỏng SO101ClutchRetargeter của Isaac Teleop, nhưng nằm trong vòng lặp để thiết bị có thể chỉ đóng vai trò là một bộ đọc mỏng:
- Nó khóa điểm gốc engage tại cạnh engage của squeeze (khung hình mà squeeze lần đầu vượt qua
clutch_threshold) và đặt lại gốc cho cả vị trí lẫn hướng xoay quanh điểm đó, nhờ vậy việc engage không làm cánh tay bị dịch chuyển tức thời.Clutch.rebasetrả về mục tiêu tuyệt đối trong hệ tọa độ gốc dưới dạng cặp(pos, quat), sau đó vòng lặp ghép chúng thànhee_pose7 chiều để đưa vào bộ xử lý. - Cò tương tự trở thành độ
closednesscủa kẹp trong[0, 1](0 = mở, 1 = đóng), tỷ lệ thuận với mức kéo cò, vàMapXRControllerActionToRobotActionánh xạ giá trị này thành mục tiêu hàm.
Xem Giao diện Retargeting và tổng quan kiến trúc của Isaac Teleop để biết cách các nút nguồn và bộ retargeter được kết hợp.
VR controller (OpenXR)
│
▼
XRController.get_action() ── raw base-frame grip_pos / grip_quat + squeeze + trigger
│ (TeleopSession always stepped RUNNING; clutch lives downstream)
▼
Clutch.rebase(grip_pos, grip_quat) ── engage-relative delta applied to the EE home (pos + orient)
│ ee_pose (7) / closedness → absolute ee_pose; closedness = trigger
▼
MapXRControllerActionToRobotAction ── absolute ee.x/y/z; ee.w* = orientation rotvec target;
│ ee.x/y/z / ee.w* / ee.gripper_pos ee.gripper_pos = (1 - closedness) * 100
▼
EEBoundsAndSafety ── workspace clip + per-frame step clamp (clamp+warn)
│
▼
InverseKinematicsEEToJoints ── closed-loop Placo IK; position + soft-orientation
│ (orientation_weight=0.01) (passes ee.gripper_pos → gripper.pos)
▼
SO-101 follower joint targetsBộ ly hợp: do vòng lặp ví dụ sở hữu
Khác với pipeline điện thoại (nơi clutch được chia giữa MapPhoneActionToRobotAction và EEReferenceAndDelta), clutch XR nằm hoàn toàn trong lớp Clutch của vòng lặp ví dụ. Nó phát ra một tư thế EE tuyệt đối, do đó không có giai đoạn EEReferenceAndDelta và không có tích lũy delta trong bộ xử lý — MapXRControllerActionToRobotAction là một ánh xạ thuần túy, không trạng thái cho từng khung hình.
Bộ ly hợp khóa điểm gốc tham gia tại cạnh tham gia của thao tác bóp (khoảnh khắc thao tác bóp vượt qua clutch_threshold) và điều khiển EE từ chuyển động tương đối so với điểm gốc đó, để cánh tay không bị dịch chuyển tức thời khi tham gia. Ở mọi lần tham gia — cả khi khởi động lẫn khi tham gia lại giữa nhiệm vụ — vị trí gốc được khóa từ động học thuận trên khớp đo được của cánh tay, nên vị trí gốc trùng khớp với nơi cánh tay đang thực sự ở ngay cả khi nó đã di chuyển trong lúc ngắt kết nối, và quá trình tham gia không có bước nhảy. Định hướng gốc giữ nguyên phép quay được lệnh cuối cùng: cánh tay 5-DOF chỉ theo dõi định hướng một cách mềm, nên việc khóa định hướng cổ tay đo được sẽ đưa sai số theo dõi của nó vào lệnh ở mỗi lần tham gia lại.
Điều khiển
- Ép / nắm — phan ly hợp (deadman). Giữ nó vượt quá
clutch_thresholdđể kích hoạt điều khiển từ xa; thả ra để tạm dừng. Mỗi lần kích hoạt sẽ ghi nhận lại điểm gốc, nên bạn có thể di chuyển tay trong khi tạm dừng và kích hoạt lại mà cánh tay không bị giật (kiểu index/clutch). - Trigger — gripper, điều khiển analog. Hàm theo dõi trigger một cách tỷ lệ — trigger nhấn một nửa để hàm đóng một nửa — thông qua độ đóng trong
[0, 1](0 = mở, 1 = đóng) được ánh xạ sang mục tiêu khớp gripper tuyệt đối. - Định hướng tay cầm — cổ tay. Clutch đặt lại định hướng tay cầm
(tương đối so với engage, hệ quy chiếu gốc) thành một mục tiêu định hướng IK mềm để cổ tay bám theo cùng với
vị trí. Trên 5‑DOF SO‑101, cổ tay chỉ bám theo tay một phần theo thiết kế — xem
orientation_weightbên dưới.
Bắt đầu
Bước 1: Tạo teleoperator
# Run from the repo root so the `examples` package is importable.
from examples.isaac_teleop_to_so101.isaac_teleop import XRController, XRControllerConfig
teleop_config = XRControllerConfig(
hand_side="right", # "left" or "right" controller
clutch_threshold=0.5, # squeeze value above which the clutch engages
)
teleop_device = XRController(teleop_config)XRController.get_action() trả về tư thế điều khiển gốc của khung cơ sở, không phải mục tiêu đã được đặt lại bằng clutch: grip_pos (3,) [x, y, z] [m] và grip_quat (4,) [qx, qy, qz, qw] trong khung cơ sở của robot, cùng các giá trị tương tự vô hướng squeeze và trigger trong [0, 1]. Vòng lặp trong ví dụ sử dụng Clutch để chuyển đổi các giá trị này thành ee_pose tuyệt đối, và giá trị squeeze được vòng lặp so sánh với clutch_threshold để kích hoạt.
Bước 2: Kết nối
Việc gọi teleop_device.connect() trước tiên sẽ tự động khởi động runtime CloudXR (trừ khi bạn đã từ chối —
xem Cài đặt CloudXR và kết nối headset; bước này sẽ chặn trong
khoảng 30 giây và ở lần chạy đầu tiên sẽ yêu cầu chấp nhận EULA trên stdin), sau đó khởi động TeleopSession của Isaac Teleop (mở phiên OpenXR và phát hiện các bộ điều khiển). Các bộ điều khiển XR tự hiệu chuẩn, vì vậy
không có bước hiệu chuẩn thủ công — clutch sẽ xử lý việc căn lại tâm mỗi khi bạn kích hoạt. Kết hợp connect() với try/finally gọi disconnect() để phiên được tháo dỡ trước khi
runtime thoát/Ctrl-C.
Bước 3: Chạy ví dụ
Ví dụ này giả định rằng bạn đã cấu hình robot (SO‑101 follower) và thiết lập đúng cổng serial.
URDF của robot và các mesh của nó được tải về tự động ở lần chạy đầu tiên: thiết bị XR sẽ tải URDF của SO-101 từ bucket Hugging Face lerobot/robot-urdfs vào bộ nhớ đệm LeRobot (HF_LEROBOT_HOME/robot-urdfs/so101/) và tái sử dụng sau đó, nên không có bước tải riêng biệt:
python -m examples.isaac_teleop_to_so101.teleoperate --robot.type=so101_follower --robot.port=/dev/ttyACM0 \
--robot.id=so101_follower_arm --teleop.type=xr_controllerCLI có phong cách lerobot-teleoperate (draccus): --robot.* cấu hình follower SO-101 và --teleop.type chọn thiết bị đầu vào Isaac (xr_controller | so101_leader), với --teleop.* là các thông số thiết bị. --teleop.type=xr_controller chạy luồng điều khiển bằng tay cầm XR được mô tả ở trên. Hợp đồng an toàn khi khởi động: mặc định, hệ thống sẽ di chuyển tất cả các khớp đến tư thế đặt lại mặc định trong --reset_duration giây (--reset_to_origin=false giữ cánh tay ở vị trí hiện tại), sau đó đặt vị trí gốc của clutch từ tư thế đo được của cánh tay để lần gắn kết đầu tiên không bị giật; follower chỉ được ra lệnh khi clutch đang ở trạng thái gắn kết.
Tùy chỉnh tư thế reset. Tư thế reset được cung cấp như mặc định tích hợp (một tư thế trung bình thoải mái) và hoạt động ngay lập tức — bạn không cần ghi lại bất cứ thứ gì. Để điều chỉnh cho phù hợp với thiết lập của bạn,
điều khiển tay cơ về tư thế mong muốn và chạy python -m examples.isaac_teleop_to_so101.override_reset_pose --id <robot.id>; lệnh này sẽ ghi các khớp
hiện tại vào một tệp riêng cho từng cánh tay trong bộ nhớ đệm LeRobot
(HF_LEROBOT_HOME/reset_poses/<robot.name>/<robot.id>.json, được đánh khóa giống như hiệu chuẩn), sau đó sẽ có
ưu tiên cao hơn mặc định tích hợp trong lần chạy tiếp theo. Vì tệp này nằm trong bộ nhớ đệm cục bộ của người dùng (không
phải trong kho), bản ghi đè của bạn sẽ được giữ trên máy của bạn, và cả teleoperate lẫn record đều tuân thủ nó
khi được khởi chạy với cùng --robot.id.
Thiết bị còn lại, --teleop.type=so101_leader, sao chép 1:1 thiết bị theo dõi từ cánh tay leader SO-101 có thể back-drive, trong đó các khớp được stream bởi plugin so101_leader native của Isaac Teleop (không có clutch, không có IK — leader và follower dùng chung động học SO-101).
Binary so101_leader_plugin là một plugin C++ không nằm trong gói pip isaacteleop — bạn cần biên dịch nó từ cây mã nguồn Isaac Teleop. Hãy làm theo Build Isaac Teleop from source (tóm lại, từ thư mục checkout Isaac Teleop của bạn: cmake -B build && cmake --build build --parallel && cmake --install build); quá trình biên dịch sẽ cài đặt các plugin vào <IsaacTeleop>/install/plugins/, do đó binary sẽ nằm tại install/plugins/so101_leader/so101_leader_plugin — đây là đường dẫn cho --launch_plugin ở bên dưới. Xem README.md riêng của plugin (nằm cạnh binary) để biết chi tiết về cổng serial và hiệu chuẩn.
Chỉ định --teleop.port đến cổng serial của thiết bị điều khiển vật lý và --launch_plugin đến binary của plugin đó để script khởi tạo plugin sau khi CloudXR đã sẵn sàng:
python -m examples.isaac_teleop_to_so101.teleoperate --robot.type=so101_follower --robot.port=/dev/ttyACM0 \
--robot.id=so101_follower_arm --teleop.type=so101_leader \
--teleop.port=/dev/ttyACM1 --teleop.id=so101_leader_arm \
--launch_plugin=/code/Teleop/install/plugins/so101_leader/so101_leader_plugin(Lưu ý rằng so101_leader ở đây là leader Isaac, được phân giải đối với registry thiết bị Isaac Teleop, khác với serial so101_leader của lerobot-teleoperate.) Khi --teleop.port được đặt, hiệu chuẩn tick→radian của plugin sẽ được suy ra từ --teleop.id và được truyền vào plugin như đối số vị trí thứ ba — tệp JSON định dạng LeRobot tại HF_LEROBOT_CALIBRATION/teleoperators/so_leader/<id>.json, cùng tệp mà leader SO-101 qua serial sử dụng (lerobot-calibrate --teleop.type=so101_leader --teleop.id=<id>). Nếu tệp này thiếu, script sẽ cảnh báo và plugin sẽ sử dụng các giá trị mặc định tích hợp. Chạy python -m examples.isaac_teleop_to_so101.teleoperate --help để xem tất cả các cờ. Hợp đồng an toàn khi khởi động của nó: mặc định, follower sẽ được slew đến lần đọc đầu tiên của leader trong --align_duration giây (--align=false để bỏ qua) để cánh tay không bị giật khi mirror bắt đầu, và trong khi luồng leader bị lỗi thời, follower sẽ được giữ ở tư thế đã đo.
Việc lấy URDF sử dụng huggingface_hub (đã là một dependency của LeRobot) đối với bucket công khai lerobot/robot-urdfs, nên không cần đăng nhập. Nó được cache dưới HF_LEROBOT_HOME/robot-urdfs/so101/; xóa thư mục đó để buộc tải lại.
Sau đó, trên thiết bị đeo của bạn: bóp và giữ cần nắm để kích hoạt, di chuyển tay cầm để điều khiển cánh tay, xoay/ghiêng nó để định hướng cổ tay, và nhấn cò để đóng kẹp (theo tỷ lệ — thả ra để mở).
Để ghi lại một tập dữ liệu (không chỉ điều khiển từ xa), hãy dùng record.py trong cùng thư mục. Nó phân phối theo --teleop.type (xr_controller | so101_leader) y hệt như teleoperate.py, nên bất kỳ thiết bị nào cũng có thể điều khiển follower, và nó lưu các khớp được lệnh vào một tập dữ liệu LeRobot (các cờ --dataset.* theo kiểu lerobot-record). Xem docstring của module để biết CLI đầy đủ và các phím tắt ghi bằng bàn phím.
Các bước và tùy chọn quan trọng của pipeline
Clutch đã tạo ra tư thế khung gốc tuyệt đối, do đó phía processor là một đường dẫn tư thế tuyệt đối mỏng — không có ánh xạ lại khung, không có tích lũy delta và không có giai đoạn EEReferenceAndDelta.
MapXRControllerActionToRobotActionlà ánh xạ không trạng thái theo từng khung hình từ đầu ra của thiết bị sang hợp đồng đầu vào IK. Nó ghi vị trí tuyệt đối trong hệ tọa độ gốc, mã hóa hướng tuyệt đối dưới dạng rotvec đích và đảo ngược độ đóng thành mục tiêu gắp động cơ:action["ee.x"], action["ee.y"], action["ee.z"] = ee_pose[:3] # absolute, base frame [m] action["ee.wx"], action["ee.wy"], action["ee.wz"] = orient_rotvec # orientation target (rotvec) action["ee.gripper_pos"] = (1 - closedness) * 100 # motor units; SO-101 calibrates 100 = openCực tính của kẹp (
100 = open, 0 = closed) là một quy ước hiệu chuẩn phần cứng trong mã nguồn gốc — hãy đảo ngược nó ở đó nếu hàm mở ra khi đáng lẽ phải đóng.EEBoundsAndSafetykẹp EE trong một vùng làm việc và giới hạn tốc độ nhảy theo từng khung hình. Cơ chế chống dịch chuyển tức thời của clutch giữ cho các khung hình nhỏ, do đómax_ee_step_mchủ yếu bắt các lỗi theo dõi tạm thời của bộ điều khiển. Sàn z là0.0(mặt phẳng bàn) để một mục tiêu lạc không thể đẩy EE xuống dưới bàn; x/y vẫn giữ trong hộp[-1, 1]m lỏng lẻo. Đặtraise_on_jump=Falseđể một khung hình vượt giới hạn sẽ bị kẹp và cảnh báo thay vì gây lỗi — một sự cố giữa vòng lặp sẽ khiến cánh tay mất kiểm soát:EEBoundsAndSafety( end_effector_bounds={"min": [-1.0, -1.0, 0.0], "max": [1.0, 1.0, 1.0]}, max_ee_step_m=0.10, raise_on_jump=False, )InverseKinematicsEEToJoints(initial_guess_current_joints=False, orientation_weight=0.01)giải bài toán IK Placo dạng vòng kín. SO‑101 là cánh tay 5‑DOF nên IK thiên về vị trí; giá trịorientation_weightnhỏ cho phép nó bám mềm vào mục tiêu hướng đi kèm trongee.w*để cổ tay theo dõi bàn tay, trong khi roll chưa xác định đầy đủ vẫn chỉ được giải một phần theo thiết kế. Không có lớpGripperVelocityToJoint: giá trị tuyệt đốiee.gripper_posđược truyền thẳng tớigripper.pos.initial_guess_current_joints=Falsekhởi tạo ấm mỗi lần giải từ giải pháp IK trước đó thay vì gieo lại từ các khớp đo được, nhờ đó quỹ đạo khớp liên tục giữa các khung hình. Hãy chỉnhorientation_weighttrên phần cứng — quá cao sẽ gây xung đột với việc bám vị trí, quá thấp sẽ bỏ qua lệnh hướng.
Ví dụ cũng kiểm soát an toàn ở cấp độ vòng lặp: sau khi hoàn tất quá trình đưa về vị trí gốc khi khởi động (bật mặc định —
truyền --reset_to_origin=false để giữ cánh tay ở vị trí hiện tại), nó chỉ ra lệnh cho robot khi clutch đang được khóa, và gửi lại các khớp đã đo khi clutch đang mở, nhờ đó việc nhả clutch sẽ giữ cánh tay đứng yên tại chỗ.
Xem hướng dẫn Processors for Robots and Teleoperators để biết thêm về việc điều chỉnh pipeline cho các robot khác.
Xử lý sự cố
ModuleNotFoundError: isaacteleop— góiisaacteleopchưa được cài đặt trong môi trường đang hoạt động. Chạy lại lệnh cài đặt ở đầu hướng dẫn này:uv pip install "isaacteleop[cloudxr,retargeters-lite]~=1.3.131".- Không tìm thấy bộ điều khiển nào — hãy đảm bảo rằng runtime CloudXR đang chạy, các cổng tường lửa đã được đưa vào danh sách trắng và thiết bị đeo đã được kết nối (xem Cài đặt CloudXR và kết nối thiết bị đeo và Quick Start của Isaac Teleop).
- CloudXR auto-launch thất bại —
connect()sẽ ném raRuntimeErrornếu runtime không khởi động được trong thời gian chờ khởi động. Kiểm tra nhật ký của launcher tại~/.cloudxr/logs. Các nguyên nhân phổ biến: EULA chưa bao giờ được chấp nhận (chạypython -m isaacteleop.cloudxr --accept-eulamột lần, tương tác — auto-launch sẽ hỏi trên stdin và treo khi chạy headless), hoặc runtime đã đang chạy từ bên ngoài (đặtLEROBOT_CLOUDXR_SKIP_AUTOLAUNCH=1hoặcauto_launch_cloudxr=Falseđể bỏ qua auto-launch). - Cánh tay không di chuyển — bộ ly hợp là loại deadman: bạn phải giữ thao tác bóp/nắm vượt qua
clutch_threshold. Hãy giảm ngưỡng này nếu thao tác bóp của bộ điều khiển được báo cáo ở mức yếu. - Chuyển động có vẻ lệch — hãy kiểm tra hướng của thiết bị đeo/không gian chơi. Luồng điều khiển được căn lại vào hệ tọa độ gốc của robot bằng phép biến đổi
base_T_anchortrênXRControllerConfig(mặc định: chuẩn OpenXR → quy ước trục robot); hãy điều chỉnh nếu hệ tọa độ neo của bạn khác.
Tìm hiểu thêm
Tài liệu NVIDIA Isaac Teleop (trang chủ tài liệu, GitHub):
- Bắt đầu nhanh — cài đặt, chạy máy chủ CloudXR, kết nối kính thực tế ảo, chạy ví dụ điều khiển từ xa.
- TeleopSession —
API phiên mà
XRControllerbao bọc. - Giao diện retargeting và tổng quan kiến trúc — cách các nút nguồn và retargeter kết hợp thành một pipeline.
- Build từ mã nguồn —
build
isaacteleop(và các plugin C++ của nó, bao gồm pluginso101_leaderđược dùng ở trên) từ một bản checkout cục bộ. - Yêu cầu hệ thống và tài liệu SDK CloudXR — các nền tảng, GPU, phiên bản runtime CloudXR/OpenXR và kính thực tế ảo được hỗ trợ.