DataPointContainer.h
Point Data를 Container에 쌓아주는 Class가 존재하는 header file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
//=================================================================================================
// Copyright (c) 2011, Stefan Kohlbrecher, TU Darmstadt
// All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of the Simulation, Systems Optimization and Robotics
// group, TU Darmstadt nor the names of its contributors may be used to
// endorse or promote products derived from this software without
// specific prior written permission.
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//=================================================================================================
#ifndef __DataPointContainer_h_
#define __DataPointContainer_h_
#include <vector>
namespace hectorslam {
template<typename DataPointType>
class DataPointContainer
{
public:
DataPointContainer(int size = 1000)
{
dataPoints.reserve(size);
}
void setFrom(const DataPointContainer& other, float factor)
{
origo = other.getOrigo()*factor;
dataPoints = other.dataPoints;
unsigned int size = dataPoints.size();
for (unsigned int i = 0; i < size; ++i){
dataPoints[i] *= factor;
}
}
void add(const DataPointType& dataPoint)
{
dataPoints.push_back(dataPoint);
}
void clear()
{
dataPoints.clear();
}
int getSize() const
{
return dataPoints.size();
}
const DataPointType& getVecEntry(int index) const
{
return dataPoints[index];
}
DataPointType getOrigo() const
{
return origo;
}
void setOrigo(const DataPointType& origoIn)
{
origo = origoIn;
}
protected:
std::vector<DataPointType> dataPoints;
DataPointType origo;
};
typedef DataPointContainer<Eigen::Vector2f> DataContainer;
}
#endif
| cs |
namespace hectorslam {
namespace가 hectorslam 이므로
다른 위치에서 호출할 때,
using namespace hectorslam
혹은
hectorslam::GridMap
과 같이 사용해야 한다.
template<typename DataPointType>
여기서는 "클래스 템플릿"으로 작용한다.
"클래스 템플릿"이란 다음의 예를 통해 이해할 수 있다.
template <typename T>
class Box {
T data;
public :
Box() { }
void set(T value) {
data = value;
}
T get() {
return data;
}
};
int main()
{
Box<int> box;
box.set(100);
cout << box.get() << endl;
Box<double> box1;
box1.set(3.141592);
cout << box1.get() << endl;
return 0;
}
결과값
100
3.14159
즉, 다음과 같은 순서를 따르게 되는 것이다.
1. 클래스 템플릿을 만듦.
2. class 객체를 만들 때, 해당 템플릿의 typename이 어떤 자료형을 지닐지 언급해줌.
3. class 객체가 만들어지면서 해당 typename들은 2번에서 언급된 자료형으로 바뀌어 생성됨.
typedef DataPointContainer<Eigen::Vector2f> DataContainer;
typedef A B;
A라는 자료형을 B라는 별칭으로 정의하는 것이다.
즉, DataContainer 라는 별칭으로 Class 객체를 만들시에 DataPointContainer는 DataPointContainer<Eigen::Vector2f> 라는 템플릿으로 생성이 되는 것이다.
protected:
std::vector<DataPointType> dataPoints;
DataPointType origo;
dataPoints의 경우 기본적으로 vector형태인데, <DataPointType> 은 <Eigen::Vector2f> 형태이다.
typedef DataPointContainer<Eigen::Vector2f> DataContainer;
위 내용으로 인해 <Eigen::Vector2f> 타입을 갖게 된다.
DataPointType origo;
DataPointType은 <Eigen::Vector2f> 이므로, Vector2f 형태의 포인트(좌표)를 의미하게 될 것이다.
DataPointContainer(int size = 1000)
{
dataPoints.reserve(size);
}
생성자이다. 매개변수로 size를 주게 되고, 특정 값이 주어지지 않는다면, 1000이란 값으로 시작하게 된다.
reserve 함수는 다음에서 살펴보자.
reserve 함수는 Eigen에서 제공하는 함수이며, dataPoints 변수가 Eigen::Vector2f의 형태를 갖기 때문에 reserve 함수 를 사용할 수 있는 것이다.
Resize/Reserve |
sm1.resize(m,n); // Change sm1 to a m x n matrix.
sm1.reserve(nnz); // Allocate room for nnz nonzeros elements.
| Note that when calling reserve(), it is not required that nnz is the exact number of nonzero elements in the final matrix. However, an exact estimation will avoid multiple reallocations during the insertion phase. |
혹시나 dataPoints에 0이 담길 상황을 피하기 위하여 reserve 함수를 이용하여 nonzeros elements만을 allocate 해준다.
void setFrom(const DataPointContainer& other, float factor)
{
origo = other.getOrigo()*factor;
dataPoints = other.dataPoints;
unsigned int size = dataPoints.size();
for (unsigned int i = 0; i < size; ++i){
dataPoints[i] *= factor;
}
}
origo = other.getOrigo()*factor;
매개변수로 주어진 other의 origo를 가져와 factor와 곱해서 origo에 저장해준다.
스케일의 개념인 것 같다.
아래의 함수를 이용한다.
DataPointType getOrigo() const
{
return origo;
}
dataPoints = other.dataPoints;
dataPoints도 가져와준다.
unsigned int size = dataPoints.size();
dataPoints의 사이즈를 가져온다.
for (unsigned int i = 0; i < size; ++i){
dataPoints[i] *= factor;
}
dataPoints의 각 값에 factor를 곱해준다.
void add(const DataPointType& dataPoint)
{
dataPoints.push_back(dataPoint);
}
dataPoints.push_back(dataPoint);
push_back은 std::vector에 존재하는 함수이다.
dataPoints는 크기가 정해지지 않은 vector인데
이 dataPoints라는 container에 dataPoint를 추가하는 것이다.
data는 [0]부터 차례대로 추가된다.
void clear()
{
dataPoints.clear();
}
dataPoints의 data를 다 비워준다.
int getSize() const
{
return dataPoints.size();
}
dataPoints의 size를 반환하는 함수이다.
const DataPointType& getVecEntry(int index) const
{
return dataPoints[index];
}
index 값을 parameter로 받아
dataPoints에서 해당 index에 해당하는 값을 return해준다.
void setOrigo(const DataPointType& origoIn)
{
origo = origoIn;
}
origo의 값을 set해준다.
댓글 없음:
댓글 쓰기