1#ifndef PLANNING_UTILS_H
2#define PLANNING_UTILS_H
5#include <quad_utils/fast_terrain_map.h>
6#include <quad_utils/math_utils.h>
7#include <quad_utils/ros_utils.h>
10#include <visualization_msgs/MarkerArray.h>
14#include <eigen3/Eigen/Eigen>
15#include <grid_map_core/grid_map_core.hpp>
19#include <unordered_map>
20#include <unordered_set>
31namespace planning_utils {
39 grid_map::GridMap terrain_grid_map;
61 int trapped_buffer_factor;
66 double max_planning_time;
67 Eigen::Vector3d g_vec;
74 double traversability_threshold;
77 bool enable_leaping =
true;
78 static const int num_reachability_points =
80 static const int num_collision_points =
83 Eigen::Matrix<double, 3, num_reachability_points>
84 reachability_points_body;
86 Eigen::Matrix<double, 3, num_collision_points>
87 collision_points_body;
98 reachability_points_body << 0.5 * robot_l, -0.5 * robot_l, 0.5 * robot_l,
99 -0.5 * robot_l, 0.5 * robot_w, 0.5 * robot_w, -0.5 * robot_w,
100 -0.5 * robot_w, 0, 0, 0, 0;
102 collision_points_body << 0.5 * robot_l, -0.5 * robot_l, 0.5 * robot_l,
103 -0.5 * robot_l, 0, 0.5 * robot_w, 0.5 * robot_w, -0.5 * robot_w,
104 -0.5 * robot_w, 0, -0.5 * robot_h, -0.5 * robot_h, -0.5 * robot_h,
105 -0.5 * robot_h, -0.5 * robot_h;
113 quad_utils::loadROSParam(nh,
"global_body_planner/h_max", h_max);
114 quad_utils::loadROSParam(nh,
"global_body_planner/h_min", h_min);
115 quad_utils::loadROSParam(nh,
"global_body_planner/h_nom", h_nom);
116 quad_utils::loadROSParam(nh,
"global_body_planner/v_max", v_max);
117 quad_utils::loadROSParam(nh,
"global_body_planner/v_nom", v_nom);
118 quad_utils::loadROSParam(nh,
"global_body_planner/robot_l", robot_l);
119 quad_utils::loadROSParam(nh,
"global_body_planner/robot_w", robot_w);
120 quad_utils::loadROSParam(nh,
"global_body_planner/robot_h", robot_h);
122 quad_utils::loadROSParam(nh,
"global_body_planner/mass", mass);
123 quad_utils::loadROSParam(nh,
"global_body_planner/grf_min", grf_min);
124 quad_utils::loadROSParam(nh,
"global_body_planner/grf_max", grf_max);
125 quad_utils::loadROSParam(nh,
126 "/global_body_planner/traversability_threshold",
127 traversability_threshold);
130 quad_utils::loadROSParam(nh,
"/global_body_planner/g", g);
131 quad_utils::loadROSParam(nh,
"/global_body_planner/mu", mu);
132 quad_utils::loadROSParam(nh,
"/global_body_planner/t_s_min", t_s_min);
133 quad_utils::loadROSParam(nh,
"/global_body_planner/t_s_max", t_s_max);
134 quad_utils::loadROSParam(nh,
"/global_body_planner/dz0_min", dz0_min);
135 quad_utils::loadROSParam(nh,
"/global_body_planner/dz0_max", dz0_max);
136 quad_utils::loadROSParam(nh,
"/global_body_planner/dt", dt);
137 quad_utils::loadROSParam(nh,
"/global_body_planner/backup_ratio",
139 quad_utils::loadROSParam(nh,
"/global_body_planner/trapped_buffer_factor",
140 trapped_buffer_factor);
141 quad_utils::loadROSParam(nh,
"/global_body_planner/num_leap_samples",
143 quad_utils::loadROSParam(nh,
"/global_body_planner/max_planning_time",
154enum Phase { CONNECT, LEAP_STANCE, FLIGHT, LAND_STANCE };
160enum TreeDirection { FORWARD, REVERSE };
171 INVALID_START_GOAL_EQUAL
175const grid_map::InterpolationMethods INTER_TYPE =
176 grid_map::InterpolationMethods::INTER_NEAREST;
179typedef Eigen::Vector3d GRF;
188 bool operator==(
const State rhs)
const {
190 return ((pos == rhs.pos) && (vel.head<2>() == rhs.vel.head<2>()));
193 bool operator!=(
const State rhs)
const {
195 return ((pos != rhs.pos) || (vel.head<2>() != rhs.vel.head<2>()));
198 bool isApprox(
const State rhs)
const {
200 return ((pos.isApprox(rhs.pos)) &&
201 (vel.head<2>().isApprox(rhs.vel.head<2>())));
212 Eigen::Vector3d ang_vel;
253FullState stateToFullState(
const State &state,
double roll,
double pitch,
254 double yaw,
double roll_rate,
double pitch_rate,
262void eigenToFullState(
const Eigen::VectorXd &s_eig,
FullState &s);
269Eigen::VectorXd fullStateToEigen(
const FullState &s);
276void vectorToFullState(
const std::vector<double> &v,
FullState &s);
282void flipDirection(
State &s);
289void flipDirection(
Action &a);
295void printState(
const State &s);
307void printStateNewline(
const State &s);
313void printAction(
const Action &a);
319void printActionNewline(
const Action &a);
325void printStateSequence(
const std::vector<State> &state_sequence);
333void printInterpStateSequence(
const std::vector<State> &state_sequence,
334 const std::vector<double> &interp_t);
340void printActionSequence(
const std::vector<Action> &action_sequence);
348double poseDistance(
const State &q1,
const State &q2);
365double poseDistance(
const std::vector<double> &v1,
366 const std::vector<double> &v2);
376double stateDistance(
const State &q1,
const State &q2);
384Eigen::Vector3d rotateGRF(
const Eigen::Vector3d &surface_norm,
385 const Eigen::Vector3d &grf);
392inline double getSpeed(
const State &s) {
return s.vel.norm(); }
402void addFullStates(
const FullState &start_state,
403 std::vector<State> interp_reduced_path,
double dt,
404 std::vector<FullState> &interp_full_path,
405 const PlannerConfig &planner_config);
424State interpStateActionPair(
const State &s,
const Action &a,
double t0,
425 double dt, std::vector<State> &interp_plan,
426 std::vector<GRF> &interp_GRF,
427 std::vector<double> &interp_t,
428 std::vector<int> &interp_primitive_id,
429 std::vector<double> &interp_length,
430 const PlannerConfig &planner_config);
448void getInterpPlan(
const FullState &start_state,
449 const std::vector<State> &state_sequence,
450 const std::vector<Action> &action_sequence,
double dt,
451 double t0, std::vector<FullState> &interp_full_plan,
452 std::vector<GRF> &interp_GRF, std::vector<double> &interp_t,
453 std::vector<int> &interp_primitive_id,
454 std::vector<double> &interp_length,
455 const PlannerConfig &planner_config);
463double getPitchFromState(
const State &s,
const PlannerConfig &planner_config);
471double getDzFromState(
const State &s,
const PlannerConfig &planner_config);
479void setDz(State &s,
const PlannerConfig &planner_config);
487void setDz(State &s,
const Eigen::Vector3d &surf_norm);
496inline bool isInMap(
const Eigen::Vector3d &pos,
497 const PlannerConfig &planner_config) {
499 return planner_config.terrain_grid_map.isInside(pos.head<2>());
509inline bool isInMap(
const State &s,
const PlannerConfig &planner_config) {
510 return isInMap(s.pos, planner_config);
519inline double getTerrainZ(
const Eigen::Vector3d &pos,
520 const PlannerConfig &planner_config) {
525 return (planner_config.terrain.getGroundHeight(pos[0], pos[1]));
534inline double getTerrainZFiltered(
const Eigen::Vector3d &pos,
535 const PlannerConfig &planner_config) {
540 return (planner_config.terrain.getGroundHeightFiltered(pos[0], pos[1]));
549inline double getTraversability(
const Eigen::Vector3d &pos,
550 const PlannerConfig &planner_config) {
551 return planner_config.terrain_grid_map.atPosition(
"traversability",
552 pos.head<2>(), INTER_TYPE);
562inline bool isTraversable(
const Eigen::Vector3d &pos,
563 const PlannerConfig &planner_config) {
564 return (getTraversability(pos, planner_config) >=
565 planner_config.traversability_threshold);
574inline Eigen::Vector3d getSurfaceNormalFiltered(
575 const State &s,
const PlannerConfig &planner_config) {
585 return planner_config.terrain.getSurfaceNormalFilteredEigen(s.pos[0],
595inline double getTerrainZFromState(
const State &s,
596 const PlannerConfig &planner_config) {
597 return getTerrainZ(s.pos, planner_config);
606inline double getTerrainZFilteredFromState(
607 const State &s,
const PlannerConfig &planner_config) {
608 return getTerrainZFiltered(s.pos, planner_config);
618inline double getZRelToTerrain(
const Eigen::Vector3d &pos,
619 const PlannerConfig &planner_config) {
620 return (pos[2] - getTerrainZ(pos, planner_config));
630inline double getZRelToTerrain(
const State &s,
631 const PlannerConfig &planner_config) {
632 return getZRelToTerrain(s.pos, planner_config);
643inline double getZRelToTerrainFiltered(
const Eigen::Vector3d &pos,
644 const PlannerConfig &planner_config) {
645 return (pos[2] - getTerrainZFiltered(pos, planner_config));
655inline double getZRelToTerrainFiltered(
const State &s,
656 const PlannerConfig &planner_config) {
657 return getZRelToTerrainFiltered(s.pos, planner_config);
668inline void getMapBounds(
const PlannerConfig &planner_config,
double &x_min,
669 double &x_max,
double &y_min,
double &y_max) {
671 x_min = planner_config.terrain.getXData().front() + eps;
672 x_max = planner_config.terrain.getXData().back() - eps;
673 y_min = planner_config.terrain.getYData().front() + eps;
674 y_max = planner_config.terrain.getYData().back() - eps;
686State applyStance(
const State &s,
const Action &a,
double t,
int phase,
687 const PlannerConfig &planner_config);
699State applyStance(
const State &s,
const Action &a,
int phase,
700 const PlannerConfig &planner_config);
709State applyFlight(
const State &s,
double t_f,
710 const PlannerConfig &planner_config);
719State applyAction(
const State &s,
const Action &a,
720 const PlannerConfig &planner_config);
730GRF getGRF(
const Action &a,
double t,
int phase,
731 const PlannerConfig &planner_config);
740Eigen::Vector3d getAcceleration(
const Action &a,
double t,
int phase,
741 const PlannerConfig &planner_config);
751bool getRandomLeapAction(
const State &s,
const Eigen::Vector3d &surf_norm,
752 Action &a,
const PlannerConfig &planner_config);
762bool refineAction(
const State &s, Action &a,
763 const PlannerConfig &planner_config);
773bool refineStance(
const State &s,
int phase, Action &a,
774 const PlannerConfig &planner_config);
782bool refineFlight(
const State &s,
double &t_f,
783 const PlannerConfig &planner_config);
793bool isValidAction(
const Action &a,
const PlannerConfig &planner_config);
804bool isValidState(
const State &s,
const PlannerConfig &planner_config,
816bool isValidState(
const State &s,
const PlannerConfig &planner_config,
817 int phase,
double &max_height);
828bool isValidStateActionPair(
const State &s,
const Action &a,
829 StateActionResult &result,
830 const PlannerConfig &planner_config);
841void publishStateActionPair(
const State &s,
const Action &a,
843 const PlannerConfig &planner_config,
844 visualization_msgs::MarkerArray &tree_viz_msg,
845 ros::Publisher &tree_pub);
A terrain map class built for fast and efficient sampling.
Definition fast_terrain_map.h:16
Define action with Eigen data.
Definition planning_utils.h:218
Define full state with Eigen data.
Definition planning_utils.h:208
Planner Configuration.
Definition planning_utils.h:36
void loadEigenVectorsFromParams()
Definition planning_utils.h:93
void loadParamsFromServer(ros::NodeHandle nh)
Load the Global Body Planner parameters from ROS server.
Definition planning_utils.h:111
Definition planning_utils.h:228
Define state with Eigen data.
Definition planning_utils.h:184