1818#include < mrs_lib/geometry/cyclic.h>
1919#include < mrs_lib/subscriber_handler.h>
2020#include < mrs_lib/timer_handler.h>
21+ #include < mrs_lib/utils.h>
2122
2223#include < sensor_msgs/msg/imu.hpp>
2324
@@ -136,10 +137,14 @@ class MpcController : public mrs_uav_managers::Controller {
136137 DrsParams_t drs_params_;
137138 std::mutex mutex_drs_params_;
138139
140+ rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr param_callback_handle_;
141+
139142 rcl_interfaces::msg::SetParametersResult callbackParameters (std::vector<rclcpp::Parameter> parameters);
140143
141144 void setParamsToServer (const DrsParams_t &drs_params);
142145
146+ std::atomic<bool > params_setting_running_ = false ;
147+
143148 // | ----------------------- controllers ---------------------- |
144149
145150 void positionPassthrough (const mrs_msgs::msg::UavState &uav_state, const mrs_msgs::msg::TrackerCommand &tracker_command);
@@ -463,10 +468,10 @@ bool MpcController::initialize(const rclcpp::Node::SharedPtr &node, std::shared_
463468
464469 param_desc.type = rcl_interfaces::msg::ParameterType::PARAMETER_DOUBLE;
465470
466- node_->declare_parameter (node_->get_sub_namespace () + " horizontal.kiwxy" , 0.0 , param_desc);
467- node_->declare_parameter (node_->get_sub_namespace () + " horizontal.kibxy" , 0.0 , param_desc);
468- node_->declare_parameter (node_->get_sub_namespace () + " horizontal.kiwxy_lim" , 0.0 , param_desc);
469- node_->declare_parameter (node_->get_sub_namespace () + " horizontal.kibxy_lim" , 0.0 , param_desc);
471+ node_->declare_parameter (node_->get_sub_namespace () + " / horizontal.kiwxy" , 0.0 , param_desc);
472+ node_->declare_parameter (node_->get_sub_namespace () + " / horizontal.kibxy" , 0.0 , param_desc);
473+ node_->declare_parameter (node_->get_sub_namespace () + " / horizontal.kiwxy_lim" , 0.0 , param_desc);
474+ node_->declare_parameter (node_->get_sub_namespace () + " / horizontal.kibxy_lim" , 0.0 , param_desc);
470475 }
471476
472477 {
@@ -481,7 +486,7 @@ bool MpcController::initialize(const rclcpp::Node::SharedPtr &node, std::shared_
481486
482487 param_desc.type = rcl_interfaces::msg::ParameterType::PARAMETER_DOUBLE;
483488
484- node_->declare_parameter (node_->get_sub_namespace () + " attitude.kq_roll_pitch" , 0.0 , param_desc);
489+ node_->declare_parameter (node_->get_sub_namespace () + " / attitude.kq_roll_pitch" , 0.0 , param_desc);
485490 }
486491
487492 {
@@ -496,7 +501,7 @@ bool MpcController::initialize(const rclcpp::Node::SharedPtr &node, std::shared_
496501
497502 param_desc.type = rcl_interfaces::msg::ParameterType::PARAMETER_DOUBLE;
498503
499- node_->declare_parameter (node_->get_sub_namespace () + " attitude.kq_yaw" , 0.0 , param_desc);
504+ node_->declare_parameter (node_->get_sub_namespace () + " / attitude.kq_yaw" , 0.0 , param_desc);
500505 }
501506
502507 {
@@ -511,15 +516,15 @@ bool MpcController::initialize(const rclcpp::Node::SharedPtr &node, std::shared_
511516
512517 param_desc.type = rcl_interfaces::msg::ParameterType::PARAMETER_DOUBLE;
513518
514- node_->declare_parameter (node_->get_sub_namespace () + " mass.km" , 0.0 , param_desc);
519+ node_->declare_parameter (node_->get_sub_namespace () + " / mass.km" , 0.0 , param_desc);
515520 }
516521
517522 {
518523 auto param_desc = rcl_interfaces::msg::ParameterDescriptor{};
519524
520525 param_desc.type = rcl_interfaces::msg::ParameterType::PARAMETER_BOOL;
521526
522- node_->declare_parameter (node_->get_sub_namespace () + " mass.fuse_acceleration" , false , param_desc);
527+ node_->declare_parameter (node_->get_sub_namespace () + " / mass.fuse_acceleration" , false , param_desc);
523528 }
524529
525530 {
@@ -534,7 +539,7 @@ bool MpcController::initialize(const rclcpp::Node::SharedPtr &node, std::shared_
534539
535540 param_desc.type = rcl_interfaces::msg::ParameterType::PARAMETER_DOUBLE;
536541
537- node_->declare_parameter (node_->get_sub_namespace () + " mass.km_lim" , 0.0 , param_desc);
542+ node_->declare_parameter (node_->get_sub_namespace () + " / mass.km_lim" , 0.0 , param_desc);
538543 }
539544
540545 {
@@ -549,15 +554,15 @@ bool MpcController::initialize(const rclcpp::Node::SharedPtr &node, std::shared_
549554
550555 param_desc.type = rcl_interfaces::msg::ParameterType::PARAMETER_INTEGER;
551556
552- node_->declare_parameter (node_->get_sub_namespace () + " preferred_output_mode" , 0. 0 , param_desc);
557+ node_->declare_parameter (node_->get_sub_namespace () + " / preferred_output_mode" , 0 , param_desc);
553558 }
554559
555560 {
556561 auto param_desc = rcl_interfaces::msg::ParameterDescriptor{};
557562
558563 param_desc.type = rcl_interfaces::msg::ParameterType::PARAMETER_BOOL;
559564
560- node_->declare_parameter (node_->get_sub_namespace () + " jerk_feedforward" , false , param_desc);
565+ node_->declare_parameter (node_->get_sub_namespace () + " / jerk_feedforward" , false , param_desc);
561566 }
562567
563568 drs_params_.kiwxy = gains_.kiwxy ;
@@ -571,11 +576,7 @@ bool MpcController::initialize(const rclcpp::Node::SharedPtr &node, std::shared_
571576
572577 setParamsToServer (drs_params_);
573578
574- // old ROS1 drs
575- /* drs_.reset(new Drs_t(mutex_drs_, nh_)); */
576- /* drs_->updateConfig(drs_params_); */
577- /* Drs_t::CallbackType f = boost::bind(&MpcController::callbackDrs, this, _1, _2); */
578- /* drs_->setCallback(f); */
579+ param_callback_handle_ = node_->add_on_set_parameters_callback (std::bind (&MpcController::callbackParameters, this , std::placeholders::_1));
579580
580581 // | --------------------- service servers -------------------- |
581582
@@ -2121,14 +2122,87 @@ void MpcController::PIDVelocityOutput(const mrs_msgs::msg::UavState &uav_state,
21212122// | callbacks |
21222123// --------------------------------------------------------------
21232124
2124- /* //{ callbackDrs() */
2125+ /* callbackParameters() //{ */
2126+
2127+ rcl_interfaces::msg::SetParametersResult MpcController::callbackParameters (std::vector<rclcpp::Parameter> parameters) {
2128+
2129+ rcl_interfaces::msg::SetParametersResult result;
2130+
2131+ if (params_setting_running_) {
2132+
2133+ result.successful = true ;
2134+ result.reason = " not seting, params update triggered from the inside" ;
2135+
2136+ return result;
2137+ }
2138+
2139+ auto drs_params = mrs_lib::get_mutexed (mutex_drs_params_, drs_params_);
2140+
2141+ // Note that setting a parameter to a nonsensical value (such as setting the `param_namespace.floating_number` parameter to `hello`)
2142+ // doesn't have any effect - it doesn't even call this callback.
2143+ for (auto ¶m : parameters) {
2144+
2145+ RCLCPP_INFO_STREAM (node_->get_logger (), " got parameter: '" << param.get_name () << " ' with value '" << param.value_to_string () << " '" );
2146+
2147+ if (param.get_name () == node_->get_sub_namespace () + " /horizontal.kiwxy" ) {
2148+
2149+ drs_params.kiwxy = param.as_double ();
2150+
2151+ } else if (param.get_name () == node_->get_sub_namespace () + " /horizontal.kibxy" ) {
2152+
2153+ drs_params.kibxy = param.as_double ();
2154+
2155+ } else if (param.get_name () == node_->get_sub_namespace () + " /horizontal.kiwxy_lim" ) {
2156+
2157+ drs_params.kiwxy_lim = param.as_double ();
2158+
2159+ } else if (param.get_name () == node_->get_sub_namespace () + " /horizontal.kibxy_lim" ) {
2160+
2161+ drs_params.kibxy_lim = param.as_double ();
21252162
2126- /* void MpcController::callbackDrs(mrs_uav_controllers::mpc_controllerConfig &config, [[maybe_unused]] uint32_t level) { */
2163+ } else if (param. get_name () == node_-> get_sub_namespace () + " /attitude.kq_roll_pitch " ) {
21272164
2128- /* mrs_lib::set_mutexed(mutex_drs_params_, config, drs_params_); */
2165+ drs_params. kq_roll_pitch = param. as_double ();
21292166
2130- /* ROS_INFO("[%s]: DRS updated gains", this->name_.c_str()); */
2131- /* } */
2167+ } else if (param.get_name () == node_->get_sub_namespace () + " /attitude.kq_yaw" ) {
2168+
2169+ drs_params.kq_yaw = param.as_double ();
2170+
2171+ } else if (param.get_name () == node_->get_sub_namespace () + " /mass.km" ) {
2172+
2173+ drs_params.km = param.as_double ();
2174+
2175+ } else if (param.get_name () == node_->get_sub_namespace () + " /mass.fuse_acceleration" ) {
2176+
2177+ drs_params.fuse_acceleration = param.as_bool ();
2178+
2179+ } else if (param.get_name () == node_->get_sub_namespace () + " /mass.km_lim" ) {
2180+
2181+ drs_params.km_lim = param.as_double ();
2182+
2183+ } else if (param.get_name () == node_->get_sub_namespace () + " /preferred_output_mode" ) {
2184+
2185+ drs_params.preferred_output_mode = param.as_int ();
2186+
2187+ } else if (param.get_name () == node_->get_sub_namespace () + " /jerk_feedforward" ) {
2188+
2189+ drs_params.jerk_feedforward = param.as_bool ();
2190+
2191+ } else {
2192+
2193+ RCLCPP_DEBUG_STREAM (node_->get_logger (), " parameter: '" << param.get_name () << " ' is not dynamically reconfigurable!" );
2194+ }
2195+ }
2196+
2197+ RCLCPP_INFO_THROTTLE (node_->get_logger (), *clock_, 1000 , " params updated" );
2198+
2199+ result.successful = true ;
2200+ result.reason = " OK" ;
2201+
2202+ mrs_lib::set_mutexed (mutex_drs_params_, drs_params, drs_params_);
2203+
2204+ return result;
2205+ }
21322206
21332207// }
21342208
@@ -2294,18 +2368,20 @@ double MpcController::getHeadingSafely(const mrs_msgs::msg::UavState &uav_state,
22942368
22952369void MpcController::setParamsToServer (const DrsParams_t &drs_params) {
22962370
2297- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " mass.fuse_acceleration" , drs_params.fuse_acceleration ));
2298- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " jerk_feedforward" , drs_params.jerk_feedforward ));
2299- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " preferred_output_mode" , drs_params.preferred_output_mode ));
2300- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " horizontal.kiwxy" , drs_params.kiwxy ));
2301- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " horizontal.kibxy" , drs_params.kibxy ));
2302- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " horizontal.kiwxy_lim" , drs_params.kiwxy_lim ));
2303- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " horizontal.kibxy_lim" , drs_params.kibxy_lim ));
2304- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " attitude.kq_roll_pitch" , drs_params.kq_roll_pitch ));
2305- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " attitude.kq_yaw" , drs_params.kq_yaw ));
2306- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " mass.km" , drs_params.km ));
2307- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " mass.km_lim" , drs_params.km_lim ));
2308- node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " mass.fuse_acceleration" , drs_params.fuse_acceleration ));
2371+ mrs_lib::AtomicScopeFlag unset_running (params_setting_running_);
2372+
2373+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /mass.fuse_acceleration" , drs_params.fuse_acceleration ));
2374+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /jerk_feedforward" , drs_params.jerk_feedforward ));
2375+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /preferred_output_mode" , drs_params.preferred_output_mode ));
2376+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /horizontal.kiwxy" , drs_params.kiwxy ));
2377+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /horizontal.kibxy" , drs_params.kibxy ));
2378+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /horizontal.kiwxy_lim" , drs_params.kiwxy_lim ));
2379+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /horizontal.kibxy_lim" , drs_params.kibxy_lim ));
2380+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /attitude.kq_roll_pitch" , drs_params.kq_roll_pitch ));
2381+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /attitude.kq_yaw" , drs_params.kq_yaw ));
2382+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /mass.km" , drs_params.km ));
2383+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /mass.km_lim" , drs_params.km_lim ));
2384+ node_->set_parameter (rclcpp::Parameter (node_->get_sub_namespace () + " /mass.fuse_acceleration" , drs_params.fuse_acceleration ));
23092385}
23102386
23112387// }
0 commit comments