[具身智能-670]:ROS2 Node内部的工作原理:rclpy.init()、node = MyNode() 、rclpy.spin(node)
一、三个函数的一句话功能rclpy.init()初始化ROS2 全局系统上下文、信号处理、DDS。node MyNode()创建节点对象注册名字分配通信句柄不创建线程。rclpy.spin(node)进入主线程死循环不断检查消息 / 定时器执行回调。二、逐句讲解 内部伪代码实现1rclpy.init()功能初始化 ROS2 客户端库创建全局上下文Context初始化日志初始化 RMWDDS注册CtrlC信号处理伪代码内部实现python运行def init(argsNone): # 1. 创建全局上下文 global_context Context() # 2. 初始化底层 rcl 库 _rclpy.rcl_init() # 3. 初始化日志系统 logging.initialize() # 4. 安装 CtrlC 信号处理器 _register_sigint_handler() # 5. 标记 ROS2 已启动 global_context.ok True2node MyNode()功能创建节点注册节点名创建底层 node handle初始化参数、日志、回调容器不创建线程不启动循环伪代码Node 基类内部python运行class Node: def __init__(self, node_name): # 1. 保存节点名字 self.node_name node_name # 2. 获取全局上下文 self.context get_global_context() # 3. 创建底层通信节点和DDS连接 self._node_handle _rclpy.create_node_handle(node_name) # 4. 初始化日志 self.logger Logger(node_name) # 5. 创建回调组、容器只是列表不执行 self.callback_groups [DefaultCallbackGroup()] self.timers [] self.publishers [] self.subscriptions [] self.services [] # 6. 初始化参数服务 self.parameters ParameterService(self._node_handle) # -------------------------- # 这里 没有 线程 # 这里 没有 循环 # --------------------------3rclpy.spin(node)功能进入主线程无限循环等待消息 / 定时器到达从节点取出就绪回调在当前主线程执行回调直到CtrlC退出伪代码内部实现python运行def spin(node): # 循环只要ROS2正常运行 while rclpy.ok(): # 节点还活着 # 1. 等待事件消息到达、定时器超时 wait_for_events(node) # 2. 取出所有就绪的回调 callbacks get_ready_callbacks(node) # 所有回调函数 # 3. 在当前主线程 依次执行回调 for cb in callbacks: cb() # 收到 CtrlC 后退出循环三、最精简总结一定要背rclpy.init()启动 ROS2 系统创建全局环境。node MyNode()创建节点分配通信资源无线程、无循环。rclpy.spin(node)主线程死循环等待消息 → 执行回调 → 等待消息 → 执行回调…四、最直观的运行流程你终于能看懂了plaintextrclpy.init() → 开机 node MyNode() → 造好节点放那里 rclpy.spin(node) → 主线程无限跑循环 ↓ 等待消息 ↓ 有消息 → 执行回调 ↓ 继续等待 ↓ CtrlC → 退出循环 → 关机五、最终金句Node 不创建线程spin () 才是真正跑循环的地方所有回调都在主线程执行
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2608131.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!