ROS2节点关闭回调
时间: 2025-03-09 11:05:00 浏览: 54
### 实现节点关闭时的回调函数
在 ROS 2 中,为了实现在节点关闭时触发特定行为的功能,可以利用生命周期管理机制中的 `on_deactivate` 和自定义信号处理程序来捕获节点即将结束的情况。当接收到终止请求时,ROS 2 节点可以从活跃状态转换至不活跃状态,在此过程中调用预设的方法完成必要的清理工作[^5]。
对于更精细控制的需求,还可以注册 SIGINT (Ctrl+C) 或其他类型的 Unix 信号处理器以便优雅地退出应用程序并执行额外的任务。然而,最推荐的方式还是遵循官方文档建议的最佳实践——即通过重写 `on_deactivation()` 方法或者使用 `atexit` 函数注册全局性的清除动作。
下面是一个简单的例子展示如何创建一个会在关闭前打印日志信息以及保存某些重要数据到文件里的 Python 版本 ROS 2 节点:
```python
import rclpy
from rclpy.node import Node
import atexit
class CleanupNode(Node):
def __init__(self):
super().__init__('cleanup_node')
self.get_logger().info('Starting cleanup node...')
# 注册退出时要执行的动作
atexit.register(self.on_shutdown)
def on_shutdown(self):
self.get_logger().warn('Cleanup node is shutting down!')
try:
with open('/tmp/cleanup_log.txt', 'w') as f:
f.write("This file was created during shutdown.")
self.get_logger().info('Data saved successfully.')
except Exception as e:
self.get_logger().error(f'Failed to save data: {e}')
def main(args=None):
rclpy.init(args=args)
node = CleanupNode()
try:
rclpy.spin(node)
finally:
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
```
此外,如果项目允许的话,也可以考虑采用 C++ 编程语言编写类似的逻辑;只需替换相应的语法结构即可达到相同的效果。
阅读全文
相关推荐


















