// it's for Latex

pages

[hector_slam code review] #06. hector_mapping : GridMapReflectanceCount.h

GridMapReflectanceCount.h






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
101
102
103
104
105
106
107
108
109
110
111
//=================================================================================================
// 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 __GridMapReflectanceCount_h_
#define __GridMapReflectanceCount_h_
/**
 * Provides a reflectance count representation for cells in a occupancy grid map.
 */
class ReflectanceCell
{
public:
  void set(float val)
  {
    probOccupied = val;
  }
  float getValue() const
  {
    return probOccupied;
  }
  bool isOccupied() const
  {
    return probOccupied > 0.5f;
  }
  bool isFree() const{
    return probOccupied < 0.5f;
  }
  void resetGridCell()
  {
    probOccupied = 0.5f;
    visitedCount = 0.0f;
    reflectedCount = 0.0f;
    updateIndex = -1;
  }
//protected:
  float visitedCount;
  float reflectedCount;
  float probOccupied;
  int updateIndex;
};
class GridMapReflectanceFunctions
{
public:
  GridMapReflectanceFunctions()
  {}
  void updateSetOccupied(ReflectanceCell& cell) const
  {
    ++cell.reflectedCount;
    ++cell.visitedCount;
    cell.probOccupied = cell.reflectedCount / cell.visitedCount;
  }
  void updateSetFree(ReflectanceCell& cell) const
  {
    ++cell.visitedCount;
    cell.probOccupied = cell.reflectedCount / cell.visitedCount;
  }
  void updateUnsetFree(ReflectanceCell& cell) const
  {
    --cell.visitedCount;
    cell.probOccupied = cell.reflectedCount / cell.visitedCount;
  }
  float getGridProbability(const ReflectanceCell& cell) const
  {
    return cell.probOccupied;
  }
protected:
};
#endif
cs



#ifndef __GridMapReflectanceCount_h_
#define __GridMapReflectanceCount_h_



헤더파일의 내용
#endif

링크 참조 (https://m.blog.naver.com/PostView.nhn?blogId=sharonichoya&logNo=220507818075&proxyReferer=https%3A%2F%2Fwww.google.com%2F)

매우 자주 사용되는 (거의 99%) 방법으로 헤더파일을 include 할 때, 이중포함 및 컴파일을 방지하는 방법이다. 헤더파일의 처음과 끝에 매크로를 이용하여 이를 방지할 수 있다.

가장 먼저 __GridMapReflectanceCount_h_ 가 정의되어 있는지를 살펴본다. 만약 정의되어 있지 않다면, 바로 다음 아래 줄에서 이를 정의하게 된다. 그리고 헤더파일의 내용이 있고, #endif로 끝나게 된다. 즉 #ifdef에 의해 __GridMapReflectanceCount_h_가 정의되어 있지 않은 경우에만 이 헤더파일을 컴파일하게 된다. 최초에 이 헤더파일을 include 하게 되면 당연히 __GridMapReflectanceCount_h_ 는 정의되어 있지 않을 것이며 #ifdef의 조건이 참이 되어 컴파일하게 될 것이다. 그런데 참이 되는 순간에 바로 __GridMapReflectanceCount_h_ 를 #define 하게 된다. 따라서 다음에 또 이 헤더파일을 include 한다 하여도 이미 __GridMapReflectanceCount_h_ 는 define 되어 있기에, #ifndef __GridMapReflectanceCount_h_ 는 거짓이 되어 더이상 그 안에 내용을 컴파일하지 않게 된다. (즉 포함하지 않게 된다.) 우리가 버릇처럼 사용하는 #include <stdio.h> 를 만약 두 번, 세 번 썼다고 가정해보자. 그렇다고 두 번, 세 번 stdio.h 가 포함되어 컴파일 되지는 않는다. 바로 위와 같은 헤더파일의 이중포함 방지를 매크로를 이용해서 정의해두었기 때문이다.




/**
 * Provides a reflectance count representation for cells in a occupancy grid map.
 */
class ReflectanceCell
{

해당 Class는 Occupancy Grid Map에서 Cell의 반사율을 표현하기 위해 존재한다고 한다.



  void set(float val)
  {
    probOccupied = val;
  }

probOccupied 라는 변수에 Occupied된 probability를 저장한다.



  float getValue() const
  {
    return probOccupied;
  }

값을 가져온다.



  bool isOccupied() const
  {
    return probOccupied > 0.5f;
  }

probOccupied 가 0.5f 보다 크면 true를 반환한다.

Occupancy Grid Map에서 0.5f 보다 크면 Occupied 하다고 판단하기 때문이다.
즉 isOccupied() 는 해당 Cell이 Occupied 한지 판단하는 Function이다.



  bool isFree() const{
    return probOccupied < 0.5f;
  }

반대로 0.5f 보다 작으면 Free라고 판단함으로써, isFree() 함수를 만들 수 있다.



  void resetGridCell()
  {
    probOccupied = 0.5f;
    visitedCount = 0.0f;
    reflectedCount = 0.0f;
    updateIndex = -1;
  }
  float visitedCount;
  float reflectedCount;
  float probOccupied;
  int updateIndex;

GridCell의 값들을 reset 시킨다.

Occupied probability가 0.5f 란 것은 미확인 상태란 의미이다 (회색)
visitedCount 는 방문횟수
reflectedCount는 반사된 횟수
updateIndex는 update된 횟수 일 것이다... (모두 추측)



class GridMapReflectanceFunctions
{
public:
  GridMapReflectanceFunctions()
  {}

class와 생성자이다.



  void updateSetOccupied(ReflectanceCell& cell) const
  {
    ++cell.reflectedCount;
    ++cell.visitedCount;
    cell.probOccupied = cell.reflectedCount / cell.visitedCount;
  }

probOccupied 의 값이 reflectedCount / visitedCount 로 정해진다.

즉, reflectedCount는 해당 cell에서 LiDAR Sensor의 반사가 이뤄진, 즉, 장애물이 존재한 횟수.
visitedCount는 해당 cell을 거쳐간 횟수를 의미하는 것이다. 장애물이 있건 없건 말이다.

헌데 updateSetOccupied 함수는 reflectedCount와 viditedCount를 모두 증가시키니 LiDAR Sensor에서 장애물이 검출된 경우 updateSetOccupied 함수를 발동시킬 것을 알 수 있다.



  void updateSetFree(ReflectanceCell& cell) const
  {
    ++cell.visitedCount;
    cell.probOccupied = cell.reflectedCount / cell.visitedCount;
  }

반대로 Cell에 장애물이 없이 지나갔을 경우 viditedCount 만을 증가시켜
probOccupied 값을 정의한다.



  void updateUnsetFree(ReflectanceCell& cell) const
  {
    --cell.visitedCount;
    cell.probOccupied = cell.reflectedCount / cell.visitedCount;
  }

음... 이 과정은 visitedCount를 줄이는 것인데, 어떤 상황에 줄이는 작업을 수행하는 것일까?



  float getGridProbability(const ReflectanceCell& cell) const
  {
    return cell.probOccupied;
  }

probOccupied 값을 반환해준다.











댓글 없음:

댓글 쓰기