代码来源于古月居发布者import rclpy # ROS2 Python接口库 from rclpy.node import Node # ROS2 节点类 from std_msgs.msg import String # 字符串消息类型 创建一个发布者节点 class PublisherNode(Node): def __init__(self, name): super().__init__(name) # ROS2节点父类初始化 self.pub self.create_publisher(String, chatter, 10) # 创建发布者对象消息类型、话题名、队列长度 self.timer self.create_timer(0.5, self.timer_callback) # 创建一个定时器单位为秒的周期定时执行的回调函数 def timer_callback(self): # 创建定时器周期执行的回调函数 msg String() # 创建一个String类型的消息对象 msg.data Hello World # 填充消息对象中的消息数据 self.pub.publish(msg) # 发布话题消息 self.get_logger().info(Publishing: %s % msg.data) # 输出日志信息提示已经完成话题发布 def main(argsNone): # ROS2节点主入口main函数 rclpy.init(argsargs) # ROS2 Python接口初始化 node PublisherNode(topic_helloworld_pub) # 创建ROS2节点对象并进行初始化 rclpy.spin(node) # 循环等待ROS2退出 node.destroy_node() # 销毁节点对象 rclpy.shutdown()1.发布者程序流程1.编程接口初始化rclpy.init(argsargs)调用ros2的python接口库init方法对接口进行初始化2.创建节点并初始化3.创建发布对象node ImagePublisher(topic_webcam_pub)自定义一个ImagePublisher类该类继承ros2的node类class ImagePublisher(Node):在该类的构造方法中定义发布内容首先调用父类构造方法super().__init__(name) 再调用create_publisher方法创建发布对象定义发布的类型话题名对列长度self.pub self.create_publisher(String, chatter, 10) # 创建发布者对象消息类型、话题名、队列长度def create_publisher(self,msg_type,topic: str,qos_profile,*,callback_groupNone,event_callbacksNone )主要参数msg_type消息类型类如示例中Stringtopic: str话题名qos_profile对列深度3.创建并填充话题消息self.timer self.create_timer(0.5, self.timer_callback) # 创建一个定时器单位为秒的周期定时执行的回调函数def create_timer(self,period: float,callback,callback_groupNone,clockNone ) - rclpy.timer.Timer重要参数period: float 定时周期 为500ms一次callback 回调函数 为每次执行的函数4.发布话题消息即create_timer中的回调函数self.timer self.create_timer(0.5,self.timer_callback) # 创建一个定时器单位为秒的周期定时执行的回调函数def timer_callback(self): # 创建定时器周期执行的回调函数msg String() # 创建一个String类型的消息对象msg.data Hello World # 填充消息对象中的消息数据self.pub.publish(msg) # 发布话题消息self.get_logger().info(Publishing: %s % msg.data) # 输出日志信息提示已经完成话题发布publish()是Publisher 对象的成员方法不是 Node 的方法。通过create_publisher()创建发布者 pub 后调用pub.publish(消息实例)完成话题数据发送5.销毁节点并关闭接口node.destroy_node() # 销毁节点对象rclpy.shutdown()订阅者import rclpy # ROS2 Python接口库 from rclpy.node import Node # ROS2 节点类 from std_msgs.msg import String # ROS2标准定义的String消息 创建一个订阅者节点 class SubscriberNode(Node): def __init__(self, name): super().__init__(name) # ROS2节点父类初始化 self.sub self.create_subscription(\ String, chatter, self.listener_callback, 10) # 创建订阅者对象消息类型、话题名、订阅者回调函数、队列长度 def listener_callback(self, msg): # 创建回调函数执行收到话题消息后对数据的处理 self.get_logger().info(I heard: %s % msg.data) # 输出日志信息提示订阅收到的话题消息 def main(argsNone): # ROS2节点主入口main函数 rclpy.init(argsargs) # ROS2 Python接口初始化 node SubscriberNode(topic_helloworld_sub) # 创建ROS2节点对象并进行初始化 rclpy.spin(node) # 循环等待ROS2退出 node.destroy_node() # 销毁节点对象 rclpy.shutdown() # 关闭ROS2 Python接口2.订阅者程序流程1.编程接口初始化2.创建节点并初始化和发布者类似不做其他说明3.创建订阅对象self.sub self.create_subscription(String, chatter, self.listener_callback, 10)接受Sting类型话题名为chatter的话题接受后调用listener_callback方法def create_subscription(self, msg_type,topic: str,qos_profile,callback, *,callback_groupNone,event_callbacksNone ) - rclpy.subscription.Subscriptioncreate_subscription()是rclpy.node.Node的成员方法用于创建话题订阅者Subscriber。功能监听指定话题一旦有 Publisher 发布消息自动触发你定义的回调函数处理数据重要参数 msg_type消息类型 topic: str 话题名 qos_profile 队列深度callback 回调函数4.销毁节点并关闭接口node.destroy_node() # 销毁节点对象rclpy.shutdown() # 关闭ROS2 Python接口
网站建设
高端定制
企业官网