首页 > 解决方案 > ROS2 + Qt:有什么好的解决方案吗?

问题描述

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

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

标签: pythonqtros2

解决方案


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

class RosWorker : public QObject, public rclcpp::Node

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

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

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但没有设法让它以这种方式工作。


推荐阅读