Skip to content

Commit 3a09fb3

Browse files
authored
Expose node options to controller manager (#942)
Signed-off-by: methylDragon <[email protected]>
1 parent 1c058d7 commit 3a09fb3

File tree

5 files changed

+39
-6
lines changed

5 files changed

+39
-6
lines changed
40 KB
Loading
35.7 KB
Loading

controller_manager/doc/userdoc.rst

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,35 @@ There are two scripts to interact with controller manager from launch files:
119119
-c CONTROLLER_MANAGER, --controller-manager CONTROLLER_MANAGER
120120
Name of the controller manager ROS node
121121
122+
Using the Controller Manager in a Process
123+
-----------------------------------------
124+
125+
The ``ControllerManager`` may also be instantiated in a process as a class, but proper care must be taken when doing so.
126+
The reason for this is because the ``ControllerManager`` class inherits from ``rclcpp::Node``.
127+
128+
If there is more than one Node in the process, global node name remap rules can forcibly change the ``ControllerManager's`` node name as well, leading to duplicate node names.
129+
This occurs whether the Nodes are siblings or exist in a hierarchy.
130+
131+
.. image:: images/global_general_remap.png
132+
133+
The workaround for this is to specify another node name remap rule in the ``NodeOptions`` passed to the ``ControllerManager`` node (causing it to ignore the global rule), or ensure that any remap rules are targeted to specific nodes.
134+
135+
.. image:: images/global_specific_remap.png
136+
137+
..
138+
TODO: (methylDragon) Update the proposed solution when https://github.com/ros2/ros2/issues/1377 is resolved
139+
140+
.. code-block:: cpp
141+
142+
auto options = controller_manager::get_cm_node_options();
143+
options.arguments({
144+
"--ros-args",
145+
"--remap", "_target_node_name:__node:=dst_node_name",
146+
"--log-level", "info"});
147+
148+
auto cm = std::make_shared<controller_manager::ControllerManager>(
149+
executor, "_target_node_name", "some_optional_namespace", options);
150+
122151
Concepts
123152
-----------
124153

controller_manager/include/controller_manager/controller_manager.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ namespace controller_manager
5656
{
5757
using ControllersListIterator = std::vector<controller_manager::ControllerSpec>::const_iterator;
5858

59+
rclcpp::NodeOptions get_cm_node_options();
60+
5961
class ControllerManager : public rclcpp::Node
6062
{
6163
public:
@@ -67,13 +69,15 @@ class ControllerManager : public rclcpp::Node
6769
std::unique_ptr<hardware_interface::ResourceManager> resource_manager,
6870
std::shared_ptr<rclcpp::Executor> executor,
6971
const std::string & manager_node_name = "controller_manager",
70-
const std::string & namespace_ = "");
72+
const std::string & namespace_ = "",
73+
const rclcpp::NodeOptions & options = get_cm_node_options());
7174

7275
CONTROLLER_MANAGER_PUBLIC
7376
ControllerManager(
7477
std::shared_ptr<rclcpp::Executor> executor,
7578
const std::string & manager_node_name = "controller_manager",
76-
const std::string & namespace_ = "");
79+
const std::string & namespace_ = "",
80+
const rclcpp::NodeOptions & options = get_cm_node_options());
7781

7882
CONTROLLER_MANAGER_PUBLIC
7983
virtual ~ControllerManager() = default;

controller_manager/src/controller_manager.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -133,8 +133,8 @@ rclcpp::NodeOptions get_cm_node_options()
133133

134134
ControllerManager::ControllerManager(
135135
std::shared_ptr<rclcpp::Executor> executor, const std::string & manager_node_name,
136-
const std::string & namespace_)
137-
: rclcpp::Node(manager_node_name, namespace_, get_cm_node_options()),
136+
const std::string & namespace_, const rclcpp::NodeOptions & options)
137+
: rclcpp::Node(manager_node_name, namespace_, options),
138138
resource_manager_(std::make_unique<hardware_interface::ResourceManager>()),
139139
diagnostics_updater_(this),
140140
executor_(executor),
@@ -167,8 +167,8 @@ ControllerManager::ControllerManager(
167167
ControllerManager::ControllerManager(
168168
std::unique_ptr<hardware_interface::ResourceManager> resource_manager,
169169
std::shared_ptr<rclcpp::Executor> executor, const std::string & manager_node_name,
170-
const std::string & namespace_)
171-
: rclcpp::Node(manager_node_name, namespace_, get_cm_node_options()),
170+
const std::string & namespace_, const rclcpp::NodeOptions & options)
171+
: rclcpp::Node(manager_node_name, namespace_, options),
172172
resource_manager_(std::move(resource_manager)),
173173
diagnostics_updater_(this),
174174
executor_(executor),

0 commit comments

Comments
 (0)