大多数节点都有发布者和订阅者,它们都是通过调用实例的函数创建的:
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MyNode(Node):
def __init__(self):
super().__init__('my_node_name')
self.publisher = self.create_publisher(String, 'output_topic', 10)
self.subscription = self.create_subscription(
String,
'input_topic',
self.callback,
10)
def callback(self, msg):
self.get_logger().info("Recieved: %s" % msg.data)
self.publisher.publish(msg)
if __name___ == "__main__":
rclpy.init()
my_node = MyNode()
rclpy.spin(my_node)
my_node.destroy_node() # cleans up pub-subs, etc
rclpy.shutdown()
ROS1 有rospy.on_shutdown() - 但是 不等于ROS2也有,不过,这真的不需要,因为我们手动关闭了一些东西,而不是像 rospy 那样使用了许多全局变量:
try:
rclpy.spin(my_node)
except KeyboardInterrupt:
pass
finally:
my_node.on_shutdown() # do any custom cleanup
my_node.destroy_node()
rclpy.shutdown()