diff --git a/nav2_docking/README.md b/nav2_docking/README.md index 37aa56d3d4..8fd8780e19 100644 --- a/nav2_docking/README.md +++ b/nav2_docking/README.md @@ -7,7 +7,6 @@ This work is sponsored by [NVIDIA](https://www.nvidia.com/en-us/) and created by This is split into 4 packages - `opennav_docking`: Contains the main docking framework -- `opennav_docking_msgs`: Contains the action interfaces for docking and undocking - `opennav_docking_core`: Contains the dock plugin header file to be implemented for each dock type - `opennav_docking_bt`: Contains behavior tree nodes and example XML files using the docking task server - `nova_carter_docking`: Contains an implementation using the Docking system with the Nvidia [Nova Carter](https://robotics.segway.com/nova-carter/) Robot platform and dock. diff --git a/nav2_docking/opennav_docking/CMakeLists.txt b/nav2_docking/opennav_docking/CMakeLists.txt index 29cfabf7f2..5640e4ac04 100644 --- a/nav2_docking/opennav_docking/CMakeLists.txt +++ b/nav2_docking/opennav_docking/CMakeLists.txt @@ -54,7 +54,6 @@ set(dependencies tf2_geometry_msgs pluginlib yaml_cpp_vendor - opennav_docking_msgs opennav_docking_core ) diff --git a/nav2_docking/opennav_docking/include/opennav_docking/dock_database.hpp b/nav2_docking/opennav_docking/include/opennav_docking/dock_database.hpp index 573c497605..95bde05e19 100644 --- a/nav2_docking/opennav_docking/include/opennav_docking/dock_database.hpp +++ b/nav2_docking/opennav_docking/include/opennav_docking/dock_database.hpp @@ -28,7 +28,7 @@ #include "nav2_util/simple_action_server.hpp" #include "opennav_docking/utils.hpp" #include "opennav_docking/types.hpp" -#include "opennav_docking_msgs/srv/reload_database.hpp" +#include "nav2_msgs/srv/reload_dock_database.hpp" namespace opennav_docking { @@ -123,14 +123,14 @@ class DockDatabase * @param response Service response */ void reloadDbCb( - const std::shared_ptr request, - std::shared_ptr response); + const std::shared_ptr request, + std::shared_ptr response); rclcpp_lifecycle::LifecycleNode::WeakPtr node_; DockPluginMap dock_plugins_; DockMap dock_instances_; pluginlib::ClassLoader dock_loader_; - rclcpp::Service::SharedPtr reload_db_service_; + rclcpp::Service::SharedPtr reload_db_service_; }; } // namespace opennav_docking diff --git a/nav2_docking/opennav_docking/include/opennav_docking/types.hpp b/nav2_docking/opennav_docking/include/opennav_docking/types.hpp index a7f038da5c..e690789570 100644 --- a/nav2_docking/opennav_docking/include/opennav_docking/types.hpp +++ b/nav2_docking/opennav_docking/include/opennav_docking/types.hpp @@ -18,13 +18,13 @@ #include #include -#include "opennav_docking_msgs/action/dock_robot.hpp" -#include "opennav_docking_msgs/action/undock_robot.hpp" +#include "nav2_msgs/action/dock_robot.hpp" +#include "nav2_msgs/action/undock_robot.hpp" #include "opennav_docking_core/charging_dock.hpp" #include "opennav_docking_core/docking_exceptions.hpp" -typedef opennav_docking_msgs::action::DockRobot DockRobot; -typedef opennav_docking_msgs::action::UndockRobot UndockRobot; +typedef nav2_msgs::action::DockRobot DockRobot; +typedef nav2_msgs::action::UndockRobot UndockRobot; /** * @struct A dock instance struct for a database diff --git a/nav2_docking/opennav_docking/package.xml b/nav2_docking/opennav_docking/package.xml index 2e85901c42..154522ead5 100644 --- a/nav2_docking/opennav_docking/package.xml +++ b/nav2_docking/opennav_docking/package.xml @@ -22,7 +22,6 @@ sensor_msgs pluginlib yaml_cpp_vendor - opennav_docking_msgs opennav_docking_core tf2_ros diff --git a/nav2_docking/opennav_docking/src/dock_database.cpp b/nav2_docking/opennav_docking/src/dock_database.cpp index 34f5f9183a..6774e93620 100644 --- a/nav2_docking/opennav_docking/src/dock_database.cpp +++ b/nav2_docking/opennav_docking/src/dock_database.cpp @@ -42,7 +42,7 @@ bool DockDatabase::initialize( return true; } - reload_db_service_ = node->create_service( + reload_db_service_ = node->create_service( "~/reload_database", std::bind( &DockDatabase::reloadDbCb, this, @@ -68,8 +68,8 @@ void DockDatabase::deactivate() } void DockDatabase::reloadDbCb( - const std::shared_ptr request, - std::shared_ptr response) + const std::shared_ptr request, + std::shared_ptr response) { DockMap dock_instances; if (utils::parseDockFile(request->filepath, node_.lock(), dock_instances)) { diff --git a/nav2_docking/opennav_docking/test/test_dock_database.cpp b/nav2_docking/opennav_docking/test/test_dock_database.cpp index 61600f4d61..2753f34f1b 100644 --- a/nav2_docking/opennav_docking/test/test_dock_database.cpp +++ b/nav2_docking/opennav_docking/test/test_dock_database.cpp @@ -109,9 +109,9 @@ TEST(DatabaseTests, reloadDbService) // Call service with a filepath auto client = - node->create_client("test/reload_database"); + node->create_client("test/reload_database"); - auto request = std::make_shared(); + auto request = std::make_shared(); request->filepath = ament_index_cpp::get_package_share_directory("opennav_docking") + "/test_dock_file.yaml"; EXPECT_TRUE(client->wait_for_service(1s)); @@ -122,7 +122,7 @@ TEST(DatabaseTests, reloadDbService) EXPECT_TRUE(result.get()->success); // Try again with a bogus file - auto request2 = std::make_shared(); + auto request2 = std::make_shared(); request2->filepath = ament_index_cpp::get_package_share_directory("opennav_docking") + "/file_does_not_exist.yaml"; EXPECT_TRUE(client->wait_for_service(1s)); diff --git a/nav2_docking/opennav_docking/test/test_docking_server.py b/nav2_docking/opennav_docking/test/test_docking_server.py index dee56f0d99..f4d5abac95 100644 --- a/nav2_docking/opennav_docking/test/test_docking_server.py +++ b/nav2_docking/opennav_docking/test/test_docking_server.py @@ -22,7 +22,7 @@ from launch_ros.actions import Node import launch_testing from nav2_msgs.action import NavigateToPose -from opennav_docking_msgs.action import DockRobot, UndockRobot +from nav2_msgs.action import DockRobot, UndockRobot import pytest import rclpy from rclpy.action import ActionClient, ActionServer diff --git a/nav2_docking/opennav_docking_bt/CMakeLists.txt b/nav2_docking/opennav_docking_bt/CMakeLists.txt index fe81417cdd..c89330ee38 100644 --- a/nav2_docking/opennav_docking_bt/CMakeLists.txt +++ b/nav2_docking/opennav_docking_bt/CMakeLists.txt @@ -11,7 +11,6 @@ find_package(nav2_core REQUIRED) find_package(nav2_behavior_tree REQUIRED) find_package(nav_msgs REQUIRED) find_package(geometry_msgs REQUIRED) -find_package(opennav_docking_msgs REQUIRED) find_package(behaviortree_cpp REQUIRED) # potentially replace with nav2_common, nav2_package() @@ -32,7 +31,6 @@ set(dependencies nav2_behavior_tree nav_msgs geometry_msgs - opennav_docking_msgs behaviortree_cpp ) diff --git a/nav2_docking/opennav_docking_bt/include/opennav_docking_bt/dock_robot.hpp b/nav2_docking/opennav_docking_bt/include/opennav_docking_bt/dock_robot.hpp index 2d334df90c..9fb328a5a7 100644 --- a/nav2_docking/opennav_docking_bt/include/opennav_docking_bt/dock_robot.hpp +++ b/nav2_docking/opennav_docking_bt/include/opennav_docking_bt/dock_robot.hpp @@ -19,7 +19,7 @@ #include #include -#include "opennav_docking_msgs/action/dock_robot.hpp" +#include "nav2_msgs/action/dock_robot.hpp" #include "geometry_msgs/msg/pose_stamped.hpp" #include "nav2_behavior_tree/bt_action_node.hpp" @@ -27,13 +27,13 @@ namespace opennav_docking_bt { /** - * @brief nav2_behavior_tree::BtActionNode class that wraps opennav_docking_msgs/DockRobot + * @brief nav2_behavior_tree::BtActionNode class that wraps opnav2_msgsennav_docking_msgs/DockRobot */ class DockRobotAction : public nav2_behavior_tree::BtActionNode< - opennav_docking_msgs::action::DockRobot> + nav2_msgs::action::DockRobot> { - using Action = opennav_docking_msgs::action::DockRobot; + using Action = nav2_msgs::action::DockRobot; using ActionResult = Action::Result; public: diff --git a/nav2_docking/opennav_docking_bt/include/opennav_docking_bt/undock_robot.hpp b/nav2_docking/opennav_docking_bt/include/opennav_docking_bt/undock_robot.hpp index abf740d726..58a634a240 100644 --- a/nav2_docking/opennav_docking_bt/include/opennav_docking_bt/undock_robot.hpp +++ b/nav2_docking/opennav_docking_bt/include/opennav_docking_bt/undock_robot.hpp @@ -19,7 +19,7 @@ #include #include -#include "opennav_docking_msgs/action/undock_robot.hpp" +#include "nav2_msgs/action/undock_robot.hpp" #include "geometry_msgs/msg/pose_stamped.hpp" #include "nav2_behavior_tree/bt_action_node.hpp" @@ -27,13 +27,13 @@ namespace opennav_docking_bt { /** - * @brief nav2_behavior_tree::BtActionNode class that wraps opennav_docking_msgs/UndockRobot + * @brief nav2_behavior_tree::BtActionNode class that wraps nav2_msgs/UndockRobot */ class UndockRobotAction : public nav2_behavior_tree::BtActionNode< - opennav_docking_msgs::action::UndockRobot> + nav2_msgs::action::UndockRobot> { - using Action = opennav_docking_msgs::action::UndockRobot; + using Action = nav2_msgs::action::UndockRobot; using ActionResult = Action::Result; public: diff --git a/nav2_docking/opennav_docking_bt/package.xml b/nav2_docking/opennav_docking_bt/package.xml index 3328b1c41f..8937c11699 100644 --- a/nav2_docking/opennav_docking_bt/package.xml +++ b/nav2_docking/opennav_docking_bt/package.xml @@ -17,7 +17,6 @@ nav2_msgs nav_msgs geometry_msgs - opennav_docking_msgs behaviortree_cpp ament_lint_common diff --git a/nav2_docking/opennav_docking_bt/test/test_dock_robot.cpp b/nav2_docking/opennav_docking_bt/test/test_dock_robot.cpp index e9c13b827d..aea6401adc 100644 --- a/nav2_docking/opennav_docking_bt/test/test_dock_robot.cpp +++ b/nav2_docking/opennav_docking_bt/test/test_dock_robot.cpp @@ -22,10 +22,10 @@ #include "behaviortree_cpp/bt_factory.h" #include "nav2_behavior_tree/utils/test_action_server.hpp" -#include "opennav_docking_bt/dock_robot.hpp" +#include "nav2_msgs/dock_robot.hpp" class DockRobotActionServer - : public TestActionServer + : public TestActionServer { public: DockRobotActionServer() @@ -35,13 +35,13 @@ class DockRobotActionServer protected: void execute( const typename std::shared_ptr< - rclcpp_action::ServerGoalHandle> + rclcpp_action::ServerGoalHandle> goal_handle) override { const auto goal = goal_handle->get_goal(); auto result = - std::make_shared(); + std::make_shared(); result->success = true; goal_handle->succeed(result); } diff --git a/nav2_docking/opennav_docking_bt/test/test_undock_robot.cpp b/nav2_docking/opennav_docking_bt/test/test_undock_robot.cpp index becb03012e..c2084d35f6 100644 --- a/nav2_docking/opennav_docking_bt/test/test_undock_robot.cpp +++ b/nav2_docking/opennav_docking_bt/test/test_undock_robot.cpp @@ -25,7 +25,7 @@ #include "opennav_docking_bt/undock_robot.hpp" class UndockRobotActionServer - : public TestActionServer + : public TestActionServer { public: UndockRobotActionServer() @@ -35,13 +35,13 @@ class UndockRobotActionServer protected: void execute( const typename std::shared_ptr< - rclcpp_action::ServerGoalHandle> + rclcpp_action::ServerGoalHandle> goal_handle) override { const auto goal = goal_handle->get_goal(); auto result = - std::make_shared(); + std::make_shared(); result->success = true; goal_handle->succeed(result); } diff --git a/nav2_docking/opennav_docking_core/CMakeLists.txt b/nav2_docking/opennav_docking_core/CMakeLists.txt index d2f087b217..639319bc5e 100644 --- a/nav2_docking/opennav_docking_core/CMakeLists.txt +++ b/nav2_docking/opennav_docking_core/CMakeLists.txt @@ -5,15 +5,15 @@ find_package(ament_cmake REQUIRED) find_package(nav2_common REQUIRED) find_package(rclcpp REQUIRED) find_package(rclcpp_lifecycle REQUIRED) -find_package(opennav_docking_msgs REQUIRED) find_package(nav2_util REQUIRED) +find_package(nav2_msgs REQUIRED) nav2_package() set(dependencies rclcpp rclcpp_lifecycle - opennav_docking_msgs + nav2_msgs nav2_util ) diff --git a/nav2_docking/opennav_docking_core/package.xml b/nav2_docking/opennav_docking_core/package.xml index 51c19282f4..fc1954fde6 100644 --- a/nav2_docking/opennav_docking_core/package.xml +++ b/nav2_docking/opennav_docking_core/package.xml @@ -12,7 +12,7 @@ rclcpp rclcpp_lifecycle nav2_util - opennav_docking_msgs + nav2_msgs ament_lint_common ament_lint_auto diff --git a/nav2_docking/opennav_docking_msgs/CMakeLists.txt b/nav2_docking/opennav_docking_msgs/CMakeLists.txt deleted file mode 100644 index d35d4e2c1f..0000000000 --- a/nav2_docking/opennav_docking_msgs/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -cmake_minimum_required(VERSION 3.5) -project(opennav_docking_msgs) - -find_package(ament_cmake REQUIRED) -find_package(builtin_interfaces REQUIRED) -find_package(nav_msgs REQUIRED) -find_package(geometry_msgs REQUIRED) -find_package(rosidl_default_generators REQUIRED) -find_package(std_msgs REQUIRED) -find_package(action_msgs REQUIRED) - -rosidl_generate_interfaces(${PROJECT_NAME} - "action/DockRobot.action" - "action/UndockRobot.action" - "srv/ReloadDatabase.srv" - DEPENDENCIES builtin_interfaces geometry_msgs std_msgs action_msgs nav_msgs -) - -ament_export_dependencies(rosidl_default_runtime) - -ament_package() diff --git a/nav2_docking/opennav_docking_msgs/README.md b/nav2_docking/opennav_docking_msgs/README.md deleted file mode 100644 index 77e40de985..0000000000 --- a/nav2_docking/opennav_docking_msgs/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Open Navigation's Nav2 Docking Msgs - -This package contains a set of messages for docking and undocking diff --git a/nav2_docking/opennav_docking_msgs/action/DockRobot.action b/nav2_docking/opennav_docking_msgs/action/DockRobot.action deleted file mode 100644 index fc85e6cca9..0000000000 --- a/nav2_docking/opennav_docking_msgs/action/DockRobot.action +++ /dev/null @@ -1,42 +0,0 @@ -#goal definition - -bool use_dock_id True # Whether to use the dock_id or dock_pose fields -string dock_id # Dock name or ID to dock at, from given dock database - -geometry_msgs/PoseStamped dock_pose # Dock pose -string dock_type # If using dock_pose, what type of dock it is. Not necessary if only using one type of dock. - -float32 max_staging_time 1000.0 # Maximum time for navigation to get to the dock's staging pose. -bool navigate_to_staging_pose True # Whether or not to navigate to staging pose or assume robot is already at staging pose within tolerance to execute behavior - ---- -#result definition - -# Error codes -# Note: The expected priority order of the errors should match the message order -uint16 NONE=0 -uint16 DOCK_NOT_IN_DB=901 -uint16 DOCK_NOT_VALID=902 -uint16 FAILED_TO_STAGE=903 -uint16 FAILED_TO_DETECT_DOCK=904 -uint16 FAILED_TO_CONTROL=905 -uint16 FAILED_TO_CHARGE=906 -uint16 UNKNOWN=999 - -bool success True # docking success status -uint16 error_code 0 # Contextual error code, if any -uint16 num_retries 0 # Number of retries attempted - ---- -#feedback definition - -uint16 NONE=0 -uint16 NAV_TO_STAGING_POSE=1 -uint16 INITIAL_PERCEPTION=2 -uint16 CONTROLLING=3 -uint16 WAIT_FOR_CHARGE=4 -uint16 RETRY=5 - -uint16 state # Current docking state -builtin_interfaces/Duration docking_time # Docking time elapsed -uint16 num_retries 0 # Number of retries attempted diff --git a/nav2_docking/opennav_docking_msgs/action/UndockRobot.action b/nav2_docking/opennav_docking_msgs/action/UndockRobot.action deleted file mode 100644 index 4ab21a75dd..0000000000 --- a/nav2_docking/opennav_docking_msgs/action/UndockRobot.action +++ /dev/null @@ -1,25 +0,0 @@ -#goal definition - -# If initialized on a dock so the server doesn't know what type of dock its on, -# you must specify what dock it is to know where to stage for undocking. -# If only one type of dock plugin is present, it is not necessary to set. -# If not set & server instance was used to dock, server will use current dock information from last docking request. -string dock_type - -float32 max_undocking_time 30.0 # Maximum time to undock - ---- -#result definition - -# Error codes -# Note: The expected priority order of the errors should match the message order -uint16 NONE=0 -uint16 DOCK_NOT_VALID=902 -uint16 FAILED_TO_CONTROL=905 -uint16 UNKNOWN=999 - -bool success True # docking success status -uint16 error_code 0 # Contextual error code, if any - ---- -#feedback definition diff --git a/nav2_docking/opennav_docking_msgs/package.xml b/nav2_docking/opennav_docking_msgs/package.xml deleted file mode 100644 index 8e7855acb6..0000000000 --- a/nav2_docking/opennav_docking_msgs/package.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - opennav_docking_msgs - 0.0.1 - A set of ROS interfaces for docking and undocking - Steve Macenski - Apache-2.0 - - ament_cmake - - rclcpp - rclcpp_action - rclcpp_lifecycle - nav2_util - nav2_msgs - nav_msgs - geometry_msgs - builtin_interfaces - tf2_ros - rosidl_default_generators - - ament_lint_common - ament_lint_auto - - rosidl_interface_packages - - - ament_cmake - - diff --git a/nav2_docking/opennav_docking_msgs/srv/ReloadDatabase.srv b/nav2_docking/opennav_docking_msgs/srv/ReloadDatabase.srv deleted file mode 100644 index fb6f36d7a4..0000000000 --- a/nav2_docking/opennav_docking_msgs/srv/ReloadDatabase.srv +++ /dev/null @@ -1,5 +0,0 @@ -# Reloads the dock's database with a new filepath - -string filepath ---- -bool success diff --git a/nav2_msgs/CMakeLists.txt b/nav2_msgs/CMakeLists.txt index 12637abca6..d0ff352775 100644 --- a/nav2_msgs/CMakeLists.txt +++ b/nav2_msgs/CMakeLists.txt @@ -39,6 +39,7 @@ rosidl_generate_interfaces(${PROJECT_NAME} "srv/LoadMap.srv" "srv/SaveMap.srv" "srv/SetInitialPose.srv" + "srv/ReloadDockDatabase.srv" "action/AssistedTeleop.action" "action/BackUp.action" "action/ComputePathToPose.action" @@ -53,6 +54,8 @@ rosidl_generate_interfaces(${PROJECT_NAME} "action/DummyBehavior.action" "action/FollowWaypoints.action" "action/FollowGPSWaypoints.action" + "action/DockRobot.action" + "action/UndockRobot.action" DEPENDENCIES builtin_interfaces geometry_msgs std_msgs action_msgs nav_msgs geographic_msgs ) diff --git a/nav2_simple_commander/nav2_simple_commander/robot_navigator.py b/nav2_simple_commander/nav2_simple_commander/robot_navigator.py index 148361bc68..bc45f3bfd7 100644 --- a/nav2_simple_commander/nav2_simple_commander/robot_navigator.py +++ b/nav2_simple_commander/nav2_simple_commander/robot_navigator.py @@ -26,11 +26,13 @@ from nav2_msgs.action import AssistedTeleop, BackUp, DriveOnHeading, Spin from nav2_msgs.action import ComputePathThroughPoses, ComputePathToPose from nav2_msgs.action import ( + DockRobot, FollowGPSWaypoints, FollowPath, FollowWaypoints, NavigateThroughPoses, NavigateToPose, + UndockRobot, ) from nav2_msgs.action import SmoothPath from nav2_msgs.srv import ClearEntireCostmap, GetCostmap, LoadMap, ManageLifecycleNodes @@ -95,6 +97,8 @@ def __init__(self, node_name='basic_navigator', namespace=''): self.assisted_teleop_client = ActionClient( self, AssistedTeleop, 'assisted_teleop' ) + self.docking_client = ActionClient(self, DockRobot, 'dock_robot') + self.undocking_client = ActionClient(self, UndockRobot, 'undock_robot') self.localization_pose_sub = self.create_subscription( PoseWithCovarianceStamped, 'amcl_pose', @@ -362,6 +366,77 @@ def followPath(self, path, controller_id='', goal_checker_id=''): self.result_future = self.goal_handle.get_result_async() return True + def dockRobot(self, dock_pose, dock_type, nav_to_dock=True): + """Send a `DockRobot` action request.""" + print("Waiting for 'DockRobot' action server") + while not self.docking_client.wait_for_server(timeout_sec=1.0): + print('"DockRobot" action server not available, waiting...') + + goal_msg = DockRobot.Goal() + goal_msg.use_dock_id = False + goal_msg.dock_pose = dock_pose + goal_msg.dock_type = dock_type + goal_msg.navigate_to_staging_pose = nav_to_dock # if want to navigate before staging + + print('Docking at pose: ' + str(dock_pose) + '...') + send_goal_future = self.docking_client.send_goal_async(goal_msg, + self._feedbackCallback) + rclpy.spin_until_future_complete(self, send_goal_future) + self.goal_handle = send_goal_future.result() + + if not self.goal_handle.accepted: + print('Docking request was rejected!') + return False + + self.result_future = self.goal_handle.get_result_async() + return True + + def dockRobot(self, dock_id, nav_to_dock=True): + """Send a `DockRobot` action request.""" + print("Waiting for 'DockRobot' action server") + while not self.docking_client.wait_for_server(timeout_sec=1.0): + print('"DockRobot" action server not available, waiting...') + + goal_msg = DockRobot.Goal() + goal_msg.use_dock_id = True + goal_msg.dock_id = dock_id + goal_msg.navigate_to_staging_pose = nav_to_dock # if want to navigate before staging + + print('Docking at pose: ' + str(dock_pose) + '...') + send_goal_future = self.docking_client.send_goal_async(goal_msg, + self._feedbackCallback) + rclpy.spin_until_future_complete(self, send_goal_future) + self.goal_handle = send_goal_future.result() + + if not self.goal_handle.accepted: + print('Docking request was rejected!') + return False + + self.result_future = self.goal_handle.get_result_async() + return True + + def undockRobot(self, dock_type=""): + """Send a `UndockRobot` action request.""" + print("Waiting for 'UndockRobot' action server") + while not self.undocking_client.wait_for_server(timeout_sec=1.0): + print('"UndockRobot" action server not available, waiting...') + + goal_msg = UndockRobot.Goal() + goal_msg.dock_type = dock_type + + print('Undocking from dock of type: ' + str(dock_type) + '...') + send_goal_future = self.undocking_client.send_goal_async(goal_msg, + self._feedbackCallback) + rclpy.spin_until_future_complete(self, send_goal_future) + self.goal_handle = send_goal_future.result() + + if not self.goal_handle.accepted: + print('Undocking request was rejected!') + return False + + self.result_future = self.goal_handle.get_result_async() + return True + def cancelTask(self): """Cancel pending task request of any type.""" self.info('Canceling current task.') diff --git a/navigation2/package.xml b/navigation2/package.xml index 7d8a186493..c1e17ed147 100644 --- a/navigation2/package.xml +++ b/navigation2/package.xml @@ -42,6 +42,7 @@ nav2_velocity_smoother nav2_voxel_grid nav2_waypoint_follower + opennav_docking ament_cmake