【基于 QT5 的 ROS2 GUI 开发教程(三)】基于 librviz 多线程可视化点云(进阶)
0. 前言
1. 项目代码的使用
2. 代码知识点解析
- 借助 QT 的多线程显示这个 rviz 界面,因为最终软件的界面是很复杂的,使用多线程可以避免不必要的阻塞,所以 QThread 基本的使用你需要了解,否则代码看上去一头雾水。
LidarView
类继承自 QThread
,主要流程如下图所示:
app_->processEvents();
在 rviz_common::RenderPanel
变量初始化之前和之后是必不可少的,它可替换为 QApplication::processEvents();
,这样可以省去从一层层传入 main.cpp
中的 QApplication
类型的变量。
- 为了确保
rviz_common::ros_integration::RosNodeAbstractionIface::WeakPtr _rvizRosNode;
该变量不被销毁,必须让一个 std::shared_ptr<rviz_common::ros_integration::RosNodeAbstraction>
类型的变量指向它,后者在,前者就在,后者无,前者也就没了,所以保证后者的生命周期更长,在代码中这样写(详细知识点可以去了解一下 C++ 的智能指针 std::weak_ptr
):
std::shared_ptr<rviz_common::ros_integration::RosNodeAbstraction> _rvizRosNodeTmp;
rviz_common::ros_integration::RosNodeAbstractionIface::WeakPtr _rvizRosNode;
_rvizRosNodeTmp = std::make_shared<rviz_common::ros_integration::RosNodeAbstraction>("rviz_render_node");
_rvizRosNode = _rvizRosNodeTmp;
- Qt 的事件循环与 ROS2 循环存在区别:
-
rviz_common::RenderPanel
的父类是 QWidget
,所以我在 mainwindow.cpp
中添加 ui 时是像下面这样,线程类 lidarView
的成员变量 _render_panel
是个智能指针,通过 get()
函数可以获取 rviz_common::RenderPanel
类型的变量,绕了一圈最终绕回到 QWidget
了,这部分理解了,才能在官方的 Demo 上进行改动:
MainWindow::MainWindow(QApplication * app, QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, _app(app)
{
ui->setupUi(this);
lidarView = new LidarView();
ui->scrollArea->setWidget(lidarView->_render_panel.get());
}
原创文章作者:宇宙爆肝锦标赛冠军。如若转载,请注明出处:古月居
http://admin.guyuehome.com/43886
评论(0)
您还未登录,请登录后发表或查看评论