我已经从代码(不是从 Qt 编辑器,所以我不使用 qml 文件)在 python 中构建了一个 Qt GUI。我希望它能够订阅 ROS2 主题并根据收到的消息更新 GUI,并在单击按钮时发布数据。问题是Qt需要app.exec()
,ROS需要node.spin()
运行,两者都是无限循环。网上好像有一些关于ROS+Qt的教程,但是都是针对ROS1的。我找不到 ROS2 + Qt 的任何示例代码。
如何将我的 Qt GUI 与 ROS2 集成?
我使用了一个既是 aQObject
又是 a 的类rclcpp::Node
:
class RosWorker : public QObject, public rclcpp::Node
RosWorker 通过来自 Qt 的公共插槽接收“消息”,并通过rclcpp::Publisher::publish()
. 它使用经典的回调原理接收 ROS 消息,并使用公共信号将它们发送到 Qt。
然后,我在我的类(继承)中创建RosWorker
(" ")的一个实例,并在单独的线程中运行该节点:std::shared_ptr<RosWorker> node_;
MainWindow
QMainWindow
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
但没有设法让它以这种方式工作。