在ROS1中,您可以将代码编写为ROS节点或ROS nodelet。ROS 1节点被编译成可执行文件。另一方面,ROS1 nodelet被编译成共享库,然后在运行时由进程加载。
在ROS 2中,推荐的编写代码的方式类似于节点--我们称之为组件。这使得向现有代码中添加通用概念(如生命周期)变得容易。不同API的最大缺点在ROS 2中得以避免,因为这两种方法在ROS 2中使用相同的API。
通过将流程布局作为部署时决策,用户可以在以下选项中进行选择:
另外,ros2 launch可以通过专门的启动操作来自动执行这些操作。
因为组件只内置在共享库中,所以它没有main函数(参见Talker源代码)。组件通常是rclcpp::Node的子类。因为它不控制线程,所以它不应该在构造函数中执行任何长时间运行或阻塞的任务。相反,它可以使用计时器来获得定期通知。此外,它还可以创建发布者、订阅者、服务器和客户端。
将这样的类作为组件的一个重要方面是,该类使用包rclcpp_components中的宏注册自己(参见源代码的最后一行)。这使得组件在其库被加载到正在运行的进程中时可以被发现-它充当某种入口点。
此外,一旦创建了组件,就必须向索引注册它,以便工具能够发现它。
RCLCPP_COMPONENTS_REGISTER_NODE(action_tutorials_cpp::FibonacciActionServer)
add_library(talker_component SHAREDsrc/talker_component.cpp)
rclcpp_components_register_nodes(talker_component "composition::Talker")
# To register multiple components in the same shared library, use multiple calls
# rclcpp_components_register_nodes(talker_component "composition::Talker2")
合成包包含两种不同的使用组件的方法。最常见的三种是:
下一篇:信道估计中的导频结构