diff --git a/src/msgs/CMakeLists.txt b/src/msgs/CMakeLists.txt
index 9617b224..d2de6a2b 100644
--- a/src/msgs/CMakeLists.txt
+++ b/src/msgs/CMakeLists.txt
@@ -20,6 +20,7 @@ rosidl_generate_interfaces(${PROJECT_NAME}
"msg/JointStatus.msg"
"msg/SystemInfo.msg"
"msg/Heading.msg"
+ "msg/LedStatus.msg"
"srv/SetController.srv"
"srv/StatusReq.srv"
"srv/MaintenanceReq.srv"
diff --git a/src/subsystems/navigation/athena_planner/CMakeLists.txt b/src/subsystems/navigation/athena_planner/CMakeLists.txt
index f5c1ef93..e9640842 100644
--- a/src/subsystems/navigation/athena_planner/CMakeLists.txt
+++ b/src/subsystems/navigation/athena_planner/CMakeLists.txt
@@ -15,6 +15,7 @@ find_package(nav_msgs REQUIRED)
find_package(tf2 REQUIRED)
find_package(tf2_geometry_msgs REQUIRED)
find_package(vision_msgs REQUIRED)
+find_package(msgs REQUIRED)
add_library(bt_nodes SHARED
plugins/nav_selector_node.cpp
@@ -22,6 +23,7 @@ add_library(bt_nodes SHARED
plugins/get_aruco_pose_node.cpp
plugins/spiral_coverage_action_node.cpp
plugins/object_detected_node.cpp
+ plugins/led_status_node.cpp
)
target_compile_definitions(bt_nodes PRIVATE BT_PLUGIN_EXPORT)
@@ -42,6 +44,7 @@ ament_target_dependencies(bt_nodes
tf2
tf2_geometry_msgs
vision_msgs
+ msgs
)
install(TARGETS bt_nodes
diff --git a/src/subsystems/navigation/athena_planner/behavior_trees/aruco_detection_navigation.xml b/src/subsystems/navigation/athena_planner/behavior_trees/aruco_detection_navigation.xml
index 54bc19dc..851fe416 100644
--- a/src/subsystems/navigation/athena_planner/behavior_trees/aruco_detection_navigation.xml
+++ b/src/subsystems/navigation/athena_planner/behavior_trees/aruco_detection_navigation.xml
@@ -22,6 +22,7 @@
+
diff --git a/src/subsystems/navigation/athena_planner/behavior_trees/gnss_navigation.xml b/src/subsystems/navigation/athena_planner/behavior_trees/gnss_navigation.xml
index fb32b5b9..0ba987f6 100644
--- a/src/subsystems/navigation/athena_planner/behavior_trees/gnss_navigation.xml
+++ b/src/subsystems/navigation/athena_planner/behavior_trees/gnss_navigation.xml
@@ -1,10 +1,14 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/src/subsystems/navigation/athena_planner/behavior_trees/main_router.xml b/src/subsystems/navigation/athena_planner/behavior_trees/main_router.xml
index e5842729..ac4190a2 100644
--- a/src/subsystems/navigation/athena_planner/behavior_trees/main_router.xml
+++ b/src/subsystems/navigation/athena_planner/behavior_trees/main_router.xml
@@ -10,6 +10,8 @@
+
+
diff --git a/src/subsystems/navigation/athena_planner/behavior_trees/object_detection_navigation.xml b/src/subsystems/navigation/athena_planner/behavior_trees/object_detection_navigation.xml
index 75ff1152..4cef372b 100644
--- a/src/subsystems/navigation/athena_planner/behavior_trees/object_detection_navigation.xml
+++ b/src/subsystems/navigation/athena_planner/behavior_trees/object_detection_navigation.xml
@@ -5,6 +5,7 @@
+
diff --git a/src/subsystems/navigation/athena_planner/include/athena_planner/led_status_node.hpp b/src/subsystems/navigation/athena_planner/include/athena_planner/led_status_node.hpp
new file mode 100644
index 00000000..bc27ad45
--- /dev/null
+++ b/src/subsystems/navigation/athena_planner/include/athena_planner/led_status_node.hpp
@@ -0,0 +1,41 @@
+#ifndef ATHENA_PLANNER__LED_STATUS_NODE_HPP_
+#define ATHENA_PLANNER__LED_STATUS_NODE_HPP_
+
+#include
+
+#include "behaviortree_cpp_v3/action_node.h"
+#include "rclcpp/rclcpp.hpp"
+
+// Change this include if your msg package name is different
+#include "msgs/msg/led_status.hpp"
+
+namespace bt_nodes
+{
+
+class LedStatusNode : public BT::SyncActionNode
+{
+public:
+ LedStatusNode(
+ const std::string & name,
+ const BT::NodeConfiguration & conf);
+
+ BT::NodeStatus tick() override;
+
+ static BT::PortsList providedPorts()
+ {
+ return {
+ BT::InputPort("color"),
+ BT::InputPort("topic_name", "/led_status")
+ };
+ }
+
+private:
+ rclcpp::Node::SharedPtr node_;
+ rclcpp::Publisher::SharedPtr led_pub_;
+
+ std::string topic_name_;
+};
+
+} // namespace bt_nodes
+
+#endif // ATHENA_PLANNER__LED_STATUS_NODE_HPP_
\ No newline at end of file
diff --git a/src/subsystems/navigation/athena_planner/plugins/led_status_node.cpp b/src/subsystems/navigation/athena_planner/plugins/led_status_node.cpp
new file mode 100644
index 00000000..83af3b77
--- /dev/null
+++ b/src/subsystems/navigation/athena_planner/plugins/led_status_node.cpp
@@ -0,0 +1,67 @@
+#include "athena_planner/led_status_node.hpp"
+
+namespace bt_nodes
+{
+
+LedStatusNode::LedStatusNode(
+ const std::string & name,
+ const BT::NodeConfiguration & conf)
+: BT::SyncActionNode(name, conf)
+{
+ node_ = config().blackboard->get("node");
+
+ topic_name_ = "/led_status";
+ getInput("topic_name", topic_name_);
+
+ led_pub_ = node_->create_publisher(
+ topic_name_,
+ 10);
+}
+
+BT::NodeStatus LedStatusNode::tick()
+{
+ std::string color;
+ if (!getInput("color", color)) {
+ RCLCPP_ERROR(node_->get_logger(), "LedStatusNode missing required input port [color]");
+ return BT::NodeStatus::FAILURE;
+ }
+
+ msgs::msg::LedStatus msg;
+ msg.cmd = msgs::msg::LedStatus::CMD_SOLID;
+ msg.r = 0;
+ msg.g = 0;
+ msg.b = 0;
+ msg.param = 0;
+
+ if (color == "red" || color == "RED") {
+ msg.cmd = msgs::msg::LedStatus::CMD_SOLID;
+ msg.r = 255;
+ msg.g = 0;
+ msg.b = 0;
+ } else if (color == "green" || color == "GREEN") {
+ msg.cmd = msgs::msg::LedStatus::CMD_FLASH;
+ msg.r = 0;
+ msg.g = 255;
+ msg.b = 0;
+ } else {
+ RCLCPP_ERROR(
+ node_->get_logger(),
+ "Invalid LED color [%s]. Expected red or green.",
+ color.c_str());
+ return BT::NodeStatus::FAILURE;
+ }
+
+ led_pub_->publish(msg);
+
+ RCLCPP_INFO(
+ node_->get_logger(),
+ "Published LED status: color=%s rgb=[%u, %u, %u]",
+ color.c_str(),
+ msg.r,
+ msg.g,
+ msg.b);
+
+ return BT::NodeStatus::SUCCESS;
+}
+
+} // namespace bt_nodes
\ No newline at end of file
diff --git a/nav2_config b/src/subsystems/navigation/nav2_config
similarity index 100%
rename from nav2_config
rename to src/subsystems/navigation/nav2_config