From 1b26cd2d3d52fd3eb46034f7bde23942e53cc43d Mon Sep 17 00:00:00 2001 From: Esteve Fernandez Date: Tue, 23 Jun 2015 16:40:44 -0700 Subject: [PATCH 1/3] Listen on the correct topic --- rclcpp/include/rclcpp/parameter_service.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rclcpp/include/rclcpp/parameter_service.hpp b/rclcpp/include/rclcpp/parameter_service.hpp index ea5cdc9..66b1859 100644 --- a/rclcpp/include/rclcpp/parameter_service.hpp +++ b/rclcpp/include/rclcpp/parameter_service.hpp @@ -124,7 +124,7 @@ public: ); list_parameters_service_ = node_->create_service( - node_->get_name() + "__describe_parameters", [&node]( + node_->get_name() + "__list_parameters", [&node]( const std::shared_ptr request_header, const std::shared_ptr request, std::shared_ptr response) From e39af181d0a443c24091e596d0da97a6e8faf58b Mon Sep 17 00:00:00 2001 From: Esteve Fernandez Date: Thu, 25 Jun 2015 15:28:39 -0700 Subject: [PATCH 2/3] Improve list_parameters logic --- rclcpp/include/rclcpp/node_impl.hpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/rclcpp/include/rclcpp/node_impl.hpp b/rclcpp/include/rclcpp/node_impl.hpp index 2f26921..516fda9 100644 --- a/rclcpp/include/rclcpp/node_impl.hpp +++ b/rclcpp/include/rclcpp/node_impl.hpp @@ -368,7 +368,9 @@ Node::list_parameters( // TODO(esteve): define parameter separator, use "." for now for (auto & kv : parameters_) { if (std::any_of(prefixes.cbegin(), prefixes.cend(), [&kv, &depth](const std::string & prefix) { - if (kv.first.find(prefix + ".") == 0) { + if (kv.first == prefix) { + return true; + } else if (kv.first.find(prefix + ".") == 0) { size_t length = prefix.length(); std::string substr = kv.first.substr(length); // Cast as unsigned integer to avoid warning @@ -379,11 +381,13 @@ Node::list_parameters( { result.names.push_back(kv.first); size_t last_separator = kv.first.find_last_of('.'); - std::string prefix = kv.first.substr(0, last_separator); - if (std::find(result.prefixes.cbegin(), result.prefixes.cend(), - prefix) == result.prefixes.cend()) - { - result.prefixes.push_back(prefix); + if (std::string::npos != last_separator) { + std::string prefix = kv.first.substr(0, last_separator); + if (std::find(result.prefixes.cbegin(), result.prefixes.cend(), + prefix) == result.prefixes.cend()) + { + result.prefixes.push_back(prefix); + } } } } From 94ece105c259c0c9646ef626757cf835bed2bbaf Mon Sep 17 00:00:00 2001 From: Esteve Fernandez Date: Tue, 23 Jun 2015 16:43:38 -0700 Subject: [PATCH 3/3] Prevent promises from going out of scope prematurely --- rclcpp/include/rclcpp/node_impl.hpp | 4 +- rclcpp/include/rclcpp/parameter_client.hpp | 61 ++++++++++++---------- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/rclcpp/include/rclcpp/node_impl.hpp b/rclcpp/include/rclcpp/node_impl.hpp index 516fda9..2d0aaf0 100644 --- a/rclcpp/include/rclcpp/node_impl.hpp +++ b/rclcpp/include/rclcpp/node_impl.hpp @@ -383,8 +383,8 @@ Node::list_parameters( size_t last_separator = kv.first.find_last_of('.'); if (std::string::npos != last_separator) { std::string prefix = kv.first.substr(0, last_separator); - if (std::find(result.prefixes.cbegin(), result.prefixes.cend(), - prefix) == result.prefixes.cend()) + if (std::find(result.prefixes.cbegin(), result.prefixes.cend(), prefix) == + result.prefixes.cend()) { result.prefixes.push_back(prefix); } diff --git a/rclcpp/include/rclcpp/parameter_client.hpp b/rclcpp/include/rclcpp/parameter_client.hpp index 60543ea..672b099 100644 --- a/rclcpp/include/rclcpp/parameter_client.hpp +++ b/rclcpp/include/rclcpp/parameter_client.hpp @@ -73,28 +73,30 @@ public: std::function>)> callback = nullptr) { - std::promise> promise_result; - auto future_result = promise_result.get_future().share(); + auto promise_result = + std::make_shared>>(); + auto future_result = promise_result->get_future().share(); auto request = std::make_shared(); request->names = names; get_parameters_client_->async_send_request( request, - [&names, &promise_result, &future_result, &callback]( + [request, promise_result, future_result, &callback]( rclcpp::client::Client::SharedFuture cb_f) { std::vector parameter_variants; auto & pvalues = cb_f.get()->values; - std::transform(pvalues.begin(), pvalues.end(), std::back_inserter(parameter_variants), - [&names, &pvalues](rcl_interfaces::msg::ParameterValue pvalue) { + for (auto & pvalue : pvalues) { auto i = &pvalue - &pvalues[0]; rcl_interfaces::msg::Parameter parameter; - parameter.name = names[i]; + parameter.name = request->names[i]; parameter.value = pvalue; - return rclcpp::parameter::ParameterVariant::from_parameter(parameter); - }); - promise_result.set_value(parameter_variants); + parameter_variants.push_back(rclcpp::parameter::ParameterVariant::from_parameter( + parameter)); + } + + promise_result->set_value(parameter_variants); if (callback != nullptr) { callback(future_result); } @@ -110,21 +112,23 @@ public: std::function>)> callback = nullptr) { - std::promise> promise_result; - auto future_result = promise_result.get_future().share(); + auto promise_result = + std::make_shared>>(); + auto future_result = promise_result->get_future().share(); auto request = std::make_shared(); request->names = names; get_parameter_types_client_->async_send_request( request, - [&promise_result, &future_result, &callback]( + [promise_result, future_result, &callback]( rclcpp::client::Client::SharedFuture cb_f) { std::vector types; auto & pts = cb_f.get()->types; - std::transform(pts.begin(), pts.end(), std::back_inserter(types), - [](uint8_t pt) {return static_cast(pt); }); - promise_result.set_value(types); + for (auto & pt : pts) { + pts.push_back(static_cast(pt)); + } + promise_result->set_value(types); if (callback != nullptr) { callback(future_result); } @@ -140,8 +144,9 @@ public: std::function>)> callback = nullptr) { - std::promise> promise_result; - auto future_result = promise_result.get_future().share(); + auto promise_result = + std::make_shared>>(); + auto future_result = promise_result->get_future().share(); auto request = std::make_shared(); @@ -151,9 +156,9 @@ public: set_parameters_client_->async_send_request( request, - [&promise_result, &future_result, &callback]( + [promise_result, future_result, &callback]( rclcpp::client::Client::SharedFuture cb_f) { - promise_result.set_value(cb_f.get()->results); + promise_result->set_value(cb_f.get()->results); if (callback != nullptr) { callback(future_result); } @@ -169,8 +174,9 @@ public: std::function)> callback = nullptr) { - std::promise promise_result; - auto future_result = promise_result.get_future().share(); + auto promise_result = + std::make_shared>(); + auto future_result = promise_result->get_future().share(); auto request = std::make_shared(); @@ -180,9 +186,9 @@ public: set_parameters_atomically_client_->async_send_request( request, - [&promise_result, &future_result, &callback]( + [promise_result, future_result, &callback]( rclcpp::client::Client::SharedFuture cb_f) { - promise_result.set_value(cb_f.get()->result); + promise_result->set_value(cb_f.get()->result); if (callback != nullptr) { callback(future_result); } @@ -199,8 +205,9 @@ public: std::function)> callback = nullptr) { - std::promise promise_result; - auto future_result = promise_result.get_future().share(); + auto promise_result = + std::make_shared>(); + auto future_result = promise_result->get_future().share(); auto request = std::make_shared(); request->prefixes = prefixes; @@ -208,9 +215,9 @@ public: list_parameters_client_->async_send_request( request, - [&promise_result, &future_result, &callback]( + [promise_result, future_result, &callback]( rclcpp::client::Client::SharedFuture cb_f) { - promise_result.set_value(cb_f.get()->result); + promise_result->set_value(cb_f.get()->result); if (callback != nullptr) { callback(future_result); }