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:
-
Show basic bag information:
# Show basic information about the bag file ./rose.py info input.bag
-
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"
}
}
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