MIRA
PointCloud.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) by
3  * MetraLabs GmbH (MLAB), GERMANY
4  * and
5  * Neuroinformatics and Cognitive Robotics Labs (NICR) at TU Ilmenau, GERMANY
6  * All rights reserved.
7  *
8  * Redistribution and modification of this code is strictly prohibited.
9  *
10  * IN NO EVENT SHALL "MLAB" OR "NICR" BE LIABLE TO ANY PARTY FOR DIRECT,
11  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
12  * THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF "MLAB" OR
13  * "NICR" HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
14  *
15  * "MLAB" AND "NICR" SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING,
16  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
17  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
18  * ON AN "AS IS" BASIS, AND "MLAB" AND "NICR" HAVE NO OBLIGATION TO
19  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR MODIFICATIONS.
20  */
21 
30 #ifndef _MIRA_POINTCLOUD_H_
31 #define _MIRA_POINTCLOUD_H_
32 
33 #include <utils/Buffer.h>
34 #include <math/Eigen.h>
35 
37 
38 namespace mira { namespace maps {
39 
41 
43 {
44 public:
45 
47 
49  mFormat(format) {}
50 
52  data(std::move(iData)), mFormat(format) {}
53 
54 public:
55 
56  template <typename Reflector>
57  void reflect(Reflector& r)
58  {
60  r.member("Format", mFormat, "The format of the binary point cloud data below");
61  r.member("Data", data, "The binary point cloud data in the specified format");
62  }
63 
64 public:
65 
68 
70  return const_iterator(data.data(), pointStep());
71  }
72 
74  return iterator(data.data(), pointStep());
75  }
76 
77  const_iterator end() const {
78  return const_iterator(data.data()+data.size(), pointStep());
79  }
80 
82  return iterator(data.data()+data.size(), pointStep());
83  }
84 
85 public:
86 
87  template <typename T>
88  const T& at(std::size_t idx, const PCDataField& field) const {
89  assert(PCDataFieldTypeTrait<T>::type == field.type);
90  const uint8* ptr = data.data() + idx*pointStep();
91  return *reinterpret_cast<const T*>(ptr + field.offset);
92  }
93 
94 public:
95 
100  std::size_t size() const { return data.size() / pointStep(); }
101 
102 public:
103 
104  const PCFormat& getFormat() const { return mFormat; }
105 
110  void setFormat(const PCFormat& format) { mFormat = format; }
111 
112 public:
113 
114  std::size_t pointStep() const { return mFormat.size; }
115 
116 public:
117 
118  template<typename TPointCloud>
119  TPointCloud& castTo() { return (TPointCloud&)*this; }
120 
121  template<typename TPointCloud>
122  const TPointCloud& castTo() const { return (const TPointCloud&)*this; }
123 
124  template<typename TPointCloud>
125  TPointCloud& convertTo() {
126  mFormat = pointCloudFormat<typename TPointCloud::value_type>();
127  return (TPointCloud&)*this;
128  }
129 
130 public:
131 
141  template <typename PointType>
142  static GenericPointCloud fromStdVector(std::vector<PointType>& data) {
143  Buffer<uint8> buffer((uint8*)data.data(), data.size()*sizeof(PointType));
144  return GenericPointCloud(std::move(buffer), pointCloudFormat<PointType>());
145  }
146 
156  template <typename PointType>
157  static const GenericPointCloud fromStdVector(const std::vector<PointType>& data) {
158  Buffer<uint8> buffer((uint8*)data.data(), data.size()*sizeof(PointType));
159  return GenericPointCloud(std::move(buffer), pointCloudFormat<PointType>());
160  }
161 
162 public:
164 
165 private:
166  PCFormat mFormat;
167 };
168 
170 
171 template<typename PointType>
173 {
174 
175 public:
176 
178  GenericPointCloud(pointCloudFormat<PointType>()) {
179  assert(sizeof(PointType)==pointStep());
180  }
181 
183  GenericPointCloud(iData, pointCloudFormat<PointType>()) {
184  assert(sizeof(PointType)==pointStep());
185  }
186 
187 public:
188  // stl conform typedefs
189  typedef PointType value_type;
192 
194  return const_iterator(data.data(), pointStep());
195  }
196 
198  return iterator(data.data(), pointStep());
199  }
200 
201  const_iterator end() const {
202  return const_iterator(data.data()+data.size(), pointStep());
203  }
204 
206  return iterator(data.data()+data.size(), pointStep());
207  }
208 
209  const PointType& at(std::size_t idx) const {
210  const uint8* ptr = data.data() + idx*pointStep();
211  return *reinterpret_cast<const PointType*>(ptr);
212  }
213 
214  PointType& at(std::size_t idx){
215  uint8* ptr = data.data() + idx*pointStep();
216  return *reinterpret_cast<PointType*>(ptr);
217  }
218 
219  PointType& operator[](std::size_t idx)
220  {
221  return at(idx);
222  }
223 
224  const PointType& operator[](std::size_t idx) const
225  {
226  return at(idx);
227  }
228 
229 
230 public:
231 
232  PointType* reservePoints(std::size_t count)
233  {
234  std::size_t oldSize = data.size();
235  data.resize(data.size()+pointStep()*count);
236  return reinterpret_cast<PointType*>(data.data()+oldSize);
237  }
238 
239  void push_back(const PointType& point)
240  {
241  PointType* newPoint = reservePoints(1);
242  memcpy(newPoint, &point, sizeof(PointType));
243  }
244 
245  void resize(std::size_t count) {
246  data.resize(count*pointStep());
247  }
248 
249 public:
250 
251  void clear() {
252  data.resize(0);
253  }
254 
255 };
256 
258 
259 }} // namespace
260 
261 #endif /* _MIRA_POINTCLOUD_H_ */
GenericPointCloud(const PCFormat &format)
Definition: PointCloud.h:48
const_iterator begin() const
Definition: PointCloud.h:193
const_iterator end() const
Definition: PointCloud.h:77
Definition: PointCloudFormat.h:91
TEigenFormat< Derived > format(Eigen::MatrixBase< Derived > &matrix, Eigen::IOFormat format=EigenFormat::matlab())
PointType & at(std::size_t idx)
Definition: PointCloud.h:214
Definition: PointCloud.h:172
const PointType & operator[](std::size_t idx) const
Definition: PointCloud.h:224
uint32 offset
Definition: PointCloudFormat.h:86
iterator end()
Definition: PointCloud.h:81
GenericPointCloud(Buffer< uint8 > iData, const PCFormat &format)
Definition: PointCloud.h:51
GenericPointCloudConstIterator const_iterator
Definition: PointCloud.h:66
void clear()
Definition: PointCloud.h:251
Definition: PointCloudIterator.h:46
Type type
Definition: PointCloudFormat.h:83
TPointCloud & convertTo()
Definition: PointCloud.h:125
Definition: PointCloud.h:42
STL namespace.
PointCloudConstIterator< PointType > const_iterator
Definition: PointCloud.h:190
static GenericPointCloud fromStdVector(std::vector< PointType > &data)
Creates a GenericPointCloud from an std::vector with existing data, without copying any data...
Definition: PointCloud.h:142
PointType & operator[](std::size_t idx)
Definition: PointCloud.h:219
TPointCloud & castTo()
Definition: PointCloud.h:119
void push_back(const PointType &point)
Definition: PointCloud.h:239
const TPointCloud & castTo() const
Definition: PointCloud.h:122
static const GenericPointCloud fromStdVector(const std::vector< PointType > &data)
Creates a GenericPointCloud from a const std::vector with existing data, without copying any data...
Definition: PointCloud.h:157
const PointType & at(std::size_t idx) const
Definition: PointCloud.h:209
const_iterator begin() const
Definition: PointCloud.h:69
void resize(std::size_t count)
Definition: PointCloud.h:245
size_type size() const
void setFormat(const PCFormat &format)
Prefer convertTo(), only use this to handle generic format field collections for which no respective ...
Definition: PointCloud.h:110
uint8_t uint8
Definition: PointCloudIterator.h:142
pointer data()
PointCloudIterator< PointType > iterator
Definition: PointCloud.h:191
PointCloud()
Definition: PointCloud.h:177
iterator end()
Definition: PointCloud.h:205
PCFormat pointCloudFormat()
Definition: PointCloudFormat.h:147
const PCFormat & getFormat() const
Definition: PointCloud.h:104
GenericPointCloud()
Definition: PointCloud.h:46
Definition: PointCloudIterator.h:109
PointType value_type
Definition: PointCloud.h:189
Definition: PointCloudFormat.h:45
std::size_t size() const
Returns number of points in the point cloud.
Definition: PointCloud.h:100
const_iterator end() const
Definition: PointCloud.h:201
void resize(size_type size)
PointCloud(Buffer< uint8 > iData)
Definition: PointCloud.h:182
Definition: PointCloudIterator.h:88
Definition: PointCloudFormat.h:104
iterator begin()
Definition: PointCloud.h:73
#define MIRA_REFLECT_VERSION(reflector, versionNumber)
const T & at(std::size_t idx, const PCDataField &field) const
Definition: PointCloud.h:88
std::size_t pointStep() const
Definition: PointCloud.h:114
void reflect(Reflector &r)
Definition: PointCloud.h:57
uint32 size
Definition: PointCloudFormat.h:136
Buffer< uint8 > data
Definition: PointCloud.h:163
iterator begin()
Definition: PointCloud.h:197
GenericPointCloudIterator iterator
Definition: PointCloud.h:67
PointType * reservePoints(std::size_t count)
Definition: PointCloud.h:232