Tub Format
Donkeycar uses “tubs” to store sensor data. A tub is a directory containing:- manifest.json - Metadata and record index
- images/ - Directory of image files
- records/ - JSON files with non-image data (optional in v2)
Tub Structure
TubWriter
Main part for recording data during driving. Location:donkeycar/parts/tub_v2.py:119
base_path: Directory path for the tubinputs: List of input keys to recordtypes: Data types for each inputmetadata: Optional metadata key:value pairsmax_catalog_len: Records per catalog file
'image_array'- numpy array saved as JPG'gray16_array'- 16-bit grayscale saved as PNG'float'- floating point number'int'- integer'str'- string'boolean'- boolean'nparray'- numpy array (saved as list)'list'or'vector'- Python list
Adding to Vehicle
run_condition='recording' means the TubWriter only runs when the recording input is True:
Tub Class
Lower-level interface for reading and writing tubs. Location:donkeycar/parts/tub_v2.py:17
Writing Records Manually
TubWiper
Deletes records from the end of a tub during recording. Location:donkeycar/parts/tub_v2.py:144
Manifest System
The manifest tracks all records and their metadata. Location:donkeycar/parts/datastore_v2.py
Manifest Structure
ManifestIterator
Data Management
Deleting Records
donkey makemovie or manual cleanup to remove files.
Merging Tubs
Filtering Tubs
Legacy Tub Format (v1)
Older tub format with separate JSON files per record. Location:donkeycar/parts/datastore.py
Converting v1 to v2
Configuration
Inmyconfig.py:
Tub Commands
List Tubs
Tub Info
Make Movie
Clean Tub
Remove deleted records:Histogram
View data distribution:Training Pipeline
Using Tubs for Training
Custom Data Loading
Data Augmentation
Image Transformations
Best Practices
Recording Quality Data
- Smooth Driving: Avoid jerky movements
- Variety: Record multiple laps, both directions
- Recovery: Record recovery from edges
- Lighting: Record in different lighting conditions
- Clean Data: Delete bad segments immediately with TubWiper
Data Organization
Storage Management
- Each image ~10-50KB (depends on compression)
- 1000 records ≈ 10-50MB
- Monitor disk space:
df -h - Archive old tubs:
tar -czf tub_1.tar.gz data/tub_1/
Common Issues
”Manifest is full”
Increasemax_catalog_len:
Missing Images
Check file permissions and disk space:Corrupted Tub
Verify and fix:Next Steps
- Keras Models - Train models with recorded data
- PyTorch Models - Alternative training framework
- Custom Parts - Create custom recording logic
