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