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