【问题标题】:ROS2 + Qt: any good solution?ROS2 + Qt:有什么好的解决方案吗?
【发布时间】:2020-07-28 16:02:26
【问题描述】:

我在 python 中使用代码构建了一个 Qt GUI(不是来自 Qt 编辑器,所以我不使用 qml 文件)。 我希望它能够订阅 ROS2 主题并根据收到的消息更新 GUI,并在单击按钮时发布数据。 问题是Qt需要app.exec(),而ROS需要node.spin()才能运行,两者都是无限循环。 网上好像有一些关于ROS+Qt的教程,但是都是针对ROS1的。 我找不到任何 ROS2 + Qt 的示例代码。

如何将我的 Qt GUI 与 ROS2 集成?

【问题讨论】:

    标签: python qt ros2


    【解决方案1】:

    我使用了一个既是 QObject 又是 rclcpp::Node 的类:

    class RosWorker : public QObject, public rclcpp::Node
    

    RosWorker 通过公共插槽从 Qt 接收“消息”,并通过rclcpp::Publisher::publish() 将它们发送到 ROS。它以经典的回调原理接收ROS消息,并通过公共信号将它们发送给Qt。

    然后,我在我的MainWindow 类(继承QMainWindow)中创建RosWorker(“std::shared_ptr<RosWorker> node_;”)的实例并在单独的线程中运行该节点:

    void
    MainWindow::rosSpinThread()
    {
      rclcpp::spin(node_);
      rclcpp::shutdown();
    }
    

    MainWindow::MainWindow
    {
      ros_spin_thread_ = std::thread{std::bind(&MainWindow::rosSpinThread, this)};
    }
    

    此外,您需要将 ROS 消息类型声明为自定义类型,例如:

    Q_DECLARE_METATYPE(geometry_msg::msg::Pose)  // Outside of any namespace.
    

    qRegisterMetaType<geometry_msg::msg::Pose>();  // In MainWindow's constructor.
    

    我的第一个直觉是有一个类从 rclcpp::Node 继承,只有一个 MainWindow 的实例,但没有设法让它以这种方式工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-14
      • 2011-08-15
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多