Skip to content

Commit 4f2f60c

Browse files
Tomas BacaTomas Baca
authored andcommitted
fixed gain filtering
1 parent c4b8a6c commit 4f2f60c

File tree

1 file changed

+109
-33
lines changed

1 file changed

+109
-33
lines changed

src/mpc_controller.cpp

Lines changed: 109 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
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 &param : 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

22952369
void 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

Comments
 (0)