python - ROS2 + Qt:有什么好的解决方案吗?
问题描述
我已经从代码(不是从 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
但没有设法让它以这种方式工作。
推荐阅读
- javascript - 如何将值从控制器传递到 JavaScript 图表
- matlab - Octave 中的 validateattributes 函数存在问题
- r - 如何刻面图,每个图都包含一个插图?
- javascript - 如何获取从承诺返回的值并在其他文件中使用它?
- matrix - R中的存储问题。替代用于创建矩阵数组和多个绘图的嵌套循环
- python - 通过python运行简单查询:没有结果
- javascript - 在构建 GraphQL 查询和突变时使用这两种方法有什么区别?
- scala - foreach 函数奇怪的行为
- html - 他们是如何制作 a:hover 完整背景颜色的
- excel - 如何使用没有双引号的excel VBA创建文本文件?