2024-06-26 05:53:28 发布
网友
我已经用python从代码(不是从Qt编辑器,所以我不使用qml文件)构建了一个Qt GUI。 我希望它能够订阅ROS2主题,根据收到的消息更新GUI,并在单击按钮时发布数据。 问题是Qt需要运行app.exec(),而ROS需要运行node.spin(),两者都是无限循环。 在线上似乎有一些关于ROS+Qt的教程,但都是关于ROS1的。 我找不到任何ROS2+Qt的示例代码
app.exec()
node.spin()
如何将Qt GUI与ROS2集成
我使用了一个既是QObject又是rclcpp::Node的类:
QObject
rclcpp::Node
class RosWorker : public QObject, public rclcpp::Node
RosWorker通过Qt的公共插槽接收“消息”,并通过rclcpp::Publisher::publish()将它们发送给ROS。它使用经典的回调原理接收ROS消息,并使用公共信号将它们发送到Qt
rclcpp::Publisher::publish()
然后,在我的MainWindow类(继承QMainWindow)中创建RosWorker(“std::shared_ptr<RosWorker> node_;”)的实例,并在单独的线程中运行节点:
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实例,但它没有以这种方式工作
我使用了一个既是
QObject
又是rclcpp::Node
的类:RosWorker通过Qt的公共插槽接收“消息”,并通过
rclcpp::Publisher::publish()
将它们发送给ROS。它使用经典的回调原理接收ROS消息,并使用公共信号将它们发送到Qt然后,在我的
MainWindow
类(继承QMainWindow
)中创建RosWorker
(“std::shared_ptr<RosWorker> node_;
”)的实例,并在单独的线程中运行节点:与
此外,您需要将ROS消息类型声明为自定义类型,例如:
及
我的第一个直觉是,让一个类只从
rclcpp::Node
继承一个MainWindow
实例,但它没有以这种方式工作相关问题 更多 >
编程相关推荐