00001
00002
00003
00004 #ifndef CAJUN_DRIVE_H
00005 #define CAJUN_DRIVE_H
00006
00007 #include "linear_interpolator.H"
00008 #include "speed_planner.H"
00009 #include "guide_mode.H"
00010 #include "steering_pid.H"
00011 #include "safe_speed_advisor.H"
00012 #include "throttle.H"
00013 #include "world_state.H"
00014 #include "base_steering.H"
00015 #include "throttle.H"
00016 #include "conf.H"
00017 #include "integral.H"
00018
00019 namespace cajun
00020 {
00021 class drive_t
00022 {
00023 public:
00024 drive_t (base_path_interpolator_t *path_interpolator,
00025 speed_planner_t *speed_planner,
00026 guide_mode_t *guide_mode,
00027 base_steering_t *steering_controller,
00028 safe_speed_advisor_t *safe_speed_advisor,
00029 base_throttle_t *throttle_controller,
00030 world_state_t *world_state,
00031 const conf_t &steering_conf,
00032 const conf_t &cajun_conf);
00033 ~drive_t () {};
00034 private:
00035 base_path_interpolator_t *m_path_interpolator;
00036 speed_planner_t *m_speed_planner;
00037 guide_mode_t *m_guide_mode;
00038 base_steering_t *m_steering_controller;
00039 safe_speed_advisor_t *m_safe_speed_advisor;
00040 base_throttle_t *m_throttle_controller;
00041 world_state_t *m_world_state;
00042
00043 nav_data_t m_nav;
00044 heading_data_t m_heading;
00045 sog_data_t m_sog;
00046 drive_data_t m_drive;
00047 steering_data_t m_steering;
00048 signal_line_data_t m_signal_line;
00049 path_data_t m_input_path;
00050
00051 std::vector<waypoint_t> m_path;
00052 bool m_input_path_forward;
00053 steering_data_t::gear_t m_pres_gear;
00054 steering_data_t::gear_t m_req_gear;
00055 double m_gear_req_tstamp;
00056 double m_gear_change_time;
00057 bool m_gear_change_stop;
00058
00059 bool m_nav_staled;
00060 bool m_heading_staled;
00061 bool m_sog_staled;
00062 bool m_drive_staled;
00063 bool m_signal_line_staled;
00064 bool m_path_staled;
00065
00066
00067 bool m_bot_should_die;
00068
00069 bool m_bot_should_stop;
00070
00071 bool m_bot_stopped;
00072 bool m_software_pause;
00073
00074 bool m_hardware_pause;
00075
00076 bool m_covered_input_path;
00077
00078 bool m_empty_input_path;
00079
00080 bool m_zero_speed_path;
00081
00082 double m_min_wheel_angle;
00083 double m_max_wheel_angle;
00084
00085 double m_max_stop_speed;
00086 double m_pause_brake;
00087 double m_prev_tstamp;
00088 double m_unpause_delay_left;
00089 double m_unpause_delay;
00090 double m_path_data_timeout;
00091 double m_data_timeout;
00092 int m_steering_position_feedback;
00093 double m_min_dis_to_reach_wp;
00094
00095 bool read_steering_conf (const conf_t &steering_conf);
00096 bool read_cajun_conf (const conf_t &cajun_conf);
00097
00098 void update_data (double tstamp);
00099 void compute_azimuths ();
00100 void update_signal_line (double tstamp);
00101 bool check_staled_data (double tstamp);
00102 void update_stale_status (double tstamp, double data_tstamp,
00103 double timeout,
00104 bool &data_staled, const char *data_name);
00105
00106 void update_delayed_hardware_pause (double tstamp,
00107 bool h_pause);
00108 void update_software_pause (double tstamp, int goal_index);
00109 void update_bot_should_die (double tstamp,
00110 bool received_interrupt);
00111 void update_bot_should_stop (double tstamp, int goal_index);
00112 void update_zero_speed (double tstamp, int goal_index);
00113 void update_gear_action (double tstamp);
00114
00115 void update_action_status (double tstamp, bool bot_should_die,
00116 int goal_index);
00117 double steering_position (double tstamp);
00118 double map_steering_angle_to_command (double st_angle);
00119 void convert_to_output_format (double tstamp,
00120 path_data_t &output_path);
00121 void update_flag (double tstamp, bool &present_status,
00122 bool new_status, const char *mesg,
00123 const char *mesg_okay, const char *mesg_not_okay);
00124 void change_gear (double tstamp_);
00125
00126 public:
00127 void drive_the_bot (double tstamp, bool bot_should_die);
00128 void publish_pause_values (double tstamp, double pause_brake,
00129 steering_data_t::gear_t gear_);
00130 bool shutdown ();
00131 };
00132 };
00133
00134
00135 #endif