ROS2-001-初始化与资源释放在程序中起到什么作用?
2024年9月12日...大约 1 分钟
在ROS2节点中,当我们编写C++或Python程序时,都需要引用“初始化”与“资源释放”两个操作,例如:
在C++中:
#include "rclcpp/rclcpp.hpp"
class MyNode: public rclcpp::Node{
public:
MyNode():Node("hello_node_cpp"){
RCLCPP_INFO(this->get_logger(), "helloworld");
}
};
int main(int argc, char const *argv[])
{
//初始化
rclcpp::init(argc, argv);
// 实例化自定义类
auto node = std::make_shared<MyNode>();
// ......
// 资源释放
rclcpp::shutdown();
return 0;
}
在Python中:
import rclpy
from rclpy.node import Node
class MyNode(Node):
def __init__(self):
super().__init__("hello_node_py")
self.get_logger().info("helloworld!")
def main():
# 初始化
rclpy.init()
# 创建对象
node = MyNode()
# ......
# 资源释放
rclpy.shutdown()
if __name__ == '__main__':
main()
但是这两个操作在编译运行后,并没有任何可视化表现,那么这两个操作起到什么作用呢?
答案
- ROS2构建的程序可能有若干步骤或阶段组成:
- 初始化 -> 节点对象 -> 日志输出 -> 数据发布 -> 数据订阅 -> …… -> 资源释放;
- 不同步骤或不同阶段之间会涉及到数据的传递;
- 那么如何实现数据的传递?
- 使用Context(上下文)对象,可以将其作为数据容器,在不同步骤中进行流转,以达到数据传递的效果
- 因此初始化即包括了创建Context对象的步骤,资源释放即也包括了销毁Context对象。
- 有些类似VUE框架在初始化时为了实现响应式所经历的在生命周期中创建各种缓存空间的操作