Conversation
Agent-Logs-Url: https://github.com/Ac31415/aic/sessions/e11a0a2a-a823-4962-a756-2269c309a984 Co-authored-by: Ac31415 <21079375+Ac31415@users.noreply.github.com>
Copilot created this pull request from a session on behalf of
Ac31415
April 20, 2026 17:37
View session
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
During
lerobot-record, the VR teleop's 30 Hz background timer kept publishing absolute pose targets to the AIC controller throughout the reset phase (scene reload / robot repositioning), causing the robot to fight the sim reset. Additionally, the VR reference frame was never reset between episodes, so each new episode started from the previous episode's end pose rather than the loaded scene's initial TCP pose.Changes
AICVRTeleop(aic_teleop.py)get_action()— appends"_vr_active": _vr_enabled or _analogue_enabledto the returned dict.Falsewhen in IDLE/paused mode. Not inVRMotionUpdateActionDict, so ignored bybuild_dataset_frame.pause()— disables VR/analogue modes and sets_paused=True, causing_update()to return early. Call before the resetrecord_loop.start_episode()— resets all reference state, enters VR TRACKING mode (_vr_enabled=True), and blocks up to 1 s until_capture_reference()completes. Guarantees the first recorded frame reflects the scene's initial TCP pose._update()— early-returns when_paused; signals_init_eventafter the first successful_capture_reference().AICRobotAICController(aic_robot_aic_controller.py)send_action_vr_cartesian()— checksaction.get("_vr_active", True)and no-ops whenFalse, suppressing all pose and gripper publishes during IDLE/reset.New:
lerobot_record_aic_vr.py→lerobot-record-vrentrypointMirrors
lerobot-recordwith VR lifecycle hooks injected around the reset phase:Falls back gracefully when the teleop is not
AICVRTeleop(no-ops), so it can replacelerobot-recordfor all teleop types.Supporting changes
setup.py— registerslerobot-record-vrconsole script.__init__.py— exportsAICVRTeleop/AICVRTeleopConfig.README.md— documentslerobot-record-vrand when to prefer it overlerobot-record.