[WIP / Re-Opened] Add functions to return formatted Node Name-Namespace strings (#698)
* Add functions to return formatted Node Name-Namespace strings Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Changed get_node_names to return fully qualified names, removed namespace method Signed-off-by: Oswin So <oswinso@gmail.com> * Removed unnecessary capture-by-reference Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Added first draft of tests Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Fixed bug creating phantom empty name/namespaces Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Re-ordered includes Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Swap checks to see if name is in set Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Fixed style errors from uncrustify Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Swapped to unordered_set Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Re-ordered includes again Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * nitpick: minimize vertical whitespace see: https://google.github.io/styleguide/cppguide.html#Vertical_Whitespace Signed-off-by: William Woodall <william@osrfoundation.org> * Add API documentation for added get_node_names function Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Revert to last known semi-working point Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Modified expected test results A fully-qualified name is "namespace"/"name". If namespace is set to be "/" (as they are in these tests), we would expect a qualified name of "//name" Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Have get_node_names determine if central slash needed or not Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Corrected tests to not accept double slashes Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Undo changes to .gitignore Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Change qualified string construction to better handle invalid slashes Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Removed debugging statements Signed-off-by: Jacob Hassold <jhassold@dcscorp.com> * Simplified slash-checking logic Signed-off-by: Jacob Hassold <jhassold@dcscorp.com>
This commit is contained in:
parent
e9101b49cd
commit
a8a0788f81
4 changed files with 53 additions and 11 deletions
|
@ -916,6 +916,12 @@ public:
|
||||||
void
|
void
|
||||||
register_param_change_callback(CallbackT && callback);
|
register_param_change_callback(CallbackT && callback);
|
||||||
|
|
||||||
|
|
||||||
|
/// Get the fully-qualified names of all available nodes.
|
||||||
|
/**
|
||||||
|
* The fully-qualified name includes the local namespace and name of the node.
|
||||||
|
* \return A vector of fully-qualified names of nodes.
|
||||||
|
*/
|
||||||
RCLCPP_PUBLIC
|
RCLCPP_PUBLIC
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
get_node_names() const;
|
get_node_names() const;
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "rclcpp/node_interfaces/node_graph.hpp"
|
#include "rclcpp/node_interfaces/node_graph.hpp"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
@ -136,9 +137,24 @@ NodeGraph::get_node_names() const
|
||||||
std::vector<std::string> nodes;
|
std::vector<std::string> nodes;
|
||||||
auto names_and_namespaces = get_node_names_and_namespaces();
|
auto names_and_namespaces = get_node_names_and_namespaces();
|
||||||
|
|
||||||
for (const auto & it : names_and_namespaces) {
|
std::transform(names_and_namespaces.begin(),
|
||||||
nodes.push_back(it.first);
|
names_and_namespaces.end(),
|
||||||
}
|
std::back_inserter(nodes),
|
||||||
|
[](std::pair<std::string, std::string> nns) {
|
||||||
|
std::string return_string;
|
||||||
|
if (nns.second.back() == '/') {
|
||||||
|
return_string = nns.second + nns.first;
|
||||||
|
} else {
|
||||||
|
return_string = nns.second + '/' + nns.first;
|
||||||
|
}
|
||||||
|
// Quick check to make sure that we start with a slash
|
||||||
|
// Since fully-qualified strings need to
|
||||||
|
if (return_string.front() != '/') {
|
||||||
|
return_string = "/" + return_string;
|
||||||
|
}
|
||||||
|
return return_string;
|
||||||
|
}
|
||||||
|
);
|
||||||
return nodes;
|
return nodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,10 +189,12 @@ NodeGraph::get_node_names_and_namespaces() const
|
||||||
throw std::runtime_error(error_msg);
|
throw std::runtime_error(error_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::pair<std::string, std::string>> node_names(node_names_c.size);
|
|
||||||
|
std::vector<std::pair<std::string, std::string>> node_names;
|
||||||
|
node_names.reserve(node_names_c.size);
|
||||||
for (size_t i = 0; i < node_names_c.size; ++i) {
|
for (size_t i = 0; i < node_names_c.size; ++i) {
|
||||||
if (node_names_c.data[i] && node_namespaces_c.data[i]) {
|
if (node_names_c.data[i] && node_namespaces_c.data[i]) {
|
||||||
node_names.push_back(std::make_pair(node_names_c.data[i], node_namespaces_c.data[i]));
|
node_names.emplace_back(node_names_c.data[i], node_namespaces_c.data[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,9 +14,10 @@
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <unordered_set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "rclcpp/exceptions.hpp"
|
#include "rclcpp/exceptions.hpp"
|
||||||
|
@ -99,6 +100,23 @@ TEST_F(TestNode, get_name_and_namespace) {
|
||||||
EXPECT_STREQ("/my/ns", node->get_namespace());
|
EXPECT_STREQ("/my/ns", node->get_namespace());
|
||||||
EXPECT_STREQ("/my/ns/my_node", node->get_fully_qualified_name());
|
EXPECT_STREQ("/my/ns/my_node", node->get_fully_qualified_name());
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
auto node1 = std::make_shared<rclcpp::Node>("my_node1", "my/ns");
|
||||||
|
auto node2 = std::make_shared<rclcpp::Node>("my_node2", "my/ns");
|
||||||
|
auto node3 = std::make_shared<rclcpp::Node>("my_node3", "/ns2");
|
||||||
|
auto node4 = std::make_shared<rclcpp::Node>("my_node4", "my/ns3");
|
||||||
|
auto names_and_namespaces = node1->get_node_names();
|
||||||
|
auto name_namespace_set = std::unordered_set<std::string>(names_and_namespaces.begin(),
|
||||||
|
names_and_namespaces.end());
|
||||||
|
std::function<bool(std::string)> Set_Contains = [&](std::string string_key)
|
||||||
|
{
|
||||||
|
return name_namespace_set.find(string_key) != name_namespace_set.end();
|
||||||
|
};
|
||||||
|
EXPECT_TRUE(Set_Contains("/my/ns/my_node1"));
|
||||||
|
EXPECT_TRUE(Set_Contains("/my/ns/my_node2"));
|
||||||
|
EXPECT_TRUE(Set_Contains("/ns2/my_node3"));
|
||||||
|
EXPECT_TRUE(Set_Contains("/my/ns3/my_node4"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TestNode, subnode_get_name_and_namespace) {
|
TEST_F(TestNode, subnode_get_name_and_namespace) {
|
||||||
|
|
|
@ -117,10 +117,10 @@ TEST_F(TestComponentManager, load_components)
|
||||||
return std::find(node_names.begin(), node_names.end(), name) != node_names.end();
|
return std::find(node_names.begin(), node_names.end(), name) != node_names.end();
|
||||||
};
|
};
|
||||||
|
|
||||||
EXPECT_TRUE(find_in_nodes("test_component_foo"));
|
EXPECT_TRUE(find_in_nodes("/test_component_foo"));
|
||||||
EXPECT_TRUE(find_in_nodes("test_component_bar"));
|
EXPECT_TRUE(find_in_nodes("/test_component_bar"));
|
||||||
EXPECT_TRUE(find_in_nodes("test_component_baz"));
|
EXPECT_TRUE(find_in_nodes("/test_component_baz"));
|
||||||
EXPECT_TRUE(find_in_nodes("test_component_bing"));
|
EXPECT_TRUE(find_in_nodes("/ns/test_component_bing"));
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(TestComponentManager, load_invalid_components)
|
TEST_F(TestComponentManager, load_invalid_components)
|
||||||
|
@ -263,7 +263,7 @@ TEST_F(TestComponentManager, unload_component)
|
||||||
auto find_in_nodes = [node_names](std::string name) {
|
auto find_in_nodes = [node_names](std::string name) {
|
||||||
return std::find(node_names.begin(), node_names.end(), name) != node_names.end();
|
return std::find(node_names.begin(), node_names.end(), name) != node_names.end();
|
||||||
};
|
};
|
||||||
EXPECT_TRUE(find_in_nodes("test_component_foo"));
|
EXPECT_TRUE(find_in_nodes("/test_component_foo"));
|
||||||
|
|
||||||
{
|
{
|
||||||
auto client = node->create_client<composition_interfaces::srv::UnloadNode>(
|
auto client = node->create_client<composition_interfaces::srv::UnloadNode>(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue