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;
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
rosbag_fancy::BagReader::Message::data
const uint8_t * data() const
Definition: bag_reader.h:79
ros::message_traits::MD5Sum< rosbag_fancy::BagReader::Message >::value
static const char * value(const rosbag_fancy::BagReader::Message &m)
Definition: bag_reader.h:205
ros::message_traits::TrueType
rosbag_fancy::BagReader::Iterator::operator++
Iterator operator++(int)
Definition: bag_reader.h:141
rosbag_fancy::BagReader::Message::m_data
const uint8_t * m_data
Definition: bag_reader.h:89
rosbag_fancy::BagReader::Connection::totalCount
std::uint64_t totalCount
Definition: bag_reader.h:44
rosbag_fancy::BagReader::ChunkIterator::operator++
ChunkIterator operator++(int)
Definition: bag_reader.h:108
rosbag_fancy::BagReader::Connection::callerID
std::string callerID
Definition: bag_reader.h:41
rosbag_fancy::BagReader::operator=
BagReader & operator=(const BagReader &)=delete
boost::shared_ptr< M >
rosbag_fancy::operator==
bool operator==(const BagView::Iterator &a, const BagView::Iterator &b)
Definition: bag_view.cpp:203
ros::serialization::Serializer< rosbag_fancy::BagReader::Message >::serializedLength
static uint32_t serializedLength(const rosbag_fancy::BagReader::Message &t)
Definition: bag_reader.h:241
rosbag_fancy::BagReader::Iterator::Iterator
Iterator()
Definition: bag_reader.h:133
rosbag_fancy::BagReader::Connection
Definition: bag_reader.h:32
ros
rosbag_fancy::BagReader::chunkBegin
Iterator chunkBegin(int chunk) const
Definition: bag_reader.cpp:815
rosbag_fancy::BagReader::Message::connection
const Connection * connection
Definition: bag_reader.h:61
time.h
rosbag_fancy::BagReader::Connection::msgDef
std::string msgDef
Definition: bag_reader.h:40
ros::serialization
rosbag_fancy
Definition: bag_reader.cpp:240
rosbag_fancy::BagReader::endTime
ros::Time endTime() const
Definition: bag_reader.cpp:769
ros::serialization::Stream
ros::message_traits::DataType
rosbag_fancy::BagReader::~BagReader
~BagReader()
Definition: bag_reader.cpp:755
rosbag_fancy::BagReader::Connection::topicInBag
std::string topicInBag
Definition: bag_reader.h:35
rosbag_fancy::BagReader::Message
Definition: bag_reader.h:58
ros::serialization::Stream::advance
ROS_FORCE_INLINE uint8_t * advance(uint32_t len)
rosbag_fancy::BagReader::ChunkIterator::iterator_category
std::input_iterator_tag iterator_category
Definition: bag_reader.h:96
std::size_t
decltype(sizeof(void *)) typede size_t)
Definition: doctest.h:501
rosbag_fancy::BagReader::ConnectionInfo
Definition: bag_reader.h:49
rosbag_fancy::BagReader::end
Iterator end() const
Definition: bag_reader.cpp:787
rosbag_fancy::BagReader::Message::instantiate
boost::shared_ptr< M > instantiate() const
Definition: bag_reader.h:64
rosbag_fancy::BagReader::Iterator::m_chunk
int m_chunk
Definition: bag_reader.h:162
rosbag_fancy::BagReader::Iterator::operator->
pointer operator->()
Definition: bag_reader.h:138
rosbag_fancy::BagReader::Iterator::m_reader
const BagReader * m_reader
Definition: bag_reader.h:161
rosbag_fancy::BagReader::Private
Definition: bag_reader.cpp:243
rosbag_fancy::BagReader::Message::stamp
ros::Time stamp
Definition: bag_reader.h:60
rosbag_fancy::BagReader::ChunkIterator::m_d
std::shared_ptr< Private > m_d
Definition: bag_reader.h:119
ros::message_traits::Definition< rosbag_fancy::BagReader::Message >::value
static const char * value(const rosbag_fancy::BagReader::Message &m)
Definition: bag_reader.h:223
serialization.h
rosbag_fancy::BagReader::ConnectionMap
std::map< std::uint32_t, Connection > ConnectionMap
Definition: bag_reader.h:47
rosbag_fancy::BagReader::connections
const ConnectionMap & connections() const
Definition: bag_reader.cpp:759
rosbag_fancy::BagReader::ChunkIterator
Definition: bag_reader.h:93
rosbag_fancy::BagReader::numChunks
std::size_t numChunks() const
Definition: bag_reader.cpp:823
rosbag_fancy::BagReader::Connection::type
std::string type
Definition: bag_reader.h:38
ros::message_traits::MD5Sum
ros::message_traits::DataType< rosbag_fancy::BagReader::Message >::value
static const char * value(const rosbag_fancy::BagReader::Message &m)
Definition: bag_reader.h:214
rosbag_fancy::BagReader::m_d
std::unique_ptr< Private > m_d
Definition: bag_reader.h:190
rosbag_fancy::BagReader::Connection::id
std::uint32_t id
Definition: bag_reader.h:34
rosbag_fancy::BagReader::findChunk
int findChunk(const ros::Time &time) const
rosbag_fancy::BagReader
Definition: bag_reader.h:21
rosbag_fancy::BagReader::ConnectionInfo::msgCount
std::uint32_t msgCount
Definition: bag_reader.h:52
rosbag::compression::CompressionType
CompressionType
rosbag_fancy::BagReader::Iterator
Definition: bag_reader.h:125
rosbag_fancy::BagReader::Iterator::m_it
ChunkIterator m_it
Definition: bag_reader.h:163
rosbag_fancy::BagReader::ConnectionInfo::id
std::uint32_t id
Definition: bag_reader.h:51
rosbag_fancy::BagReader::Exception::Exception
Exception(const std::string &what)
Definition: bag_reader.h:27
rosbag_fancy::BagReader::Message::size
std::size_t size() const
Definition: bag_reader.h:82
ros::Time
rosbag_fancy::BagReader::begin
Iterator begin() const
Definition: bag_reader.cpp:779
std
rosbag_fancy::BagReader::Iterator::operator*
reference operator*()
Definition: bag_reader.h:137
rosbag_fancy::BagReader::Connection::topicAsPublished
std::string topicAsPublished
Definition: bag_reader.h:37
rosbag_fancy::BagReader::Exception
Definition: bag_reader.h:24
ros::message_traits::IsMessage
ros::serialization::Serializer< rosbag_fancy::BagReader::Message >::write
static void write(Stream &stream, const rosbag_fancy::BagReader::Message &t)
Definition: bag_reader.h:236
rosbag_fancy::BagReader::Iterator::chunk
int chunk() const
Definition: bag_reader.h:153
rosbag_fancy::BagReader::Connection::latching
bool latching
Definition: bag_reader.h:42
rosbag_fancy::BagReader::ChunkIterator::operator*
reference operator*()
Definition: bag_reader.h:104
rosbag_fancy::BagReader::Message::m_size
std::size_t m_size
Definition: bag_reader.h:90
rosbag_fancy::BagReader::ChunkIterator::operator->
pointer operator->()
Definition: bag_reader.h:105
rosbag_fancy::BagReader::BagReader
BagReader(const std::string &filename)
Definition: bag_reader.cpp:605
ros::message_traits::Definition
rosbag_fancy::BagReader::Iterator::iterator_category
std::input_iterator_tag iterator_category
Definition: bag_reader.h:128
rosbag_fancy::BagReader::ChunkIterator::m_idx
std::size_t m_idx
Definition: bag_reader.h:121
rosbag_fancy::BagReader::findTime
Iterator findTime(const ros::Time &time) const
Definition: bag_reader.cpp:792
rosbag_fancy::BagReader::Connection::md5sum
std::string md5sum
Definition: bag_reader.h:39
rosbag_fancy::operator!=
bool operator!=(const BagView::Iterator &a, const BagView::Iterator &b)
Definition: bag_view.cpp:209
rosbag_fancy::BagReader::startTime
ros::Time startTime() const
Definition: bag_reader.cpp:764
rosbag_fancy::BagReader::ChunkIterator::Private
Definition: bag_reader.cpp:262
rosbag_fancy::BagReader::ChunkIterator::m_msg
Message m_msg
Definition: bag_reader.h:122
ros::serialization::Serializer
rosbag_fancy::BagReader::ChunkIterator::ChunkIterator
ChunkIterator()
Definition: bag_reader.h:116
stream.h


rosbag_fancy
Author(s):
autogenerated on Tue Feb 20 2024 03:20:59