bag_reader.h
Go to the documentation of this file.
1 // Fast native bag reader
2 // Author: Max Schwarz <max.schwarz@ais.uni-bonn.de>
3 
4 #ifndef ROSBAG_FANCY_BAGREADER_H
5 #define ROSBAG_FANCY_BAGREADER_H
6 
7 #include <map>
8 #include <memory>
9 #include <string>
10 
11 #include <ros/time.h>
12 #include <ros/serialization.h>
13 
14 #include <rosbag/stream.h>
15 
16 #include <boost/make_shared.hpp>
17 
18 namespace rosbag_fancy
19 {
20 
21 class BagReader
22 {
23 public:
24  class Exception : public std::runtime_error
25  {
26  public:
27  explicit Exception(const std::string& what)
28  : std::runtime_error{what}
29  {}
30  };
31 
32  struct Connection
33  {
34  std::uint32_t id;
35  std::string topicInBag;
36 
37  std::string topicAsPublished;
38  std::string type;
39  std::string md5sum;
40  std::string msgDef;
41  std::string callerID;
42  bool latching = false;
43 
44  std::uint64_t totalCount = 0;
45  };
46 
47  using ConnectionMap = std::map<std::uint32_t, Connection>;
48 
50  {
51  std::uint32_t id;
52  std::uint32_t msgCount;
53  };
54 
55  class ChunkIterator;
56  class Iterator;
57 
58  struct Message
59  {
62 
63  template<class M>
65  {
67  return {};
69  return {};
70 
71  namespace ser = ros::serialization;
72  ser::IStream stream(const_cast<uint8_t*>(m_data), m_size);
73 
74  auto ret = boost::make_shared<M>();
75  ser::deserialize(stream, *ret);
76  return ret;
77  }
78 
79  const uint8_t* data() const
80  { return m_data; }
81 
82  std::size_t size() const
83  { return m_size; }
84 
85  private:
88 
89  const uint8_t* m_data = nullptr;
90  std::size_t m_size;
91  };
92 
94  {
95  public:
96  using iterator_category = std::input_iterator_tag;
98  using reference = const Message&;
99  using pointer = const Message*;
100 
101  ChunkIterator(const ChunkIterator&) = default;
102  ChunkIterator& operator=(const ChunkIterator&) = default;
103 
104  reference operator*() { return m_msg; }
105  pointer operator->() { return &m_msg; }
106 
107  ChunkIterator& operator++();
108  ChunkIterator operator++(int) { ChunkIterator tmp = *this; ++(*this); return tmp; }
109 
110  friend bool operator== (const ChunkIterator& a, const ChunkIterator& b) { return a.m_d == b.m_d && a.m_idx == b.m_idx; };
111  friend bool operator!= (const ChunkIterator& a, const ChunkIterator& b) { return a.m_d != b.m_d || a.m_idx != b.m_idx; };
112 
113  private:
114  friend class BagReader::Iterator;
115 
117  explicit ChunkIterator(const BagReader* reader, int chunk);
118 
119  class Private;
120  std::shared_ptr<Private> m_d;
121  std::size_t m_idx = 0;
123  };
124 
125  class Iterator
126  {
127  public:
128  using iterator_category = std::input_iterator_tag;
130  using reference = const Message&;
131  using pointer = const Message*;
132 
133  Iterator() {}
134  Iterator(const Iterator&) = default;
135  Iterator& operator=(const Iterator&) = default;
136 
137  reference operator*() { return *m_it; }
138  pointer operator->() { return &*m_it; }
139 
140  Iterator& operator++();
141  Iterator operator++(int) { Iterator tmp = *this; ++(*this); return tmp; }
142 
143  void advanceWithPredicates(const std::function<bool(const ConnectionInfo&)>& connPredicate, const std::function<bool(const Message&)>& messagePredicate);
144  void findNextWithPredicates(const std::function<bool(const ConnectionInfo&)>& connPredicate, const std::function<bool(const Message&)>& messagePredicate);
145 
146  friend bool operator== (const Iterator& a, const Iterator& b) { return a.m_chunk == b.m_chunk && a.m_it == b.m_it; };
147  friend bool operator!= (const Iterator& a, const Iterator& b) { return a.m_chunk != b.m_chunk || a.m_it != b.m_it; };
148 
149  std::vector<ConnectionInfo>& currentChunkConnections() const;
150  rosbag::CompressionType currentChunkCompression() const;
151 
152  void skipChunk();
153  int chunk() const
154  { return m_chunk; }
155 
156  private:
157  friend class BagReader;
158 
159  explicit Iterator(const BagReader* reader, int chunk);
160 
162  int m_chunk = -1;
164  };
165 
166  explicit BagReader(const std::string& filename);
167  ~BagReader();
168 
169  BagReader(const BagReader&) = delete;
170  BagReader& operator=(const BagReader&) = delete;
171 
172  BagReader(BagReader&& other);
173 
174  const ConnectionMap& connections() const;
175 
176  ros::Time startTime() const;
177  ros::Time endTime() const;
178 
179  std::size_t size() const;
180 
181  Iterator begin() const;
182  Iterator end() const;
183  Iterator findTime(const ros::Time& time) const;
184 
185  std::size_t numChunks() const;
186 
187  int findChunk(const ros::Time& time) const;
188  Iterator chunkBegin(int chunk) const;
189 private:
190  class Private;
191  std::unique_ptr<Private> m_d;
192 };
193 
194 }
195 
196 namespace ros
197 {
198 namespace message_traits
199 {
200 template<> struct IsMessage<rosbag_fancy::BagReader::Message> : TrueType { };
201 
202 template<>
203 struct MD5Sum<rosbag_fancy::BagReader::Message>
204 {
205  static const char* value(const rosbag_fancy::BagReader::Message& m)
206  {
207  return m.connection->md5sum.c_str();
208  }
209 };
210 
211 template<>
212 struct DataType<rosbag_fancy::BagReader::Message>
213 {
214  static const char* value(const rosbag_fancy::BagReader::Message& m)
215  {
216  return m.connection->type.c_str();
217  }
218 };
219 
220 template<>
221 struct Definition<rosbag_fancy::BagReader::Message>
222 {
223  static const char* value(const rosbag_fancy::BagReader::Message& m)
224  {
225  return m.connection->msgDef.c_str();
226  }
227 };
228 }
229 
230 namespace serialization
231 {
232 template<>
233 struct Serializer<rosbag_fancy::BagReader::Message>
234 {
235  template<typename Stream>
236  inline static void write(Stream& stream, const rosbag_fancy::BagReader::Message& t)
237  {
238  std::memcpy(stream.advance(t.m_size), t.m_data, t.m_size);
239  }
240 
241  inline static uint32_t serializedLength(const rosbag_fancy::BagReader::Message& t)
242  {
243  return t.m_size;
244  }
245 };
246 }
247 }
248 
249 #endif
static const char * value(const rosbag_fancy::BagReader::Message &m)
Definition: bag_reader.h:223
decltype(sizeof(void *)) typede size_t)
Definition: doctest.h:501
std::size_t size() const
Definition: bag_reader.cpp:774
std::size_t size() const
Definition: bag_reader.h:82
bool operator!=(const BagView::Iterator &a, const BagView::Iterator &b)
Definition: bag_view.cpp:209
const ConnectionMap & connections() const
Definition: bag_reader.cpp:759
bool operator==(const BagView::Iterator &a, const BagView::Iterator &b)
Definition: bag_view.cpp:203
std::size_t numChunks() const
Definition: bag_reader.cpp:823
boost::shared_ptr< M > instantiate() const
Definition: bag_reader.h:64
Iterator findTime(const ros::Time &time) const
Definition: bag_reader.cpp:792
ros::Time endTime() const
Definition: bag_reader.cpp:769
static const char * value(const rosbag_fancy::BagReader::Message &m)
Definition: bag_reader.h:214
const uint8_t * data() const
Definition: bag_reader.h:79
std::unique_ptr< Private > m_d
Definition: bag_reader.h:190
ROS_FORCE_INLINE uint8_t * advance(uint32_t len)
static void write(Stream &stream, const rosbag_fancy::BagReader::Message &t)
Definition: bag_reader.h:236
BagReader(const std::string &filename)
Definition: bag_reader.cpp:605
const Connection * connection
Definition: bag_reader.h:61
Iterator begin() const
Definition: bag_reader.cpp:779
Iterator chunkBegin(int chunk) const
Definition: bag_reader.cpp:815
std::map< std::uint32_t, Connection > ConnectionMap
Definition: bag_reader.h:47
std::input_iterator_tag iterator_category
Definition: bag_reader.h:96
std::shared_ptr< Private > m_d
Definition: bag_reader.h:119
Exception(const std::string &what)
Definition: bag_reader.h:27
ros::Time startTime() const
Definition: bag_reader.cpp:764
static uint32_t serializedLength(const rosbag_fancy::BagReader::Message &t)
Definition: bag_reader.h:241
static const char * value(const rosbag_fancy::BagReader::Message &m)
Definition: bag_reader.h:205
int findChunk(const ros::Time &time) const
std::input_iterator_tag iterator_category
Definition: bag_reader.h:128
Iterator end() const
Definition: bag_reader.cpp:787
BagReader & operator=(const BagReader &)=delete


rosbag_fancy
Author(s):
autogenerated on Fri Dec 9 2022 04:00:08