16 #ifndef OPENNAV_FOLLOWING__FOLLOWING_SERVER_HPP_
17 #define OPENNAV_FOLLOWING__FOLLOWING_SERVER_HPP_
25 #include "geometry_msgs/msg/pose_stamped.hpp"
26 #include "rclcpp/rclcpp.hpp"
27 #include "rclcpp_lifecycle/lifecycle_publisher.hpp"
28 #include "nav2_msgs/action/follow_object.hpp"
29 #include "nav2_util/lifecycle_node.hpp"
30 #include "nav2_util/node_utils.hpp"
31 #include "nav2_util/simple_action_server.hpp"
32 #include "nav2_util/twist_publisher.hpp"
33 #include "nav2_util/odometry_utils.hpp"
34 #include "opennav_docking/controller.hpp"
35 #include "opennav_docking/pose_filter.hpp"
36 #include "opennav_following/parameter_handler.hpp"
37 #include "tf2_ros/buffer.h"
38 #include "tf2_ros/transform_listener.h"
40 namespace opennav_following
49 using FollowObject = nav2_msgs::action::FollowObject;
56 explicit FollowingServer(
const rclcpp::NodeOptions & options = rclcpp::NodeOptions());
77 geometry_msgs::msg::PoseStamped & object_pose,
78 const std::string & target_frame = std::string(
""));
87 geometry_msgs::msg::PoseStamped & object_pose,
88 const std::string & target_frame = std::string(
""));
96 template<
typename ActionT>
98 typename std::shared_ptr<const typename ActionT::Goal> goal,
107 template<
typename ActionT>
110 const std::string & name);
118 template<
typename ActionT>
121 const std::string & name);
128 nav2_util::CallbackReturn
on_configure(
const rclcpp_lifecycle::State & state)
override;
135 nav2_util::CallbackReturn
on_activate(
const rclcpp_lifecycle::State & state)
override;
142 nav2_util::CallbackReturn
on_deactivate(
const rclcpp_lifecycle::State & state)
override;
149 nav2_util::CallbackReturn
on_cleanup(
const rclcpp_lifecycle::State & state)
override;
156 nav2_util::CallbackReturn
on_shutdown(
const rclcpp_lifecycle::State & state)
override;
175 virtual bool getRefinedPose(geometry_msgs::msg::PoseStamped & pose);
183 virtual bool getFramePose(geometry_msgs::msg::PoseStamped & pose,
const std::string & frame_id);
192 geometry_msgs::msg::PoseStamped & pose,
const std::string & frame_id);
202 const geometry_msgs::msg::PoseStamped & pose,
double distance);
210 bool isGoalReached(
const geometry_msgs::msg::PoseStamped & goal_pose);
213 std::unique_ptr<opennav_following::ParameterHandler> param_handler_;
217 rclcpp::Time static_object_start_time_;
219 bool static_timer_initialized_;
224 rclcpp::Time iteration_start_time_;
227 rclcpp::Time action_start_time_;
230 rclcpp::Subscription<geometry_msgs::msg::PoseStamped>::SharedPtr dynamic_pose_sub_;
233 rclcpp_lifecycle::LifecyclePublisher<geometry_msgs::msg::PoseStamped>::SharedPtr
234 filtered_dynamic_pose_pub_;
237 geometry_msgs::msg::PoseStamped detected_dynamic_pose_;
240 std::unique_ptr<opennav_docking::PoseFilter> filter_;
242 std::unique_ptr<nav2_util::TwistPublisher> vel_publisher_;
243 std::unique_ptr<nav2_util::OdomSmoother> odom_sub_;
244 std::unique_ptr<FollowingActionServer> following_action_server_;
246 std::unique_ptr<opennav_docking::Controller> controller_;
248 std::shared_ptr<tf2_ros::Buffer> tf2_buffer_;
249 std::unique_ptr<tf2_ros::TransformListener> tf2_listener_;
A lifecycle node wrapper to enable common Nav2 needs such as manipulating parameters.
An action server wrapper to make applications simpler using Actions.
An action server which implements a dynamic following behavior.
void followObject()
Main action callback method to complete following request.
void getPreemptedGoalIfRequested(typename std::shared_ptr< const typename ActionT::Goal > goal, const std::unique_ptr< nav2_util::SimpleActionServer< ActionT >> &action_server)
Gets a preempted goal if immediately requested.
bool checkAndWarnIfPreempted(std::unique_ptr< nav2_util::SimpleActionServer< ActionT >> &action_server, const std::string &name)
Checks and logs warning if action preempted.
virtual bool getFramePose(geometry_msgs::msg::PoseStamped &pose, const std::string &frame_id)
Get the pose of a specific frame in the fixed frame.
virtual bool approachObject(geometry_msgs::msg::PoseStamped &object_pose, const std::string &target_frame=std::string(""))
Use control law and perception to approach the object.
virtual bool getTrackingPose(geometry_msgs::msg::PoseStamped &pose, const std::string &frame_id)
Get the tracking pose based on the current tracking mode.
nav2_util::CallbackReturn on_deactivate(const rclcpp_lifecycle::State &state) override
Deactivate member variables.
void publishFollowingFeedback(uint16_t state)
Publish feedback from a following action.
nav2_util::CallbackReturn on_cleanup(const rclcpp_lifecycle::State &state) override
Reset member variables.
nav2_util::CallbackReturn on_shutdown(const rclcpp_lifecycle::State &state) override
Called when in shutdown state.
geometry_msgs::msg::PoseStamped getPoseAtDistance(const geometry_msgs::msg::PoseStamped &pose, double distance)
Get the pose at a distance in front of the input pose.
virtual bool getRefinedPose(geometry_msgs::msg::PoseStamped &pose)
Method to obtain the refined dynamic pose.
void publishZeroVelocity()
Publish zero velocity at terminal condition.
bool isGoalReached(const geometry_msgs::msg::PoseStamped &goal_pose)
Check if the goal has been reached.
virtual bool rotateToObject(geometry_msgs::msg::PoseStamped &object_pose, const std::string &target_frame=std::string(""))
Rotate the robot to find the object again.
bool checkAndWarnIfCancelled(std::unique_ptr< nav2_util::SimpleActionServer< ActionT >> &action_server, const std::string &name)
Checks and logs warning if action canceled.
nav2_util::CallbackReturn on_configure(const rclcpp_lifecycle::State &state) override
Configure member variables.
nav2_util::CallbackReturn on_activate(const rclcpp_lifecycle::State &state) override
Activate member variables.
~FollowingServer()=default
A destructor for opennav_following::FollowingServer.
FollowingServer(const rclcpp::NodeOptions &options=rclcpp::NodeOptions())
A constructor for opennav_following::FollowingServer.