[Bug] SO-101 can make discontinuous joint jumps during Grip motion and stationary re-clutch
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 35/100
Hướng nghiên cứu
Bắt đầu với entry point examples.isaac_teleop_to_so101.teleoperate và tái hiện hai kịch bản ly hợp bằng các thông tin chi tiết về lệnh và nền tảng đã cung cấp. So sánh hành vi của Isaac Teleop với bản sửa lỗi downstream f611bba và xác định liệu engage-frame hold hoặc joint-state rebase có thuộc ranh giới tích hợp hay không; hoàn thành có nghĩa là chuyển động giữa các khớp liên tục và không có chuyển động khi kích hoạt lại một controller đang đứng yên.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Describe the bug
When teleoperating an SO-101 with a Meta Quest 3S Touch Plus controller through CloudXR and Isaac Teleop, I observed sudden discontinuous robot motion in two situations:
- A joint jump while continuously holding Grip/Squeeze and moving the controller.
- A downward jump after moving the robot to a pose, releasing Grip, keeping the controller stationary, and pressing Grip again to re-engage the clutch.
The Quest controller pose and button input otherwise reached the Ubuntu host correctly. Grip/Squeeze acted as the clutch and Trigger controlled the gripper.
This was reproduced through the LeRobot SO-101 integration. I am filing it here because I would like guidance on the intended Isaac Teleop clutch/re-engagement behavior for underactuated arms and whether joint-continuity handling should be exposed or documented at the Isaac Teleop integration boundary.
To reproduce
- Start CloudXR Runtime 6.2.0 on Ubuntu and connect a Quest 3S through the official CloudXR web client.
- Connect an SO-101 follower and run the LeRobot Isaac Teleop example:
python -m examples.isaac_teleop_to_so101.teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/serial/by-id/<SO101_SERIAL_DEVICE> \
--robot.id=so101_follower_main \
--teleop.type=xr_controller \
--reset_to_origin=false
-
Reproduction A:
- Hold Grip continuously.
- Move the right Quest controller through the workspace.
- Observe that the arm can suddenly switch to a discontinuous elbow/wrist configuration.
-
Reproduction B:
- Hold Grip and move the arm to a reachable pose.
- Release Grip and confirm that the arm holds.
- Keep the controller stationary.
- Press Grip again.
- Observe an immediate downward jump on re-engagement.
Expected behavior
- Motion should remain joint-continuous while Grip is held.
- Releasing Grip should hold the robot.
- Re-engaging Grip with a stationary controller should produce no robot movement on the engage frame.
- The following IK frames should continue from the measured/current joint configuration rather than switching to another local solution.
Observed behavior
In a quantified re-clutch run before the downstream fix, three physical Grip re-engagements produced first-frame maximum joint-target changes of:
- 6.422 degrees with 14.006 mm end-effector position change
- 3.116 degrees with 6.815 mm end-effector position change
- 3.186 degrees with 7.151 mm end-effector position change
The reported orientation change was 0 degrees in all three cases. The largest changes were mainly in elbow_flex, with wrist_flex also visibly involved in another event.
Videos
-
Video 1 - jump while Grip is continuously held and the controller is moving:
https://github.com/user-attachments/assets/f249e4d1-d16d-401f-91fb-02b7f3e34ddf
-
Video 2 - downward jump when re-engaging Grip while the controller is stationary:
https://github.com/user-attachments/assets/2e6d228d-d09b-4497-ae2c-a6e52b0d9927
Platforms
- Isaac Teleop Version: 1.3.131
- CloudXR Runtime: 6.2.0
- OS: Ubuntu 24.04 LTS, kernel 6.8.0-134-generic, x86_64
- GPU: NVIDIA GeForce RTX 4080, driver 595.71.05
- Integration: LeRobot v0.6.0,
examples/isaac_teleop_to_so101 - XR Device: Meta Quest 3S with Touch Plus controllers
- Robot: SO-101 follower, 5-DoF arm plus gripper
- Control target rate: 30 Hz
Investigation and downstream workaround
The investigation in the LeRobot integration found two relevant behaviors:
- A calibrated/measured joint value can be slightly outside the URDF nominal limit (for example,
shoulder_lift=-103 degreeswhile the URDF lower limit is approximately-100 degrees). A same-poseq -> FK(q) -> IK(FK(q))operation can therefore project the state into the solver's feasible joint space instead of returning the measured joint configuration. - On this 5-DoF arm, the same-pose projection may require multiple solves to settle, and a small first controller displacement near an underconstrained or near-singular pose can select a more distant local joint solution.
A downstream fix was implemented in commit f611bba, currently included in the independent draft LeRobot PR #4046.
The workaround keeps the measured arm joints exactly unchanged on the engage frame, pre-converges the same-pose IK state, adds native dq regularization, and rebases subsequent solver increments onto the measured joint configuration. The gripper remains an absolute 0-100 command.
After the fix, 47 physical re-engagements on the SO-101 produced a 0.000000-degree engage-frame joint jump, and the original elbow/wrist jump did not recur during small and larger XYZ motions.
Questions
- Is there an intended Isaac Teleop pattern for guaranteeing joint-space continuity at clutch re-engagement on underactuated arms?
- Should the clutch/integration API provide an engage-frame hold or joint-state rebase hook before Cartesian IK resumes?
- Would NVIDIA prefer this behavior to remain entirely integration-specific, or should the Isaac Teleop documentation/example cover it?
Additional context
No hand tracking was used. The test used only the Quest 3S right Touch Plus controller. No cameras, data recording, or leader arm were involved.
- Ngôn ngữ chính
- Python
- Star
- 412
- Fork
- 97
- Merge trung bình
- 2 ngày 3 giờ
- Pull request đã merge (30 ngày)
- 141
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của NVIDIA/IsaacCapture
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 68/100
NVIDIA/IsaacCapture#910 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
NVIDIA/IsaacCapture#891 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 35/100
NVIDIA/IsaacCapture#1319 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Add OneRobotics A1 asset and Isaac Teleop exampleCó thể đã có người làm @WangXuechun-woan đã nhận 5 ngày trước. Đang mở
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 35/100
NVIDIA/IsaacCapture#1291 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 25/100
NVIDIA/IsaacCapture#1217 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của NVIDIA/IsaacCapture
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
google-agentic-commerce/AP2#388 ·
-
area:codegen backend:cuda backend:hip bug direction:input
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
CrossGL/crosstl#3061 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
rlaope/oh-my-hermes#2304 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 85/100
mochan-tk/agentic-dev-kit-for-codex#64 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Windows ARM memory-leakĐang mởbug docs performance
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
Maintainer thường phản hồi trong vòng 3 ngày