Я использовал класс, который одновременно является QObject
и rclcpp::Node
:
class RosWorker : public QObject, public rclcpp::Node
RosWorker получает сообщения через публичные слоты от Qt и отправляет их в ROS через 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
, но мне не удалось заставить его работать таким образом.
person
Gaël Ecorchard
schedule
24.07.2020