[Bug] SO-101 can make discontinuous joint jumps during Grip motion and stationary re-clutch
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 35/100
Línea de trabajo
Comienza con el punto de entrada examples.isaac_teleop_to_so101.teleoperate y reproduce los dos escenarios de embrague utilizando los detalles del comando y de la plataforma proporcionados. Compara el comportamiento de Isaac Teleop con la corrección posterior f611bba y determina si un engage-frame hold o un joint-state rebase debe pertenecer al límite de integración; se considera terminado cuando el movimiento es continuo entre las articulaciones y no hay movimiento al volver a activar un controlador estacionario.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
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.
- Lenguaje dominante
- Python
- Estrellas
- 403
- Forks
- 94
- Merge medio
- 2 d 17 min
- PR fusionados (30 d)
- 121
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de NVIDIA/IsaacCapture
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
NVIDIA/IsaacCapture#910 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 88/100
NVIDIA/IsaacCapture#891 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 4/5 3-5 días Aptitud para principiantes 25/100
NVIDIA/IsaacCapture#1217 ·
Los mantenedores suelen responder en 1 día
-
Release Notes Draft: 1.5Abierto
Dificultad 3/5 1-2 días Aptitud para principiantes 20/100
NVIDIA/IsaacCapture#1214 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 50/100
NVIDIA/IsaacCapture#1181 ·
Los mantenedores suelen responder en 1 día
Todos los issues de NVIDIA/IsaacCapture
Issues similares
-
Use mhctools predictor_required=False for saved-result rescoringPosiblemente ocupada @iskandr la tomó hoy. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 79/100
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 85/100
521xueweihan/HelloGitHub#4051 · 1 comentario ·
-
bug documentation
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
awslabs/visual-asset-management-system#514 ·
Los mantenedores suelen responder en 1 día
-
backend bug spec:REQ-053
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
nolte/kamerplanter#2547 ·
Los mantenedores suelen responder en 1 día