6.3.1. Nodes¶
Table of Contents
ROS 2 nodes are the main participants on ROS 2 ecosystem. They will communicate between each other using publishers, subscriptions, services, etc. Further information about ROS 2 nodes can be found on Understanding nodes.
6.3.1.1. Initialization¶
Before a node is created, a rclc_support_t
object needs to be created and initialized. The rclc_support_init
method will handle micro-ROS initial configuration (memory initialization, transport configuration, …).
Note
The rclc_support_init
function will try to establish communication with the Agent and will fail if its not reachable on a configurable time.
A good practice is to the ping the Agent to check the connection before calling this method.
Initialize micro-ROS and create a node with default configuration:
// Get configured allocator rcl_allocator_t allocator = rcl_get_default_allocator(); // Initialize support object rclc_support_t support; rclc_support_init(&support, argc, argv, &allocator); // Node name const char * node_name = "test_node"; // Node namespace (Can remain empty: "") const char * namespace = "test_namespace"; // Init default node rcl_node_t node; rclc_node_init_default(&node, node_name, namespace, &support);
Configure the node
Domain ID
:ROS2 allows isolation of nodes through the
ROS_DOMAIN_ID
concept. Nodes can only discover and communicate nodes placed on the same domain. Further information about ROS 2 Domain ID can be found on About Domain ID.A node can be configured using the
rclc_support_t
internalrcl_init_options_t
options structure. rcl provides thercl_init_options_set_domain_id
method to set a node domain. Example:// Get configured allocator rcl_allocator_t allocator = rcl_get_default_allocator(); // Initialize and modify options (Set DOMAIN ID to 10) rcl_init_options_t init_options = rcl_get_zero_initialized_init_options(); rcl_init_options_init(&init_options, allocator); rcl_init_options_set_domain_id(&init_options, 10); // Initialize rclc support object with custom options rclc_support_t support; rclc_support_init_with_options(&support, 0, NULL, &init_options, &allocator); // Node name const char * node_name = "test_node"; // Node namespace (Can remain empty "") const char * namespace = "test_namespace"; // Init node with configured support object rcl_node_t node; rclc_node_init_default(&node, node_name, namespace, &support);
Note
The configuration of the node will also be applied to its future elements (publishers, subscribers, services, …).
6.3.1.2. Cleaning Up¶
All entities owned by a node (publishers, subscribers, services, …) have to be destroyed before the node itself:
// Destroy created entities (Example)
rcl_publisher_fini(&publisher, &node);
// Destroy the node
rcl_node_fini(&node);
This will delete the node from ROS2 graph, including any generated infrastructure on the agent (if possible) and used memory on the client.