在QT中开发librviz显示雷达点云数据

一、基础配置

  1. 在rosworksapce中建立gui模版项目,在src目录下
    catkin_create_qt_pkg test 创建一个包名为test的ros_gui模板
  2. 添加rviz包依赖
    在CMakeLists.txt中添加
    find_package(catkin REQUIRED COMPONENTS rviz roscpp)
    在package.xml中添加
<build_depend>roscpp</build_depend>
  <run_depend>roscpp</run_depend>
  <build_depend>rospy</build_depend>
  <run_depend>rospy</run_depend>
  <build_depend>rviz</build_depend>
  <run_depend>rviz</run_depend>

二、UI

ui
在main_window.ui中在centralwidget下添加verticalLayout,verticalLayout就是我要在上边添加rviz的布局,而这个close的button是为了关闭当前页面,并且结束终端的一些操作。

三、创建rviz相关的class

3.1引入:

#include <rviz/visualization_manager.h>

#include <rviz/render_panel.h>

#include <rviz/display.h>

#include <rviz/default_plugin/view_controllers/orbit_view_controller.h>

#include <rviz/view_manager.h>

3.2 在main_window.hpp中定义一个class,就是显示rviz的组件

class RvizPlugin: public QObject{

    Q_OBJECT

public:

    RvizPlugin(QVBoxLayout* ui){

//创建rviz的容器,并将该容器作为组建加入到ui内,其中关键class为VisualizationManager,是个管理类,起到控制创建rviz图层和设置坐标系的作用。

      render_panel_=new rviz::RenderPanel;

       ui->addWidget(render_panel_);

       manager_=new rviz::VisualizationManager(render_panel_);

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

       manager_->initialize();

       manager_->startUpdate();

      manager_->setFixedFrame("/world”);

//创建一个类型为rviz/PointCloud2的图层,用于接收topic为points_map的点云数据,就是我最终底图的图层

      rviz::Display *map_=manager_->createDisplay("rviz/PointCloud2","pointCloud2",true);

      ROS_ASSERT(map_!=NULL);

      map_->subProp("Topic")->setValue("/points_map");

      map_->subProp("Invert Rainbow")->setValue("true");

      map_->subProp("Style")->setValue("Points");

      map_->subProp("Size (Pixels)")->setValue("2");

      //map_->subProp("Decay Time")->setValue("0");

      map_->subProp("Color Transformer")->setValue("FlatColor");

      map_->subProp("Queue Size")->setValue("10");

      map_->subProp("Alpha")->setValue("0.05");

//创建一个类型为rviz/PointCloud2的图层,用于接收topic为points_raw的点云数据,就是雷达实时扫描数据的展示

      rviz::Display *robot_=manager_->createDisplay("rviz/PointCloud2","pointCloud2",true);

       ROS_ASSERT(robot_!=NULL);

       robot_->subProp("Topic")->setValue("/points_raw");

       //robot_->subProp("Use Rainbow")->setValue(true);

       robot_->subProp("Size (Pixels)")->setValue("2");

       robot_->subProp("Style")->setValue("Points");

       //robot_->subProp("Autocompute Intensity Bounds")->setValue(true);

       //robot_->subProp("Color Transformer")->setValue("Intensity");

       robot_->subProp("Queue Size")->setValue("10");

       robot_->subProp("Alpha")->setValue("0.3");

       //robot_->subProp("Channel Name")->setValue("Intensity");

  //     robot_->subProp("Color Transformer")->setValue("Intensity");

  //     robot_->subProp("Color Transformer")->setValue("Intensity");

//这个是创建小车模型的图层,由urdf文件控制

       rviz::Display *car=manager_->createDisplay("rviz/RobotModel","adjustable robot",true);

            ROS_ASSERT(car!=NULL);

           car->subProp("Robot Description")->setValue("robot_description");

      manager_->startUpdate();

//设置整个地图的展示方式,如视角、距离、偏航等

      viewManager = manager_->getViewManager();

      viewManager->setRenderPanel(render_panel_);

      viewManager->setCurrentViewControllerType("rviz/ThirdPersonFollower");

      viewManager->getCurrent()->subProp("Target Frame")->setValue("/base_link");

      viewManager->getCurrent()->subProp("Near Clip Distance")->setValue("0.01");

      viewManager->getCurrent()->subProp("Focal Point")->setValue("1.90735e-06;-7.62939e-06;0");

      viewManager->getCurrent()->subProp("Focal Shape Size")->setValue("0.05");

      viewManager->getCurrent()->subProp("Focal Shape Fixed Size")->setValue("true");

      //juli

      viewManager->getCurrent()->subProp("Distance")->setValue("204.168");

      //chetou jiaodu

      viewManager->getCurrent()->subProp("Yaw")->setValue("1.7004");

      //fujiao

      viewManager->getCurrent()->subProp("Pitch")->setValue("0.770398");

    }

public slots:

private:

    rviz::RenderPanel* render_panel_;// = new rviz::RenderPanel;

    rviz::VisualizationManager *manager_;// =  new rviz::VisualizationManager(pointCloud_panel);

    rviz::ViewManager* viewManager;

};

3.3 在.cpp文件中直接使用即可

RvizPlugin rvi(this->ui.verticalLayout);

3.4 close按钮的关闭操作

void rtourMap::MainWindow::on_close_clicked()
{
    system("killall -9 rosbag");
    this->close();
}

四、效果展示

pointCloud

  • 3
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
使用Qt库、RViz和ROS进行点云显示界面设计是一种常见的做法。Qt是一个功能强大的跨平台界面开发框架,RViz是一个ROS包,用于可视化和分析ROS数据。 首先,我们需要在ROS环境安装RViz包,并确保系统安装了Qt库。然后,我们可以使用Qt的创作工具Qt Creator创建一个新的Qt项目。 在Qt Creator,我们可以使用Qt的图形用户界面设计工具来设计点云显示界面的布局。可以选择合适的窗口大小、放置各种控件,如按钮、滑块和标签等,以及指定它们的位置。还可以设置界面的样式和主题,使其符合我们的需求。 然后,我们需要在Qt项目引入RViz库,以便能够使用其点云显示功能。在Qt Creator的项目文件,添加RViz库的依赖项,并将其包含到源代码。通过RViz提供的接口,可以在界面加载并显示点云数据。 接下来,要使界面与ROS通信,我们需要编写一些代码来连接ROS和Qt。可以使用ROS的C++或Python API在Qt订阅和发布ROS消息,从而实现与ROS节点的数据交互。通过订阅ROS节点发布的点云消息,可以将点云数据传递给RViz,并在界面上显示出来。 最后,我们可以将Qt项目构建为可执行文件,并在ROS系统运行。在启动ROS节点后,打开设计好的界面,即可显示ROS系统点云数据。 总的来说,使用Qt库、RViz和ROS进行点云显示界面设计是一种灵活且功能强大的方法。通过合理布局界面、使用RViz点云显示功能并与ROS进行数据交互,我们可以设计出易于使用且具有良好用户体验的点云显示界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值