/navigate_to_poseΒΆ
Caution
This documentation page has been auto-generated.
It may be missing some details.
/navigate_to_pose Quick Facts
- Category
- Message type
Nav2 BT Navigator implemented by the nav2_bt_navigator package. It navigates from a starting point to a single point goal using a specified Behavior Tree.
For more information on this Navigator, check the Nav2 NavigateToPose documentation.
Quick snippetsΒΆ
Send a goal from the command-lineΒΆ
$ ros2 action send_goal /navigate_to_pose nav2_msgs/action/NavigateToPose # press Tab to complete the message prototype
How to use in your codeΒΆ
Call the action from a Python scriptΒΆ
#!/usr/bin/env python
import rclpy
from rclpy.action import ActionClient
from rclpy.node import Node
from nav2_msgs.action import NavigateToPose
class NavigateToPoseActionClient(Node):
    def __init__(self):
        super().__init__('navigate_to_pose_client')
        self._action_client = ActionClient(self, NavigateToPose, '/navigate_to_pose')
    def send_goal(self, a, b):
        goal_msg = NavigateToPose.Goal()
        # TODO: adapt to the action's parameters
        # check https://docs.ros2.org/latest/api/nav2_msgs/action/NavigateToPose.html
        # for the possible goal parameters
        # goal_msg.a = a
        # goal_msg.b = b
        self._action_client.wait_for_server()
        return self._action_client.send_goal_async(goal_msg)
if __name__ == '__main__':
    rclpy.init(args=args)
    action_client = NavigateToPoseActionClient()
    # TODO: adapt to your action's parameters
    future = action_client.send_goal(a, b)
    rclpy.spin_until_future_complete(action_client, future)
    rclpy.shutdown()
Call the action from a C++ programΒΆ
#include <functional>
#include <future>
#include <memory>
#include <string>
#include <sstream>
#include <chrono>
#include "nav2_msgs/action/navigate_to_pose.hpp"
#include "rclcpp/rclcpp.hpp"
#include "rclcpp_action/rclcpp_action.hpp"
#include "rclcpp_components/register_node_macro.hpp"
using namespace std::chrono_literals;
using namespace std;
class NavigateToPoseActionClient : public rclcpp::Node
{
public:
  using NavigateToPose = nav2_msgs::action::NavigateToPose;
  using GoalHandleNavigateToPose = rclcpp_action::ClientGoalHandle<NavigateToPose>;
  explicit NavigateToPoseActionClient(const rclcpp::NodeOptions & options)
  : Node("navigate_to_pose_action_client", options)
  {
    this->client_ptr_ = rclcpp_action::create_client<NavigateToPose>(
            this,
            "/navigate_to_pose");
    this->timer_ = this->create_wall_timer(
            500ms,
            bind(&NavigateToPoseActionClient::send_goal, this));
  }
  void send_goal()
  {
    using namespace std::placeholders;
    this->timer_->cancel();
    if (!this->client_ptr_->wait_for_action_server()) {
      RCLCPP_ERROR(this->get_logger(), "Action server not available after waiting");
      rclcpp::shutdown();
    }
    auto goal_msg = NavigateToPose::Goal();
    // check https://docs.ros2.org/latest/api/nav2_msgs/action/NavigateToPose.html
    // for the possible goal parameters
    // goal_msg.... = ...;
    RCLCPP_INFO(this->get_logger(), "Sending goal");
    auto send_goal_options = rclcpp_action::Client<NavigateToPose>::SendGoalOptions();
    send_goal_options.goal_response_callback =
        bind(&NavigateToPoseActionClient::goal_response_callback, this, _1);
    send_goal_options.feedback_callback =
        bind(&NavigateToPoseActionClient::feedback_callback, this, _1, _2);
    send_goal_options.result_callback =
        bind(&NavigateToPoseActionClient::result_callback, this, _1);
    this->client_ptr_->async_send_goal(goal_msg, send_goal_options);
  }
private:
  rclcpp_action::Client<NavigateToPose>::SharedPtr client_ptr_;
  rclcpp::TimerBase::SharedPtr timer_;
  void goal_response_callback(const GoalHandleNavigateToPose::SharedPtr & goal_handle)
  {
    if (!goal_handle) {
      RCLCPP_ERROR(this->get_logger(), "Goal was rejected by server");
    } else {
      RCLCPP_INFO(this->get_logger(), "Goal accepted by server, waiting for result");
    }
  }
  void feedback_callback(
      GoalHandleNavigateToPose::SharedPtr,
      const shared_ptr<const NavigateToPose::Feedback> feedback)
  {
    stringstream ss;
    ss << "Next number in sequence received: ";
    for (auto number : feedback->partial_sequence) {
      ss << number << " ";
    }
    RCLCPP_INFO(this->get_logger(), ss.str().c_str());
  }
  void result_callback(const GoalHandleNavigateToPose::WrappedResult & result)
  {
    switch (result.code) {
      case rclcpp_action::ResultCode::SUCCEEDED:
          break;
      case rclcpp_action::ResultCode::ABORTED:
          RCLCPP_ERROR(this->get_logger(), "Goal was aborted");
          return;
      case rclcpp_action::ResultCode::CANCELED:
          RCLCPP_ERROR(this->get_logger(), "Goal was canceled");
          return;
      default:
          RCLCPP_ERROR(this->get_logger(), "Unknown result code");
          return;
    }
    stringstream ss;
    ss << "Result received: ";
    for (auto number : result.result->sequence) {
      ss << number << " ";
    }
    RCLCPP_INFO(this->get_logger(), ss.str().c_str());
    rclcpp::shutdown();
  }
};  // class NavigateToPoseActionClient
RCLCPP_COMPONENTS_REGISTER_NODE(NavigateToPoseActionClient)
 
 
 
 
 
 
 
