微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 ROS2 上的 Kivy GUI 中 rclpy.spin() 订阅者?

如何解决如何在 ROS2 上的 Kivy GUI 中 rclpy.spin() 订阅者?

我正在构建一个小型 GUI,它将成为我的 ROS2 狡猾系统中的一个节点。我们称之为 gui_node,它基于 Kivy 框架。我想以编程方式从我的 GUI 代码启动另一个节点 - subscriber订阅订阅一个主题并计算它应该显示在我的 GUI 节点的 Kivy 标签中的频率。

唯一的问题是 gui_node 必须启动其循环才能正常工作 (gui_node.run()),而 subscriber 需要 rclpy.spin(subscriber) 才能开始订阅主题。 我的订阅者本身就可以完美运行,Kivy 应用程序也是如此。但是,它们不能一起工作,如下面的代码所示。 Kivy 应用程序显示为黑色,就好像执行的代码没有到达 gui_node.run() 行一样。 如何让这两者在 ROS2 中协同工作?

import rclpy
from rclpy.node import Node
from kivymd.app import MDApp
from kivy.lang import Builder


class Subscriber(Node):

    def __init__(self,topic_name):
        super().__init__('My_Subscriber')
        self.subscription = self.create_subscription(
            Image,topic_name,self.listener_callback,10)
        self.subscription  # prevent unused variable warning

    def listener_callback(self,msg):
        # some code


class MyApp(MDApp):

    def __init__(self,**kwargs):
        super().__init__(**kwargs)

        self.subscriber = Subscriber('topic') 
        rclpy.spin(self.subscriber) # <---
    
        self.screen=Builder.load_file('file.kv')
    
        def build(self):
            return self.screen

        ### the rest of the code here ###


def main(args=None):

    rclpy.init(args=args)

    gui_node = MyApp()
    gui_node.run() # <---

    rclpy.shutdown()


if __name__ == '__main__':
    main()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。