ROS下基于Qt的人机交互开发(五)Qt导入Rviz组件

1.添加依赖

在CMakeLists.txt中添加rviz依赖

find_package(catkin REQUIRED COMPONENTS rviz roscpp
sensor_msgs cv_bridge std_msgs image_transport

在这里插入图片描述

2.创建一个rviz类

(1)本文创建的类名为:qrviz
(2)头文件后缀名改为“.hpp”,“.hpp”相当于“.h”与“.cpp”的结合。这是由于使用“.h”可能会出现一些闪退的bug。
在这里插入图片描述

(3)由于不是原生Qt项目,它不能被正确添加,需要手动更改路径。

 1. 打开项目的目录
 2. ".hpp"文件移动到include文件下
 3. ".cpp"文件移动到src目录下

在这里插入图片描述

(4)在自动生成的"qrviz.cpp"中修改头文件 #include “qrviz.hpp”,使它被正确包含

#include "../qrviz.hpp文件路径/qrviz.hpp"

例如我的:

#include "../include/qt_rviz/qrviz.hpp"

在这里插入图片描述

注:如果还是没有被包括,可以测试重启一下Qt
可以使用F4看能否跳转来校验是否被正确包含

3.新建qrviz中包含头文件

在调用Rviz的相关函数的时候,需要先引用相关头文件

#include <rviz/visualization_manager.h>
#include <rviz/render_panel.h>
#include <rviz/display.h>
#include <rviz/tool_manager.h>
#include<rviz/tool.h>
#include <rviz/default_plugin/view_controllers/orbit_view_controller.h>
#include <rviz/view_manager.h>

注:由于Qt不会自动包含“.h”头文件,需要在CMakeLists.txt中添加“*.h”

file(GLOB_RECURSE QT_MOC RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} FOLLOW_SYMLINKS include/qt_rviz/*.hpp *.h)

在这里插入图片描述

4.Rviz初始化

(1)创建rviz显示容器

创建rviz显示容器,其本质是继承QWidget类,因此可将其看成一个窗口控件,设置其显示布局
qrviz类中定义显示容器对象:

private:
    rviz::RenderPanel *render_panel_;

构造函数中创建:

render_panel_=new rviz::RenderPanel();

由于ui与Qrviz处于两个不同的类,需要建立通信。本文通过在Qrviz构造函数中添加一个QVBoxLayout对象与ui界面中的QVBoxLayout控件建立联系。

#ifndef QRVIZ_HPP
#define QRVIZ_HPP

#include <QObject>
#include <rviz/visualization_manager.h>
#include <rviz/render_panel.h>
#include <rviz/display.h>
#include <rviz/tool_manager.h>
#include<rviz/tool.h>
#include <rviz/default_plugin/view_controllers/orbit_view_controller.h>
#include <rviz/view_manager.h>
#include<QVBoxLayout>

class Qrviz
{
public:
    Qrviz(QVBoxLayout *layout);

private:
    rviz::RenderPanel *render_panel_;
    rviz::VisualizationManager* manager_;
};
#endif // QRVIZ_HPP

在QVBoxLayout类对象上显示:

#include "../include/rviz_qt/Qrviz.hpp"
Qrviz::Qrviz(QVBoxLayout *layout)
{
    render_panel_=new rviz::RenderPanel();
    layout->addWidget(render_panel_);
    manager_=new rviz::VisualizationManager(render_panel_);
    manager_->initialize();//初始化
    manager_->startUpdate();//更新所有图层
    manager_->removeAllDisplays();//删除所有图层
    render_panel_->initialize(manager_->getSceneManager(),manager_);
}

在main_window.hpp中定义Qrviz指针对象

Qrviz *my_rviz;

在main_window.cpp中初始化Qrviz指针对象

 my_rviz=new Qrviz(ui.verticalLayout_4);

(2)获取rviz的控制对象

获取rviz的控制对象,该操作可以通过后续对控制对象操作进而对rviz显示容器进行操作显示
qrviz类中定义控制对象:

private:
	rviz::VisualizationManager* manager_;

构造函数中创建:

manager_=new rviz::VisualizationManager(render_panel_);

初始化:

manager_->initialize();//初始化
manager_->startUpdate();//更新所有图层
manager_->removeAllDisplays();//删除所有图层

(3)初始化camera

初始化camera,实现鼠标控制视图的放大、缩小等操作

render_panel_->initialize(manager_->getSceneManager(),manager_);

以上几步就完成了对Rviz的初始化设置,想要显示点云等具体的内容还要设置一些属性。
在这里插入图片描述

5.加载rviz常用display

(1)创建图层函数

Display* createDisplay( const QString& class_lookup_name, const QString& name, bool enabled );

其中class_lookup_name为图层类名,有

 - "rviz/Grid" 	
 - "rviz/RobotModel" 	
 - "rviz/Map" 	
 - “rviz/PointCloud2”
 - "rviz/LaserScan”
 - "rviz/TF" 	
 - ......

(2)设置图层属性参数

subProp( QString propertyName )->setValue(Qvariant value);

(3)案例1——设置网格:

rviz::Display* grid_ =manager_->createDisplay("rviz/Grid","adjustable grid",true);
grid_->subProp("Line Style")->setValue("Billboards");
grid_->subProp("Color")->setValue(QColor(125,125,125));

在这里插入图片描述
案例源文件链接:
ros环境下qt导入rviz组件

  • 4
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dtge

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值