A high-performance ROS bag filtering tool that allows you to extract specific topics from ROSv1 bag files. Built with C++ core and Python interface, it provides both command-line and TUI interfaces for efficient bag file processing.
inspired by rosbag_editor
The cassette tape, a modest analog artifact, has evolved into a retro-futurism icon, demonstrating that technological advancement can coexist with human touch. Its tactile interface and physical limitations serve as poignant reminders of our technological heritage.
็ฃๅธฆ็ไธไป ๆฏไธ็งๆๆฏ้็ฉ๏ผๆดๆฏๅคๅคๆชๆฅไธปไน็่บๆฏๅๅ็ฒพ็ฅๅพ่ พใ็ฎๅ็ๆ้ฎใ่คช่ฒ็ๅกๆๅคๅฃณๅๆ้็ๅญๅจๅฎน้๏ผๆขๆฏๆๆง็่ฝฝไฝ๏ผไนๆฏๅฏนๆฐๅญ้ธๆ็ๆธฉๆๅๆใๅฎๆถๅปๆ้็ๆไปฌ๏ผๆๆฏ็็ช้ฃ็่ฟไธๅบ่ฏฅไปฅ็บ็ฒไบบๆงไธบไปฃไปท๏ผๅ ๅถ็่ฎพ่ฎกๅพๅพๆด่ฝๆๅจไบบๅฟใ
The TUI embraces the cassette futurism aesthetic - a design philosophy that reimagines future interfaces through the lens of 20th century technological fossils. This intentional retrofuturism features:
- Nostalgic minimalism: Low-resolution displays and monochromatic schemes that evoke 1980s computing
- Tactile authenticity: Visual metaphors of physical media like magnetic tapes and CRT textures
- Humanized technology: Warm color palettes and "imperfect" interfaces that resist digital sterility
More than mere retro styling, this approach serves as poetic resistance to digital hegemony. The cassette tape - our central metaphor - embodies this duality:
- High-performance C++ processing core (Optional,ROS required)
- ๐ ROS Environment independent. current rosbag and later to rosbags
- ๐ Interactive TUI for easy operation
- ๐ Command-line interface for automation
- Filter ROS bag files
- ๐ with whitelists
- with manually selected topics
- by time range (only TUI tested)
- ๐ Fuzzy search topic in TUI
- ๐ Multi-selection mode for batch processing in TUI (note:partially supported, rename and time range based filtering not supported yet)
- ๐ parallel processing for Multi-selection mode
- Docker support for cross-platform usage
- ๐ cassette futurism theme for dark and light mode
- ๐ง Message view in TUI
- ๐ง Support dynamic file/whitelist refresh in TUI
- Install rose-bag from pypi
pip install rose-bag
- Install from the source
# Clone the repository
git clone https://github.com/hanxiaomax/rose.git
cd rose
# Run the installation script
chmod +x install.sh
./install.sh
To uninstall Rose, run the following command:
pip uninstall rose-bag
To ensure proper color display in your terminal, set the following environment variable:
# Add this to your bashrc or zshrc
export TERM=xterm-256color
No ROS bag file? No problem! Download webviz demo.bag and give it a try!
Note
Want to try C++ Parser instead of Python API(lib rosbag)?
Since Rose's C++ parser depends on ROS Noetic environment, you need to install it first.
Option 1: Install ROS Noetic (Ubuntu 20.04), refer to ROS Noetic Installation
Option 2: Use docker image
- Build the Docker image:
cd docker docker build -t rose .
- Run the container:
./go_docker.sh
Once you have ros environment installed, you can build rosbag_io_py
lib which is required by roseApp to operate.
- Build the ROS project:
cd ros ./build.sh
- Set up environment which will make sure
rosbag_io_py
add toPYTHONPATH
source setup.sh
You are all set! Now you can use RoseApp to filter ROS bag files.
Note: Rose's C++ parser is very simple and not support ROS2. It is slightly faster than Python API(lib rosbag) (Refer to benchmark). But I am not sure if it is worth the effort to maintain it.
Important
If you experience color display issues in your terminal, set the following environment variable:
export TERM=xterm-256color
This ensures proper color rendering in both CLI and TUI interfaces.
Rose provides several command-line tools for bag file operations:
-
Analyze topics and create whitelist:
# Show all topics in the bag file ./rose.py inspect input.bag # Filter topics by pattern and show ./rose.py inspect input.bag -p ".*gps.*" # Filter topics and save to whitelist ./rose.py inspect input.bag -p ".*sensor.*" -s sensor_whitelist.txt # Output in JSON format ./rose.py inspect input.bag --json
-
Filter bag file:
# Filter using whitelist file ./rose.py filter input.bag output.bag -w whitelist.txt # Filter by specific topics ./rose.py filter input.bag output.bag --topics /topic1 --topics /topic2 # Filter by time range ./rose.py filter input.bag output.bag -w whitelist.txt -t "23/01/01 00:00:00,23/01/01 00:10:00" # Dry run to preview changes ./rose.py filter input.bag output.bag -w whitelist.txt --dry-run
Common workflow example:
# 1. First inspect the bag file
./rose.py info demo.bag
# 2. Create a whitelist with GPS related topics
./rose.py inspect demo.bag -p ".*gps.*" -s gps_whitelist.txt
# 3. Filter the bag file using the whitelist
./rose.py filter demo.bag gps_only.bag -w gps_whitelist.txt
To launch the TUI:
python3 rose.py tui
- Some key bindings:
q
: to quitf
: to filter bag filesw
: to load whitelists
: to save whitelista
: to toggle select all topics
Rose is configured with roseApp/config.json
.
{
"show_splash_screen": true,
"theme": "cassette-walkman",
"load_cpp_parser": false,
"whitelists": {
"demo": "./whitelists/demo.txt",
"radar": "./whitelists/radar.txt",
"invalid": "./whitelists/invalid.txt"
}
}
show_splash_screen
: whether to show the splash screen, default is truetheme
: the theme of the TUI, default iscassette-walkman
, check Theme for more detailsload_cpp_parser
: whether to use C++ implementation for better performance, default is falsewhitelists
: the whitelists of the TUI, default is empty, check Whitelist for more details
Note
The load_cpp_parser
option is set to false by default to improve startup time. Enable it only if you need better performance and have the C++ implementation properly installed.
RoseApp TUI provides two built-in themes: cassette-walkman
(default light theme) and cassette-dark
. You can configure the theme in two ways:
cassette-walkman | cassette-dark |
---|---|
![]() |
![]() |
- Modify
config.json
to specify your preferred theme:
{
"theme": "cassette-dark",
}
- Switch Theme in TUI with command palette(the buttom in bottom right corner or keybinding ^p)
You can filter bag files with pre-configured whitelist. To select pre-configured whitelists, press w
in TUI. But before that, you need to create your own whitelist.
You can create your own whitelist in 3 ways:
-
Create topic whitelist from command line:
./rose.py inspect input.bag | awk '{print $1}' > whitelist/example.txt
-
Create topic whitelist with your favorite text editor and save it to
whitelist/
: -
Create topic in TUI by press
s
to save current selected topics as whitelist file towhitelist/
directory:
After whitelist created, add it to config.json
so RoseApp can find it:
{
"whitelists": {
"demo": "./whitelists/demo.txt",
"radar": "./whitelists/radar.txt",
"invalid": "./whitelists/invalid.txt"
}
}
python roseApp/rose.py
To publish a new version to PyPI:
- Update version in
pyproject.toml
- Install required tools:
pip install keyring keyrings.alt
- Configure PyPI credentials:
# Using environment variables
export HATCH_INDEX_USER=__token__
export HATCH_INDEX_AUTH=your_pypi_token
# Or using hatch config
hatch config set pypi.auth.username __token__
hatch config set pypi.auth.password your_pypi_token
- Build and publish:
# Build the package
hatch build
# Publish to PyPI
hatch publish
project_root/
โโโ ros/ # ROS C++ core
โ โโโ CMakeLists.txt
โ โโโ devel/ # ros development folder
โ โโโ build/ # build folder
โ โโโ src/ # source code folder
| โโโ setup.sh # setup script
| โโโ build_rosecode.sh # build script
โโโ roseApp/ # Python application
โ โโโ rose.py # main script
โ โโโ themes/
โ โโโ components/ # components
โ โโโ core/ # data types and utils
| |โโ tui.py # main tui script
โ โโโ whitelists/ # topic whitelist folder
โ โโโ config.json # config file
โ โโโ style.tcss # style sheet
โโโ docker/ # Docker support
โ โโโ Dockerfile
โ โโโ go_docker.sh
โโโ docs/ # documentation
โโโ requirements.txt # dependencies
โโโ README.md
- Textual: A Python framework for building sophisticated TUI (Text User Interface) applications. Used for creating the interactive terminal interface.
- Click: A Python package for creating beautiful command line interfaces in a composable way. Used for building the CLI interface.
- Rich: A Python library for rich text and beautiful formatting in the terminal. Used for enhancing the visual presentation of both CLI and TUI.
- Pybind11: A lightweight header-only library that exposes C++ types in Python and vice versa. Used for wrapping ROS C++ interfaces to Python.
Tip
Before you start with Textual, there are some docs worth reading:
- Textual devtools on how to use
textual run <your app> --dev
to go into dev mode and how to handle logs - Design a layout ใTextualCSS and CSS Types to understand how to design a layout and style your app with CSS. and more tips on Styles and its reference
- Event and Messages are also important ideas to understand how Textual works so you can handle actions
- Thanks to Workers, asynchronous operations never been so easy. it can supppot asyncio or threads.
- Demo bag file: webviz demo.bag
- ROS Noetic Installation