10 #include <boost/foreach.hpp>
14 #define foreach BOOST_FOREACH
18 const std::string &rosbag_path,
19 const std::string &topic_name) {
23 std::vector<std::string> topics;
24 topics.push_back(std::string(topic_name +
"/names"));
25 topics.push_back(std::string(topic_name +
"/values"));
29 std::map<std::string, size_t> variables_position_map;
30 std::vector<std::string> full_variables_names;
32 unsigned int current_names_version = 0;
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;
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]);
46 if (it == full_variables_names.end()) {
48 <<
" not found in the list");
51 size_t pos = std::distance(full_variables_names.begin(), it);
52 variables_position_map[variables_names[i]] = pos;
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) {
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]));
80 auto it =
data_.find(name);
82 if (it ==
data_.end()) {
84 return std::vector<TimeData>();
91 std::vector<std::string> names;
92 for (
auto it =
data_.begin(); it !=
data_.end(); it++) {
93 names.push_back(it->first);
99 std::vector<std::vector<TimeData>> values;
100 for (
auto it =
data_.begin(); it !=
data_.end(); it++) {
101 values.push_back(it->second);
108 for (
auto it =
data_.begin(); it !=
data_.end(); it++) {
109 if (max_size < it->second.size())
110 max_size = it->second.size();
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();
121 if(min_size == std::numeric_limits<size_t>::max())
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]);
137 if (values_time.size() == prev_size) {
139 << it->first <<
" time "
140 << it->second.back().first.toSec());
147 std::map<std::string, int> index_map;
149 for (
auto it =
data_.begin(); it !=
data_.end(); it++) {
150 index_map[it->first] = i;
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());
164 values_coeff.push_back(it->second[coeff]);