Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Source: `~/nav2_ws/src/navigation2/nav2_core/include/nav2_core/`
.claude/skills/harunkurtdev-nav2-core-plugin-interfaces/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 40% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 46% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -17% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -2% | 0% |
Source: ~/nav2_ws/src/navigation2/nav2_core/include/nav2_core/
All Nav2 plugins implement these abstract interfaces. Infrastructure layer implements them; domain/application layers depend on them.
Header: controller.hpp
cppclass Controller { public: virtual void configure( const rclcpp_lifecycle::LifecycleNode::WeakPtr &, std::string name, std::shared_ptr<tf2_ros::Buffer>, std::shared_ptr<nav2_costmap_2d::Costmap2DROS>) = 0; virtual void cleanup() = 0; virtual void activate() = 0; virtual void deactivate() = 0; virtual void newPathReceived() {}; virtual geometry_msgs::msg::TwistStamped computeVelocityCommands( const geometry_msgs::msg::PoseStamped & pose, const geometry_msgs::msg::Twist & velocity, nav2_core::GoalChecker * goal_checker) = 0; virtual void cancel() {}; virtual void setSpeedLimit(const double & speed_limit, const bool & percentage) = 0; virtual void reset() {}; };
Implementations: DWB, MPPI, RegulatedPurePursuit, Graceful, RotationShim
Header: global_planner.hpp
cppclass GlobalPlanner { public: virtual void configure( const rclcpp_lifecycle::LifecycleNode::WeakPtr &, std::string name, std::shared_ptr<tf2_ros::Buffer>, std::shared_ptr<nav2_costmap_2d::Costmap2DROS>) = 0; virtual void cleanup() = 0; virtual void activate() = 0; virtual void deactivate() = 0; virtual nav_msgs::msg::Path createPlan( const geometry_msgs::msg::PoseStamped & start, const geometry_msgs::msg::PoseStamped & goal) = 0; };
Implementations: NavFn, SmacPlanner2D, SmacPlannerHybrid, SmacPlannerLattice, ThetaStar
Header: smoother.hpp
cppclass Smoother { public: virtual void configure(...) = 0; virtual void cleanup() = 0; virtual void activate() = 0; virtual void deactivate() = 0; virtual bool smooth( nav_msgs::msg::Path & path, const nav2_costmap_2d::Costmap2D & costmap) = 0; };
Implementations: SimpleSmoother, SavitzkyGolaySmoother, ConstrainedSmoother
Header: goal_checker.hpp
cppclass GoalChecker { public: virtual void initialize(...) = 0; virtual void reset() = 0; virtual bool isGoalReached( const geometry_msgs::msg::Pose & query_pose, const geometry_msgs::msg::Pose & goal_pose, const geometry_msgs::msg::Twist & velocity) = 0; virtual bool getTolerances( geometry_msgs::msg::Pose & pose_tolerance, geometry_msgs::msg::Twist & vel_tolerance) = 0; };
Header: progress_checker.hpp
cppclass ProgressChecker { public: virtual void initialize(...) = 0; virtual bool check(const geometry_msgs::msg::PoseStamped & current_pose) = 0; virtual void reset() = 0; };
Header: path_handler.hpp
cppclass PathHandler { public: virtual void initialize(...) = 0; virtual void setPlan(const nav_msgs::msg::Path & path) = 0; virtual nav_msgs::msg::Path findPlanSegment(...) = 0; virtual nav_msgs::msg::Path transformLocalPlan(...) = 0; virtual geometry_msgs::msg::PoseStamped getTransformedGoal(...) = 0; };
Header: behavior.hpp
cppenum class CostmapInfoType { NONE, LOCAL, GLOBAL, BOTH }; class Behavior { public: virtual void configure(...) = 0; virtual void cleanup() = 0; virtual void activate() = 0; virtual void deactivate() = 0; virtual CostmapInfoType getResourceInfo() = 0; };
Implementations: Spin, BackUp, DriveOnHeading, Wait, AssistedTeleop
Header: waypoint_task_executor.hpp
cppclass WaypointTaskExecutor { public: virtual void initialize(...) = 0; virtual bool processAtWaypoint( const geometry_msgs::msg::PoseStamped & current_pose, const int & current_waypoint_index) = 0; };
Header: behavior_tree_navigator.hpp
Template class for BT-based navigation action plugins. Contains:
FeedbackUtils struct (robot_frame, global_frame, transform_tolerance, tf)NavigatorMuxer (ensures single active navigator)BehaviorTreeNavigator<ActionT> (template with BT lifecycle)controller_exceptions.hpp)ControllerException, InvalidController, ControllerTFErrorFailedToMakeProgress, PatienceExceeded, InvalidPathNoValidControl, ControllerTimedOutplanner_exceptions.hpp)PlannerException, InvalidPlanner, StartOccupied, GoalOccupiedStartOutsideMapBounds, GoalOutsideMapBoundsNoValidPathCouldBeFound, PlannerTimedOut, PlannerTFErrorNoViapointsGiven, PlannerCancelledsmoother_exceptions.hpp)SmootherException, InvalidSmoother, InvalidPathSmootherTimedOut, SmoothedPathInCollision, FailedToSmoothPathroute_exceptions.hpp)RouteException, OperationFailed, NoValidRouteCouldBeFoundTimedOut, RouteTFError, NoValidGraphIndeterminantNodesOnGraph, InvalidEdgeScorerUsecpp#include "nav2_core/controller.hpp" namespace my_controller { class MyController : public nav2_core::Controller { public: void configure( const rclcpp_lifecycle::LifecycleNode::WeakPtr & parent, std::string name, std::shared_ptr<tf2_ros::Buffer> tf, std::shared_ptr<nav2_costmap_2d::Costmap2DROS> costmap_ros) override { // Initialize from parameters } geometry_msgs::msg::TwistStamped computeVelocityCommands( const geometry_msgs::msg::PoseStamped & pose, const geometry_msgs::msg::Twist & velocity, nav2_core::GoalChecker * goal_checker) override { // Compute and return velocity command } void setSpeedLimit(const double & speed_limit, const bool & percentage) override {} void cleanup() override {} void activate() override {} void deactivate() override {} }; } // namespace #include "pluginlib/class_list_macros.hpp" PLUGINLIB_EXPORT_CLASS(my_controller::MyController, nav2_core::Controller)
xml<library path="my_controller"> <class type="my_controller::MyController" base_class_type="nav2_core::Controller"> <description>My custom controller</description> </class> </library>
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 16,653 | 13,533 | -19% | 1 | 1 | 0% | 3,514 | 4,936 | +40% | 0 | 0 | — |
case-02 | fail→pass | 16,946 | 12,588 | -26% | 1 | 1 | 0% | 3,286 | 4,604 | +40% | 0 | 0 | — |
case-03 | pass→pass | 16,629 | 8,755 | -47% | 1 | 1 | 0% | 3,085 | 3,698 | +20% | 0 | 0 | — |
case-04 | pass→pass | 8,924 | 3,628 | -59% | 1 | 1 | 0% | 1,708 | 2,674 | +57% | 0 | 0 | — |
case-05 | fail→pass | 10,039 | 4,459 | -56% | 1 | 1 | 0% | 1,904 | 2,781 | +46% | 0 | 0 | — |
case-06 | fail→pass | 19,602 | 6,796 | -65% | 1 | 1 | 0% | 3,758 | 3,123 | -17% | 0 | 0 | — |
case-07 | pass→pass | 6,923 | 2,803 | -60% | 1 | 1 | 0% | 1,193 | 2,437 | +104% | 0 | 0 | — |
case-08 | fail→pass | 16,284 | 4,424 | -73% | 1 | 1 | 0% | 2,718 | 2,669 | -2% | 0 | 0 | — |
case-09 | pass→pass | 9,499 | 3,412 | -64% | 1 | 1 | 0% | 1,756 | 2,521 | +44% | 0 | 0 | — |
case-10 | pass→pass | 6,718 | 3,904 | -42% | 1 | 1 | 0% | 1,366 | 2,605 | +91% | 0 | 0 | — |
case-11 | fail→fail | 15,315 | 2,408 | -84% | 1 | 1 | 0% | 2,779 | 2,325 | -16% | 0 | 0 | — |
case-12 | pass→pass | 9,510 | 3,022 | -68% | 1 | 1 | 0% | 1,838 | 2,444 | +33% | 0 | 0 | — |
case-13 | pass→pass | 7,491 | 3,254 | -57% | 1 | 1 | 0% | 1,384 | 2,474 | +79% | 0 | 0 | — |
case-14 | fail→pass | 9,829 | 2,921 | -70% | 1 | 1 | 0% | 1,853 | 2,409 | +30% | 0 | 0 | — |
case-15 | fail→pass | 13,681 | 5,780 | -58% | 1 | 1 | 0% | 2,581 | 2,982 | +16% | 0 | 0 | — |
case-16 | pass→pass | 4,510 | 2,518 | -44% | 1 | 1 | 0% | 839 | 2,325 | +177% | 0 | 0 | — |
case-17 | fail→pass | 6,376 | 4,454 | -30% | 1 | 1 | 0% | 1,170 | 2,695 | +130% | 0 | 0 | — |
case-18 | pass→pass | 4,783 | 3,797 | -21% | 1 | 1 | 0% | 956 | 2,658 | +178% | 0 | 0 | — |
case-19 | fail→fail | 14,725 | 3,071 | -79% | 1 | 1 | 0% | 2,667 | 2,501 | -6% | 0 | 0 | — |
case-20 | pass→pass | 12,046 | 5,024 | -58% | 1 | 1 | 0% | 2,008 | 2,873 | +43% | 0 | 0 | — |
case-21 | pass→pass | 16,363 | 14,261 | -13% | 1 | 1 | 0% | 3,156 | 4,781 | +51% | 0 | 0 | — |
case-22 | pass→pass | 19,730 | 18,582 | -6% | 1 | 1 | 0% | 4,009 | 5,738 | +43% | 0 | 0 | — |
case-23 | pass→pass | 9,435 | 10,182 | +8% | 1 | 1 | 0% | 1,690 | 3,713 | +120% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted. The headline lift of +35 percentage points is the difference between those two pass rates over the 23 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.