Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement Unified Node Interface (NodeInterfaces class) #2041

Merged
merged 17 commits into from
Dec 29, 2022

Conversation

methylDragon
Copy link
Contributor

@methylDragon methylDragon commented Nov 3, 2022

Finally a longstanding quibble about Nodes and LifecycleNodes and node interfaces has a potential resolution.

Description

This PR introduces the concept of a NodeInterfaces class (that is, a unified adapter for any disparate collection of unique kinds of NodeInterfaces) that allows you to package interfaces into a single object. This is inspired by #831.

This allows you to write functions that take in a single object instead of a collection of node interfaces (or instead of a templated function...), and also supports both Nodes and LifecycleNodes, allowing you to quickly swap any place where you originally passed a Node with a NodeInterfaces. This also means that the issue where Nodes and LifecycleNodes exist on separate inheritance trees can be mitigated a little by using this as a bridging class.

What's more, the template parameters allow you to select which interfaces are made available, and also can serve as type hints to downstream users for which interfaces a function requires.

Additionally, you can aggregate interfaces from different nodes (or mocked interfaces) too, which isn't something you could trivially do if you made your function a template function that takes in a NodeT!

This PR also adds a new method for Nodes and LifecycleNodes to obtain their corresponding NodeInterfaces.

Tests have been implemented for Nodes, LifecycleNodes, and the NodeInterfaces template class itself.

Example

This is best explained with an example.

// Suppose we have some function:
void fn(NodeInterfaces<NodeBaseInterface, NodeClockInterface> interfaces);

// Then we can, explicitly:
rclcpp::Node node("some_node");
auto ni = NodeInterfaces<NodeBaseInterface, NodeClockInterface>(node);
fn(ni);

// But also, implicitly:
fn(node);

// Subsetting a NodeInterfaces object also works!
auto ni_base = NodeInterfaces<NodeBaseInterface>(ni);

// Or aggregate them (you could aggregate interfaces from disparate node-likes)
auto ni_aggregated = NodeInterfaces<NodeBaseInterface, NodeClockInterface>(
  node->get_node_base_interface(),
  node->get_node_clock_interface()
)

// And then to access the interfaces:
// Get with get<>
auto base = ni.get<NodeBaseInterface>();

// Or the appropriate getter
auto clock = ni.get_clock_interface();

For more info, read the docstring.

Why is this useful?

(Adapted from #831)

Before you would have to...

create_service(
  std::shared_ptr<NodeBaseInterface> node_base,
  std::shared_ptr<NodeServicesInterface> node_services,
  // ...

// User calls with
auto service = create_service(
  my_node_class->get_node_base_interface(),
  my_node_class->get_node_services_interface(),
...

But now you can:

create_service(
   NodeInterfaces<NodeBaseInterface, NodeServicesInterface> node_handle,
   // ...

// User calls with
auto service = create_service(
  NodeInterfaces<NodeBaseInterface, NodeServicesInterface>(my_node_or_lifecycle_node_class),
  // ...

And in fact, implicit conversions should work too!

// User calls with
auto service = create_service(my_node_or_lifecycle_node_class,
  // ...

// This doesn't support pointers, remember to dereference!
// See notes below!

// INCREDIBLE!

And just like that you can support both Nodes and LifecycleNodes!
This also serves as an easy drop-in replacement for any method that takes in an rclcpp::Node or similar shared pointer!

Why Not...

Why not

create_service(std::shared_ptr<rclcpp::Node> node);

?

Because

// This will NOT work. rclcpp_lifecycle::LifecycleNode and rclcpp::Node are on separate inheritance trees!
create_service(lifecycle_node);

Additional Notes

This uses C++14 compatible template metaprogramming constructs, for backportability. I'm pretty sure there are some C++17/C++20 constructs that would make the implementation more concise though.. For a future time.

EDIT: I realized that fold expressions are C++17... We'll have to find some workaround when backporting. (Actually so is is_same_v 🤦‍♂️ )

Addendum

Because of #2075 , the NodeInterfaces object only accepts non-pointer node-like types. You must dereference any pointer arguments to the NodeInterfaces constructor.

@methylDragon
Copy link
Contributor Author

methylDragon commented Nov 3, 2022

Only thing I'm unsure of if if I should leave the NodeT constructor for NodeHandle explicit.

If it's not explicit we can rely on implicit conversion to allow passing in Node-like objects directly into methods that take in NodeHandle arguments without needing to explicitly instantiate the NodeHandle.. (I think? Maybe the templates won't let that happen, in which case, the point is moot...)

@methylDragon methylDragon changed the title Implement Unified NodeInterface (NodeHandle) Implement Unified Node Interface (NodeHandle) Nov 3, 2022
@methylDragon
Copy link
Contributor Author

methylDragon commented Nov 3, 2022

Will build #11111 be the one???

  • Linux Build Status
  • Linux-aarch64 Build Status
  • Windows Build Status

@alsora
Copy link
Collaborator

alsora commented Nov 3, 2022

I like the overall idea.
However I have a couple of questions from looking at your examples.

It seems like there are multiple methods to retrieve each interface (e.g. base and get_node_base_interface), why is that?

Can we implement it in a way such that users can customize it? I.e. If I create a new node interface, I would like to add it there

@methylDragon
Copy link
Contributor Author

methylDragon commented Nov 3, 2022

I like the overall idea. However I have a couple of questions from looking at your examples.

It seems like there are multiple methods to retrieve each interface (e.g. base and get_node_base_interface), why is that?

Can we implement it in a way such that users can customize it? I.e. If I create a new node interface, I would like to add it there

It's already implemented in such a way that you can attach a custom interface to the NodeHandle! Just use set_node_XXX_interface(your_interface) or XXX(your_interface) and it'll overwrite/set the interface.

If you mean creating a new type of node interface, I'm not sure if it's possible (I'm already using quite a lot of template metaprogramming wizardry to achieve what we have at the moment...) And in that case, the nodes themselves need to be updated to support the interface, so at that point I'd just ask for a PR for those new interfaces to be added to the NodeHandle class.

The multiple ways for retrieving the interface are just for convenience (or typing less...) I was basing it off the issue over this PR was inspired by. More precisely, the shorter name is for convenience, while the longer name is supposed to use the same names as the node getters for node interfaces.

Copy link
Member

@wjwwood wjwwood left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd also like to talk about the name of the new class NodeHandle. I think we should pick something else because really it's not a "handle" (we already have a rcl_node_handle_t which is actually a handle, i.e. an opaque object that is a stand in for another actual thing) and because we had a NodeHandle in ROS 1 which was something very different and that might cause confusion.

Ideally this whole class would be replaced with a constraint but we don't have access to that atm with C++17.

Some ideas from me:

  • NodeWithInterfaces<...>
    • my_func(NodeWithInterface<...>) would read as "my_func takes a Node-like thing with the interfaces ..."
  • NodeWithRequiredInterfaces<...>
  • NodeInterfaces<...>
    • invokes the idea of a collection of interfaces, which may or may not be misleading depending on how we end up implementing this class

rclcpp/include/rclcpp/node.hpp Outdated Show resolved Hide resolved
rclcpp/include/rclcpp/node_handle.hpp Outdated Show resolved Hide resolved
rclcpp/include/rclcpp/node_handle.hpp Outdated Show resolved Hide resolved
rclcpp/include/rclcpp/node_handle.hpp Outdated Show resolved Hide resolved
rclcpp/include/rclcpp/node_handle.hpp Outdated Show resolved Hide resolved
rclcpp/include/rclcpp/node_handle.hpp Outdated Show resolved Hide resolved
rclcpp/include/rclcpp/node_handle.hpp Outdated Show resolved Hide resolved
@methylDragon
Copy link
Contributor Author

methylDragon commented Nov 8, 2022

I'd also like to talk about the name of the new class NodeHandle. I think we should pick something else because really it's not a "handle" (we already have a rcl_node_handle_t which is actually a handle, i.e. an opaque object that is a stand in for another actual thing) and because we had a NodeHandle in ROS 1 which was something very different and that might cause confusion.

Ideally this whole class would be replaced with a constraint but we don't have access to that atm with C++17.

Some ideas from me:

  • NodeWithInterfaces<...>

    • my_func(NodeWithInterface<...>) would read as "my_func takes a Node-like thing with the interfaces ..."
  • NodeWithRequiredInterfaces<...>

  • NodeInterfaces<...>

    • invokes the idea of a collection of interfaces, which may or may not be misleading depending on how we end up implementing this class

How about NodeInterfaceHandle? (Since it's a handler for node interfaces, no matter where they come from). Otherwise, I'm fine with NodeInterfaces also, since this class is just supposed to be an aggregation of interfaces.

I'm less inclined towards the NodeWith... variants because it might confuse users and make them think it's a node as opposed to a node-like thing

@methylDragon
Copy link
Contributor Author

@ros-pull-request-builder retest this please

Copy link
Member

@ivanpauno ivanpauno left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think that something like this may be a good idea.
I have left one suggestion of how to implement it.

I think we have to thoroughly evaluate how this can be used in demos/examples, and double check if using the new "unified node interface" is beneficial.

rclcpp/include/rclcpp/node_handle.hpp Outdated Show resolved Hide resolved
@ivanpauno
Copy link
Member

I'd also like to talk about the name of the new class NodeHandle. I think we should pick something else because really it's not a "handle" (we already have a rcl_node_handle_t which is actually a handle, i.e. an opaque object that is a stand in for another actual thing) and because we had a NodeHandle in ROS 1 which was something very different and that might cause confusion.

+1
Of the proposed options, NodeInterfaces<...> seems nice to me.

@methylDragon
Copy link
Contributor Author

methylDragon commented Nov 10, 2022

I'd also like to talk about the name of the new class NodeHandle. I think we should pick something else because really it's not a "handle" (we already have a rcl_node_handle_t which is actually a handle, i.e. an opaque object that is a stand in for another actual thing) and because we had a NodeHandle in ROS 1 which was something very different and that might cause confusion.

+1 Of the proposed options, NodeInterfaces<...> seems nice to me.

@ivanpauno

Could I double-check that this +1 is over NodeInterfaceHandle (so +1 to NodeInterfaces even though NodeInterfaceHandle exists?) The multiple inheritance templated example you gave above used NodeInterfaceHandle 😬.

I'll change it to whichever you give the +1 to!

Also, what do you think about putting getters for this node interface aggregate onto Node and LifecycleNode?

@methylDragon methylDragon force-pushed the ch3/node-handle branch 2 times, most recently from 03aed20 to 9e675d9 Compare November 10, 2022 08:13
@methylDragon
Copy link
Contributor Author

methylDragon commented Nov 10, 2022

I've updated the tests and moved everything to node_interfaces!

RPr is green!

methylDragon and others added 9 commits December 28, 2022 15:35
Signed-off-by: methylDragon <methylDragon@gmail.com>
Signed-off-by: methylDragon <methylDragon@gmail.com>
Signed-off-by: methylDragon <methylDragon@gmail.com>
Signed-off-by: methylDragon <methylDragon@gmail.com>
Signed-off-by: methylDragon <methylDragon@gmail.com>
Signed-off-by: methylDragon <methylDragon@gmail.com>
Co-authored-by: methylDragon <methylDragon@gmail.com>
Signed-off-by: methylDragon <methylDragon@gmail.com>
Co-authored-by: methylDragon <methylDragon@gmail.com>
Signed-off-by: methylDragon <methylDragon@gmail.com>
Co-authored-by: methylDragon <methylDragon@gmail.com>
Signed-off-by: methylDragon <methylDragon@gmail.com>
Co-authored-by: methylDragon <methylDragon@gmail.com>
Signed-off-by: methylDragon <methylDragon@gmail.com>
Co-authored-by: methylDragon <methylDragon@gmail.com>
Copy link
Member

@wjwwood wjwwood left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm, after checking on the compile-only test

rclcpp/test/rclcpp/CMakeLists.txt Outdated Show resolved Hide resolved
@methylDragon methylDragon force-pushed the ch3/node-handle branch 3 times, most recently from 469be6f to 57335a0 Compare December 29, 2022 01:03
Signed-off-by: methylDragon <methylDragon@gmail.com>
Co-authored-by: methylDragon <methylDragon@gmail.com>
@methylDragon methylDragon merged commit a73e0bd into ros2:rolling Dec 29, 2022
@methylDragon methylDragon deleted the ch3/node-handle branch December 29, 2022 01:59
@Crola1702
Copy link
Contributor

Hey @methylDragon @wjwwood, this PR broke RHEL nightly builds when building rclcpp. Can you please take a look?:

Log output:

--- stderr: rclcpp
In file included from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp�[K:
/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node_interfaces/node_interfaces.hpp: In instantiation of ‘�[Krclcpp::node_interfaces::NodeInterfaces<InterfaceTs>::NodeInterfaces(std::shared_ptr<_Yp>) [with NodeT = rclcpp::Node; InterfaceTs = {rclcpp::node_interfaces::NodeBaseInterface, rclcpp::node_interfaces::NodeGraphInterfac�[K’:
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp:47:�[K   required from here
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node_interfaces/node_interfaces.hpp:153:��[Kerro�[Kuse of deleted functio�[Krclcpp::Node::Node(const rclcpp::Nod�[K’
   : NodeInterfaces(�[Knode ? *node : throw std::invalid_argument("given node pointer is nullpt�[K)
                    �[K~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~�[K
In file included from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/context.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/utilities.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/build/rclcpp/include/rclcpp/logging.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/client.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/callback_group.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp�[K:
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node.hpp:1578:��[Knot�[Kdeclared here
   RCLCPP_DISABLE_COPY(�[KN�[K)
                       �[K^�[K
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/macros.hpp:27��[Knot�[Kin definition of macr�[KRCLCPP_DISABLE_C�[K’
   �[K__VA_ARG�[K(const __VA_ARGS__ &) = delete; \
   �[K^~~~~~~~�[K
In file included from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp�[K:
/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node_interfaces/node_interfaces.hpp: In instantiation of ‘�[Krclcpp::node_interfaces::NodeInterfaces<InterfaceTs>::NodeInterfaces(std::shared_ptr<_Yp>) [with NodeT = rclcpp::Node; InterfaceTs = {rclcpp::node_interfaces::NodeBaseInterfac�[K’:
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp:58:�[K   required from here
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node_interfaces/node_interfaces.hpp:153:��[Kerro�[Kuse of deleted functio�[Krclcpp::Node::Node(const rclcpp::Nod�[K’
   : NodeInterfaces(�[Knode ? *node : throw std::invalid_argument("given node pointer is nullpt�[K)
                    �[K~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~�[K
In file included from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/context.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/utilities.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/build/rclcpp/include/rclcpp/logging.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/client.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/callback_group.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp�[K:
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node.hpp:1578:��[Knot�[Kdeclared here
   RCLCPP_DISABLE_COPY(�[KN�[K)
                       �[K^�[K
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/macros.hpp:27��[Knot�[Kin definition of macr�[KRCLCPP_DISABLE_C�[K’
   �[K__VA_ARG�[K(const __VA_ARGS__ &) = delete; \
   �[K^~~~~~~~�[K
In file included from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp�[K:
/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node_interfaces/node_interfaces.hpp: In instantiation of ‘�[Krclcpp::node_interfaces::NodeInterfaces<InterfaceTs>::NodeInterfaces(std::shared_ptr<_Yp>) [with NodeT = rclcpp::Node; InterfaceTs = {rclcpp::node_interfaces::NodeBaseInterface, rclcpp::node_interfaces::NodeClockInterface, rclcpp::node_interfaces::NodeGraphInterface, rclcpp::node_interfaces::NodeLoggingInterface, rclcpp::node_interfaces::NodeTimersInterface, rclcpp::node_interfaces::NodeTopicsInterface, rclcpp::node_interfaces::NodeServicesInterface, rclcpp::node_interfaces::NodeWaitablesInterface, rclcpp::node_interfaces::NodeParametersInterface, rclcpp::node_interfaces::NodeTimeSourceInterfac�[K’:
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp:105:�[K   required from here
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node_interfaces/node_interfaces.hpp:153:��[Kerro�[Kuse of deleted functio�[Krclcpp::Node::Node(const rclcpp::Nod�[K’
   : NodeInterfaces(�[Knode ? *node : throw std::invalid_argument("given node pointer is nullpt�[K)
                    �[K~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~�[K
In file included from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/context.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/utilities.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/build/rclcpp/include/rclcpp/logging.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/client.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/callback_group.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp�[K:
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node.hpp:1578:��[Knot�[Kdeclared here
   RCLCPP_DISABLE_COPY(�[KN�[K)
                       �[K^�[K
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/macros.hpp:27��[Knot�[Kin definition of macr�[KRCLCPP_DISABLE_C�[K’
   �[K__VA_ARG�[K(const __VA_ARGS__ &) = delete; \
   �[K^~~~~~~~�[K
In file included from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp�[K:
/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node_interfaces/node_interfaces.hpp: In instantiation of ‘�[Krclcpp::node_interfaces::NodeInterfaces<InterfaceTs>::NodeInterfaces(std::shared_ptr<_Yp>) [with NodeT = rclcpp::Node; InterfaceTs = {rclcpp::node_interfaces::NodeBaseInterface, rclcpp::node_interfaces::NodeClockInterface, rclcpp::node_interfaces::NodeGraphInterface, rclcpp::node_interfaces::NodeLoggingInterface, rclcpp::node_interfaces::NodeParametersInterface, rclcpp::node_interfaces::NodeServicesInterface, rclcpp::node_interfaces::NodeTimeSourceInterface, rclcpp::node_interfaces::NodeTimersInterface, rclcpp::node_interfaces::NodeTopicsInterface, rclcpp::node_interfaces::NodeWaitablesInterfac�[K’:
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp:201:�[K   required from here
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node_interfaces/node_interfaces.hpp:153:��[Kerro�[Kuse of deleted functio�[Krclcpp::Node::Node(const rclcpp::Nod�[K’
   : NodeInterfaces(�[Knode ? *node : throw std::invalid_argument("given node pointer is nullpt�[K)
                    �[K~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~�[K
In file included from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/context.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/utilities.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/build/rclcpp/include/rclcpp/logging.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/client.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/callback_group.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node.hpp�[K,
                 from �[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/test/rclcpp/node_interfaces/test_node_interfaces.cpp�[K:
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/node.hpp:1578:��[Knot�[Kdeclared here
   RCLCPP_DISABLE_COPY(�[KN�[K)
                       �[K^�[K
�[K/home/jenkins-agent/workspace/nightly_linux-rhel_debug/ws/src/ros2/rclcpp/rclcpp/include/rclcpp/macros.hpp:27��[Knot�[Kin definition of macr�[KRCLCPP_DISABLE_C�[K’
   �[K__VA_ARG�[K(const __VA_ARGS__ &) = delete; \
   �[K^~~~~~~~�[K
gmake[2]: *** [test/rclcpp/CMakeFiles/test_node_interfaces__node_interfaces.dir/build.make:76: test/rclcpp/CMakeFiles/test_node_interfaces__node_interfaces.dir/node_interfaces/test_node_interfaces.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:2943: test/rclcpp/CMakeFiles/test_node_interfaces__node_interfaces.dir/all] Error 2
gmake[1]: *** Waiting for unfinished jobs....
gmake: *** [Makefile:146: all] Error 2

I notice:

@methylDragon
Copy link
Contributor Author

@Crola1702 I'm looking at it!

@methylDragon
Copy link
Contributor Author

methylDragon commented Jan 27, 2023

Hey @methylDragon @wjwwood, this PR broke RHEL nightly builds when building rclcpp. Can you please take a look?:

Log output:

I notice:

Noting that this was fixed in

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants