rosbag + rust = frost
Read rosbags using Rust. Supports custom types via code-generation.
frost info ./examples/read_bag/fixtures/test.bag
# or, if you are building from source:
cargo run --release --bin frost -- info ./examples/read_bag/fixtures/test.bag
path: ./examples/read_bag/fixtures/test.bag
version: 2.0
duration: 99s
start: 2022-10-16 20:40:59.000001 UTC (1665952859.000001)
end: 2022-10-16 20:42:38.000100 UTC (1665952958.000100)
size: 11.53 KiB (11808 bytes)
messages: 200
compression: lz4 [1/1 chunks; 18.53%]
types: std_msgs/Float64MultiArray [4b7d974086d4060e7db4613a7e6c3ba4]
std_msgs/String [992ce8a1687cec8c8bd883ec73ca41d1]
topics: /array 100 msgs : std_msgs/Float64MultiArray
/chatter 100 msgs : std_msgs/String
There are more commands than the standard rosbag info
, such as the info --minimal
subcommand, which will leave out the types and topics. Or, the topics
command, which will just print the topics in the bag:
frost topics ./examples/read_bag/fixtures/test.bag
/array
/chatter
And, the types
command:
frost types ./examples/read_bag/fixtures/test.bag
std_msgs/Float64MultiArray
std_msgs/String
This program is around 4x to 120x+ faster (larger the bag, faster the speedup).
On a compressed 25GB bag, the vanilla rosbag
can take 20+ minutes, while frost
returns in less than ~10 seconds.
The topics
and types
commands allow you to see the information you need without extra noise that info
provides
- Copy the binary URL from the Releases page.
- In a terminal:
wget <URL> -O frost
chmod +x frost
sudo mv frost /usr/local/bin # or elsewhere
frost --help # check if it's in your path
Note: if you do not have Rust or Cargo installed, follow the guide here.
cargo install --all-features --git https://github.com/dantheman3333/frost.git frost
frost
has some optional features for the binary. If you wish to not include them, remove the --all-features
flag for cargo install
.
- color
- enables colors in the help menu
- if you build with colors enabled but wish to disable them, you can set the env var
NO_COLOR=1
If you would like to set up bash
auto-completion for frost
arguments, run:
frost --bpaf-complete-style-bash >> ~/.bash_completion
source ~/.bash_completion
Or, for zsh
(untested):
frost --bpaf-complete-style-zsh > ~/.zsh/_frost
source ~/.zsh/_frost
When using it as a library, code-generation is required to convert ros .msg files to Rust structs. See the full example and code-generation steps here.
let bag = DecompressedBag::from(bag_path).unwrap();
let query = Query::all();
let count = bag.read_messages(&query).unwrap().count();
assert_eq!(count, 200);
for msg_view in bag.read_messages(&query).unwrap() {
match msg_view.topic {
"/chatter" => {
let msg = msg_view.instantiate::<std_msgs::String>().unwrap();
// because frost has ros msg -> rust struct generation,
// you can safely access your data with the correct rust types:
// `msg.data` is a `std::String` so you have access to `starts_with`
assert!(msg.data.starts_with("foo_"))
}
"/array" => {
let msg = msg_view
.instantiate::<std_msgs::Float64MultiArray>()
.unwrap();
assert_eq!(msg.data, vec![0f64, 0f64, 0f64]);
}
&_ => {}
}
}
let query = Query::new().with_topics(&["/chatter"]);
let count = bag.read_messages(&query).unwrap().count();
assert_eq!(count, 100);
- reading bz2-compressed bags with
read_messages
frost info/topics
command line works with all compression modes and lz4-compressed bags works withread_messages
- default values in ros msgs
- a
frost echo
command - bag writing