00001
00002
00003
00004 #ifndef CAJUN_PASSING_LANE_TASK_PLANNER_H
00005 #define CAJUN_PASSING_LANE_TASK_PLANNER_H
00006
00007 #include "task_planner.H"
00008 #include "uc_planner_param.H"
00009
00010 namespace cajun
00011 {
00012
00013 class passing_lane_task_planner_t : public task_planner_t
00014 {
00015 public:
00016 passing_lane_task_planner_t ();
00017
00020 void set_plan (unsigned sid, unsigned lid_1_, unsigned lid_2_,
00021 double x_, double y_, double b_dis_);
00022
00023 void set_path_blocked (unsigned p_id_);
00024
00025 void set_active ();
00026
00027 path_status_t generate_path (world_state_t *ws_, path_t &path_,
00028 double &p_len_left_,
00029 const path_t &base_path_);
00030
00031
00032 bool get_path_lane_lids (unsigned &sid_,
00033 std::vector<unsigned> &lids_);
00034
00035 bool get_path_map_to_lane_lids (
00036 std::vector<path_lane_map_t> &pl_ids_);
00037
00038 bool get_start_lid (unsigned &sid_, unsigned &lid_);
00039
00040 bool is_task_complete (world_state_t *ws_, double x_, double y_,
00041 double heading_);
00042
00043 void print_plan ();
00044
00045 protected:
00046 const uc_planner_param_t *m_uc_param;
00047
00048
00049
00050 double m_width_multiplier;
00051 double m_look_ahead_ratio;
00052 double m_dis_from_blk;
00053 double m_dis_after_blk;
00054
00055 double m_stop_time;
00056 bool m_stopped;
00057
00058 bool m_switch_pass_lane;
00059 bool m_drive_on_passing_lane;
00060 bool m_switch_orig_lane;
00061
00062 unsigned m_sid;
00063 unsigned m_lid;
00064 unsigned m_passing_lid;
00065
00066 double m_blk_x;
00067 double m_blk_y;
00068 double m_blk_dis;
00069
00070 void compute_end_passing_points (
00071 rndf_lane_data_t &lb_, double &end_pass_x, double &end_pass_y);
00072
00073
00074 void compute_end_passing_points (
00075 world_state_t *ws_, rndf_lane_data_t &lb_, double pres_x_,
00076 double pres_y_, double &end_pass_x_, double &end_pass_y_);
00077
00078 bool blockage_just_after (
00079 world_state_t *ws_,
00080 blocked_lane_data_t &blk_, double x_, double y_,
00081 unsigned sid_,
00082 unsigned lid_, unsigned &wid_, double dis_);
00083
00084 void blk_end_points (
00085 world_state_t *ws_,
00086 blocked_lane_data_t const &blk_, double &x_, double &y_,
00087 unsigned &wid_);
00088
00089 bool blockage_just_before (
00090 world_state_t *ws_,
00091 blocked_lane_data_t &blk_, double x_, double y_,
00092 unsigned sid_,
00093 unsigned lid_, unsigned &wid_, double dis_);
00094
00095 void get_blk_around (
00096 world_state_t *ws_, double x_, double y_,
00097 std::vector<blocked_lane_data_t> &blk_list_, double dis_);
00098
00099
00100 bool closest_blk_before_point (
00101 world_state_t *ws_,
00102 std::vector <blocked_lane_data_t> const &blk_list,
00103 blocked_lane_data_t &best_blk_,
00104 unsigned sid_1_, unsigned lid_1_, unsigned wid_1_,
00105 unsigned sid_2_, unsigned lid_2_, unsigned wid_2_,
00106 double x, double y, double &dis_);
00107
00108
00109
00110
00111
00112 void drive_on_passing_lane (world_state_t *ws_,
00113 rndf_lane_data_t &passing_lb_,
00114 path_t &path_, double &local_p_len_left_);
00115
00116 bool stop_before_passing (world_state_t *ws_);
00117
00118 bool closest_blk_after_point (
00119 world_state_t *ws_,
00120 std::vector <blocked_lane_data_t> const &blk_list,
00121 blocked_lane_data_t &best_blk_,
00122 unsigned sid_1_, unsigned lid_1_, unsigned wid_1_,
00123 unsigned sid_2_, unsigned lid_2_, unsigned wid_2_,
00124 double x, double y, double &dis_);
00125
00126 double distance_to_end_of_lane (
00127 world_state_t *ws_,
00128 unsigned sid1_, unsigned lid1_, unsigned wid1_,
00129 unsigned sid2_, unsigned lid2_, unsigned wid2_,
00130 double x_, double y_);
00131
00132 double distance_to_beginning_of_lane (
00133 world_state_t *ws_,
00134 unsigned sid1_, unsigned lid1_, unsigned wid1_,
00135 unsigned sid2_, unsigned lid2_, unsigned wid2_,
00136 double x_, double y_);
00137
00138
00139 };
00140
00141 };
00142
00143
00144 #endif