如何在 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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...