reachability_state_generator.cpp
Go to the documentation of this file.
2 
3 #include <vigir_footstep_planning_lib/math.h>
4 
5 #include <vigir_footstep_planning_plugins/plugin_aggregators/robot_model.h>
6 #include <vigir_footstep_planning_plugins/plugin_aggregators/world_model.h>
7 
8 
9 
11 {
13  : StateGeneratorPlugin("reachability_state_generator")
14 {
15 }
16 
17 bool ReachabilityStateGenerator::loadParams(const vigir_generic_params::ParameterSet& params)
18 {
19  if (!StateGeneratorPlugin::loadParams(params))
20  return false;
21 
22  bool result = true;
23 
24  int threads;
25  unsigned int jobs_per_thread;
26  result &= params.getParam("threads", threads);
27  result &= params.getParam("jobs_per_thread", jobs_per_thread);
28 
29  int hash_table_size;
30  double cell_size;
31  int num_angle_bins;
32  result &= params.getParam("max_hash_size", hash_table_size);
33  result &= params.getParam("collision_check/cell_size", cell_size);
34  result &= params.getParam("collision_check/num_angle_bins", num_angle_bins);
35  double angle_bin_size = 2.0*M_PI / static_cast<double>(num_angle_bins);
36 
37  int ivMaxStepRangeX, ivMaxStepRangeY, ivMaxStepRangeTheta;
38  int ivMaxInvStepRangeX, ivMaxInvStepRangeY, ivMaxInvStepRangeTheta;
39 
41  std::vector<std::pair<int, int> > step_range;
42 
43  // step range
44  XmlRpc::XmlRpcValue step_range_x;
45  XmlRpc::XmlRpcValue step_range_y;
46  if (params.getParam("step_range/x", step_range_x) && params.getParam("step_range/y", step_range_y))
47  {
48  // create step range
49  step_range.clear();
50  step_range.reserve(step_range_x.size());
51  double max_x = (double)step_range_x[0];
52  double max_y = (double)step_range_y[0];
53  double max_inv_x = (double)step_range_x[0];
54  double max_inv_y = (double)step_range_y[0];
55  for (int i=0; i < step_range_x.size(); ++i)
56  {
57  double x = (double)step_range_x[i];
58  double y = (double)step_range_y[i];
59 
60  max_x = std::max(max_x, x);
61  max_y = std::max(max_y, y);
62  max_inv_x = std::min(max_inv_x, x);
63  max_inv_y = std::min(max_inv_y, y);
64 
65  step_range.push_back(std::pair<int, int>(disc_val(x, cell_size), disc_val(y, cell_size)));
66  }
67 
68  double max_step_range_theta;
69  double max_inverse_step_range_theta;
70  result &= params.getParam("foot/max/step/theta", max_step_range_theta);
71  result &= params.getParam("foot/max/inverse/step/theta", max_inverse_step_range_theta);
72 
73  ivMaxStepRangeX = disc_val(max_x, cell_size);
74  ivMaxStepRangeY = disc_val(max_y, cell_size);
75  ivMaxStepRangeTheta = angle_state_2_cell(max_step_range_theta, angle_bin_size);
76  ivMaxInvStepRangeX = disc_val(max_inv_x, cell_size);
77  ivMaxInvStepRangeY = disc_val(max_inv_y, cell_size);
78  ivMaxInvStepRangeTheta = angle_state_2_cell(max_inverse_step_range_theta, angle_bin_size);
79  }
80 
81 
82  // we can't proceed if parameters are missing
83  if (!result)
84  return false;
85 
86  // setup state expansion manager
87  expand_states_manager.reset(new threading::ThreadingManager<threading::ExpandStateJob>(threads, jobs_per_thread));
88 
89  // determine whether a (x,y) translation can be performed by the robot by
90  // checking if it is within a certain area of performable steps
91  for (int y = ivMaxInvStepRangeY; y <= ivMaxStepRangeY; y++)
92  {
93  for (int x = ivMaxInvStepRangeX; x <= ivMaxStepRangeX; x++)
94  {
95  bool in_step_range = pointWithinPolygon(x, y, step_range);
96 
97  if (!in_step_range)
98  continue;
99 
100  // generate area of samplings for gpr/map-based planning
101  for (int theta = ivMaxInvStepRangeTheta; theta <= ivMaxStepRangeTheta; theta++)
102  {
103  Footstep f(cont_val(x, cell_size), cont_val(y, cell_size), angle_cell_2_state(theta, angle_bin_size), 0.0, cell_size, num_angle_bins, hash_table_size);
104  ivContFootstepSet.push_back(f);
105  }
106  }
107  }
108 
109  return result;
110 }
111 
112 std::list<PlanningState::Ptr> ReachabilityStateGenerator::generatePredecessors(const PlanningState& state) const
113 {
114  std::list<PlanningState::Ptr> result;
115 
116  ROS_ERROR("[ReachabilityStateGenerator] generatePredecessor not implemented yet!");
117 
118  return result;
119 }
120 
121 std::list<PlanningState::Ptr> ReachabilityStateGenerator::generateSuccessors(const PlanningState& state) const
122 {
123  std::list<PlanningState::Ptr> result;
124 
125  // explorate all state
126  std::list<threading::ExpandStateJob::Ptr> jobs;
127  for (const Footstep& footstep : ivContFootstepSet)
128  jobs.push_back(threading::ExpandStateJob::Ptr(new threading::ExpandStateJob(footstep, state)));
129 
130  expand_states_manager->addJobs(jobs);
131  expand_states_manager->waitUntilJobsFinished();
132 
133  for (std::list<threading::ExpandStateJob::Ptr>::iterator itr = jobs.begin(); itr != jobs.end(); itr++)
134  {
135  threading::ExpandStateJob::Ptr& job = *itr;
136  if (job->successful)
137  result.push_back(job->next);
138  }
139 
140  return result;
141 }
142 }
143 
144 #include <pluginlib/class_list_macros.h>
145 PLUGINLIB_EXPORT_CLASS(vigir_footstep_planning::ReachabilityStateGenerator, vigir_footstep_planning::StateGeneratorPlugin)
f
int size() const
bool loadParams(const vigir_generic_params::ParameterSet &params=vigir_generic_params::ParameterSet()) override
std::list< PlanningState::Ptr > generatePredecessors(const PlanningState &state) const override
#define ROS_ERROR(...)
threading::ThreadingManager< threading::ExpandStateJob >::Ptr expand_states_manager
std::list< PlanningState::Ptr > generateSuccessors(const PlanningState &state) const override


vigir_footstep_planning_default_plugins
Author(s): Alexander Stumpf
autogenerated on Sun Nov 17 2019 03:30:01