7 #include <QApplication> 8 #include <QProgressDialog> 13 #include <QElapsedTimer> 16 #include <rosidl_typesupport_introspection_cpp/identifier.hpp> 17 #include <rosidl_typesupport_introspection_cpp/message_introspection.hpp> 18 #include <rosidl_typesupport_introspection_cpp/field_types.hpp> 19 #include <rosidl_typesupport_cpp/identifier.hpp> 20 #include <rosbag2_cpp/typesupport_helpers.hpp> 21 #include <rosbag2_cpp/storage_options.hpp> 22 #include <rosbag2_cpp/types/introspection_message.hpp> 23 #include <unordered_map> 24 #include <rclcpp/rclcpp.hpp> 27 #include "../dialog_select_ros_topics.h" 43 auto metadata_io = std::make_unique<rosbag2_storage::MetadataIo>();
45 auto temp_bag_reader = std::make_shared<rosbag2_cpp::readers::SequentialReader>();
50 bagDir = finfo.dir().path();
53 rosbag2_cpp::StorageOptions storageOptions;
54 storageOptions.uri = bagDir.toStdString();
55 storageOptions.storage_id =
"sqlite3";
56 rosbag2_cpp::ConverterOptions converterOptions;
57 converterOptions.input_serialization_format =
"cdr";
58 converterOptions.output_serialization_format = rmw_get_serialization_format();
60 QString oldPath = QDir::currentPath();
61 QDir::setCurrent(QDir::cleanPath(bagDir + QDir::separator() +
".."));
65 temp_bag_reader->open(storageOptions, converterOptions);
67 catch (std::runtime_error& ex)
69 QMessageBox::warning(
nullptr, tr(
"Error"), QString(
"rosbag::open thrown an exception:\n") + QString(ex.what()));
72 const auto bag_metadata = metadata_io->read_metadata(storageOptions.uri);
74 QDir::setCurrent(oldPath);
77 std::vector<rosbag2_storage::TopicMetadata> topic_metadata = temp_bag_reader->get_all_topics_and_types();
79 std::unordered_map<std::string, std::string> topicTypesByName;
81 std::vector<std::pair<QString, QString>> all_topics_qt;
83 std::vector<TopicInfo> topics_info;
85 std::set<std::string> blacklist_topic_name;
86 std::set<std::string> failed_topic_type;
88 for (
const rosbag2_storage::TopicMetadata&
topic : topic_metadata)
90 all_topics_qt.push_back( {QString::fromStdString(
topic.name),
91 QString::fromStdString(
topic.type)} );
92 topicTypesByName.emplace(
topic.name,
topic.type);
98 const auto& typesupport_identifier = rosidl_typesupport_cpp::typesupport_identifier;
101 const auto& typesupport_library = rosbag2_cpp::get_typesupport_library(
topic.type,
102 typesupport_identifier);
104 typesupport_identifier,
105 typesupport_library);
106 topics_info.emplace_back( std::move(topic_info) );
109 failed_topic_type.insert(
topic.type);
110 blacklist_topic_name.insert(
topic.type);
114 if(!failed_topic_type.empty())
116 QString
msg(
"Can not recognize the following message types and those topics will be ignored:\n\n");
117 for(
const auto&
type: failed_topic_type)
119 msg +=
" " + QString::fromStdString(
type) +
"\n";
121 msg +=
"\nHave you forgotten to source your workspace?";
122 QMessageBox::warning(
nullptr, tr(
"Error"), msg);
138 if (dialog->exec() !=
static_cast<int>(QDialog::Accepted))
162 std::set<std::string> topic_selected;
165 std::string topic_name = topic_qt.toStdString();
166 std::string topic_type = topicTypesByName.at(topic_name);
167 topic_selected.insert(topic_name);
174 QProgressDialog progress_dialog;
175 progress_dialog.setLabelText(
"Loading... please wait");
176 progress_dialog.setWindowModality(Qt::ApplicationModal);
177 progress_dialog.setRange(0, bag_metadata.message_count);
178 progress_dialog.show();
182 plot_map.
addUserDefined(
"plotjuggler::rosbag2_cpp::consecutive_messages")->second;
184 plot_map.
addUserDefined(
"plotjuggler::rosbag2_cpp::topics_metadata")->second;
187 metadata_storage.
pushBack( {0, std::any(topics_info) } );
189 auto time_prev = std::chrono::high_resolution_clock::now();
194 const std::string& topic_name =
msg->topic_name;
195 if(blacklist_topic_name.count(topic_name))
199 const double msg_timestamp = 1e-9 * double(
msg->time_stamp);
202 if (msg_count++ % 100 == 0)
204 progress_dialog.setValue(msg_count);
205 QApplication::processEvents();
207 if (progress_dialog.wasCanceled())
214 if (topic_selected.find(topic_name) == topic_selected.end())
219 double timestamp = msg_timestamp;
220 MessageRef msg_ref(
msg->serialized_data->buffer,
msg->serialized_data->buffer_length);
225 plot_consecutive.
pushBack(data_point);
227 auto plot_pair = plot_map.
user_defined.find(topic_name);
236 auto now = std::chrono::high_resolution_clock::now();
237 double diff = std::chrono::duration_cast<std::chrono::milliseconds>(now - time_prev).
count();
239 qDebug() <<
"The rosbag loaded the data in " << diff <<
" milliseconds";
void xmlLoadState(const QDomElement &parent_element)
void xmlSaveState(QDomDocument &doc, QDomElement &plugin_elem) const
std::vector< const char * > _extensions
void loadDefaultSettings()
QStringList selected_datasources
void registerMessageType(const std::string &topic_name, const std::string &topic_type)
std::shared_ptr< rosbag2_cpp::readers::SequentialReader > _bag_reader
constexpr auto count() -> size_t
virtual const std::vector< const char * > & compatibleFileExtensions() const override
AnySeriesMap::iterator addUserDefined(const std::string &name, PlotGroup::Ptr group={})
virtual bool xmlSaveState(QDomDocument &doc, QDomElement &parent_element) const override
bool parseMessage(const std::string &topic_name, MessageRef serialized_msg, double ×tamp)
void saveToSettings(QSettings &setting, QString prefix) const
typename PlotDataBase< double, Value >::Point Point
void saveDefaultSettings()
void pushBack(const Point &p) override
AnySeriesMap user_defined
QDomDocument plugin_config
PJ::RosParserConfig getResult() const
virtual bool readDataFromFile(PJ::FileLoadInfo *fileload_info, PJ::PlotDataMapRef &destination) override
virtual bool xmlLoadState(const QDomElement &parent_element) override
void loadFromSettings(const QSettings &settings, QString prefix)
const rosidl_message_type_support_t * type_support
void setConfig(const RosParserConfig &config)