Skip to content

Commit bca3fd7

Browse files
authored
add use_global_arguments for node options of component nodes (#1776)
* add use_global_arguments for node options of component nodes Signed-off-by: zhenpeng ge <[email protected]> keep use_global_arguments false default Signed-off-by: zhenpeng ge <[email protected]> update warning message Signed-off-by: zhenpeng ge <[email protected]> update warnning message Signed-off-by: zhenpeng ge <[email protected]> add test Signed-off-by: zhenpeng ge <[email protected]> * use forward_global_arguments instead of use_global_arguments Signed-off-by: zhenpeng ge <[email protected]>
1 parent 8afef51 commit bca3fd7

File tree

2 files changed

+63
-4
lines changed

2 files changed

+63
-4
lines changed

rclcpp_components/src/component_manager.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,18 @@ ComponentManager::create_node_options(const std::shared_ptr<LoadNode::Request> r
172172
"Extra component argument 'use_intra_process_comms' must be a boolean");
173173
}
174174
options.use_intra_process_comms(extra_argument.get_value<bool>());
175+
} else if (extra_argument.get_name() == "forward_global_arguments") {
176+
if (extra_argument.get_type() != rclcpp::ParameterType::PARAMETER_BOOL) {
177+
throw ComponentManagerException(
178+
"Extra component argument 'forward_global_arguments' must be a boolean");
179+
}
180+
options.use_global_arguments(extra_argument.get_value<bool>());
181+
if (extra_argument.get_value<bool>()) {
182+
RCLCPP_WARN(
183+
get_logger(), "forward_global_arguments is true by default in nodes, but is not "
184+
"recommended in a component manager. If true, this will cause this node's behavior "
185+
"to be influenced by global arguments, not only those targeted at this node.");
186+
}
175187
}
176188
}
177189

rclcpp_components/test/test_component_manager_api.cpp

Lines changed: 51 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,49 @@ void test_components_api(bool use_dedicated_executor)
219219
EXPECT_EQ(result->unique_id, 0u);
220220
}
221221

222+
{
223+
// forward_global_arguments
224+
auto request = std::make_shared<composition_interfaces::srv::LoadNode::Request>();
225+
request->package_name = "rclcpp_components";
226+
request->plugin_name = "test_rclcpp_components::TestComponentFoo";
227+
request->node_name = "test_component_global_arguments";
228+
rclcpp::Parameter forward_global_arguments("forward_global_arguments",
229+
rclcpp::ParameterValue(true));
230+
request->extra_arguments.push_back(forward_global_arguments.to_parameter_msg());
231+
232+
auto future = composition_client->async_send_request(request);
233+
auto ret = exec->spin_until_future_complete(future, 5s); // Wait for the result.
234+
auto result = future.get();
235+
EXPECT_EQ(ret, rclcpp::FutureReturnCode::SUCCESS);
236+
EXPECT_EQ(result->success, true);
237+
EXPECT_EQ(result->error_message, "");
238+
EXPECT_EQ(result->full_node_name, "/test_component_global_arguments");
239+
EXPECT_EQ(result->unique_id, 7u);
240+
}
241+
242+
{
243+
// forward_global_arguments is not a bool type parameter
244+
auto request = std::make_shared<composition_interfaces::srv::LoadNode::Request>();
245+
request->package_name = "rclcpp_components";
246+
request->plugin_name = "test_rclcpp_components::TestComponentFoo";
247+
request->node_name = "test_component_global_arguments_str";
248+
249+
rclcpp::Parameter forward_global_arguments("forward_global_arguments",
250+
rclcpp::ParameterValue("hello"));
251+
request->extra_arguments.push_back(forward_global_arguments.to_parameter_msg());
252+
253+
auto future = composition_client->async_send_request(request);
254+
auto ret = exec->spin_until_future_complete(future, 5s); // Wait for the result.
255+
auto result = future.get();
256+
EXPECT_EQ(ret, rclcpp::FutureReturnCode::SUCCESS);
257+
EXPECT_EQ(result->success, false);
258+
EXPECT_EQ(
259+
result->error_message,
260+
"Extra component argument 'forward_global_arguments' must be a boolean");
261+
EXPECT_EQ(result->full_node_name, "");
262+
EXPECT_EQ(result->unique_id, 0u);
263+
}
264+
222265
auto node_names = node->get_node_names();
223266

224267
auto find_in_nodes = [node_names](std::string name) {
@@ -247,20 +290,22 @@ void test_components_api(bool use_dedicated_executor)
247290
auto result_node_names = result->full_node_names;
248291
auto result_unique_ids = result->unique_ids;
249292

250-
EXPECT_EQ(result_node_names.size(), 6u);
293+
EXPECT_EQ(result_node_names.size(), 7u);
251294
EXPECT_EQ(result_node_names[0], "/test_component_foo");
252295
EXPECT_EQ(result_node_names[1], "/test_component_bar");
253296
EXPECT_EQ(result_node_names[2], "/test_component_baz");
254297
EXPECT_EQ(result_node_names[3], "/ns/test_component_bing");
255298
EXPECT_EQ(result_node_names[4], "/test_component_remap");
256299
EXPECT_EQ(result_node_names[5], "/test_component_intra_process");
257-
EXPECT_EQ(result_unique_ids.size(), 6u);
300+
EXPECT_EQ(result_node_names[6], "/test_component_global_arguments");
301+
EXPECT_EQ(result_unique_ids.size(), 7u);
258302
EXPECT_EQ(result_unique_ids[0], 1u);
259303
EXPECT_EQ(result_unique_ids[1], 2u);
260304
EXPECT_EQ(result_unique_ids[2], 3u);
261305
EXPECT_EQ(result_unique_ids[3], 4u);
262306
EXPECT_EQ(result_unique_ids[4], 5u);
263307
EXPECT_EQ(result_unique_ids[5], 6u);
308+
EXPECT_EQ(result_unique_ids[6], 7u);
264309
}
265310
}
266311

@@ -314,18 +359,20 @@ void test_components_api(bool use_dedicated_executor)
314359
auto result_node_names = result->full_node_names;
315360
auto result_unique_ids = result->unique_ids;
316361

317-
EXPECT_EQ(result_node_names.size(), 5u);
362+
EXPECT_EQ(result_node_names.size(), 6u);
318363
EXPECT_EQ(result_node_names[0], "/test_component_bar");
319364
EXPECT_EQ(result_node_names[1], "/test_component_baz");
320365
EXPECT_EQ(result_node_names[2], "/ns/test_component_bing");
321366
EXPECT_EQ(result_node_names[3], "/test_component_remap");
322367
EXPECT_EQ(result_node_names[4], "/test_component_intra_process");
323-
EXPECT_EQ(result_unique_ids.size(), 5u);
368+
EXPECT_EQ(result_node_names[5], "/test_component_global_arguments");
369+
EXPECT_EQ(result_unique_ids.size(), 6u);
324370
EXPECT_EQ(result_unique_ids[0], 2u);
325371
EXPECT_EQ(result_unique_ids[1], 3u);
326372
EXPECT_EQ(result_unique_ids[2], 4u);
327373
EXPECT_EQ(result_unique_ids[3], 5u);
328374
EXPECT_EQ(result_unique_ids[4], 6u);
375+
EXPECT_EQ(result_unique_ids[5], 7u);
329376
}
330377
}
331378
}

0 commit comments

Comments
 (0)