15 #ifndef NAV2_RVIZ_PLUGINS__DOCKING_PANEL_HPP_
16 #define NAV2_RVIZ_PLUGINS__DOCKING_PANEL_HPP_
20 #include <QBasicTimer>
21 #include <QStateMachine>
23 #include <QSignalTransition>
29 #include "nav2_lifecycle_manager/lifecycle_manager_client.hpp"
30 #include "rclcpp/executors/single_threaded_executor.hpp"
31 #include "rclcpp/node.hpp"
32 #include "rclcpp_action/rclcpp_action.hpp"
33 #include "rviz_common/panel.hpp"
34 #include "rviz_common/ros_integration/ros_node_abstraction_iface.hpp"
35 #include "sensor_msgs/msg/battery_state.hpp"
36 #include "nav2_msgs/action/dock_robot.hpp"
37 #include "nav2_msgs/action/undock_robot.hpp"
42 namespace nav2_rviz_plugins
45 class InitialDockThread;
56 void onInitialize()
override;
59 void load(
const rviz_common::Config & config)
override;
60 void save(rviz_common::Config config)
const override;
64 void onDockingButtonPressed();
65 void onUndockingButtonPressed();
66 void onCancelDocking();
67 void onCancelUndocking();
68 void dockIdCheckbox();
71 using Dock = nav2_msgs::action::DockRobot;
72 using Undock = nav2_msgs::action::UndockRobot;
73 using DockGoalHandle = rclcpp_action::ClientGoalHandle<Dock>;
74 using UndockGoalHandle = rclcpp_action::ClientGoalHandle<Undock>;
77 void timerEvent(QTimerEvent * event)
override;
80 static inline QString getDockFeedbackLabel(Dock::Feedback msg = Dock::Feedback());
84 static inline std::string toLabel(T & msg);
87 static inline std::string toString(
double val,
int precision = 0);
90 static inline std::string dockStateToString(int16_t state);
91 static inline std::string dockErrorToString(int16_t error_code);
94 rclcpp::Node::SharedPtr client_node_;
95 rclcpp::executors::SingleThreadedExecutor::SharedPtr executor_;
98 std::shared_ptr<rviz_common::ros_integration::RosNodeAbstractionIface> node_ptr_;
101 std::chrono::milliseconds server_timeout_;
104 QBasicTimer action_timer_;
107 nav2::ActionClient<Dock>::SharedPtr dock_client_;
108 nav2::ActionClient<Undock>::SharedPtr undock_client_;
111 nav2::Subscription<Dock::Impl::FeedbackMessage>::SharedPtr docking_feedback_sub_;
112 nav2::Subscription<Undock::Impl::FeedbackMessage>::SharedPtr undocking_feedback_sub_;
113 nav2::Subscription<Dock::Impl::GoalStatusMessage>::SharedPtr docking_goal_status_sub_;
114 nav2::Subscription<Undock::Impl::GoalStatusMessage>::SharedPtr undocking_goal_status_sub_;
117 DockGoalHandle::SharedPtr dock_goal_handle_;
118 UndockGoalHandle::SharedPtr undock_goal_handle_;
121 bool plugins_loaded_ =
false;
122 bool server_failed_ =
false;
124 QVBoxLayout * main_layout_{
nullptr};
125 QHBoxLayout * info_layout_{
nullptr};
126 QVBoxLayout * feedback_layout_{
nullptr};
127 QHBoxLayout * dock_id_layout_{
nullptr};
128 QHBoxLayout * dock_type_layout_{
nullptr};
129 QHBoxLayout * dock_pose_layout_{
nullptr};
130 QHBoxLayout * nav_stage_layout_{
nullptr};
132 QComboBox * dock_type_{
nullptr};
133 QPushButton * docking_button_{
nullptr};
134 QPushButton * undocking_button_{
nullptr};
135 QCheckBox * use_dock_id_checkbox_{
nullptr};
136 QCheckBox * nav_to_staging_checkbox_{
nullptr};
138 QLabel * docking_goal_status_indicator_{
nullptr};
139 QLabel * docking_feedback_indicator_{
nullptr};
140 QLabel * docking_result_indicator_{
nullptr};
142 QLineEdit * dock_id_{
nullptr};
143 QLineEdit * dock_pose_x_{
nullptr};
144 QLineEdit * dock_pose_y_{
nullptr};
145 QLineEdit * dock_pose_yaw_{
nullptr};
148 bool docking_in_progress_ =
false;
149 bool undocking_in_progress_ =
false;
150 bool use_dock_id_ =
false;
152 QStateMachine state_machine_;
155 QState * pre_initial_{
nullptr};
156 QState * idle_{
nullptr};
157 QState * docking_{
nullptr};
158 QState * undocking_{
nullptr};
159 QState * canceled_docking_{
nullptr};
160 QState * canceled_undocking_{
nullptr};
169 nav2::ActionClient<nav2_msgs::action::DockRobot>::SharedPtr & dock_client,
170 nav2::ActionClient<nav2_msgs::action::UndockRobot>::SharedPtr & undock_client)
171 : dock_client_(dock_client), undock_client_(undock_client)
176 while (!dock_active_) {
177 dock_active_ = dock_client_->wait_for_action_server(std::chrono::seconds(1));
180 while (!undock_active_) {
181 undock_active_ = undock_client_->wait_for_action_server(std::chrono::seconds(1));
185 emit dockingActive();
187 emit dockingInactive();
190 if (undock_active_) {
191 emit undockingActive();
193 emit undockingInactive();
198 void dockingActive();
199 void dockingInactive();
200 void undockingActive();
201 void undockingInactive();
204 nav2::ActionClient<nav2_msgs::action::DockRobot>::SharedPtr dock_client_;
205 nav2::ActionClient<nav2_msgs::action::UndockRobot>::SharedPtr undock_client_;
206 bool dock_active_ =
false;
207 bool undock_active_ =
false;
Panel to interface to the docking server.
void load(const rviz_common::Config &config) override
Load and save configuration data.