diff --git a/README.md b/README.md index 4483940d..20ebeee8 100644 --- a/README.md +++ b/README.md @@ -98,14 +98,14 @@ conda create -y -n lerobot python=3.10 conda activate lerobot ``` -When using `miniconda`, if you don't have `ffmpeg` in your environment: +When using `miniconda`, install `ffmpeg` in your environment: ```bash -conda install ffmpeg +conda install ffmpeg -c conda-forge ``` Install 🤗 LeRobot: ```bash -pip install --no-binary=av -e . +pip install -e . ``` > **NOTE:** If you encounter build errors, you may need to install additional dependencies (`cmake`, `build-essential`, and `ffmpeg libs`). On Linux, run: @@ -118,7 +118,7 @@ For simulations, 🤗 LeRobot comes with gymnasium environments that can be inst For instance, to install 🤗 LeRobot with aloha and pusht, use: ```bash -pip install --no-binary=av -e ".[aloha, pusht]" +pip install -e ".[aloha, pusht]" ``` To use [Weights and Biases](https://docs.wandb.ai/quickstart) for experiment tracking, log in with diff --git a/benchmarks/video/capture_camera_feed.py b/benchmarks/video/capture_camera_feed.py index 3b4c356a..ce248f20 100644 --- a/benchmarks/video/capture_camera_feed.py +++ b/benchmarks/video/capture_camera_feed.py @@ -17,12 +17,21 @@ import argparse import datetime as dt +import os +import time from pathlib import Path import cv2 +import rerun as rr + +# see https://rerun.io/docs/howto/visualization/limit-ram +RERUN_MEMORY_LIMIT = os.getenv("LEROBOT_RERUN_MEMORY_LIMIT", "5%") -def display_and_save_video_stream(output_dir: Path, fps: int, width: int, height: int): +def display_and_save_video_stream(output_dir: Path, fps: int, width: int, height: int, duration: int): + rr.init("lerobot_capture_camera_feed") + rr.spawn(memory_limit=RERUN_MEMORY_LIMIT) + now = dt.datetime.now() capture_dir = output_dir / f"{now:%Y-%m-%d}" / f"{now:%H-%M-%S}" if not capture_dir.exists(): @@ -39,24 +48,21 @@ def display_and_save_video_stream(output_dir: Path, fps: int, width: int, height cap.set(cv2.CAP_PROP_FRAME_HEIGHT, height) frame_index = 0 - while True: + start_time = time.time() + while time.time() - start_time < duration: ret, frame = cap.read() if not ret: print("Error: Could not read frame.") break - - cv2.imshow("Video Stream", frame) + rr.log("video/stream", rr.Image(frame.numpy()), static=True) cv2.imwrite(str(capture_dir / f"frame_{frame_index:06d}.png"), frame) frame_index += 1 - # Break the loop on 'q' key press - if cv2.waitKey(1) & 0xFF == ord("q"): - break - - # Release the capture and destroy all windows + # Release the capture cap.release() - cv2.destroyAllWindows() + + # TODO(Steven): Add a graceful shutdown via a close() method for the Viewer context, though not currently supported in the Rerun API. if __name__ == "__main__": @@ -86,5 +92,11 @@ if __name__ == "__main__": default=720, help="Height of the captured images.", ) + parser.add_argument( + "--duration", + type=int, + default=20, + help="Duration in seconds for which the video stream should be captured.", + ) args = parser.parse_args() display_and_save_video_stream(**vars(args)) diff --git a/examples/10_use_so100.md b/examples/10_use_so100.md index 8fb6d3b5..9dbe974c 100644 --- a/examples/10_use_so100.md +++ b/examples/10_use_so100.md @@ -57,9 +57,15 @@ conda activate lerobot git clone https://github.com/huggingface/lerobot.git ~/lerobot ``` -#### 5. Install LeRobot with dependencies for the feetech motors: +#### 5. Install ffmpeg in your environment: +When using `miniconda`, install `ffmpeg` in your environment: ```bash -cd ~/lerobot && pip install --no-binary=av -e ".[feetech]" +conda install ffmpeg -c conda-forge +``` + +#### 6. Install LeRobot with dependencies for the feetech motors: +```bash +cd ~/lerobot && pip install -e ".[feetech]" ``` Great :hugs:! You are now done installing LeRobot and we can begin assembling the SO100 arms :robot:. @@ -491,6 +497,9 @@ python lerobot/scripts/control_robot.py \ #### a. Teleop with displaying cameras Follow [this guide to setup your cameras](https://github.com/huggingface/lerobot/blob/main/examples/7_get_started_with_real_robot.md#c-add-your-cameras-with-opencvcamera). Then you will be able to display the cameras on your computer while you are teleoperating by running the following code. This is useful to prepare your setup before recording your first dataset. + +> **NOTE:** To visualize the data, enable `--control.display_data=true`. This streams the data using `rerun`. + ```bash python lerobot/scripts/control_robot.py \ --robot.type=so100 \ diff --git a/examples/11_use_lekiwi.md b/examples/11_use_lekiwi.md index 215419e1..1be7cbc4 100644 --- a/examples/11_use_lekiwi.md +++ b/examples/11_use_lekiwi.md @@ -67,9 +67,15 @@ conda activate lerobot git clone https://github.com/huggingface/lerobot.git ~/lerobot ``` -#### 5. Install LeRobot with dependencies for the feetech motors: +#### 5. Install ffmpeg in your environment: +When using `miniconda`, install `ffmpeg` in your environment: ```bash -cd ~/lerobot && pip install --no-binary=av -e ".[feetech]" +conda install ffmpeg -c conda-forge +``` + +#### 6. Install LeRobot with dependencies for the feetech motors: +```bash +cd ~/lerobot && pip install -e ".[feetech]" ``` ## C. Install LeRobot on laptop @@ -108,9 +114,15 @@ conda activate lerobot git clone https://github.com/huggingface/lerobot.git ~/lerobot ``` -#### 5. Install LeRobot with dependencies for the feetech motors: +#### 5. Install ffmpeg in your environment: +When using `miniconda`, install `ffmpeg` in your environment: ```bash -cd ~/lerobot && pip install --no-binary=av -e ".[feetech]" +conda install ffmpeg -c conda-forge +``` + +#### 6. Install LeRobot with dependencies for the feetech motors: +```bash +cd ~/lerobot && pip install -e ".[feetech]" ``` Great :hugs:! You are now done installing LeRobot and we can begin assembling the SO100 arms and Mobile base :robot:. @@ -412,6 +424,8 @@ python lerobot/scripts/control_robot.py \ --control.fps=30 ``` +> **NOTE:** To visualize the data, enable `--control.display_data=true`. This streams the data using `rerun`. For the `--control.type=remote_robot` you will also need to set `--control.viewer_ip` and `--control.viewer_port` + You should see on your laptop something like this: ```[INFO] Connected to remote robot at tcp://172.17.133.91:5555 and video stream at tcp://172.17.133.91:5556.``` Now you can move the leader arm and use the keyboard (w,a,s,d) to drive forward, left, backwards, right. And use (z,x) to turn left or turn right. You can use (r,f) to increase and decrease the speed of the mobile robot. There are three speed modes, see the table below: | Speed Mode | Linear Speed (m/s) | Rotation Speed (deg/s) | | ---------- | ------------------ | ---------------------- | diff --git a/examples/11_use_moss.md b/examples/11_use_moss.md index 7b1be232..1b6f23b9 100644 --- a/examples/11_use_moss.md +++ b/examples/11_use_moss.md @@ -31,9 +31,15 @@ conda create -y -n lerobot python=3.10 && conda activate lerobot git clone https://github.com/huggingface/lerobot.git ~/lerobot ``` -5. Install LeRobot with dependencies for the feetech motors: +5. Install ffmpeg in your environment: +When using `miniconda`, install `ffmpeg` in your environment: ```bash -cd ~/lerobot && pip install --no-binary=av -e ".[feetech]" +conda install ffmpeg -c conda-forge +``` + +6. Install LeRobot with dependencies for the feetech motors: +```bash +cd ~/lerobot && pip install -e ".[feetech]" ``` ## Configure the motors @@ -212,6 +218,9 @@ python lerobot/scripts/control_robot.py \ **Teleop with displaying cameras** Follow [this guide to setup your cameras](https://github.com/huggingface/lerobot/blob/main/examples/7_get_started_with_real_robot.md#c-add-your-cameras-with-opencvcamera). Then you will be able to display the cameras on your computer while you are teleoperating by running the following code. This is useful to prepare your setup before recording your first dataset. + +> **NOTE:** To visualize the data, enable `--control.display_data=true`. This streams the data using `rerun`. + ```bash python lerobot/scripts/control_robot.py \ --robot.type=moss \ diff --git a/examples/2_evaluate_pretrained_policy.py b/examples/2_evaluate_pretrained_policy.py index 24b5ea2c..edbbad38 100644 --- a/examples/2_evaluate_pretrained_policy.py +++ b/examples/2_evaluate_pretrained_policy.py @@ -18,7 +18,7 @@ training outputs directory. In the latter case, you might want to run examples/3 It requires the installation of the 'gym_pusht' simulation environment. Install it by running: ```bash -pip install --no-binary=av -e ".[pusht]"` +pip install -e ".[pusht]"` ``` """ diff --git a/examples/7_get_started_with_real_robot.md b/examples/7_get_started_with_real_robot.md index 5b12e903..3562c0e6 100644 --- a/examples/7_get_started_with_real_robot.md +++ b/examples/7_get_started_with_real_robot.md @@ -33,7 +33,7 @@ First, install the additional dependencies required for robots built with dynami Using `pip`: ```bash -pip install --no-binary=av -e ".[dynamixel]" +pip install -e ".[dynamixel]" ``` Using `poetry`: @@ -55,6 +55,9 @@ Finally, connect both arms to your computer via USB. Note that the USB doesn't p Now you are ready to configure your motors for the first time, as detailed in the sections below. In the upcoming sections, you'll learn about our classes and functions by running some python code in an interactive session, or by copy-pasting it in a python file. If you have already configured your motors the first time, you can streamline the process by directly running the teleoperate script (which is detailed further in the tutorial): + +> **NOTE:** To visualize the data, enable `--control.display_data=true`. This streams the data using `rerun`. + ```bash python lerobot/scripts/control_robot.py \ --robot.type=koch \ @@ -828,10 +831,10 @@ It contains: Troubleshooting: - On Linux, if you encounter any issue during video encoding with `ffmpeg: unknown encoder libsvtav1`, you can: - - install with conda-forge by running `conda install -c conda-forge ffmpeg` (it should be compiled with `libsvtav1`), - - or, install [Homebrew](https://brew.sh) and run `brew install ffmpeg` (it should be compiled with `libsvtav1`), - - or, install [ffmpeg build dependencies](https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#GettheDependencies) and [compile ffmpeg from source with libsvtav1](https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#libsvtav1), - - and, make sure you use the corresponding ffmpeg binary to your install with `which ffmpeg`. + - install with conda-forge by running `conda install -c conda-forge ffmpeg` (it should be compiled with `libsvtav1`), +> **NOTE:** This usually installs `ffmpeg 7.X` for your platform (check the version installed with `ffmpeg -encoders | grep libsvtav1`). If it isn't `ffmpeg 7.X` or lacks `libsvtav1` support, you can explicitly install `ffmpeg 7.X` using: `conda install ffmpeg=7.1.1 -c conda-forge` + - or, install [ffmpeg build dependencies](https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#GettheDependencies) and [compile ffmpeg from source with libsvtav1](https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu#libsvtav1), + - and, make sure you use the corresponding ffmpeg binary to your install with `which ffmpeg`. - On Linux, if the left and right arrow keys and escape key don't have any effect during data recording, make sure you've set the `$DISPLAY` environment variable. See [pynput limitations](https://pynput.readthedocs.io/en/latest/limitations.html#linux). At the end of data recording, your dataset will be uploaded on your Hugging Face page (e.g. https://huggingface.co/datasets/cadene/koch_test) that you can obtain by running: diff --git a/examples/8_use_stretch.md b/examples/8_use_stretch.md index d02e7ef3..a7a7dde1 100644 --- a/examples/8_use_stretch.md +++ b/examples/8_use_stretch.md @@ -43,14 +43,19 @@ conda create -y -n lerobot python=3.10 && conda activate lerobot git clone https://github.com/huggingface/lerobot.git ~/lerobot ``` -6. Install LeRobot with stretch dependencies: +6. When using `miniconda`, install `ffmpeg` in your environment: ```bash -cd ~/lerobot && pip install --no-binary=av -e ".[stretch]" +conda install ffmpeg -c conda-forge +``` + +7. Install LeRobot with stretch dependencies: +```bash +cd ~/lerobot && pip install -e ".[stretch]" ``` > **Note:** If you get this message, you can ignore it: `ERROR: pip's dependency resolver does not currently take into account all the packages that are installed.` -7. Run a [system check](https://docs.hello-robot.com/0.3/getting_started/stretch_hardware_overview/#system-check) to make sure your robot is ready: +8. Run a [system check](https://docs.hello-robot.com/0.3/getting_started/stretch_hardware_overview/#system-check) to make sure your robot is ready: ```bash stretch_system_check.py ``` @@ -97,6 +102,8 @@ This is equivalent to running `stretch_robot_home.py` Before trying teleoperation, you need activate the gamepad controller by pressing the middle button. For more info, see Stretch's [doc](https://docs.hello-robot.com/0.3/getting_started/hello_robot/#gamepad-teleoperation). Now try out teleoperation (see above documentation to learn about the gamepad controls): + +> **NOTE:** To visualize the data, enable `--control.display_data=true`. This streams the data using `rerun`. ```bash python lerobot/scripts/control_robot.py \ --robot.type=stretch \ diff --git a/examples/9_use_aloha.md b/examples/9_use_aloha.md index 1f7aee3c..77cff161 100644 --- a/examples/9_use_aloha.md +++ b/examples/9_use_aloha.md @@ -30,9 +30,14 @@ conda create -y -n lerobot python=3.10 && conda activate lerobot git clone https://github.com/huggingface/lerobot.git ~/lerobot ``` -5. Install LeRobot with dependencies for the Aloha motors (dynamixel) and cameras (intelrealsense): +5. When using `miniconda`, install `ffmpeg` in your environment: ```bash -cd ~/lerobot && pip install --no-binary=av -e ".[dynamixel, intelrealsense]" +conda install ffmpeg -c conda-forge +``` + +6. Install LeRobot with dependencies for the Aloha motors (dynamixel) and cameras (intelrealsense): +```bash +cd ~/lerobot && pip install -e ".[dynamixel, intelrealsense]" ``` ## Teleoperate @@ -43,6 +48,9 @@ Teleoperation consists in manually operating the leader arms to move the followe 2. Our code assumes that your robot has been assembled following Trossen Robotics instructions. This allows us to skip calibration, as we use the pre-defined calibration files in `.cache/calibration/aloha_default`. If you replace a motor, make sure you follow the exact instructions from Trossen Robotics. By running the following code, you can start your first **SAFE** teleoperation: + +> **NOTE:** To visualize the data, enable `--control.display_data=true`. This streams the data using `rerun`. + ```bash python lerobot/scripts/control_robot.py \ --robot.type=aloha \ diff --git a/lerobot/common/policies/pi0/modeling_pi0.py b/lerobot/common/policies/pi0/modeling_pi0.py index 4462f162..7599fa63 100644 --- a/lerobot/common/policies/pi0/modeling_pi0.py +++ b/lerobot/common/policies/pi0/modeling_pi0.py @@ -24,7 +24,7 @@ Designed by Physical Intelligence. Ported from Jax by Hugging Face. Install pi0 extra dependencies: ```bash -pip install --no-binary=av -e ".[pi0]" +pip install -e ".[pi0]" ``` Example of finetuning the pi0 pretrained model (`pi0_base` in `openpi`): diff --git a/lerobot/common/robot_devices/control_configs.py b/lerobot/common/robot_devices/control_configs.py index 0ecd8683..cb558c71 100644 --- a/lerobot/common/robot_devices/control_configs.py +++ b/lerobot/common/robot_devices/control_configs.py @@ -41,7 +41,7 @@ class TeleoperateControlConfig(ControlConfig): fps: int | None = None teleop_time_s: float | None = None # Display all cameras on screen - display_cameras: bool = True + display_data: bool = False @ControlConfig.register_subclass("record") @@ -82,7 +82,7 @@ class RecordControlConfig(ControlConfig): # Not enough threads might cause low camera fps. num_image_writer_threads_per_camera: int = 4 # Display all cameras on screen - display_cameras: bool = True + display_data: bool = False # Use vocal synthesis to read events. play_sounds: bool = True # Resume recording on an existing dataset. @@ -116,6 +116,11 @@ class ReplayControlConfig(ControlConfig): @dataclass class RemoteRobotConfig(ControlConfig): log_interval: int = 100 + # Display all cameras on screen + display_data: bool = False + # Rerun configuration for remote robot (https://ref.rerun.io/docs/python/0.22.1/common/initialization_functions/#rerun.connect_tcp) + viewer_ip: str | None = None + viewer_port: str | None = None @dataclass diff --git a/lerobot/common/robot_devices/control_utils.py b/lerobot/common/robot_devices/control_utils.py index 78a8c6a6..4e42a989 100644 --- a/lerobot/common/robot_devices/control_utils.py +++ b/lerobot/common/robot_devices/control_utils.py @@ -24,7 +24,7 @@ from contextlib import nullcontext from copy import copy from functools import cache -import cv2 +import rerun as rr import torch from deepdiff import DeepDiff from termcolor import colored @@ -174,13 +174,13 @@ def warmup_record( events, enable_teleoperation, warmup_time_s, - display_cameras, + display_data, fps, ): control_loop( robot=robot, control_time_s=warmup_time_s, - display_cameras=display_cameras, + display_data=display_data, events=events, fps=fps, teleoperate=enable_teleoperation, @@ -192,7 +192,7 @@ def record_episode( dataset, events, episode_time_s, - display_cameras, + display_data, policy, fps, single_task, @@ -200,7 +200,7 @@ def record_episode( control_loop( robot=robot, control_time_s=episode_time_s, - display_cameras=display_cameras, + display_data=display_data, dataset=dataset, events=events, policy=policy, @@ -215,7 +215,7 @@ def control_loop( robot, control_time_s=None, teleoperate=False, - display_cameras=False, + display_data=False, dataset: LeRobotDataset | None = None, events=None, policy: PreTrainedPolicy = None, @@ -264,11 +264,15 @@ def control_loop( frame = {**observation, **action, "task": single_task} dataset.add_frame(frame) - if display_cameras and not is_headless(): + # TODO(Steven): This should be more general (for RemoteRobot instead of checking the name, but anyways it will change soon) + if (display_data and not is_headless()) or (display_data and robot.robot_type.startswith("lekiwi")): + for k, v in action.items(): + for i, vv in enumerate(v): + rr.log(f"sent_{k}_{i}", rr.Scalar(vv.numpy())) + image_keys = [key for key in observation if "image" in key] for key in image_keys: - cv2.imshow(key, cv2.cvtColor(observation[key].numpy(), cv2.COLOR_RGB2BGR)) - cv2.waitKey(1) + rr.log(key, rr.Image(observation[key].numpy()), static=True) if fps is not None: dt_s = time.perf_counter() - start_loop_t @@ -297,15 +301,11 @@ def reset_environment(robot, events, reset_time_s, fps): ) -def stop_recording(robot, listener, display_cameras): +def stop_recording(robot, listener, display_data): robot.disconnect() - if not is_headless(): - if listener is not None: - listener.stop() - - if display_cameras: - cv2.destroyAllWindows() + if not is_headless() and listener is not None: + listener.stop() def sanity_check_dataset_name(repo_id, policy_cfg): diff --git a/lerobot/scripts/control_robot.py b/lerobot/scripts/control_robot.py index 3c3c43f9..3daea98d 100644 --- a/lerobot/scripts/control_robot.py +++ b/lerobot/scripts/control_robot.py @@ -135,15 +135,19 @@ python lerobot/scripts/control_robot.py \ """ import logging +import os import time from dataclasses import asdict from pprint import pformat +import rerun as rr + # from safetensors.torch import load_file, save_file from lerobot.common.datasets.lerobot_dataset import LeRobotDataset from lerobot.common.policies.factory import make_policy from lerobot.common.robot_devices.control_configs import ( CalibrateControlConfig, + ControlConfig, ControlPipelineConfig, RecordControlConfig, RemoteRobotConfig, @@ -153,6 +157,7 @@ from lerobot.common.robot_devices.control_configs import ( from lerobot.common.robot_devices.control_utils import ( control_loop, init_keyboard_listener, + is_headless, log_control_info, record_episode, reset_environment, @@ -232,7 +237,7 @@ def teleoperate(robot: Robot, cfg: TeleoperateControlConfig): control_time_s=cfg.teleop_time_s, fps=cfg.fps, teleoperate=True, - display_cameras=cfg.display_cameras, + display_data=cfg.display_data, ) @@ -280,7 +285,7 @@ def record( # 3. place the cameras windows on screen enable_teleoperation = policy is None log_say("Warmup record", cfg.play_sounds) - warmup_record(robot, events, enable_teleoperation, cfg.warmup_time_s, cfg.display_cameras, cfg.fps) + warmup_record(robot, events, enable_teleoperation, cfg.warmup_time_s, cfg.display_data, cfg.fps) if has_method(robot, "teleop_safety_stop"): robot.teleop_safety_stop() @@ -296,7 +301,7 @@ def record( dataset=dataset, events=events, episode_time_s=cfg.episode_time_s, - display_cameras=cfg.display_cameras, + display_data=cfg.display_data, policy=policy, fps=cfg.fps, single_task=cfg.single_task, @@ -326,7 +331,7 @@ def record( break log_say("Stop recording", cfg.play_sounds, blocking=True) - stop_recording(robot, listener, cfg.display_cameras) + stop_recording(robot, listener, cfg.display_data) if cfg.push_to_hub: dataset.push_to_hub(tags=cfg.tags, private=cfg.private) @@ -363,6 +368,40 @@ def replay( log_control_info(robot, dt_s, fps=cfg.fps) +def _init_rerun(control_config: ControlConfig, session_name: str = "lerobot_control_loop") -> None: + """Initializes the Rerun SDK for visualizing the control loop. + + Args: + control_config: Configuration determining data display and robot type. + session_name: Rerun session name. Defaults to "lerobot_control_loop". + + Raises: + ValueError: If viewer IP is missing for non-remote configurations with display enabled. + """ + if (control_config.display_data and not is_headless()) or ( + control_config.display_data and isinstance(control_config, RemoteRobotConfig) + ): + # Configure Rerun flush batch size default to 8KB if not set + batch_size = os.getenv("RERUN_FLUSH_NUM_BYTES", "8000") + os.environ["RERUN_FLUSH_NUM_BYTES"] = batch_size + + # Initialize Rerun based on configuration + rr.init(session_name) + if isinstance(control_config, RemoteRobotConfig): + viewer_ip = control_config.viewer_ip + viewer_port = control_config.viewer_port + if not viewer_ip or not viewer_port: + raise ValueError( + "Viewer IP & Port are required for remote config. Set via config file/CLI or disable control_config.display_data." + ) + logging.info(f"Connecting to viewer at {viewer_ip}:{viewer_port}") + rr.connect_tcp(f"{viewer_ip}:{viewer_port}") + else: + # Get memory limit for rerun viewer parameters + memory_limit = os.getenv("LEROBOT_RERUN_MEMORY_LIMIT", "10%") + rr.spawn(memory_limit=memory_limit) + + @parser.wrap() def control_robot(cfg: ControlPipelineConfig): init_logging() @@ -370,17 +409,22 @@ def control_robot(cfg: ControlPipelineConfig): robot = make_robot_from_config(cfg.robot) + # TODO(Steven): Blueprint for fixed window size + if isinstance(cfg.control, CalibrateControlConfig): calibrate(robot, cfg.control) elif isinstance(cfg.control, TeleoperateControlConfig): + _init_rerun(control_config=cfg.control, session_name="lerobot_control_loop_teleop") teleoperate(robot, cfg.control) elif isinstance(cfg.control, RecordControlConfig): + _init_rerun(control_config=cfg.control, session_name="lerobot_control_loop_record") record(robot, cfg.control) elif isinstance(cfg.control, ReplayControlConfig): replay(robot, cfg.control) elif isinstance(cfg.control, RemoteRobotConfig): from lerobot.common.robot_devices.robots.lekiwi_remote import run_lekiwi + _init_rerun(control_config=cfg.control, session_name="lerobot_control_loop_remote") run_lekiwi(cfg.robot) if robot.is_connected: diff --git a/pyproject.toml b/pyproject.toml index 6b9b6802..4b858634 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,9 +60,9 @@ dependencies = [ "jsonlines>=4.0.0", "numba>=0.59.0", "omegaconf>=2.3.0", - "opencv-python>=4.9.0", + "opencv-python-headless>=4.9.0", "packaging>=24.2", - "av>=12.0.5,<13.0.0", + "av>=12.0.5", "pymunk>=6.6.0", "pynput>=1.7.7", "pyzmq>=26.2.1", diff --git a/tests/robots/test_control_robot.py b/tests/robots/test_control_robot.py index 61d1caad..3f618fc2 100644 --- a/tests/robots/test_control_robot.py +++ b/tests/robots/test_control_robot.py @@ -172,8 +172,7 @@ def test_record_and_replay_and_policy(tmp_path, request, robot_type, mock): push_to_hub=False, # TODO(rcadene, aliberts): test video=True video=False, - # TODO(rcadene): display cameras through cv2 sometimes crashes on mac - display_cameras=False, + display_data=False, play_sounds=False, ) dataset = record(robot, rec_cfg) @@ -226,7 +225,7 @@ def test_record_and_replay_and_policy(tmp_path, request, robot_type, mock): num_episodes=2, push_to_hub=False, video=False, - display_cameras=False, + display_data=False, play_sounds=False, num_image_writer_processes=num_image_writer_processes, ) @@ -273,7 +272,7 @@ def test_resume_record(tmp_path, request, robot_type, mock): episode_time_s=1, push_to_hub=False, video=False, - display_cameras=False, + display_data=False, play_sounds=False, num_episodes=1, ) @@ -330,7 +329,7 @@ def test_record_with_event_rerecord_episode(tmp_path, request, robot_type, mock) num_episodes=1, push_to_hub=False, video=False, - display_cameras=False, + display_data=False, play_sounds=False, ) dataset = record(robot, rec_cfg) @@ -380,7 +379,7 @@ def test_record_with_event_exit_early(tmp_path, request, robot_type, mock): num_episodes=1, push_to_hub=False, video=False, - display_cameras=False, + display_data=False, play_sounds=False, ) @@ -433,7 +432,7 @@ def test_record_with_event_stop_recording(tmp_path, request, robot_type, mock, n num_episodes=2, push_to_hub=False, video=False, - display_cameras=False, + display_data=False, play_sounds=False, num_image_writer_processes=num_image_writer_processes, )