ROS2+Qt:有好的解决方案吗?

2024-06-26 05:53:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如何将Qt GUI与ROS2集成


Tags: 文件数据代码nodeapp消息主题gui
1条回答
网友
1楼 · 发布于 2024-06-26 05:53:28

我使用了一个既是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实例,但它没有以这种方式工作

相关问题 更多 >