A modern CLI/TUI tool for ROS bag file analysis and filtering
Project description
ROSE - Yet Another ROS Bag Filter Tool
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
Aesthetic
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:
Key Features and Todos
- 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
Getting Started
Installation
- 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
Terminal Setup
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.shOnce you have ros environment installed, you can build
rosbag_io_pylib which is required by roseApp to operate.
- Build the ROS project:
cd ros ./build.sh- Set up environment which will make sure
rosbag_io_pyadd toPYTHONPATHsource setup.shYou 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.
Usage
[!IMPORTANT] If you experience color display issues in your terminal, set the following environment variable:
export TERM=xterm-256colorThis ensures proper color rendering in both CLI and TUI interfaces.
Command Line Interface
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
TUI Interface
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
Configuration
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_parseroption 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.
Theme
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.jsonto specify your preferred theme:
{
"theme": "cassette-dark",
}
- Switch Theme in TUI with command palette(the buttom in bottom right corner or keybinding ^p)
Whitelist
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
sto 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"
}
}
Development
Run locally in docker
python roseApp/rose.py
Project Structure
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
Tech stack
- 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.
Rough ideas - data driven rendering
[!TIP] Before you start with Textual, there are some docs worth reading:
- Textual devtools on how to use
textual run <your app> --devto 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.
Resources
- Demo bag file: webviz demo.bag
- ROS Noetic Installation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rose_bag-0.2.0.tar.gz.
File metadata
- Download URL: rose_bag-0.2.0.tar.gz
- Upload date:
- Size: 33.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bd3f38234b85282bfe310273234fb556290ba268f8febcc840928a704bb7caba
|
|
| MD5 |
f357687c255322a5cfce70e9ee471e23
|
|
| BLAKE2b-256 |
0d3fa392d29fdda83952844b53d6281bcd1c0c3ff565eb0d5b304694277077dc
|
File details
Details for the file rose_bag-0.2.0-py3-none-any.whl.
File metadata
- Download URL: rose_bag-0.2.0-py3-none-any.whl
- Upload date:
- Size: 43.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: python-httpx/0.28.1
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc2470af8a0ea367a267ae7ddcb17ee88fcb2c6e098b6e299a93bcd612572371
|
|
| MD5 |
7638dede5860b741013df6e0cc756ded
|
|
| BLAKE2b-256 |
42db9ff3fea3ba03dd77a22d7ddaa773b038e332d3366ed95f176419c63a9aa1
|