Skip to content

Commit

Permalink
move InfoSortingMethod and generate sorted idx functions to seprate f…
Browse files Browse the repository at this point in the history
…iles; move ServiceInformation and ServiceMetadata struct to storage package for clear include structure

Signed-off-by: Soenke Prophet <[email protected]>
  • Loading branch information
Soenke Prophet committed Sep 27, 2024
1 parent 2778bf7 commit 5603870
Show file tree
Hide file tree
Showing 10 changed files with 217 additions and 90 deletions.
2 changes: 1 addition & 1 deletion ros2bag/ros2bag/verb/info.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,6 @@ def main(self, *, args): # noqa: D102
Info().print_output_verbose(args.bag_path, m, args.sort)
else:
if args.topic_name:
Info().print_output_topic_name_only(m)
Info().print_output_topic_name_only(m, args.sort)
else:
Info().print_output(m, args.sort)
1 change: 1 addition & 0 deletions rosbag2_py/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ pybind11_add_module(_info SHARED
src/rosbag2_py/_info.cpp
src/rosbag2_py/format_bag_metadata.cpp
src/rosbag2_py/format_service_info.cpp
src/rosbag2_py/info_sorting_method.cpp
)
target_link_libraries(_info PUBLIC
rosbag2_cpp::rosbag2_cpp
Expand Down
37 changes: 14 additions & 23 deletions rosbag2_py/src/rosbag2_py/_info.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <algorithm>
#include <numeric>

#include "info_sorting_method.hpp"
#include "format_bag_metadata.hpp"
#include "format_service_info.hpp"
#include "rosbag2_cpp/info.hpp"
Expand All @@ -30,11 +31,6 @@ namespace rosbag2_py
{


std::unordered_map<std::string, SortingMethod> stringToSortingMethod = {
{"name", SortingMethod::NAME},
{"type", SortingMethod::TYPE},
{"count", SortingMethod::COUNT}};

class Info
{
public:
Expand All @@ -51,28 +47,23 @@ class Info
}

void print_output(
const rosbag2_storage::BagMetadata & metadata_info, std::string sorting_method)
const rosbag2_storage::BagMetadata & metadata_info, const std::string & sorting_method)
{
rosbag2_py::SortingMethod sort_method = rosbag2_py::stringToSortingMethod[sorting_method];
InfoSortingMethod sort_method = info_sorting_method_from_string(sorting_method);
// Output formatted metadata
std::cout << format_bag_meta_data(metadata_info, {}, false, false, sort_method) << std::endl;
}

void print_output_topic_name_only(const rosbag2_storage::BagMetadata & metadata_info)
void print_output_topic_name_only(
const rosbag2_storage::BagMetadata & metadata_info, const std::string & sorting_method)
{
std::vector<size_t> sorted_idx(metadata_info.topics_with_message_count.size());
std::iota(sorted_idx.begin(), sorted_idx.end(), 0);
std::sort(
sorted_idx.begin(),
sorted_idx.end(),
[&metadata_info](size_t i1, size_t i2) {
std::string topic_name_1 = metadata_info.topics_with_message_count[i1].topic_metadata.name;
std::string topic_name_2 = metadata_info.topics_with_message_count[i2].topic_metadata.name;
return topic_name_1 < topic_name_2;
}
);
InfoSortingMethod sort_method = info_sorting_method_from_string(sorting_method);
std::vector<size_t> sorted_idx = generate_sorted_idx(
metadata_info.topics_with_message_count,
sort_method);

for (auto idx : sorted_idx) {
auto topic_info = metadata_info.topics_with_message_count[idx];
const auto & topic_info = metadata_info.topics_with_message_count[idx];
if (!rosbag2_cpp::is_service_event_topic(
topic_info.topic_metadata.name,
topic_info.topic_metadata.type))
Expand All @@ -85,7 +76,7 @@ class Info
void print_output_verbose(
const std::string & uri,
const rosbag2_storage::BagMetadata & metadata_info,
std::string sorting_method)
const std::string & sorting_method)
{
std::vector<std::shared_ptr<rosbag2_cpp::rosbag2_service_info_t>> all_services_info;
for (auto & file_info : metadata_info.files) {
Expand All @@ -110,7 +101,7 @@ class Info
}
}

rosbag2_py::SortingMethod sort_method = rosbag2_py::stringToSortingMethod[sorting_method];
rosbag2_py::InfoSortingMethod sort_method = info_sorting_method_from_string(sorting_method);
// Output formatted metadata and service info
std::cout << format_bag_meta_data(metadata_info, messages_size, true, true, sort_method);
std::cout << format_service_info(all_services_info, messages_size, true) << std::endl;
Expand All @@ -119,7 +110,7 @@ class Info
std::unordered_set<std::string> get_sorting_methods()
{
std::unordered_set<std::string> sorting_methods;
for (auto sorting_method : rosbag2_py::stringToSortingMethod) {
for (auto sorting_method : rosbag2_py::sorting_method_map) {
sorting_methods.insert(sorting_method.first);
}
return sorting_methods;
Expand Down
62 changes: 11 additions & 51 deletions rosbag2_py/src/rosbag2_py/format_bag_metadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ void format_topics_with_type(
bool verbose,
std::stringstream & info_stream,
int indentation_spaces,
const rosbag2_py::SortingMethod sort_method = rosbag2_py::SortingMethod::NAME)
const rosbag2_py::InfoSortingMethod sort_method = rosbag2_py::InfoSortingMethod::NAME)
{
if (topics.empty()) {
info_stream << std::endl;
Expand All @@ -142,21 +142,7 @@ void format_topics_with_type(
info_stream << std::endl;
};

std::vector<size_t> sorted_idx(topics.size());
std::iota(sorted_idx.begin(), sorted_idx.end(), 0);
std::sort(
sorted_idx.begin(),
sorted_idx.end(),
[&topics, sort_method](size_t i1, size_t i2) {
if (sort_method == rosbag2_py::SortingMethod::TYPE) {
return topics[i1].topic_metadata.type < topics[i2].topic_metadata.type;
}
if (sort_method == rosbag2_py::SortingMethod::COUNT) {
return topics[i1].message_count < topics[i2].message_count;
}
return topics[i1].topic_metadata.name < topics[i2].topic_metadata.name;
}
);
std::vector<size_t> sorted_idx = rosbag2_py::generate_sorted_idx(topics, sort_method);

size_t number_of_topics = topics.size();
size_t i = 0;
Expand Down Expand Up @@ -186,31 +172,19 @@ void format_topics_with_type(
}
}

struct ServiceMetadata
{
std::string name;
std::string type;
std::string serialization_format;
};

struct ServiceInformation
{
ServiceMetadata service_metadata;
size_t event_message_count = 0;
};

std::vector<std::shared_ptr<ServiceInformation>> filter_service_event_topic(
std::vector<std::shared_ptr<rosbag2_storage::ServiceInformation>> filter_service_event_topic(
const std::vector<rosbag2_storage::TopicInformation> & topics_with_message_count,
size_t & total_service_event_msg_count)
{
total_service_event_msg_count = 0;
std::vector<std::shared_ptr<ServiceInformation>> service_info_list;
std::vector<std::shared_ptr<rosbag2_storage::ServiceInformation>> service_info_list;

for (auto & topic : topics_with_message_count) {
if (rosbag2_cpp::is_service_event_topic(
topic.topic_metadata.name, topic.topic_metadata.type))
{
auto service_info = std::make_shared<ServiceInformation>();
auto service_info = std::make_shared<rosbag2_storage::ServiceInformation>();
service_info->service_metadata.name =
rosbag2_cpp::service_event_topic_name_to_service_name(topic.topic_metadata.name);
service_info->service_metadata.type =
Expand All @@ -227,12 +201,12 @@ std::vector<std::shared_ptr<ServiceInformation>> filter_service_event_topic(
}

void format_service_with_type(
const std::vector<std::shared_ptr<ServiceInformation>> & services,
const std::vector<std::shared_ptr<rosbag2_storage::ServiceInformation>> & services,
const std::unordered_map<std::string, uint64_t> & messages_size,
bool verbose,
std::stringstream & info_stream,
int indentation_spaces,
const rosbag2_py::SortingMethod sort_method = rosbag2_py::SortingMethod::NAME)
const rosbag2_py::InfoSortingMethod sort_method = rosbag2_py::InfoSortingMethod::NAME)
{
if (services.empty()) {
info_stream << std::endl;
Expand All @@ -241,7 +215,7 @@ void format_service_with_type(

auto print_service_info =
[&info_stream, &messages_size, verbose](
const std::shared_ptr<ServiceInformation> & si) -> void {
const std::shared_ptr<rosbag2_storage::ServiceInformation> & si) -> void {
info_stream << "Service: " << si->service_metadata.name << " | ";
info_stream << "Type: " << si->service_metadata.type << " | ";
info_stream << "Event Count: " << si->event_message_count << " | ";
Expand All @@ -258,21 +232,7 @@ void format_service_with_type(
info_stream << std::endl;
};

std::vector<size_t> sorted_idx(services.size());
std::iota(sorted_idx.begin(), sorted_idx.end(), 0);
std::sort(
sorted_idx.begin(),
sorted_idx.end(),
[&services, sort_method](size_t i1, size_t i2) {
if (sort_method == rosbag2_py::SortingMethod::TYPE) {
return services[i1]->service_metadata.type < services[i2]->service_metadata.type;
}
if (sort_method == rosbag2_py::SortingMethod::COUNT) {
return services[i1]->event_message_count < services[i2]->event_message_count;
}
return services[i1]->service_metadata.name < services[i2]->service_metadata.name;
}
);
std::vector<size_t> sorted_idx = rosbag2_py::generate_sorted_idx(services, sort_method);

print_service_info(services[sorted_idx[0]]);
auto number_of_services = services.size();
Expand All @@ -292,7 +252,7 @@ std::string format_bag_meta_data(
const std::unordered_map<std::string, uint64_t> & messages_size,
bool verbose,
bool only_topic,
const SortingMethod sort_method)
const InfoSortingMethod sort_method)
{
auto start_time = metadata.starting_time.time_since_epoch();
auto end_time = start_time + metadata.duration;
Expand All @@ -304,7 +264,7 @@ std::string format_bag_meta_data(
}

size_t total_service_event_msg_count = 0;
std::vector<std::shared_ptr<ServiceInformation>> service_info_list;
std::vector<std::shared_ptr<rosbag2_storage::ServiceInformation>> service_info_list;
service_info_list = filter_service_event_topic(
metadata.topics_with_message_count,
total_service_event_msg_count);
Expand Down
13 changes: 2 additions & 11 deletions rosbag2_py/src/rosbag2_py/format_bag_metadata.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,27 +18,18 @@
#include <string>
#include <unordered_map>

#include "info_sorting_method.hpp"
#include "rosbag2_storage/bag_metadata.hpp"

namespace rosbag2_py
{

/**
* \brief Available sorting methods for info output.
*/
enum class SortingMethod
{
NAME,
TYPE,
COUNT,
};

std::string format_bag_meta_data(
const rosbag2_storage::BagMetadata & metadata,
const std::unordered_map<std::string, uint64_t> & messages_size = {},
bool verbose = false,
bool only_topic = false,
const SortingMethod sort_method = SortingMethod::NAME);
const InfoSortingMethod sort_method = InfoSortingMethod::NAME);

} // namespace rosbag2_py

Expand Down
9 changes: 6 additions & 3 deletions rosbag2_py/src/rosbag2_py/format_service_info.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@ std::string
format_service_info(
std::vector<std::shared_ptr<rosbag2_cpp::rosbag2_service_info_t>> & service_info_list,
const std::unordered_map<std::string, uint64_t> & messages_size,
bool verbose)
bool verbose,
const InfoSortingMethod sort_method)
{
std::stringstream info_stream;
const std::string service_info_string = "Service information: ";
Expand Down Expand Up @@ -78,11 +79,13 @@ format_service_info(
info_stream << std::endl;
};

print_service_info(service_info_list[0]);
std::vector<size_t> sorted_idx = rosbag2_py::generate_sorted_idx(service_info_list, sort_method);

print_service_info(service_info_list[sorted_idx[0]]);
auto number_of_services = service_info_list.size();
for (size_t j = 1; j < number_of_services; ++j) {
info_stream << std::string(indentation_spaces, ' ');
print_service_info(service_info_list[j]);
print_service_info(service_info_list[sorted_idx[j]]);
}

return info_stream.str();
Expand Down
4 changes: 3 additions & 1 deletion rosbag2_py/src/rosbag2_py/format_service_info.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
#include <vector>
#include <unordered_map>

#include "info_sorting_method.hpp"
#include "rosbag2_cpp/info.hpp"

namespace rosbag2_py
Expand All @@ -28,7 +29,8 @@ namespace rosbag2_py
std::string format_service_info(
std::vector<std::shared_ptr<rosbag2_cpp::rosbag2_service_info_t>> & service_info,
const std::unordered_map<std::string, uint64_t> & messages_size = {},
bool verbose = false);
bool verbose = false,
const InfoSortingMethod sort_method = InfoSortingMethod::NAME);

} // namespace rosbag2_py

Expand Down
Loading

0 comments on commit 5603870

Please sign in to comment.