@startuml

class MoveBase {
  - tf_: tf2_ros::Buffer&
  - as_: MoveBaseActionServer*
  - tc_: boost::shared_ptr<nav_core::BaseLocalPlanner>
  - planner_costmap_ros_: costmap_2d::Costmap2DROS*
  - controller_costmap_ros_: costmap_2d::Costmap2DROS*
  - planner_: boost::shared_ptr<nav_core::BaseGlobalPlanner>
  - robot_base_frame_: std::string
  - global_frame_: std::string
  - recovery_behaviors_: std::vector<boost::shared_ptr<nav_core::RecoveryBehavior> >
  - recovery_behavior_names_: std::vector<std::string>
  - recovery_index_: unsigned int
  - global_pose_: geometry_msgs::PoseStamped
  - planner_frequency_: double
  - controller_frequency_: double
  - inscribed_radius_: double
  - circumscribed_radius_: double
  - planner_patience_: double
  - controller_patience_: double
  - max_planning_retries_: int32_t
  - planning_retries_: uint32_t
  - conservative_reset_dist_: double
  - clearing_radius_: double
  - current_goal_pub_: ros::Publisher
  - vel_pub_: ros::Publisher
  - action_goal_pub_: ros::Publisher
  - recovery_status_pub_: ros::Publisher
  - goal_sub_: ros::Subscriber
  - make_plan_srv_: ros::ServiceServer
  - clear_costmaps_srv_: ros::ServiceServer
  - shutdown_costmaps_: bool
  - clearing_rotation_allowed_: bool
  - recovery_behavior_enabled_: bool
  - make_plan_clear_costmap_: bool
  - make_plan_add_unreachable_goal_: bool
  - oscillation_timeout_: double
  - oscillation_distance_: double
  - state_: MoveBaseState
  - recovery_trigger_: RecoveryTrigger
  - last_valid_plan_: ros::Time
  - last_valid_control_: ros::Time
  - last_oscillation_reset_: ros::Time
  - oscillation_pose_: geometry_msgs::PoseStamped
  - bgp_loader_: pluginlib::ClassLoader<nav_core::BaseGlobalPlanner>
  - blp_loader_: pluginlib::ClassLoader<nav_core::BaseLocalPlanner>
  - recovery_loader_: pluginlib::ClassLoader<nav_core::RecoveryBehavior>
  - planner_plan_: std::vector<geometry_msgs::PoseStamped>*
  - latest_plan_: std::vector<geometry_msgs::PoseStamped>*
  - controller_plan_: std::vector<geometry_msgs::PoseStamped>*
  - runPlanner_: bool
  - planner_mutex_: boost::recursive_mutex
  - planner_cond_: boost::condition_variable_any
  - planner_goal_: geometry_msgs::PoseStamped
  - planner_thread_: boost::thread*
  - configuration_mutex_: boost::recursive_mutex
  - dsrv_: dynamic_reconfigure::Server<move_base::MoveBaseConfig>*
  - last_config_: move_base::MoveBaseConfig
  - default_config_: move_base::MoveBaseConfig
  - setup_: bool
  - p_freq_change_: bool
  - c_freq_change_: bool
  - new_global_plan_: bool
  + MoveBase(tf: tf2_ros::Buffer&)
  + ~MoveBase()
  + executeCycle(goal: geometry_msgs::PoseStamped&): bool
  - clearCostmapsService(req: std_srvs::Empty::Request&, resp: std_srvs::Empty::Response&): bool
  - planService(req: nav_msgs::GetPlan::Request&, resp: nav_msgs::GetPlan::Response&): bool
  - makePlan(goal: const geometry_msgs::PoseStamped&, plan: std::vector<geometry_msgs::PoseStamped>&): bool
  - loadRecoveryBehaviors(node: ros::NodeHandle): bool
  - loadDefaultRecoveryBehaviors(): void
  - clearCostmapWindows(size_x: double, size_y: double): void
  - publishZeroVelocity(): void
  - resetState(): void
  - goalCB(goal: const geometry_msgs::PoseStamped::ConstPtr&): void
  - planThread(): void
  - executeCb(move_base_goal: const move_base_msgs::MoveBaseGoalConstPtr&): void
  - isQuaternionValid(q: const geometry_msgs::Quaternion&): bool
  - getRobotPose(global_pose: geometry_msgs::PoseStamped&, costmap: costmap_2d::Costmap2DROS*): bool
  - distance(p1: const geometry_msgs::PoseStamped&, p2: const geometry_msgs::PoseStamped&): double
  - goalToGlobalFrame(goal_pose_msg: const geometry_msgs::PoseStamped&): geometry_msgs::PoseStamped
  - wakePlanner(event: const ros::TimerEvent&): void
  - reconfigureCB(config: move_base::MoveBaseConfig, level: uint32_t): void
}

enum MoveBaseState {
  PLANNING
  CONTROLLING
  CLEARING
}

enum RecoveryTrigger {
  PLANNING_R
  CONTROLLING_R
  OSCILLATION_R
}

MoveBase --> tf2_ros::Buffer
MoveBase --> MoveBaseActionServer
MoveBase --> boost::shared_ptr<nav_core::BaseLocalPlanner>
MoveBase --> costmap_2d::Costmap2DROS
MoveBase --> std::vector<boost::shared_ptr<nav_core::RecoveryBehavior> >
MoveBase --> std::vector<std::string>
MoveBase --> geometry_msgs::PoseStamped
MoveBase --> ros::Publisher
MoveBase --> ros::Subscriber
MoveBase --> ros::ServiceServer
MoveBase --> ros::Time
MoveBase --> pluginlib::ClassLoader<nav_core::BaseGlobalPlanner>
MoveBase --> pluginlib::ClassLoader<nav_core::BaseLocalPlanner>
MoveBase --> pluginlib::ClassLoader<nav_core::RecoveryBehavior>
MoveBase --> std::vector<geometry_msgs::PoseStamped>
MoveBase --> boost::recursive_mutex
MoveBase --> boost::condition_variable_any
MoveBase --> boost::thread
MoveBase --> dynamic_reconfigure::Server<move_base::MoveBaseConfig>
MoveBase --> move_base::MoveBaseConfig

@enduml