extract_rosbag_signals.cpp
Go to the documentation of this file.
1 /*
2  * Copyright 2020 PAL Robotics SL. All Rights Reserved
3  *
4  * Unauthorized copying of this file, via any medium is strictly prohibited,
5  * unless it was supplied under the terms of a license agreement or
6  * nondisclosure agreement with PAL Robotics SL. In this case it may not be
7  * copied or disclosed except in accordance with the terms of that agreement.
8  */
9 
10 #include <boost/foreach.hpp>
12 #include <rosbag/bag.h>
13 #include <rosbag/view.h>
14 #define foreach BOOST_FOREACH
15 
16 namespace pal_statistics {
17 DataSignals::DataSignals(const std::vector<std::string> &variables_names,
18  const std::string &rosbag_path,
19  const std::string &topic_name) {
20  rosbag::Bag bag;
21  bag.open(rosbag_path, rosbag::bagmode::Read);
22 
23  std::vector<std::string> topics;
24  topics.push_back(std::string(topic_name + "/names"));
25  topics.push_back(std::string(topic_name + "/values"));
26 
27  rosbag::View view(bag, rosbag::TopicQuery(topics));
28 
29  std::map<std::string, size_t> variables_position_map;
30  std::vector<std::string> full_variables_names;
31 
32  unsigned int current_names_version = 0;
33 
34  foreach (rosbag::MessageInstance const m, view) {
35  pal_statistics_msgs::StatisticsNames::ConstPtr statistics_names =
36  m.instantiate<pal_statistics_msgs::StatisticsNames>();
37  if (statistics_names != NULL) {
38  if (statistics_names->names_version != current_names_version) {
39  current_names_version = statistics_names->names_version;
40  full_variables_names = statistics_names->names;
41 
42  for (size_t i = 0; i < variables_names.size(); i++) {
43  auto it = std::find(full_variables_names.begin(),
44  full_variables_names.end(), variables_names[i]);
45 
46  if (it == full_variables_names.end()) {
47  ROS_ERROR_STREAM("Variable " << variables_names[i]
48  << " not found in the list");
49  continue;
50  }
51  size_t pos = std::distance(full_variables_names.begin(), it);
52  variables_position_map[variables_names[i]] = pos;
53  }
54  }
55  }
56 
57  pal_statistics_msgs::StatisticsValues::ConstPtr statistics_values =
58  m.instantiate<pal_statistics_msgs::StatisticsValues>();
59  if (statistics_values != NULL) {
60  if (statistics_values->names_version != current_names_version) {
61  ROS_WARN_STREAM("Msg names version are different. Skipping data");
62  }
63 
64  for (auto it = variables_position_map.begin();
65  it != variables_position_map.end(); it++) {
66  data_[it->first].push_back(
67  std::make_pair(statistics_values->header.stamp,
68  statistics_values->values[it->second]));
69  }
70  }
71  }
72 
73  bag.close();
74 }
75 
77 
78 std::vector<TimeData>
79 DataSignals::getDataSignal(const std::string &name) const {
80  auto it = data_.find(name);
81 
82  if (it == data_.end()) {
83  ROS_ERROR_STREAM("Couldn't find signal " << name);
84  return std::vector<TimeData>();
85  }
86 
87  return it->second;
88 }
89 
90 std::vector<std::string> DataSignals::getDataSignalNames() const {
91  std::vector<std::string> names;
92  for (auto it = data_.begin(); it != data_.end(); it++) {
93  names.push_back(it->first);
94  }
95  return names;
96 }
97 
98 std::vector<std::vector<TimeData>> DataSignals::getDataValues() const {
99  std::vector<std::vector<TimeData>> values;
100  for (auto it = data_.begin(); it != data_.end(); it++) {
101  values.push_back(it->second);
102  }
103  return values;
104 }
105 
107  size_t max_size = 0;
108  for (auto it = data_.begin(); it != data_.end(); it++) {
109  if (max_size < it->second.size())
110  max_size = it->second.size();
111  }
112  return max_size;
113 }
114 
116  size_t min_size = std::numeric_limits<size_t>::max();
117  for (auto it = data_.begin(); it != data_.end(); it++) {
118  if (min_size > it->second.size())
119  min_size = it->second.size();
120  }
121  if(min_size == std::numeric_limits<size_t>::max())
122  min_size = 0;
123 
124  return min_size;
125 }
126 
127 std::vector<TimeData> DataSignals::getDataValue(const ros::Duration &time) const {
128  std::vector<TimeData> values_time;
129  for (auto it = data_.begin(); it != data_.end(); it++) {
130  size_t prev_size = values_time.size();
131  for (size_t i = 0; i < it->second.size(); i++) {
132  if (time.toSec() <= (it->second[i].first - it->second[0].first).toSec()) {
133  values_time.push_back(it->second[i]);
134  break;
135  }
136  }
137  if (values_time.size() == prev_size) {
138  ROS_WARN_STREAM("Time " << time.toSec() << " is higher than data "
139  << it->first << " time "
140  << it->second.back().first.toSec());
141  }
142  }
143  return values_time;
144 }
145 
146 std::map<std::string, int> DataSignals::getIndexMap() const {
147  std::map<std::string, int> index_map;
148  int i = 0;
149  for (auto it = data_.begin(); it != data_.end(); it++) {
150  index_map[it->first] = i;
151  i++;
152  }
153  return index_map;
154 }
155 
156 std::vector<TimeData> DataSignals::getInstantDataValues(size_t coeff) const {
157  std::vector<TimeData> values_coeff;
158  for (auto it = data_.begin(); it != data_.end(); it++) {
159  if (coeff >= it->second.size()) {
160  ROS_WARN_STREAM("Coeff " << coeff << " is higher than data " << it->first
161  << " size " << it->second.size());
162  continue;
163  }
164  values_coeff.push_back(it->second[coeff]);
165  }
166  return values_coeff;
167 }
168 } // namespace pal_statistics
pal_statistics::DataSignals::getInstantDataValues
std::vector< TimeData > getInstantDataValues(size_t coeff) const
Definition: extract_rosbag_signals.cpp:156
rosbag::Bag
ROS_ERROR_STREAM
#define ROS_ERROR_STREAM(args)
pal_statistics::DataSignals::getDataValuesMinSize
size_t getDataValuesMinSize() const
Definition: extract_rosbag_signals.cpp:115
rosbag::MessageInstance
pal_statistics::DataSignals::getIndexMap
std::map< std::string, int > getIndexMap() const
Definition: extract_rosbag_signals.cpp:146
pal_statistics::DataSignals::getDataSignal
std::vector< TimeData > getDataSignal(const std::string &name) const
Definition: extract_rosbag_signals.cpp:79
pal_statistics::DataSignals::~DataSignals
~DataSignals()
Definition: extract_rosbag_signals.cpp:76
rosbag::Bag::close
void close()
bag.h
pal_statistics::DataSignals::getDataValues
std::vector< std::vector< TimeData > > getDataValues() const
Definition: extract_rosbag_signals.cpp:98
rosbag::bagmode::Read
Read
ROS_WARN_STREAM
#define ROS_WARN_STREAM(args)
pal_statistics::DataSignals::data_
std::map< std::string, std::vector< TimeData > > data_
Definition: extract_rosbag_signals.h:56
pal_statistics::DataSignals::getDataValuesMaxSize
size_t getDataValuesMaxSize() const
Definition: extract_rosbag_signals.cpp:106
pal_statistics
Definition: extract_rosbag_signals.h:14
pal_statistics::DataSignals::DataSignals
DataSignals(const std::vector< std::string > &variables_names, const std::string &rosbag_path, const std::string &topic_name="/introspection_data")
Definition: extract_rosbag_signals.cpp:17
rosbag::TopicQuery
view.h
rosbag::View
rosbag::MessageInstance::instantiate
boost::shared_ptr< T > instantiate() const
extract_rosbag_signals.h
DurationBase< Duration >::toSec
double toSec() const
rosbag::Bag::open
void open(std::string const &filename, uint32_t mode=bagmode::Read)
pal_statistics::DataSignals::getDataValue
std::vector< TimeData > getDataValue(const ros::Duration &time) const
Definition: extract_rosbag_signals.cpp:127
ros::Duration
pal_statistics::DataSignals::getDataSignalNames
std::vector< std::string > getDataSignalNames() const
Definition: extract_rosbag_signals.cpp:90


pal_statistics
Author(s):
autogenerated on Fri Aug 2 2024 08:29:35