src
gmcl
map
map_cspace.cpp
Go to the documentation of this file.
1
//this package is based on amcl and has been modified to fit gmcl
2
/*
3
* Author: Mhd Ali Alshikh Khalil
4
* Date: 20 June 2021
5
*
6
*/
7
8
//amcl author clarification
9
/*
10
* Player - One Hell of a Robot Server
11
* Copyright (C) 2000 Brian Gerkey & Kasper Stoy
12
* gerkey@usc.edu kaspers@robotics.usc.edu
13
*
14
* This library is free software; you can redistribute it and/or
15
* modify it under the terms of the GNU Lesser General Public
16
* License as published by the Free Software Foundation; either
17
* version 2.1 of the License, or (at your option) any later version.
18
*
19
* This library is distributed in the hope that it will be useful,
20
* but WITHOUT ANY WARRANTY; without even the implied warranty of
21
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22
* Lesser General Public License for more details.
23
*
24
* You should have received a copy of the GNU Lesser General Public
25
* License along with this library; if not, write to the Free Software
26
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27
*
28
*/
29
30
#include <queue>
31
#include <math.h>
32
#include <stdlib.h>
33
#include <string.h>
34
#include "
gmcl/map/map.h
"
35
36
class
CellData
37
{
38
public
:
39
map_t
*
map_
;
40
unsigned
int
i_
,
j_
;
41
unsigned
int
src_i_
,
src_j_
;
42
};
43
44
class
CachedDistanceMap
45
{
46
public
:
47
CachedDistanceMap
(
double
scale,
double
max_dist) :
48
distances_
(NULL),
scale_
(scale),
max_dist_
(max_dist)
49
{
50
cell_radius_
= max_dist / scale;
51
distances_
=
new
double
*[
cell_radius_
+2];
52
for
(
int
i=0; i<=
cell_radius_
+1; i++)
53
{
54
distances_
[i] =
new
double
[
cell_radius_
+2];
55
for
(
int
j=0; j<=
cell_radius_
+1; j++)
56
{
57
distances_
[i][j] = sqrt(i*i + j*j);
58
}
59
}
60
}
61
~CachedDistanceMap
()
62
{
63
if
(
distances_
)
64
{
65
for
(
int
i=0; i<=
cell_radius_
+1; i++)
66
delete
[]
distances_
[i];
67
delete
[]
distances_
;
68
}
69
}
70
double
**
distances_
;
71
double
scale_
;
72
double
max_dist_
;
73
int
cell_radius_
;
74
};
75
76
77
bool
operator<
(
const
CellData
& a,
const
CellData
& b)
78
{
79
return
a.
map_
->
cells
[
MAP_INDEX
(a.
map_
, a.
i_
, a.
j_
)].
occ_dist
> a.
map_
->
cells
[
MAP_INDEX
(b.
map_
, b.
i_
, b.
j_
)].
occ_dist
;
80
}
81
82
CachedDistanceMap
*
83
get_distance_map
(
double
scale,
double
max_dist)
84
{
85
static
CachedDistanceMap
* cdm = NULL;
86
87
if
(!cdm || (cdm->
scale_
!= scale) || (cdm->
max_dist_
!= max_dist))
88
{
89
if
(cdm)
90
delete
cdm;
91
cdm =
new
CachedDistanceMap
(scale, max_dist);
92
}
93
94
return
cdm;
95
}
96
97
void
enqueue
(
map_t
* map,
int
i,
int
j,
98
int
src_i,
int
src_j,
99
std::priority_queue<CellData>& Q,
100
CachedDistanceMap
* cdm,
101
unsigned
char
* marked)
102
{
103
if
(marked[
MAP_INDEX
(map, i, j)])
104
return
;
105
106
int
di = abs(i - src_i);
107
int
dj = abs(j - src_j);
108
double
distance = cdm->
distances_
[di][dj];
109
110
if
(distance > cdm->
cell_radius_
)
111
return
;
112
113
map->
cells
[
MAP_INDEX
(map, i, j)].
occ_dist
= distance * map->
scale
;
114
115
CellData
cell;
116
cell.
map_
= map;
117
cell.
i_
= i;
118
cell.
j_
= j;
119
cell.
src_i_
= src_i;
120
cell.
src_j_
= src_j;
121
122
Q.push(cell);
123
124
marked[
MAP_INDEX
(map, i, j)] = 1;
125
}
126
127
// Update the cspace distance values
128
void
map_update_cspace
(
map_t
*map,
double
max_occ_dist)
129
{
130
unsigned
char
* marked;
131
std::priority_queue<CellData> Q;
132
133
marked =
new
unsigned
char
[map->
size_x
*map->
size_y
];
134
memset(marked, 0,
sizeof
(
unsigned
char
) * map->
size_x
*map->
size_y
);
135
136
map->
max_occ_dist
= max_occ_dist;
137
138
CachedDistanceMap
* cdm =
get_distance_map
(map->
scale
, map->
max_occ_dist
);
139
140
// Enqueue all the obstacle cells
141
CellData
cell;
142
cell.
map_
= map;
143
for
(
int
i=0; i<map->
size_x
; i++)
144
{
145
cell.
src_i_
= cell.
i_
= i;
146
for
(
int
j=0; j<map->
size_y
; j++)
147
{
148
if
(map->
cells
[
MAP_INDEX
(map, i, j)].occ_state == +1)
149
{
150
map->
cells
[
MAP_INDEX
(map, i, j)].
occ_dist
= 0.0;
151
cell.
src_j_
= cell.
j_
= j;
152
marked[
MAP_INDEX
(map, i, j)] = 1;
153
Q.push(cell);
154
}
155
else
156
map->
cells
[
MAP_INDEX
(map, i, j)].
occ_dist
= max_occ_dist;
157
}
158
}
159
160
while
(!Q.empty())
161
{
162
CellData
current_cell = Q.top();
163
if
(current_cell.
i_
> 0)
164
enqueue
(map, current_cell.
i_
-1, current_cell.
j_
,
165
current_cell.
src_i_
, current_cell.
src_j_
,
166
Q, cdm, marked);
167
if
(current_cell.
j_
> 0)
168
enqueue
(map, current_cell.
i_
, current_cell.
j_
-1,
169
current_cell.
src_i_
, current_cell.
src_j_
,
170
Q, cdm, marked);
171
if
((
int
)current_cell.
i_
< map->
size_x
- 1)
172
enqueue
(map, current_cell.
i_
+1, current_cell.
j_
,
173
current_cell.
src_i_
, current_cell.
src_j_
,
174
Q, cdm, marked);
175
if
((
int
)current_cell.
j_
< map->
size_y
- 1)
176
enqueue
(map, current_cell.
i_
, current_cell.
j_
+1,
177
current_cell.
src_i_
, current_cell.
src_j_
,
178
Q, cdm, marked);
179
180
Q.pop();
181
}
182
183
delete
[] marked;
184
}
185
CachedDistanceMap::scale_
double scale_
Definition:
map_cspace.cpp:71
CachedDistanceMap::~CachedDistanceMap
~CachedDistanceMap()
Definition:
map_cspace.cpp:61
map_t::max_occ_dist
double max_occ_dist
Definition:
map.h:83
CachedDistanceMap::distances_
double ** distances_
Definition:
map_cspace.cpp:70
operator<
bool operator<(const CellData &a, const CellData &b)
Definition:
map_cspace.cpp:77
get_distance_map
CachedDistanceMap * get_distance_map(double scale, double max_dist)
Definition:
map_cspace.cpp:83
enqueue
void enqueue(map_t *map, int i, int j, int src_i, int src_j, std::priority_queue< CellData > &Q, CachedDistanceMap *cdm, unsigned char *marked)
Definition:
map_cspace.cpp:97
map_cell_t::occ_dist
double occ_dist
Definition:
map.h:58
CellData::map_
map_t * map_
Definition:
map_cspace.cpp:39
map_t::cells
map_cell_t * cells
Definition:
map.h:79
CellData
Definition:
map_cspace.cpp:36
MAP_INDEX
#define MAP_INDEX(map, i, j)
Definition:
map.h:207
CellData::j_
unsigned int j_
Definition:
map_cspace.cpp:40
CachedDistanceMap
Definition:
map_cspace.cpp:44
map.h
CachedDistanceMap::max_dist_
double max_dist_
Definition:
map_cspace.cpp:72
CachedDistanceMap::cell_radius_
int cell_radius_
Definition:
map_cspace.cpp:73
map_t::scale
double scale
Definition:
map.h:73
CellData::i_
unsigned int i_
Definition:
map_cspace.cpp:40
map_update_cspace
void map_update_cspace(map_t *map, double max_occ_dist)
Definition:
map_cspace.cpp:128
map_t::size_x
int size_x
Definition:
map.h:76
map_t
Definition:
map.h:67
map_t::size_y
int size_y
Definition:
map.h:76
CellData::src_j_
unsigned int src_j_
Definition:
map_cspace.cpp:41
CachedDistanceMap::CachedDistanceMap
CachedDistanceMap(double scale, double max_dist)
Definition:
map_cspace.cpp:47
CellData::src_i_
unsigned int src_i_
Definition:
map_cspace.cpp:41
gmcl
Author(s): Mhd Ali Alshikh Khalil, adler1994@gmail.com
autogenerated on Wed Mar 2 2022 00:20:14