01 简介

MicroROS中的“节点”概念与ROS2相似。

ROS 2节点是 ROS 2生态系统的主要参与者。节点将使用 publishers, subscriptions, services 等相互沟通。

对于节点的操作主要有节点的初始化、节点的清除,以及节点的生命周期。

02 初始化Node

2.1 默认方法

在MicroROS中,创建Node有一套模板(默认配置),到手即用,在1.1.1中介绍。但是如果想要了解更多的细节(allocator和support),可以看1.1.2和1.1.3 。

创建默认配置的节点,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Initialize micro-ROS allocator
// `allocator` 负责分配内存,也叫分配器
rcl_allocator_t allocator = rcl_get_default_allocator();

// Initialize support object
// `support` 则是作为配置管理器来使用。
rclc_support_t support;
rcl_ret_t rc = rclc_support_init(&support, argc, argv, &allocator);

// Create node object
rcl_node_t node;
const char * node_name = "test_node";

// Node namespace (Can remain empty "")
const char * namespace = "test_namespace";

// Init default node
rc = rclc_node_init_default(&node, node_name, namespace, &support);
if (rc != RCL_RET_OK) {
... // Handle error
return -1;
}

初始化 node 需要 support,而 support 需要 allocator 。allocator -> support -> node

下面,对 allocator 和 support 稍加介绍。

2.2 allocator

allocator 对象中包装了 micro-ROS 中使用的动态内存分配和重新分配方法

下面是 default allocator 的内部结构,它的作用就是分配内存。

1
2
3
4
5
- allocate = wraps malloc()
- deallocate = wraps free()
- reallocate = wraps realloc()
- zero_allocate = wraps calloc()
- state = `NULL`

在嵌入式系统中工作,用户可能需要使用自己的内存分配方法,那么可以修改此默认函数。详情参考官方文档:Custom allocator

2.3 support

support 的结构体定义如下:

1
2
3
4
5
6
typedef struct
{
rcl_context_t context;
rcl_allocator_t * allocator;
rcl_clock_t clock;
} rclc_support_t;

可以看出来,support 包含了 allocator 的指针、用于创建一些顶层实体(如 node)的 context ,以及对时间相关资源的封装 clock。

03 清除Node

要销毁(cleaning up)节点时,必须在节点本身之前销毁节点拥有的所有实体(Publishers, subscribers, services, ……)

1
2
3
4
5
6
// Destroy created entities (Example)
rcl_publisher_fini(&publisher, &node);
...

// Destroy the node
rcl_node_fini(&node);

这将从 ROS2 图中删除节点,包括 agent 上生成的任何实体和客户端上使用的内存。

04 Lifecycle 生命周期

rclc 生命周期包在 C 中提供了方便的函数,将 rcl 节点与 ROS 2 节点生命周期状态机捆绑在一起,类似于 C++的 rclcpp 生命周期节点。Node 的生命周期的状态机图如下:

(此处一张图)

更多可以参考: