15#include "auto_apms_px4/mode_registration.hpp"
20#include "px4_ros2/components/wait_for_fmu.hpp"
29 if (registered_mode_pub_) {
38 if (!mode.doRegister()) {
39 RCLCPP_FATAL(node_ptr_->get_logger(),
"Registration of mode with name '%s' failed.", mode_name.c_str());
40 throw std::runtime_error(
"Mode registration failed");
44 announce(mode_name, mode.id());
46 RCLCPP_INFO(node_ptr_->get_logger(),
"Registered mode '%s' with nav_state %i.", mode_name.c_str(), mode.id());
55 if (!executor.doRegister()) {
57 node_ptr_->get_logger(),
"Registration of mode executor for mode with name '%s' failed.", mode_name.c_str());
58 throw std::runtime_error(
"Mode executor registration failed");
61 RCLCPP_INFO(node_ptr_->get_logger(),
"Registered mode executor owning mode '%s'.", mode_name.c_str());
64void ModeRegistrationHandler::waitForFmu()
66 constexpr int max_retries = 5;
67 for (
int attempt = 0; attempt < max_retries; ++attempt) {
68 if (px4_ros2::waitForFMU(*node_ptr_, std::chrono::seconds(3))) {
69 RCLCPP_DEBUG(node_ptr_->get_logger(),
"FMU availability test successful (attempt %d).", attempt + 1);
72 RCLCPP_WARN(node_ptr_->get_logger(),
"No message from FMU (attempt %d/%d). Retrying...", attempt + 1, max_retries);
74 throw std::runtime_error(
"No message from FMU after multiple attempts");
77void ModeRegistrationHandler::announce(
const std::string & mode_name, uint8_t nav_state)
79 registered_mode_msg_.name = mode_name;
80 registered_mode_msg_.nav_state = nav_state;
83 registered_mode_pub_ = node_ptr_->create_publisher<auto_apms_px4_interfaces::msg::RegisteredMode>(
85 registered_mode_pub_->publish(registered_mode_msg_);
88 announce_timer_ = node_ptr_->create_wall_timer(
89 std::chrono::seconds(1), [
this]() { registered_mode_pub_->publish(registered_mode_msg_); });
95 announce_timer_.reset();
96 registered_mode_pub_.reset();
97 RCLCPP_INFO(node_ptr_->get_logger(),
"Stopped announcing mode '%s'.", registered_mode_msg_.name.c_str());
void registerMode(px4_ros2::ModeBase &mode, const std::string &mode_name)
Wait for the FMU, register mode with it and announce the mode's assigned nav_state.
ModeRegistrationHandler(rclcpp::Node::SharedPtr node_ptr)
Constructor.
~ModeRegistrationHandler()
Stops announcing the mode (see stopModeAnnouncement()) if it was ever announced.
static constexpr auto TOPIC_NAME
Shared topic (relative to the node namespace) on which registered modes are announced.
void stopModeAnnouncement()
Stop announcing the mode registered with registerMode().
Implementation of PX4 mode peers offered by px4_ros2_cpp enabling integration with AutoAPMS.