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组件
本文含有隐藏内容,请 开通VIP 后查看