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:
40  unsigned int i_, j_;
41  unsigned int src_i_, src_j_;
42 };
43 
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  }
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_;
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 
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 
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