如何在RCLcpp中正确地创建和销毁一个节点?
时间: 2024-10-04 10:00:40 浏览: 31
ACE对象生命周期管理者:一种用于控制对象创建和销毁的补充模式
在RCLcpp中,创建和销毁一个节点的过程通常是这样的:
**创建节点**:
```cpp
#include <rclcpp/rclcpp.hpp>
// ... 引入所需的头文件
class MyNode : public rclcpp::Node
{
public:
explicit MyNode(const std::string & node_name)
: Node(node_name) // 使用指定的节点名称初始化节点
{
// 创建并发布/订阅、注册服务等操作都在构造函数里完成
auto publisher = this->create_publisher<std_msgs::msg::String>("topic", 10); // 创建发布者
auto subscriber = this->create_subscription<std_msgs::msg::String>("another_topic", 10,
callback_function); // 创建订阅者
}
private:
void callback_function(const std_msgs::msg::String::SharedPtr msg) { /* 处理回调 */ }
};
int main(int argc, char ** argv)
{
rclcpp::init(argc, argv);
auto node = std::make_shared<MyNode>("my_node"); // 使用共享智能指针创建节点实例
rclcpp::spin(node); // 进行事件循环,直到node退出
rclcpp::shutdown(); // 清理资源后关闭
return 0;
}
```
**销毁节点**:
当程序结束或者你想要优雅地关闭节点时,应在`main`函数的适当位置调用`rclcpp::spin()`之后加入节点的清理步骤:
```cpp
// 程序退出前...
node->on_shutdown([node] {
// 在析构函数之前,这里可以执行必要的清理工作,比如取消所有未完成的操作
node->stop();
});
rclcpp::spin_until_future_complete(node->get_node_controller()->executor()); // 阻塞直到所有的任务完成
node->destroy_node_and_wait_for_pending_tasks(); // 删除节点并等待所有关联的异步操作完成
```
注意,每个节点应该有一个析构函数,在那里你可以进行额外的资源释放,如关闭文件流或取消网络连接。
阅读全文