grid_astar_model_3dof.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019-2020, the neonavigation authors
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * * Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * * Neither the name of the copyright holder nor the names of its
14  * contributors may be used to endorse or promote products derived from
15  * this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #include <cmath>
31 #include <limits>
32 #include <list>
33 #include <utility>
34 #include <vector>
35 
36 #include <ros/ros.h>
37 
38 #include <costmap_cspace_msgs/MapMetaData3D.h>
39 
45 
46 namespace planner_cspace
47 {
48 namespace planner_3d
49 {
51  const costmap_cspace_msgs::MapMetaData3D& map_info,
52  const Vecf& euclid_cost_coef,
53  const int local_range,
54  const BlockMemGridmapBase<float, 3, 2>& cost_estim_cache,
56  const BlockMemGridmapBase<char, 3, 2>& cm_hyst,
57  const BlockMemGridmapBase<char, 3, 2>& cm_rough,
58  const CostCoeff& cc,
59  const int range,
60  const float path_interpolation_resolution,
61  const float grid_enumeration_resolution)
62  : hysteresis_(false)
63  , map_info_(map_info)
64  , euclid_cost_coef_(euclid_cost_coef)
65  , resolution_(
66  1.0f / map_info.linear_resolution,
67  1.0f / map_info.linear_resolution,
68  1.0f / map_info.angular_resolution)
69  , local_range_(local_range)
70  , cost_estim_cache_(cost_estim_cache)
71  , cm_(cm)
72  , cm_hyst_(cm_hyst)
73  , cm_rough_(cm_rough)
74  , cc_(cc)
75  , range_(range)
76 {
77  rot_cache_.reset(map_info_.linear_resolution, map_info_.angular_resolution, range_);
78 
79  costmap_cspace_msgs::MapMetaData3D map_info_linear(map_info_);
80  map_info_linear.angle = 1;
81 
83  map_info_linear.linear_resolution,
84  map_info_linear.angular_resolution,
85  range_,
87  path_interpolation_resolution,
88  grid_enumeration_resolution);
90  map_info_.linear_resolution,
91  map_info_.angular_resolution,
92  range_,
93  cm_.getAddressor(),
94  path_interpolation_resolution,
95  grid_enumeration_resolution);
96 
97  // Make boundary check threshold
100  Vec(static_cast<int>(map_info_.width),
101  static_cast<int>(map_info_.height),
102  static_cast<int>(map_info_.angle)) -
104  ROS_INFO("x:%d, y:%d grids around the boundary is ignored on path search", min_boundary_[0], min_boundary_[1]);
105 
107  search_list_rough_.clear();
108  Vec d;
109  for (d[0] = -range_; d[0] <= range_; d[0]++)
110  {
111  for (d[1] = -range_; d[1] <= range_; d[1]++)
112  {
113  if (d.sqlen() > range_ * range_)
114  continue;
115  d[2] = 0;
116  search_list_rough_.push_back(d);
117  }
118  }
119 }
120 
122  const Vecf& euclid_cost_coef,
123  const CostCoeff& cc,
124  const int local_range)
125 {
126  euclid_cost_coef_ = euclid_cost_coef;
127  cc_ = cc;
128  local_range_ = local_range;
131 }
132 
133 void GridAstarModel3D::enableHysteresis(const bool enable)
134 {
135  hysteresis_ = enable;
136 }
138 {
139  for (int rootsum = 0;
140  rootsum < static_cast<int>(euclid_cost_lin_cache_.size()); ++rootsum)
141  {
142  euclid_cost_lin_cache_[rootsum] = std::sqrt(rootsum) * euclid_cost_coef_[0];
143  }
144 }
145 float GridAstarModel3D::euclidCost(const Vec& v) const
146 {
147  float cost = euclidCostRough(v);
148 
149  int angle = v[2];
150  while (angle > static_cast<int>(map_info_.angle) / 2)
151  angle -= static_cast<int>(map_info_.angle);
152  while (angle < -static_cast<int>(map_info_.angle) / 2)
153  angle += static_cast<int>(map_info_.angle);
154  cost += std::abs(euclid_cost_coef_[2] * angle);
155  return cost;
156 }
158 {
159  int rootsum = 0;
160  for (int i = 0; i < 2; ++i)
161  rootsum += v[i] * v[i];
162 
163  if (rootsum < static_cast<int>(euclid_cost_lin_cache_.size()))
164  {
165  return euclid_cost_lin_cache_[rootsum];
166  }
167 
168  return std::sqrt(rootsum) * euclid_cost_coef_[0];
169 }
171  const Vec& cur, const Vec& next, const std::vector<VecWithCost>& start, const Vec& goal) const
172 {
173  if ((cm_[cur] > 99) || (cm_[next] > 99))
174  {
175  return -1;
176  }
177  Vec d_raw = next - cur;
178  d_raw.cycle(map_info_.angle);
179  const Vec d = d_raw;
180  float cost = euclidCost(d);
181 
182  if (d[0] == 0 && d[1] == 0)
183  {
184  // In-place turn
185  int sum = 0;
186  const int dir = d[2] < 0 ? -1 : 1;
187  Vec pos = cur;
188  for (int i = 0; i < std::abs(d[2]); i++)
189  {
190  const auto c = cm_[pos];
191  if (c > 99)
192  return -1;
194  {
195  sum += c;
196  }
197  pos[2] += dir;
198  if (pos[2] < 0)
199  pos[2] += map_info_.angle;
200  else if (pos[2] >= static_cast<int>(map_info_.angle))
201  pos[2] -= map_info_.angle;
202  }
203  const float turn_cost_ratio = cc_.weight_costmap_turn_ / 100.0;
204  const float turn_heuristic_cost_ratio =
206  const float turn_cost_multiplier = map_info_.angular_resolution * (turn_cost_ratio + turn_heuristic_cost_ratio);
207  // simplified from sum * map_info_.angular_resolution * abs(d[2]) * cc_.weight_costmap_turn_ / (100.0 * abs(d[2]))
208  // = sum * map_info_.angular_resolution * turn_cost_ratio
209  return cost + cc_.in_place_turn_ + sum * turn_cost_multiplier;
210  }
211 
212  const Vec d2(d[0] + range_, d[1] + range_, next[2]);
213  const Vecf motion = rot_cache_.getMotion(cur[2], d2);
214  const float dist = motion.len();
215 
216  if (motion[0] < 0)
217  {
218  // Going backward
219  cost *= 1.0 + cc_.weight_backward_;
220  }
221 
222  if (d[2] == 0)
223  {
224  const float aspect = motion[0] / motion[1];
225  cost += euclid_cost_coef_[2] * std::abs(1.0 / aspect) * map_info_.angular_resolution / (M_PI * 2.0);
226 
227  // Go-straight
228  int sum = 0, sum_hyst = 0;
229  Vec d_index(d[0], d[1], next[2]);
230  d_index.cycleUnsigned(map_info_.angle);
231 
232  const auto cache_page = motion_cache_.find(cur[2], d_index);
233  if (cache_page == motion_cache_.end(cur[2]))
234  return -1;
235  const int num = cache_page->second.getMotion().size();
236  for (const auto& pos_diff : cache_page->second.getMotion())
237  {
238  const Vec pos(
239  cur[0] + pos_diff[0], cur[1] + pos_diff[1], pos_diff[2]);
240  const auto c = cm_[pos];
241  if (c > 99)
242  return -1;
243  sum += c;
244 
245  if (hysteresis_)
246  sum_hyst += cm_hyst_[pos];
247  }
248  const float distf = cache_page->second.getDistance();
249  cost += sum * map_info_.linear_resolution * distf * cc_.weight_costmap_ / (100.0 * num);
250  cost += sum_hyst * map_info_.linear_resolution * distf * cc_.weight_hysteresis_ / (100.0 * num);
251  }
252  else
253  {
254  const std::pair<float, float>& radiuses = rot_cache_.getRadiuses(cur[2], d2);
255  const float r1 = radiuses.first;
256  const float r2 = radiuses.second;
257  const float curv_radius = (r1 + r2) / 2;
258 
259  // Ignore boundary
260  if (cur[0] < min_boundary_[0] || cur[1] < min_boundary_[1] ||
261  cur[0] >= max_boundary_[0] || cur[1] >= max_boundary_[1])
262  return -1;
263 
264  if (std::abs(cc_.max_vel_ / r1) > cc_.max_ang_vel_)
265  {
266  const float vel = std::abs(curv_radius) * cc_.max_ang_vel_;
267  // Curve deceleration penalty
268  cost += dist * std::abs(vel / cc_.max_vel_) * cc_.weight_decel_;
269  }
270 
271  {
272  int sum = 0, sum_turn = 0, sum_hyst = 0;
273  Vec d_index(d[0], d[1], next[2]);
274  d_index.cycleUnsigned(map_info_.angle);
275 
276  const auto cache_page = motion_cache_.find(cur[2], d_index);
277  if (cache_page == motion_cache_.end(cur[2]))
278  return -1;
279  const int num = cache_page->second.getMotion().size();
280  for (const auto& pos_diff : cache_page->second.getMotion())
281  {
282  const Vec pos(
283  cur[0] + pos_diff[0], cur[1] + pos_diff[1], pos_diff[2]);
284  const auto c = cm_[pos];
285  if (c > 99)
286  return -1;
288  {
289  sum_turn += c;
290  }
291  sum += c;
292 
293  if (hysteresis_)
294  sum_hyst += cm_hyst_[pos];
295  }
296  const float distf = cache_page->second.getDistance();
297  cost += sum * map_info_.linear_resolution * distf * cc_.weight_costmap_ / (100.0 * num);
298  cost += sum_turn * map_info_.angular_resolution * std::abs(d[2]) * cc_.weight_costmap_turn_ / (100.0 * num);
299  cost += sum_hyst * map_info_.linear_resolution * distf * cc_.weight_hysteresis_ / (100.0 * num);
300  }
301  }
302 
303  return cost;
304 }
306  const Vec& cur, const Vec& goal) const
307 {
308  Vec s2(cur[0], cur[1], 0);
309  float cost = cost_estim_cache_[s2];
310  if (cost == std::numeric_limits<float>::max())
311  return std::numeric_limits<float>::max();
312 
313  int diff = cur[2] - goal[2];
314  while (diff > static_cast<int>(map_info_.angle) / 2)
315  diff -= static_cast<int>(map_info_.angle);
316  while (diff < -static_cast<int>(map_info_.angle) / 2)
317  diff += static_cast<int>(map_info_.angle);
318 
319  cost += euclid_cost_coef_[2] * std::abs(diff);
320 
321  return cost;
322 }
323 const std::vector<GridAstarModel3D::Vec>& GridAstarModel3D::searchGrids(
324  const Vec& p,
325  const std::vector<VecWithCost>& ss,
326  const Vec& es) const
327 {
328  const float local_range_sq = local_range_ * local_range_;
329  for (const VecWithCost& s : ss)
330  {
331  const Vec ds = s.v_ - p;
332 
333  if (ds.sqlen() < local_range_sq)
334  {
335  return motion_primitives_[p[2]];
336  }
337  }
338  return search_list_rough_;
339 }
340 
341 std::list<GridAstarModel3D::Vecf> GridAstarModel3D::interpolatePath(const std::list<Vec>& grid_path) const
342 {
343  return motion_cache_.interpolatePath(grid_path);
344 }
345 
347  const Vec& cur, const Vec& next, const std::vector<VecWithCost>& start, const Vec& goal) const
348 {
349  Vec d = next - cur;
350  d[2] = 0;
351  float cost = base_->euclidCostRough(d);
352 
353  int sum = 0;
354  const auto cache_page = base_->motion_cache_linear_.find(0, d);
355  if (cache_page == base_->motion_cache_linear_.end(0))
356  return -1;
357  const int num = cache_page->second.getMotion().size();
358  for (const auto& pos_diff : cache_page->second.getMotion())
359  {
360  const Vec pos(cur[0] + pos_diff[0], cur[1] + pos_diff[1], 0);
361  const auto c = base_->cm_rough_[pos];
362  if (c > 99)
363  return -1;
364  sum += c;
365  }
366  const float distf = cache_page->second.getDistance();
367  cost += sum * base_->map_info_.linear_resolution *
368  distf * base_->cc_.weight_costmap_ / (100.0 * num);
369 
370  return cost;
371 }
373  const Vec& cur, const Vec& goal) const
374 {
375  const Vec d = goal - cur;
376  const float cost = base_->euclidCostRough(d);
377 
378  return cost;
379 }
380 const std::vector<GridAstarModel3D::Vec>& GridAstarModel2D::searchGrids(
381  const Vec& cur, const std::vector<VecWithCost>& start, const Vec& goal) const
382 {
383  return base_->search_list_rough_;
384 }
385 
386 } // namespace planner_3d
387 } // namespace planner_cspace
planner_cspace::planner_3d::CostCoeff
Definition: planner_3d/grid_astar_model.h:51
planner_cspace::planner_3d::GridAstarModel3D::Vec
CyclicVecInt< 3, 2 > Vec
Definition: planner_3d/grid_astar_model.h:78
planner_cspace::planner_3d::GridAstarModel3D::cm_
const BlockMemGridmapBase< char, 3, 2 > & cm_
Definition: planner_3d/grid_astar_model.h:90
planner_cspace::planner_3d::CostCoeff::max_ang_vel_
float max_ang_vel_
Definition: planner_3d/grid_astar_model.h:67
motion_primitive_builder.h
planner_cspace
Definition: bbf.h:33
planner_cspace::planner_3d::MotionCache::find
const Cache::const_iterator find(const int start_yaw, const CyclicVecInt< 3, 2 > &goal) const
Definition: motion_cache.h:76
planner_cspace::planner_3d::CostCoeff::weight_decel_
float weight_decel_
Definition: planner_3d/grid_astar_model.h:54
planner_cspace::planner_3d::GridAstarModel3D::searchGrids
const std::vector< Vec > & searchGrids(const Vec &p, const std::vector< VecWithCost > &ss, const Vec &es) const override
Definition: grid_astar_model_3dof.cpp:323
motion_cache.h
planner_cspace::planner_3d::GridAstarModel3D::cm_rough_
const BlockMemGridmapBase< char, 3, 2 > & cm_rough_
Definition: planner_3d/grid_astar_model.h:92
planner_cspace::planner_3d::GridAstarModel3D::euclid_cost_coef_
Vecf euclid_cost_coef_
Definition: planner_3d/grid_astar_model.h:84
angle
TFSIMD_FORCE_INLINE tfScalar angle(const Quaternion &q1, const Quaternion &q2)
planner_cspace::planner_3d::MotionCache::reset
void reset(const float linear_resolution, const float angular_resolution, const int range, const std::function< void(CyclicVecInt< 3, 2 >, size_t &, size_t &)> gm_addr, const float interpolation_resolution, const float grid_enumeration_resolution)
Definition: motion_cache.cpp:45
planner_cspace::planner_3d::RotationCache::reset
void reset(const float linear_resolution, const float angular_resolution, const int range)
Definition: rotation_cache.cpp:55
planner_cspace::planner_3d::GridAstarModel3D::map_info_
costmap_cspace_msgs::MapMetaData3D map_info_
Definition: planner_3d/grid_astar_model.h:83
planner_cspace::planner_3d::GridAstarModel3D::cost
float cost(const Vec &cur, const Vec &next, const std::vector< VecWithCost > &start, const Vec &goal) const override
Definition: grid_astar_model_3dof.cpp:170
rotation_cache.h
planner_cspace::planner_3d::GridAstarModel2D::costEstim
float costEstim(const Vec &cur, const Vec &goal) const final
Definition: grid_astar_model_3dof.cpp:372
planner_cspace::planner_3d::GridAstarModel3D::search_list_rough_
std::vector< Vec > search_list_rough_
Definition: planner_3d/grid_astar_model.h:87
s
XmlRpcServer s
planner_cspace::planner_3d::CostCoeff::weight_costmap_turn_
float weight_costmap_turn_
Definition: planner_3d/grid_astar_model.h:58
planner_cspace::planner_3d::MotionPrimitiveBuilder::build
static std::vector< std::vector< Vec > > build(const costmap_cspace_msgs::MapMetaData3D &map_info, const CostCoeff &cc, const int range)
Definition: motion_primitive_builder.cpp:44
ros.h
planner_cspace::planner_3d::MotionCache::getMaxRange
const CyclicVecInt< 3, 2 > & getMaxRange() const
Definition: motion_cache.h:102
planner_cspace::planner_3d::RotationCache::getRadiuses
const std::pair< float, float > & getRadiuses(const int start_angle, const CyclicVecInt< 3, 2 > &end) const
Definition: rotation_cache.h:94
planner_cspace::planner_3d::GridAstarModel3D::max_boundary_
Vec max_boundary_
Definition: planner_3d/grid_astar_model.h:99
planner_cspace::planner_3d::GridAstarModel3D::euclidCostRough
float euclidCostRough(const Vec &v) const
Definition: grid_astar_model_3dof.cpp:157
grid_astar_model.h
planner_cspace::BlockMemGridmapBase::getAddressor
virtual std::function< void(CyclicVecInt< DIM, NONCYCLIC >, size_t &, size_t &)> getAddressor() const =0
f
f
planner_cspace::planner_3d::GridAstarModel3D::motion_cache_
MotionCache motion_cache_
Definition: planner_3d/grid_astar_model.h:96
planner_cspace::planner_3d::GridAstarModel3D::range_
int range_
Definition: planner_3d/grid_astar_model.h:94
planner_cspace::planner_3d::GridAstarModel3D::rot_cache_
RotationCache rot_cache_
Definition: planner_3d/grid_astar_model.h:95
planner_cspace::planner_3d::CostCoeff::weight_costmap_turn_heuristics_
float weight_costmap_turn_heuristics_
Definition: planner_3d/grid_astar_model.h:59
planner_cspace::planner_3d::CostCoeff::turn_penalty_cost_threshold_
int turn_penalty_cost_threshold_
Definition: planner_3d/grid_astar_model.h:69
planner_cspace::BlockMemGridmapBase< float, 3, 2 >
planner_cspace::planner_3d::GridAstarModel3D::local_range_
int local_range_
Definition: planner_3d/grid_astar_model.h:88
planner_cspace::planner_3d::GridAstarModel2D::cost
float cost(const Vec &cur, const Vec &next, const std::vector< VecWithCost > &start, const Vec &goal) const final
Definition: grid_astar_model_3dof.cpp:346
planner_cspace::planner_3d::RotationCache::getMotion
const CyclicVecFloat< 3, 2 > & getMotion(const int start_angle, const CyclicVecInt< 3, 2 > &end) const
Definition: rotation_cache.h:88
planner_cspace::planner_3d::GridAstarModel2D::base_
const GridAstarModel3D::ConstPtr base_
Definition: planner_3d/grid_astar_model.h:141
planner_cspace::planner_3d::CostCoeff::max_vel_
float max_vel_
Definition: planner_3d/grid_astar_model.h:66
d
d
planner_cspace::planner_3d::GridAstarModel3D::cm_hyst_
const BlockMemGridmapBase< char, 3, 2 > & cm_hyst_
Definition: planner_3d/grid_astar_model.h:91
planner_cspace::planner_3d::GridAstarModel3D::euclid_cost_lin_cache_
std::array< float, 1024 > euclid_cost_lin_cache_
Definition: planner_3d/grid_astar_model.h:100
planner_cspace::planner_3d::GridAstarModel3D::motion_primitives_
std::vector< std::vector< Vec > > motion_primitives_
Definition: planner_3d/grid_astar_model.h:86
planner_cspace::CyclicVecBase::len
float len() const
Definition: cyclic_vec.h:249
planner_cspace::planner_3d::GridAstarModel3D::euclidCost
float euclidCost(const Vec &v) const
Definition: grid_astar_model_3dof.cpp:145
planner_cspace::planner_3d::GridAstarModel3D::cost_estim_cache_
const BlockMemGridmapBase< float, 3, 2 > & cost_estim_cache_
Definition: planner_3d/grid_astar_model.h:89
planner_cspace::CyclicVecBase::cycleUnsigned
void cycleUnsigned(const int res, const ArgList &... rest)
Definition: cyclic_vec.h:289
planner_cspace::planner_3d::GridAstarModel3D::motion_cache_linear_
MotionCache motion_cache_linear_
Definition: planner_3d/grid_astar_model.h:97
planner_cspace::planner_3d::GridAstarModel3D::createEuclidCostCache
void createEuclidCostCache()
Definition: grid_astar_model_3dof.cpp:137
planner_cspace::planner_3d::GridAstarModel3D::enableHysteresis
void enableHysteresis(const bool enable)
Definition: grid_astar_model_3dof.cpp:133
planner_cspace::planner_3d::CostCoeff::weight_costmap_
float weight_costmap_
Definition: planner_3d/grid_astar_model.h:57
planner_cspace::planner_3d::GridAstarModel3D::costEstim
float costEstim(const Vec &cur, const Vec &goal) const override
Definition: grid_astar_model_3dof.cpp:305
planner_cspace::CyclicVecBase::cycle
void cycle(const int res, const ArgList &... rest)
Definition: cyclic_vec.h:282
planner_cspace::planner_3d::GridAstarModel3D::cc_
CostCoeff cc_
Definition: planner_3d/grid_astar_model.h:93
planner_cspace::planner_3d::MotionCache::end
const Cache::const_iterator end(const int start_yaw) const
Definition: motion_cache.h:93
planner_cspace::planner_3d::CostCoeff::in_place_turn_
float in_place_turn_
Definition: planner_3d/grid_astar_model.h:62
cyclic_vec.h
planner_cspace::planner_3d::GridAstarModel3D::updateCostParameters
void updateCostParameters(const Vecf &euclid_cost_coef, const CostCoeff &cc, const int local_range)
Definition: grid_astar_model_3dof.cpp:121
planner_cspace::planner_3d::GridAstarModel3D::interpolatePath
std::list< Vecf > interpolatePath(const std::list< Vec > &path) const
Definition: grid_astar_model_3dof.cpp:341
planner_cspace::planner_3d::GridAstarModel2D::searchGrids
const std::vector< Vec > & searchGrids(const Vec &cur, const std::vector< VecWithCost > &start, const Vec &goal) const final
Definition: grid_astar_model_3dof.cpp:380
planner_cspace::CyclicVecBase::sqlen
T sqlen() const
Definition: cyclic_vec.h:240
planner_cspace::planner_3d::MotionCache::interpolatePath
std::list< CyclicVecFloat< 3, 2 > > interpolatePath(const std::list< CyclicVecInt< 3, 2 >> &path_grid) const
Definition: motion_cache.cpp:192
planner_cspace::planner_3d::CostCoeff::weight_hysteresis_
float weight_hysteresis_
Definition: planner_3d/grid_astar_model.h:61
ROS_INFO
#define ROS_INFO(...)
planner_cspace::planner_3d::GridAstarModel3D::GridAstarModel3D
GridAstarModel3D(const costmap_cspace_msgs::MapMetaData3D &map_info, const Vecf &euclid_cost_coef, const int local_range, const BlockMemGridmapBase< float, 3, 2 > &cost_estim_cache, const BlockMemGridmapBase< char, 3, 2 > &cm, const BlockMemGridmapBase< char, 3, 2 > &cm_hyst, const BlockMemGridmapBase< char, 3, 2 > &cm_rough, const CostCoeff &cc, const int range, const float path_interpolation_resolution=0.5, const float grid_enumeration_resolution=0.1)
Definition: grid_astar_model_3dof.cpp:50
planner_cspace::planner_3d::GridAstarModel3D::min_boundary_
Vec min_boundary_
Definition: planner_3d/grid_astar_model.h:98
planner_cspace::planner_3d::CostCoeff::weight_backward_
float weight_backward_
Definition: planner_3d/grid_astar_model.h:55
planner_cspace::planner_3d::GridAstarModel3D::hysteresis_
bool hysteresis_
Definition: planner_3d/grid_astar_model.h:82
planner_cspace::CyclicVecBase
Definition: cyclic_vec.h:78


planner_cspace
Author(s): Atsushi Watanabe
autogenerated on Fri May 16 2025 02:15:23