diff --git a/lerobot/common/datasets/lerobot_dataset.py b/lerobot/common/datasets/lerobot_dataset.py index b32cf7095..27632f0e1 100644 --- a/lerobot/common/datasets/lerobot_dataset.py +++ b/lerobot/common/datasets/lerobot_dataset.py @@ -304,6 +304,13 @@ class LeRobotDatasetMetadata: ) else: # TODO(aliberts, rcadene): implement sanity check for features + + # check if none of the features contains a "/" in their names, + # as this would break the dict flattening in the stats computation, which uses '/' as separator + for key in features: + if "/" in key: + raise ValueError(f"Feature names should not contain '/'. Found '/' in feature '{key}'.") + features = {**features, **DEFAULT_FEATURES} obj.tasks, obj.stats, obj.episodes = {}, {}, [] diff --git a/tests/test_datasets.py b/tests/test_datasets.py index 9f3615871..ce5bec607 100644 --- a/tests/test_datasets.py +++ b/tests/test_datasets.py @@ -414,3 +414,20 @@ def test_create_branch(): # Clean api.delete_repo(repo_id, repo_type=repo_type) + + +def test_dataset_feature_with_forward_slash_raises_error(): + # make sure dir does not exist + from lerobot.common.datasets.lerobot_dataset import LEROBOT_HOME + + dataset_dir = LEROBOT_HOME / "lerobot/test/with/slash" + # make sure does not exist + if dataset_dir.exists(): + dataset_dir.rmdir() + + with pytest.raises(ValueError): + LeRobotDataset.create( + repo_id="lerobot/test/with/slash", + fps=30, + features={"a/b": {"dtype": "float32", "shape": 2, "names": None}}, + )