From 67be9d98f96902a485294167526c89556b8a740e Mon Sep 17 00:00:00 2001
From: Michael Jeronimo <michael.jeronimo@intel.com>
Date: Thu, 6 Dec 2018 18:26:36 -0800
Subject: [PATCH] Enable DWB to receive path updates (#409)

* Integrate example code into the DWB controller main loop
* Changes to get current robot pose from global planner, required for dynamic replanning
* Address review feedback
* Fix cpplint problem
---
 nav2_bt_navigator/CMakeLists.txt              |  4 +-
 nav2_bt_navigator/behavior_trees/parallel.xml | 10 ++--
 .../behavior_trees/simple_sequential.xml      |  2 +-
 .../nav2_bt_navigator/bt_navigator.hpp        |  2 -
 nav2_bt_navigator/package.xml                 |  4 +-
 nav2_bt_navigator/src/bt_navigator.cpp        | 22 ++------
 .../src/navigate_to_pose_behavior_tree.cpp    |  1 +
 .../dwb_controller/src/dwb_controller.cpp     | 35 ++++++-------
 nav2_msgs/CMakeLists.txt                      |  1 -
 nav2_msgs/msg/PathEndPoints.msg               | 11 ----
 nav2_navfn_planner/CMakeLists.txt             |  2 +
 .../nav2_navfn_planner/navfn_planner.hpp      |  9 +++-
 nav2_navfn_planner/package.xml                |  2 +
 nav2_navfn_planner/src/navfn_planner.cpp      | 51 ++++++++++++-------
 nav2_simple_navigator/CMakeLists.txt          |  2 -
 .../simple_navigator.hpp                      |  2 -
 nav2_simple_navigator/package.xml             |  2 -
 .../src/simple_navigator.cpp                  | 39 +++++---------
 .../src/planning/planner_tester.cpp           | 48 +++++++----------
 .../src/planning/planner_tester.hpp           |  4 +-
 .../include/nav2_tasks/bt_conversions.hpp     |  5 +-
 .../compute_path_to_pose_action.hpp           |  2 +-
 .../nav2_tasks/compute_path_to_pose_task.hpp  |  4 +-
 .../nav2_tasks/rate_controller_node.hpp       |  4 +-
 tools/ros2_dependencies.repos                 |  2 +-
 25 files changed, 115 insertions(+), 155 deletions(-)
 delete mode 100644 nav2_msgs/msg/PathEndPoints.msg

diff --git a/nav2_bt_navigator/CMakeLists.txt b/nav2_bt_navigator/CMakeLists.txt
index 9adc7857..eaf949a5 100644
--- a/nav2_bt_navigator/CMakeLists.txt
+++ b/nav2_bt_navigator/CMakeLists.txt
@@ -14,8 +14,8 @@ find_package(ament_cmake REQUIRED)
 find_package(rclcpp REQUIRED)
 find_package(std_msgs REQUIRED)
 find_package(nav2_tasks REQUIRED)
+find_package(nav_msgs REQUIRED)
 find_package(nav2_msgs REQUIRED)
-find_package(nav2_robot REQUIRED)
 find_package(behaviortree_cpp REQUIRED)
 
 include_directories(
@@ -39,8 +39,8 @@ set(dependencies
   rclcpp
   std_msgs
   nav2_tasks
+  nav_msgs
   nav2_msgs
-  nav2_robot
   behaviortree_cpp
 )
 
diff --git a/nav2_bt_navigator/behavior_trees/parallel.xml b/nav2_bt_navigator/behavior_trees/parallel.xml
index ec6677df..1fdab427 100644
--- a/nav2_bt_navigator/behavior_trees/parallel.xml
+++ b/nav2_bt_navigator/behavior_trees/parallel.xml
@@ -8,8 +8,8 @@
   threshold of 1, whenever the FollowPath returns SUCCESS or FAILURE, the parallel
   node will return this result.
 
-  The path endpoints (input to the global planner) and the resulting path (output of
-  the global planner and input to the local planner) are passed on the blackboard.
+  The goal (input to the global planner) and the resulting path (output of the global
+  planner and input to the local planner) are passed on the blackboard.
 
   The rate at which the ComputePathToPose operation is invoked can be controlled with
   the hz parameter to the RateController node.
@@ -18,12 +18,12 @@
 <root main_tree_to_execute="MainTree">
   <BehaviorTree ID="MainTree">
     <SequenceStar name="root">
-      <ComputePathToPose endpoints="${endpoints}" path="${path}"/>
+      <ComputePathToPose goal="${goal}" path="${path}"/>
       <ParallelNode threshold="1">
         <FollowPath path="${path}"/>
         <Sequence>
-          <RateController hz="2">
-            <ComputePathToPose endpoints="${endpoints}" path="${path}"/>
+          <RateController hz="1.0">
+            <ComputePathToPose goal="${goal}" path="${path}"/>
           </RateController>
           <UpdatePath/>
         </Sequence>
diff --git a/nav2_bt_navigator/behavior_trees/simple_sequential.xml b/nav2_bt_navigator/behavior_trees/simple_sequential.xml
index 21e740fe..4f6a441d 100644
--- a/nav2_bt_navigator/behavior_trees/simple_sequential.xml
+++ b/nav2_bt_navigator/behavior_trees/simple_sequential.xml
@@ -9,7 +9,7 @@
 <root main_tree_to_execute="MainTree">
   <BehaviorTree ID="MainTree">
     <SequenceStar name="root">
-      <ComputePathToPose endpoints="${endpoints}" path="${path}"/>
+      <ComputePathToPose goal="${goal}" path="${path}"/>
       <FollowPath path="${path}"/>
     </SequenceStar>
   </BehaviorTree>
diff --git a/nav2_bt_navigator/include/nav2_bt_navigator/bt_navigator.hpp b/nav2_bt_navigator/include/nav2_bt_navigator/bt_navigator.hpp
index 785c4c66..6a327649 100644
--- a/nav2_bt_navigator/include/nav2_bt_navigator/bt_navigator.hpp
+++ b/nav2_bt_navigator/include/nav2_bt_navigator/bt_navigator.hpp
@@ -18,7 +18,6 @@
 #include <string>
 #include <memory>
 #include "nav2_tasks/navigate_to_pose_task.hpp"
-#include "nav2_robot/robot.hpp"
 
 namespace nav2_bt_navigator
 {
@@ -32,7 +31,6 @@ public:
     const nav2_tasks::NavigateToPoseCommand::SharedPtr command);
 
 private:
-  std::unique_ptr<nav2_robot::Robot> robot_;
   std::unique_ptr<nav2_tasks::NavigateToPoseTaskServer> task_server_;
   std::string bt_xml_filename_;
 };
diff --git a/nav2_bt_navigator/package.xml b/nav2_bt_navigator/package.xml
index 4ae7cf21..bf68a8ff 100644
--- a/nav2_bt_navigator/package.xml
+++ b/nav2_bt_navigator/package.xml
@@ -11,13 +11,13 @@
 
   <build_depend>rclcpp</build_depend>
   <build_depend>nav2_tasks</build_depend>
+  <build_depend>nav_msgs</build_depend>
   <build_depend>nav2_msgs</build_depend>
-  <build_depend>nav2_robot</build_depend>
 
   <exec_depend>rclcpp</exec_depend>
   <exec_depend>nav2_tasks</exec_depend>
+  <exec_depend>nav_msgs</exec_depend>
   <exec_depend>nav2_msgs</exec_depend>
-  <exec_depend>nav2_robot</exec_depend>
 
   <test_depend>ament_lint_common</test_depend>
   <test_depend>ament_lint_auto</test_depend>
diff --git a/nav2_bt_navigator/src/bt_navigator.cpp b/nav2_bt_navigator/src/bt_navigator.cpp
index a2d28811..139c5e78 100644
--- a/nav2_bt_navigator/src/bt_navigator.cpp
+++ b/nav2_bt_navigator/src/bt_navigator.cpp
@@ -32,8 +32,6 @@ BtNavigator::BtNavigator()
 {
   auto temp_node = std::shared_ptr<rclcpp::Node>(this, [](rclcpp::Node *) {});
 
-  robot_ = std::make_unique<nav2_robot::Robot>(temp_node);
-
   task_server_ = std::make_unique<nav2_tasks::NavigateToPoseTaskServer>(temp_node);
   task_server_->setExecuteCallback(
     std::bind(&BtNavigator::navigateToPose, this, std::placeholders::_1));
@@ -42,31 +40,17 @@ BtNavigator::BtNavigator()
 TaskStatus
 BtNavigator::navigateToPose(const nav2_tasks::NavigateToPoseCommand::SharedPtr command)
 {
-  RCLCPP_INFO(get_logger(), "Start navigating to goal (%.2f, %.2f).",
+  RCLCPP_INFO(get_logger(), "Begin navigating from current location to (%.2f, %.2f)",
     command->pose.position.x, command->pose.position.y);
 
-  // Get the current pose from the robot
-  auto current = std::make_shared<geometry_msgs::msg::PoseWithCovarianceStamped>();
-
-  if (!robot_->getCurrentPose(current)) {
-    RCLCPP_ERROR(get_logger(), "Current robot pose is not available.");
-    return TaskStatus::FAILED;
-  }
-
   // Create the blackboard that will be shared by all of the nodes in the tree
   BT::Blackboard::Ptr blackboard = BT::Blackboard::create<BT::BlackboardLocal>();
 
-  // Put together the PathEndPoints message for the ComputePathToPose task
-  auto endpoints = std::make_shared<nav2_tasks::ComputePathToPoseCommand>();
-  endpoints->start = current->pose.pose;
-  endpoints->goal = command->pose;
-  endpoints->tolerance = 2.0;  // TODO(mjeronimo): this will come in the command message
-
-  // The path returned from ComputePath and sent to the FollowPath task
+  // Create the path to be returned from ComputePath and sent to the FollowPath task
   auto path = std::make_shared<nav2_tasks::ComputePathToPoseResult>();
 
   // Set the shared data (commands/results)
-  blackboard->set<nav2_tasks::ComputePathToPoseCommand::SharedPtr>("endpoints", endpoints);
+  blackboard->set<nav2_tasks::ComputePathToPoseCommand::SharedPtr>("goal", command);
   blackboard->set<nav2_tasks::ComputePathToPoseResult::SharedPtr>("path", path);  // NOLINT
 
   // Get the filename to use from the parameter
diff --git a/nav2_bt_navigator/src/navigate_to_pose_behavior_tree.cpp b/nav2_bt_navigator/src/navigate_to_pose_behavior_tree.cpp
index 1c3bfd1b..4c5ba20d 100644
--- a/nav2_bt_navigator/src/navigate_to_pose_behavior_tree.cpp
+++ b/nav2_bt_navigator/src/navigate_to_pose_behavior_tree.cpp
@@ -57,6 +57,7 @@ BT::NodeStatus NavigateToPoseBehaviorTree::updatePath(BT::TreeNode & tree_node)
   // Get the updated path from the blackboard and send to the FollowPath task server
   auto path = tree_node.blackboard()->template get<nav2_tasks::ComputePathToPoseResult::SharedPtr>(
     "path");
+
   follow_path_task_client_->sendUpdate(path);
   return BT::NodeStatus::RUNNING;
 }
diff --git a/nav2_dwb_controller/dwb_controller/src/dwb_controller.cpp b/nav2_dwb_controller/dwb_controller/src/dwb_controller.cpp
index 04df5bbf..aeb2a01a 100644
--- a/nav2_dwb_controller/dwb_controller/src/dwb_controller.cpp
+++ b/nav2_dwb_controller/dwb_controller/src/dwb_controller.cpp
@@ -55,32 +55,15 @@ DwbController::~DwbController()
 TaskStatus
 DwbController::followPath(const nav2_tasks::FollowPathCommand::SharedPtr command)
 {
-#if 0
-  // TODO(mjeronimo): Integrate the following example code into the
-  // main loop below
-
-  while (true) {
-    ...
-
-    if (task_server_->updateRequested()) {
-      auto new_path = std::make_shared<nav2_tasks::FollowPathCommand>();
-      task_server_->getCommandUpdate(new_path);
-      task_server_->setUpdated();
-
-      // Update the target path
-    }
-
-    ...
-  }
-#endif
-
   RCLCPP_INFO(get_logger(), "Starting controller");
   try {
     auto path = nav_2d_utils::pathToPath2D(*command);
     auto nh = shared_from_this();
+
     planner_.initialize(nh, shared_ptr<tf2_ros::Buffer>(&tfBuffer_, NO_OP_DELETER), cm_);
     planner_.setPlan(path);
     RCLCPP_INFO(get_logger(), "Initialized");
+
     while (true) {
       nav_2d_msgs::msg::Pose2DStamped pose2d;
       if (!getRobotPose(pose2d)) {
@@ -94,12 +77,26 @@ DwbController::followPath(const nav2_tasks::FollowPathCommand::SharedPtr command
         auto cmd_vel_2d = planner_.computeVelocityCommands(pose2d, velocity);
         publishVelocity(cmd_vel_2d);
         RCLCPP_INFO(get_logger(), "Publishing velocity");
+
+        // Check if this task has been canceled
         if (task_server_->cancelRequested()) {
           RCLCPP_INFO(this->get_logger(), "execute: task has been canceled");
           task_server_->setCanceled();
           publishZeroVelocity();
           return TaskStatus::CANCELED;
         }
+
+        // Check if there is an update to the path to follow
+        if (task_server_->updateRequested()) {
+          // Get the new, updated path
+          auto path_cmd = std::make_shared<nav2_tasks::FollowPathCommand>();
+          task_server_->getCommandUpdate(path_cmd);
+          task_server_->setUpdated();
+
+          // and pass it to the local planner
+          auto path = nav_2d_utils::pathToPath2D(*path_cmd);
+          planner_.setPlan(path);
+        }
       }
       std::this_thread::sleep_for(100ms);
     }
diff --git a/nav2_msgs/CMakeLists.txt b/nav2_msgs/CMakeLists.txt
index b9ec5fe6..12bbe85e 100644
--- a/nav2_msgs/CMakeLists.txt
+++ b/nav2_msgs/CMakeLists.txt
@@ -20,7 +20,6 @@ rosidl_generate_interfaces(${PROJECT_NAME}
   "msg/Costmap.msg"
   "msg/CostmapMetaData.msg"
   "msg/Path.msg"
-  "msg/PathEndPoints.msg"
   "msg/MissionPlan.msg"
   "msg/TaskStatus.msg"
   "msg/VoxelGrid.msg"
diff --git a/nav2_msgs/msg/PathEndPoints.msg b/nav2_msgs/msg/PathEndPoints.msg
deleted file mode 100644
index 7561cec3..00000000
--- a/nav2_msgs/msg/PathEndPoints.msg
+++ /dev/null
@@ -1,11 +0,0 @@
-std_msgs/Header header
-
-# The start pose for the plan
-geometry_msgs/Pose start
-
-# The final pose of the goal
-geometry_msgs/Pose goal
-
-# If the goal is obstructed, how many meters the planner can
-# relax the constraint in x and y before failing.
-float32 tolerance
\ No newline at end of file
diff --git a/nav2_navfn_planner/CMakeLists.txt b/nav2_navfn_planner/CMakeLists.txt
index 9d850f9b..bd8d8630 100644
--- a/nav2_navfn_planner/CMakeLists.txt
+++ b/nav2_navfn_planner/CMakeLists.txt
@@ -17,6 +17,7 @@ find_package(visualization_msgs REQUIRED)
 find_package(nav2_tasks REQUIRED)
 find_package(nav2_util REQUIRED)
 find_package(nav2_msgs REQUIRED)
+find_package(nav2_robot REQUIRED)
 find_package(nav_msgs REQUIRED)
 
 include_directories(
@@ -33,6 +34,7 @@ set(dependencies
   nav2_util
   nav2_tasks
   nav2_msgs
+  nav2_robot
   nav_msgs
 )
 
diff --git a/nav2_navfn_planner/include/nav2_navfn_planner/navfn_planner.hpp b/nav2_navfn_planner/include/nav2_navfn_planner/navfn_planner.hpp
index 11a7d205..d00355d9 100644
--- a/nav2_navfn_planner/include/nav2_navfn_planner/navfn_planner.hpp
+++ b/nav2_navfn_planner/include/nav2_navfn_planner/navfn_planner.hpp
@@ -29,6 +29,7 @@
 #include "geometry_msgs/msg/point.hpp"
 #include "nav_msgs/msg/path.hpp"
 #include "visualization_msgs/msg/marker.hpp"
+#include "nav2_robot/robot.hpp"
 
 namespace nav2_navfn_planner
 {
@@ -103,7 +104,9 @@ private:
 
   // Publish a path for visualization purposes
   void publishPlan(const nav2_msgs::msg::Path & path);
-  void publishEndpoints(const nav2_tasks::ComputePathToPoseCommand::SharedPtr & endpoints);
+  void publishEndpoints(
+    const geometry_msgs::msg::Pose & start,
+    const geometry_msgs::msg::Pose & goal);
 
   // Determine if a new planner object should be made
   bool isPlannerOutOfDate();
@@ -129,10 +132,12 @@ private:
   bool allow_unknown_;
 
   // Amount the planner can relax the space constraint
-  double default_tolerance_;
+  double tolerance_;
 
   // Whether to use the astar planner or default dijkstras
   bool use_astar_;
+
+  std::unique_ptr<nav2_robot::Robot> robot_;
 };
 
 }  // namespace nav2_navfn_planner
diff --git a/nav2_navfn_planner/package.xml b/nav2_navfn_planner/package.xml
index 7e07ac5e..4060d224 100644
--- a/nav2_navfn_planner/package.xml
+++ b/nav2_navfn_planner/package.xml
@@ -15,12 +15,14 @@
   <build_depend>nav2_tasks</build_depend>
   <build_depend>nav2_util</build_depend>
   <build_depend>nav2_msgs</build_depend>
+  <build_depend>nav2_robot</build_depend>
   <build_depend>nav_msgs</build_depend>
 
   <exec_depend>rclcpp</exec_depend>
   <exec_depend>visualization_msgs</exec_depend>
   <exec_depend>nav2_tasks</exec_depend>
   <exec_depend>nav2_msgs</exec_depend>
+  <exec_depend>nav2_robot</exec_depend>
   <exec_depend>nav_msgs</exec_depend>
 
   <test_depend>ament_lint_common</test_depend>
diff --git a/nav2_navfn_planner/src/navfn_planner.cpp b/nav2_navfn_planner/src/navfn_planner.cpp
index 5d35a144..b6478e8f 100644
--- a/nav2_navfn_planner/src/navfn_planner.cpp
+++ b/nav2_navfn_planner/src/navfn_planner.cpp
@@ -49,9 +49,7 @@ namespace nav2_navfn_planner
 NavfnPlanner::NavfnPlanner()
 : Node("NavfnPlanner"),
   global_frame_("map"),
-  allow_unknown_(true),
-  default_tolerance_(1.0),
-  use_astar_(false)
+  allow_unknown_(true)
 {
   RCLCPP_INFO(get_logger(), "Initializing.");
 
@@ -59,6 +57,11 @@ NavfnPlanner::NavfnPlanner()
   auto temp_node = std::shared_ptr<rclcpp::Node>(this, [](auto) {});
 
   auto parameters_client = std::make_shared<rclcpp::SyncParametersClient>(temp_node);
+
+  // If the goal is obstructed, the tolerance specifies how many meters the planner
+  // can relax the constraint in x and y before failing
+  tolerance_ = parameters_client->get_parameter("tolerance", 0.0);
+
   use_astar_ = parameters_client->get_parameter("use_astar", false);
 
   // TODO(orduno): Enable parameter server and get costmap service name from there
@@ -68,6 +71,8 @@ NavfnPlanner::NavfnPlanner()
   plan_marker_publisher_ = this->create_publisher<visualization_msgs::msg::Marker>(
     "endpoints", 1);
 
+  robot_ = std::make_unique<nav2_robot::Robot>(temp_node);
+
   task_server_ = std::make_unique<nav2_tasks::ComputePathToPoseTaskServer>(temp_node, false),
   task_server_->setExecuteCallback(
     std::bind(&NavfnPlanner::computePathToPose, this, std::placeholders::_1));
@@ -84,10 +89,6 @@ NavfnPlanner::~NavfnPlanner()
 TaskStatus
 NavfnPlanner::computePathToPose(const nav2_tasks::ComputePathToPoseCommand::SharedPtr command)
 {
-  RCLCPP_INFO(get_logger(), "Attempting to a find path from (%.2f, %.2f) to "
-    "(%.2f, %.2f).", command->start.position.x, command->start.position.y,
-    command->goal.position.x, command->goal.position.y);
-
   nav2_tasks::ComputePathToPoseResult result;
   try {
     // Get an updated costmap
@@ -102,8 +103,20 @@ NavfnPlanner::computePathToPose(const nav2_tasks::ComputePathToPoseCommand::Shar
       planner_ = std::make_unique<NavFn>(costmap_.metadata.size_x, costmap_.metadata.size_y);
     }
 
+    // Get the current pose from the robot
+    auto start = std::make_shared<geometry_msgs::msg::PoseWithCovarianceStamped>();
+
+    if (!robot_->getCurrentPose(start)) {
+      RCLCPP_ERROR(get_logger(), "Current robot pose is not available.");
+      return TaskStatus::FAILED;
+    }
+
+    RCLCPP_INFO(get_logger(), "Attempting to a find path from (%.2f, %.2f) to "
+      "(%.2f, %.2f).", start->pose.pose.position.x, start->pose.pose.position.y,
+      command->pose.position.x, command->pose.position.y);
+
     // Make the plan for the provided goal pose
-    bool foundPath = makePlan(command->start, command->goal, command->tolerance, result);
+    bool foundPath = makePlan(start->pose.pose, command->pose, tolerance_, result);
 
     // TODO(orduno): should check for cancel within the makePlan() method?
     if (task_server_->cancelRequested()) {
@@ -114,7 +127,7 @@ NavfnPlanner::computePathToPose(const nav2_tasks::ComputePathToPoseCommand::Shar
 
     if (!foundPath) {
       RCLCPP_WARN(get_logger(), "Planning algorithm failed to generate a valid"
-        " path to (%.2f, %.2f)", command->goal.position.x, command->goal.position.y);
+        " path to (%.2f, %.2f)", command->pose.position.x, command->pose.position.y);
       return TaskStatus::FAILED;
     }
 
@@ -124,18 +137,18 @@ NavfnPlanner::computePathToPose(const nav2_tasks::ComputePathToPoseCommand::Shar
     // Publish the plan for visualization purposes
     RCLCPP_INFO(get_logger(), "Publishing the valid path.");
     publishPlan(result);
-    publishEndpoints(command);
+    publishEndpoints(start->pose.pose, command->pose);
 
     // TODO(orduno): Enable potential visualization
 
     RCLCPP_INFO(get_logger(),
       "Successfully navigated to (%.2f, %.2f) with tolerance %.2f",
-      command->goal.position.x, command->goal.position.y, command->tolerance);
+      command->pose.position.x, command->pose.position.y, tolerance_);
     task_server_->setResult(result);
     return TaskStatus::SUCCEEDED;
   } catch (std::exception & ex) {
     RCLCPP_WARN(get_logger(), "Plan calculation to (%.2f, %.2f) failed: \"%s\"",
-      command->goal.position.x, command->goal.position.y, ex.what());
+      command->pose.position.x, command->pose.position.y, ex.what());
 
     // TODO(orduno): provide information about fail error to parent task,
     //               for example: couldn't get costmap update
@@ -275,8 +288,8 @@ NavfnPlanner::smoothApproachToGoal(
   auto last_pose = plan.poses.back();
   if (
     squared_distance(last_pose, second_to_last_pose) >
-    squared_distance(goal, second_to_last_pose)
-  ) {
+    squared_distance(goal, second_to_last_pose))
+  {
     plan.poses.back() = goal;
   } else {
     geometry_msgs::msg::Pose goal_copy = goal;
@@ -390,7 +403,7 @@ NavfnPlanner::getPointPotential(const geometry_msgs::msg::Point & world_point)
 bool
 NavfnPlanner::validPointPotential(const geometry_msgs::msg::Point & world_point)
 {
-  return validPointPotential(world_point, default_tolerance_);
+  return validPointPotential(world_point, tolerance_);
 }
 
 bool
@@ -500,7 +513,9 @@ NavfnPlanner::printCostmap(const nav2_msgs::msg::Costmap & costmap)
 }
 
 void
-NavfnPlanner::publishEndpoints(const nav2_tasks::ComputePathToPoseCommand::SharedPtr & endpoints)
+NavfnPlanner::publishEndpoints(
+  const geometry_msgs::msg::Pose & start,
+  const geometry_msgs::msg::Pose & goal)
 {
   visualization_msgs::msg::Marker marker;
 
@@ -543,8 +558,8 @@ NavfnPlanner::publishEndpoints(const nav2_tasks::ComputePathToPoseCommand::Share
   marker.frame_locked = false;
 
   marker.points.resize(2);
-  marker.points[0] = endpoints->start.position;
-  marker.points[1] = endpoints->goal.position;
+  marker.points[0] = start.position;
+  marker.points[1] = goal.position;
 
   // Set the color -- be sure to set alpha to something non-zero!
   std_msgs::msg::ColorRGBA start_color;
diff --git a/nav2_simple_navigator/CMakeLists.txt b/nav2_simple_navigator/CMakeLists.txt
index 167216a7..15fc49f6 100644
--- a/nav2_simple_navigator/CMakeLists.txt
+++ b/nav2_simple_navigator/CMakeLists.txt
@@ -15,7 +15,6 @@ find_package(rclcpp REQUIRED)
 find_package(std_msgs REQUIRED)
 find_package(nav2_tasks REQUIRED)
 find_package(nav2_msgs REQUIRED)
-find_package(nav2_robot REQUIRED)
 
 include_directories(
   include
@@ -38,7 +37,6 @@ set(dependencies
   std_msgs
   nav2_tasks
   nav2_msgs
-  nav2_robot
 )
 
 ament_target_dependencies(${executable_name}
diff --git a/nav2_simple_navigator/include/nav2_simple_navigator/simple_navigator.hpp b/nav2_simple_navigator/include/nav2_simple_navigator/simple_navigator.hpp
index 19bf4c78..99e1761f 100644
--- a/nav2_simple_navigator/include/nav2_simple_navigator/simple_navigator.hpp
+++ b/nav2_simple_navigator/include/nav2_simple_navigator/simple_navigator.hpp
@@ -21,7 +21,6 @@
 #include "nav2_tasks/navigate_to_pose_task.hpp"
 #include "nav2_tasks/compute_path_to_pose_task.hpp"
 #include "nav2_tasks/follow_path_task.hpp"
-#include "nav2_robot/robot.hpp"
 
 namespace nav2_simple_navigator
 {
@@ -35,7 +34,6 @@ public:
   nav2_tasks::TaskStatus navigateToPose(const nav2_tasks::NavigateToPoseCommand::SharedPtr command);
 
 private:
-  std::unique_ptr<nav2_robot::Robot> robot_;
   std::unique_ptr<nav2_tasks::ComputePathToPoseTaskClient> planner_client_;
   std::unique_ptr<nav2_tasks::FollowPathTaskClient> controller_client_;
   std::unique_ptr<nav2_tasks::NavigateToPoseTaskServer> task_server_;
diff --git a/nav2_simple_navigator/package.xml b/nav2_simple_navigator/package.xml
index eea54ef2..cef45072 100644
--- a/nav2_simple_navigator/package.xml
+++ b/nav2_simple_navigator/package.xml
@@ -12,12 +12,10 @@
   <build_depend>rclcpp</build_depend>
   <build_depend>nav2_tasks</build_depend>
   <build_depend>nav2_msgs</build_depend>
-  <build_depend>nav2_robot</build_depend>
 
   <exec_depend>rclcpp</exec_depend>
   <exec_depend>nav2_tasks</exec_depend>
   <exec_depend>nav2_msgs</exec_depend>
-  <exec_depend>nav2_robot</exec_depend>
 
   <test_depend>ament_lint_common</test_depend>
   <test_depend>ament_lint_auto</test_depend>
diff --git a/nav2_simple_navigator/src/simple_navigator.cpp b/nav2_simple_navigator/src/simple_navigator.cpp
index f81a1a42..5d91d3c7 100644
--- a/nav2_simple_navigator/src/simple_navigator.cpp
+++ b/nav2_simple_navigator/src/simple_navigator.cpp
@@ -32,8 +32,6 @@ SimpleNavigator::SimpleNavigator()
 
   auto temp_node = std::shared_ptr<rclcpp::Node>(this, [](auto) {});
 
-  robot_ = std::make_unique<nav2_robot::Robot>(temp_node);
-
   planner_client_ =
     std::make_unique<nav2_tasks::ComputePathToPoseTaskClient>(temp_node);
 
@@ -53,35 +51,22 @@ SimpleNavigator::~SimpleNavigator()
 TaskStatus
 SimpleNavigator::navigateToPose(const nav2_tasks::NavigateToPoseCommand::SharedPtr command)
 {
-  RCLCPP_INFO(get_logger(), "Begin navigating to (%.2f, %.2f)",
+  RCLCPP_INFO(get_logger(), "Begin navigating from current location to (%.2f, %.2f)",
     command->pose.position.x, command->pose.position.y);
 
-  // Get the current pose from the robot
-  auto current_pose = std::make_shared<geometry_msgs::msg::PoseWithCovarianceStamped>();
-
-  if (!robot_->getCurrentPose(current_pose)) {
-    // TODO(mhpanah): use either last known pose, current pose from odom, wait, or try again.
-    RCLCPP_WARN(get_logger(), "Current robot pose is not available.");
-    return TaskStatus::FAILED;
-  }
-
-  // Create a PathEndPoints message for the global planner
-  auto endpoints = std::make_shared<nav2_tasks::ComputePathToPoseCommand>();
-  endpoints->start = current_pose->pose.pose;
-  endpoints->goal = command->pose;
-  endpoints->tolerance = 2.0;  // TODO(mjeronimo): this will come in the command message
+  // Create the path to be returned from ComputePath and sent to the FollowPath task
+  auto path = std::make_shared<nav2_tasks::ComputePathToPoseResult>();
 
   RCLCPP_DEBUG(get_logger(), "Getting the path from the planner");
-  RCLCPP_DEBUG(get_logger(), "goal.position.x: %f", endpoints->goal.position.x);
-  RCLCPP_DEBUG(get_logger(), "goal.position.y: %f", endpoints->goal.position.y);
-  RCLCPP_DEBUG(get_logger(), "goal.position.z: %f", endpoints->goal.position.z);
-  RCLCPP_DEBUG(get_logger(), "goal.orientation.x: %f", endpoints->goal.orientation.x);
-  RCLCPP_DEBUG(get_logger(), "goal.orientation.y: %f", endpoints->goal.orientation.y);
-  RCLCPP_DEBUG(get_logger(), "goal.orientation.z: %f", endpoints->goal.orientation.z);
-  RCLCPP_DEBUG(get_logger(), "goal.orientation.w: %f", endpoints->goal.orientation.w);
-
-  auto path = std::make_shared<nav2_tasks::ComputePathToPoseResult>();
-  planner_client_->sendCommand(endpoints);
+  RCLCPP_DEBUG(get_logger(), "goal->pose.position.x: %f", command->pose.position.x);
+  RCLCPP_DEBUG(get_logger(), "goal->pose.position.y: %f", command->pose.position.y);
+  RCLCPP_DEBUG(get_logger(), "goal->pose.position.z: %f", command->pose.position.z);
+  RCLCPP_DEBUG(get_logger(), "goal->pose.orientation.x: %f", command->pose.orientation.x);
+  RCLCPP_DEBUG(get_logger(), "goal->pose.orientation.y: %f", command->pose.orientation.y);
+  RCLCPP_DEBUG(get_logger(), "goal->pose.orientation.z: %f", command->pose.orientation.z);
+  RCLCPP_DEBUG(get_logger(), "goal->pose.orientation.w: %f", command->pose.orientation.w);
+
+  planner_client_->sendCommand(command);
 
   // Loop until the subtasks are completed
   for (;; ) {
diff --git a/nav2_system_tests/src/planning/planner_tester.cpp b/nav2_system_tests/src/planning/planner_tester.cpp
index 20daf794..ee30d9ab 100644
--- a/nav2_system_tests/src/planning/planner_tester.cpp
+++ b/nav2_system_tests/src/planning/planner_tester.cpp
@@ -240,7 +240,7 @@ bool PlannerTester::defaultPlannerTest(
     return false;
   }
 
-  auto endpoints = std::make_shared<nav2_tasks::ComputePathToPoseCommand>();
+  auto goal = std::make_shared<nav2_tasks::ComputePathToPoseCommand>();
   auto costmap_properties = costmap_->getProperties();
 
   // Compose the PathEndPoints message
@@ -248,11 +248,8 @@ bool PlannerTester::defaultPlannerTest(
     RCLCPP_INFO(this->get_logger(), "PlannerTester::defaultPlannerTest:"
       " planning using a fake costmap");
 
-    endpoints->start.position.x = 1.0;
-    endpoints->start.position.y = 1.0;
-    endpoints->goal.position.x = 9.0;
-    endpoints->goal.position.y = 9.0;
-    endpoints->tolerance = 2.0;
+    goal->pose.position.x = 9.0;
+    goal->pose.position.y = 9.0;
 
   } else {
     RCLCPP_INFO(this->get_logger(), "PlannerTester::defaultPlannerTest:"
@@ -260,14 +257,11 @@ bool PlannerTester::defaultPlannerTest(
 
     // Defined with respect to world coordinate system
     //  Planner will do coordinate transformation to map internally
-    endpoints->start.position.x = 390.0;
-    endpoints->start.position.y = 10.0;
-    endpoints->goal.position.x = 10.0;
-    endpoints->goal.position.y = 390.0;
-    endpoints->tolerance = 2.0;
+    goal->pose.position.x = 10.0;
+    goal->pose.position.y = 390.0;
   }
 
-  bool pathIsCollisionFree = plannerTest(endpoints, path);
+  bool pathIsCollisionFree = plannerTest(goal, path);
 
   // TODO(orduno): On a default test, provide the 'right answer' to compare with the planner result
   //               given that we know the start, end and costmap is either preloaded or coming from
@@ -312,7 +306,7 @@ bool PlannerTester::defaultPlannerRandomTests(const unsigned int number_tests)
       return std::make_pair(x, y);
     };
 
-  auto endpoints = std::make_shared<nav2_tasks::ComputePathToPoseCommand>();
+  auto goal = std::make_shared<nav2_tasks::ComputePathToPoseCommand>();
   auto path = std::make_shared<nav2_tasks::ComputePathToPoseResult>();
 
   bool all_tests_OK = true;
@@ -321,28 +315,22 @@ bool PlannerTester::defaultPlannerRandomTests(const unsigned int number_tests)
     RCLCPP_INFO(this->get_logger(), "PlannerTester::defaultPlannerRandomTests:"
       " running test #%u", test_num + 1);
 
-    // Compose the path endpoints using random numbers
+    // Compose the goal using random numbers
     // Defined with respect to world coordinate system
     // Planner will do coordinate transformation to map internally
-    auto start = generate_random();
-    auto goal = generate_random();
-    endpoints->start.position.x = start.first;
-    endpoints->start.position.y = start.second;
-    endpoints->goal.position.x = goal.first;
-    endpoints->goal.position.y = goal.second;
-
-    endpoints->tolerance = 2.0;
+    auto vals = generate_random();
+    goal->pose.position.x = vals.first;
+    goal->pose.position.y = vals.second;
 
     // TODO(orduno): Tweak criteria for defining if a path goes into obstacles.
     //               Current Dijkstra planner will sometimes produce paths that cut corners
     //               i.e. some points are around the corner are actually inside the obstacle
-    bool pathIsCollisionFree = plannerTest(endpoints, path);
+    bool pathIsCollisionFree = plannerTest(goal, path);
 
     if (!pathIsCollisionFree) {
       RCLCPP_INFO(this->get_logger(), "PlannerTester::defaultPlannerRandomTests:"
-        " failed or found a collision with start at %0.2f, %0.2f and end at %0.2f, %0.2f",
-        endpoints->start.position.x, endpoints->start.position.y,
-        endpoints->goal.position.x, endpoints->goal.position.y);
+        " failed or found a collision with goal at %0.2f, %0.2f",
+        goal->pose.position.x, goal->pose.position.y);
       all_tests_OK = false;
       ++num_fail;
     }
@@ -355,13 +343,13 @@ bool PlannerTester::defaultPlannerRandomTests(const unsigned int number_tests)
 }
 
 bool PlannerTester::plannerTest(
-  const nav2_tasks::ComputePathToPoseCommand::SharedPtr & endpoints,
+  const nav2_tasks::ComputePathToPoseCommand::SharedPtr & goal,
   nav2_tasks::ComputePathToPoseResult::SharedPtr & path)
 {
   RCLCPP_INFO(this->get_logger(), "PlannerTester::plannerTest:"
     " getting the path from the planner");
 
-  TaskStatus status = sendRequest(endpoints, path);
+  TaskStatus status = sendRequest(goal, path);
 
   RCLCPP_INFO(this->get_logger(), "PlannerTester::plannerTest: status: %d", status);
 
@@ -380,10 +368,10 @@ bool PlannerTester::plannerTest(
 }
 
 TaskStatus PlannerTester::sendRequest(
-  const nav2_tasks::ComputePathToPoseCommand::SharedPtr & endpoints,
+  const nav2_tasks::ComputePathToPoseCommand::SharedPtr & goal,
   nav2_tasks::ComputePathToPoseResult::SharedPtr & path)
 {
-  planner_client_->sendCommand(endpoints);
+  planner_client_->sendCommand(goal);
 
   // Loop until the subtask is completed
   while (true) {
diff --git a/nav2_system_tests/src/planning/planner_tester.hpp b/nav2_system_tests/src/planning/planner_tester.hpp
index 5b752f32..605f3e84 100644
--- a/nav2_system_tests/src/planning/planner_tester.hpp
+++ b/nav2_system_tests/src/planning/planner_tester.hpp
@@ -51,7 +51,7 @@ public:
   // Sucess criteria is a collision free path.
   // TODO(orduno): assuming a robot the size of a costmap cell
   bool plannerTest(
-    const nav2_tasks::ComputePathToPoseCommand::SharedPtr & endpoints,
+    const nav2_tasks::ComputePathToPoseCommand::SharedPtr & goal,
     nav2_tasks::ComputePathToPoseResult::SharedPtr & path);
 
   // Sends the request to the planner and gets the result.
@@ -74,7 +74,7 @@ private:
   void startCostmapServer(std::string serviceName);
 
   nav2_tasks::TaskStatus sendRequest(
-    const nav2_tasks::ComputePathToPoseCommand::SharedPtr & endpoints,
+    const nav2_tasks::ComputePathToPoseCommand::SharedPtr & goal,
     nav2_tasks::ComputePathToPoseResult::SharedPtr & path
   );
 
diff --git a/nav2_tasks/include/nav2_tasks/bt_conversions.hpp b/nav2_tasks/include/nav2_tasks/bt_conversions.hpp
index 9e988224..1fb8a11b 100644
--- a/nav2_tasks/include/nav2_tasks/bt_conversions.hpp
+++ b/nav2_tasks/include/nav2_tasks/bt_conversions.hpp
@@ -20,8 +20,8 @@
 #include "behaviortree_cpp/blackboard/blackboard.h"
 #include "geometry_msgs/msg/point.hpp"
 #include "geometry_msgs/msg/quaternion.hpp"
+#include "geometry_msgs/msg/pose_stamped.hpp"
 #include "nav2_msgs/msg/path.hpp"
-#include "nav2_msgs/msg/path_end_points.hpp"
 
 namespace BT
 {
@@ -48,11 +48,12 @@ inline nav2_msgs::msg::Path::SharedPtr convertFromString(const StringView & /*ke
 }
 
 template<>
-inline nav2_msgs::msg::PathEndPoints::SharedPtr convertFromString(const StringView & /*key*/)
+inline geometry_msgs::msg::PoseStamped::SharedPtr convertFromString(const StringView & /*key*/)
 {
   return nullptr;
 }
 
+
 // These are needed to be able to set parameters for these types in the BT XML
 
 template<>
diff --git a/nav2_tasks/include/nav2_tasks/compute_path_to_pose_action.hpp b/nav2_tasks/include/nav2_tasks/compute_path_to_pose_action.hpp
index f95390a7..0310b704 100644
--- a/nav2_tasks/include/nav2_tasks/compute_path_to_pose_action.hpp
+++ b/nav2_tasks/include/nav2_tasks/compute_path_to_pose_action.hpp
@@ -38,7 +38,7 @@ public:
   void onInit() override
   {
     command_ =
-      blackboard()->template get<nav2_tasks::ComputePathToPoseCommand::SharedPtr>("endpoints");
+      blackboard()->template get<nav2_tasks::ComputePathToPoseCommand::SharedPtr>("goal");
 
     result_ = blackboard()->template get<nav2_tasks::ComputePathToPoseResult::SharedPtr>("path");
   }
diff --git a/nav2_tasks/include/nav2_tasks/compute_path_to_pose_task.hpp b/nav2_tasks/include/nav2_tasks/compute_path_to_pose_task.hpp
index 8b3dfafb..0555f002 100644
--- a/nav2_tasks/include/nav2_tasks/compute_path_to_pose_task.hpp
+++ b/nav2_tasks/include/nav2_tasks/compute_path_to_pose_task.hpp
@@ -17,13 +17,13 @@
 
 #include "nav2_tasks/task_client.hpp"
 #include "nav2_tasks/task_server.hpp"
-#include "nav2_msgs/msg/path_end_points.hpp"
 #include "nav2_msgs/msg/path.hpp"
+#include "geometry_msgs/msg/pose_stamped.hpp"
 
 namespace nav2_tasks
 {
 
-using ComputePathToPoseCommand = nav2_msgs::msg::PathEndPoints;
+using ComputePathToPoseCommand = geometry_msgs::msg::PoseStamped;
 using ComputePathToPoseResult = nav2_msgs::msg::Path;
 
 using ComputePathToPoseTaskClient =
diff --git a/nav2_tasks/include/nav2_tasks/rate_controller_node.hpp b/nav2_tasks/include/nav2_tasks/rate_controller_node.hpp
index c3cd133d..5e593a23 100644
--- a/nav2_tasks/include/nav2_tasks/rate_controller_node.hpp
+++ b/nav2_tasks/include/nav2_tasks/rate_controller_node.hpp
@@ -28,8 +28,8 @@ public:
   RateController(const std::string & name, const BT::NodeParameters & params)
   : BT::DecoratorNode(name, params)
   {
-    unsigned int hz = 1;
-    getParam<unsigned int>("hz", hz);
+    double hz = 1.0;
+    getParam<double>("hz", hz);
     period_ = 1.0 / hz;
   }
 
diff --git a/tools/ros2_dependencies.repos b/tools/ros2_dependencies.repos
index 9d1c5e07..86d35bc0 100644
--- a/tools/ros2_dependencies.repos
+++ b/tools/ros2_dependencies.repos
@@ -1,5 +1,5 @@
 repositories:
-  behavior_tree_core:
+  BehaviorTree.CPP:
     type: git
     url: https://github.com/BehaviorTree/BehaviorTree.CPP.git
     version: ros2
-- 
GitLab