目录
概述
基本使用
执行器类型
回调组
调度语义
Outlook
更多信息
概述
在 ROS 2 中,执行管理由执行器处理。执行器使用底层操作系统的一个或多个线程来调用订阅、定时器、服务服务器、操作服务器等的回调,以处理传入的消息和事件。显式的 Executor 类(在 rclcpp 中的 executor.hpp,在 rclpy 中的 executors.py,或在 rclc 中的 executor.h)比 ROS 1 中的旋转机制提供了更多的执行管理控制,尽管基本 API 非常相似。
在以下内容中,我们重点介绍 C++ 客户端库 rclcpp。
基本用法
在最简单的情况下,主线程通过调用 rclcpp::spin(..)
来处理节点的传入消息和事件,如下所示:
int main(int argc, char* argv[])
{
// Some initialization.
rclcpp::init(argc, argv);
...
// Instantiate a node.
rclcpp::Node::SharedPtr node = ...
// Run the executor.
rclcpp::spin(node);
// Shutdown and exit.
...
return 0;
}
对 spin(node)
的调用基本上扩展为单线程执行器的实例化和调用,这是最简单的执行器:
rclcpp::executors::SingleThreadedExecutor executor;
executor.add_node(node);
executor.spin();
通过调用执行器实例的 spin()
,当前线程开始查询 rcl 和中间件层的传入消息和其他事件,并调用相应的回调函数,直到节点关闭。为了不抵消中间件的 QoS 设置,传入消息不会存储在客户端库层的队列中,而是保存在中间件中,直到由回调函数处理。(这是与 ROS 1 的一个关键区别。)等待集用于通知执行器中间件层上的可用消息