Galaxis Codebase  1.0.0
Team Galaxis software stack for the Carolo Cup 2023 - ROS2 based software
GalaxisNode.cpp
Go to the documentation of this file.
2 
3 #include "utils/settings.hpp"
4 #include "utils/logger.hpp"
5 #include <exception>
6 
7 using namespace galaxis::utils;
8 using std::placeholders::_1;
9 
10 GalaxisNode::GalaxisNode(std::string p_name, unsigned int p_heartbeatTimePeriod) :
11  Node(p_name), m_heartbeatHandler(static_cast<rclcpp::Node*>(this), p_name, p_heartbeatTimePeriod) {
12 
13  m_nodeName = p_name;
14  galaxis::ros::create_subscription(this, m_serviceSubscription, std::bind(&GalaxisNode::service_state_callback, this, std::placeholders::_1));
15 
16  m_parameterCallbackHandle = nullptr;
17 
18  // load global settings: settings/global.json
19  try {
20  auto settings = galaxis::utils::read_json_file("settings/onstartup_global.json");
21  m_globalSettings = (*settings)["settings"];
22  }
23  catch (std::exception &e) {
24  log_warning("Failed to load Global System Settings!");
25  }
26 }
27 GalaxisNode::GalaxisNode(std::string p_name) : GalaxisNode(p_name, 200) {}
28 
29 void GalaxisNode::register_callback(std::function<void(galaxis::serviceStates::State)> p_function) {
30  m_callback_service_state = p_function;
31 }
32 
33 void GalaxisNode::service_state_callback(ServiceStateType::SharedPtr const p_msgSPtr) {
34  switch(p_msgSPtr->state) {
35  case ServiceStateType::STATE_BOOTSTRAP:
36  RCLCPP_INFO(this->get_logger(), "galaxis::serviceStates::State: switch to BOOTSTRAP");
39  }
40  break;
41  case ServiceStateType::STATE_FREE_DRIVING:
42  RCLCPP_INFO(this->get_logger(), "galaxis::serviceStates::State: switch to FREE_DRIVING");
45  }
46  break;
47  case ServiceStateType::STATE_OBSTACLE_DRIVING:
48  RCLCPP_INFO(this->get_logger(), "galaxis::serviceStates::State: switch to OBSTACLE_DRIVING");
51  }
52  break;
53  default:
54  RCLCPP_ERROR(this->get_logger(), "galaxis::serviceStates::State not implemented. %i", m_serviceState);
55  // throw galaxis::Errors::NOT_IMPLEMENTED_ERROR();
56  break;
57  }
58 
59  m_serviceState = static_cast<galaxis::serviceStates::State>(p_msgSPtr->state);
60 
61  // set service state for heartbeat message
63 }
64 
66  return m_serviceState;
67 }
68 
69 void GalaxisNode::enable_parameters(std::function<rcl_interfaces::msg::SetParametersResult(const std::vector<rclcpp::Parameter>&)> callbackFunc) {
70  // read parameters from json, create ros params, run node implemented cb and set cb for new params
71  std::shared_ptr<json> nodeSettings = galaxis::utils::read_system_settings(m_nodeName);
72  this->create_parameters(nodeSettings);
73  auto result = callbackFunc(this->get_parameters(m_rosParameterNamesVec));
74  m_parameterCallbackHandle = this->add_on_set_parameters_callback(callbackFunc);
75 
76  if (result.successful == false) {
77  log_error("[GALAXIS_NODE] Can NOT enable parameter functionality. Reason:\n", result.reason);
78  }
79 }
80 
81 void GalaxisNode::create_parameters(std::shared_ptr<json> configJsonSPtr) {
82  log("[GALAXIS_NODE] Create ROS parameters from JSON.");
83 
84  try {
85  for (json::iterator itSubSec = configJsonSPtr->begin(); itSubSec != configJsonSPtr->end(); ++itSubSec) {
86  for (json::iterator itParam = itSubSec.value().begin(); itParam != itSubSec.value().end(); ++itParam) {
87  std::string fullParameterName = itSubSec.key() + "." + itParam.key();
88 
89  rcl_interfaces::msg::ParameterDescriptor paramDesc;
90  paramDesc.description = fullParameterName;
91  if(itParam.value().is_number_integer()) {
92  this->declare_parameter<int>(fullParameterName.c_str(), itParam.value(), paramDesc);
93  }
94  else if(itParam.value().is_number_float()) {
95  this->declare_parameter<double>(fullParameterName.c_str(), itParam.value(), paramDesc);
96  }
97  else {
98  log_warning("[GALAXIS_NODE] Type of parameter ", fullParameterName, " is NOT valid (INT or FLOAT/DOUBLE). Skipping.");
99  }
100 
101  m_rosParameterNamesVec.push_back(fullParameterName);
102  }
103  }
104  }
105  catch(const std::exception& e) {
106  log_warning("[GALAXIS_NODE] Failed to create parameters!");
107  }
108 }
109 
110 // rcl_interfaces::msg::SetParametersResult GalaxisNode::new_parameters_callback(const std::vector<rclcpp::Parameter>& parameters) {
111 // log_warning("[GALAXIS_NODE] Parameter Callback not implemented :(");
112 
113 // rcl_interfaces::msg::SetParametersResult result;
114 // result.successful = false;
115 // result.reason = "[" + this->m_nodeName + "] CB NOT IMPLEMENTED";
116 // return result;
117 // }
118 
120  return m_globalSettings;
121 }
galaxis::serviceStates::OBSTACLE_DRIVING
@ OBSTACLE_DRIVING
Definition: ServiceState.hpp:13
galaxis::utils::log_error
void log_error(const Args &... args)
Definition: logger.hpp:50
GalaxisNode::enable_parameters
void enable_parameters(std::function< rcl_interfaces::msg::SetParametersResult(const std::vector< rclcpp::Parameter > &)> callbackFunc)
Definition: GalaxisNode.cpp:69
json
nlohmann::json json
Definition: AutoPilotNode.hpp:21
settings.hpp
GalaxisNode::create_parameters
void create_parameters(std::shared_ptr< json > configJsonSPtr)
Definition: GalaxisNode.cpp:81
galaxis::utils::log_warning
void log_warning(const Args &... args)
Definition: logger.hpp:41
galaxis::utils::read_system_settings
shared_ptr< json > read_system_settings(std::string key)
Definition: settings.cpp:14
galaxis::serviceStates::BOOTSTRAP
@ BOOTSTRAP
Definition: ServiceState.hpp:10
GalaxisNode::service_state_callback
void service_state_callback(ServiceStateType::SharedPtr const p_msgSPtr)
Definition: GalaxisNode.cpp:33
GalaxisNode::m_callback_service_state
std::function< void(galaxis::serviceStates::State)> m_callback_service_state
Definition: GalaxisNode.hpp:32
galaxis::utils::read_json_file
shared_ptr< json > read_json_file(std::string path)
Definition: settings.cpp:5
GalaxisNode::register_callback
void register_callback(std::function< void(galaxis::serviceStates::State)> p_function)
Definition: GalaxisNode.cpp:29
GalaxisNode::get_global_settings
json const & get_global_settings()
Definition: GalaxisNode.cpp:119
GalaxisNode.hpp
galaxis::ROSHeartbeat::set_service_state
void set_service_state(::galaxis::serviceStates::State const p_serviceState)
Definition: ros_heartbeat.cpp:38
GalaxisNode::GalaxisNode
GalaxisNode()=delete
GalaxisNode::m_serviceSubscription
rclcpp::Subscription< ServiceStateType >::SharedPtr m_serviceSubscription
Definition: GalaxisNode.hpp:29
GalaxisNode::m_heartbeatHandler
galaxis::ROSHeartbeat m_heartbeatHandler
Definition: GalaxisNode.hpp:27
GalaxisNode
Definition: GalaxisNode.hpp:21
GalaxisNode::get_current_service_state
galaxis::serviceStates::State get_current_service_state() const
Definition: GalaxisNode.cpp:65
GalaxisNode::m_nodeName
std::string m_nodeName
Definition: GalaxisNode.hpp:23
logger.hpp
galaxis::utils
Definition: clock.hpp:5
galaxis::serviceStates::FREE_DRIVING
@ FREE_DRIVING
Definition: ServiceState.hpp:12
GalaxisNode::m_parameterCallbackHandle
OnSetParametersCallbackHandle::SharedPtr m_parameterCallbackHandle
Definition: GalaxisNode.hpp:35
galaxis::utils::log
void log(const Args &... args)
Definition: logger.hpp:33
GalaxisNode::m_serviceState
galaxis::serviceStates::State m_serviceState
Definition: GalaxisNode.hpp:25
GalaxisNode::m_globalSettings
json m_globalSettings
Definition: GalaxisNode.hpp:38
GalaxisNode::m_rosParameterNamesVec
std::vector< std::string > m_rosParameterNamesVec
Definition: GalaxisNode.hpp:36
galaxis::serviceStates::State
State
Definition: ServiceState.hpp:9