我是靠谱客的博主 迷路朋友,最近开发中收集的这篇文章主要介绍3.2加载RVIZ常用的Display,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在这里插入图片描述
在这里插入图片描述

前面基本的gird图形设计好了,接下来就是去设置gird的图层属性,
在qrviz.hpp中声明一个接口函数:

    void Display_Grid(int Cell_Count,QColor color,bool enable);

初始化这个接口函数

void qrviz::Display_Grid(int Cell_Count,QColor color,bool enable)
{
    if(Grid_!=NULL)
    {
        delete Grid_;
        Grid_=NULL;
    }
    Grid_=manager_->createDisplay("rviz/Grid","myGrid",enable);
    //设置cell Count
    Grid_->subProp("Plane Cell Count")->setValue(Cell_Count);
    //设置颜色
    Grid_->subProp("Color")->setValue(color);
    ROS_ASSERT(Grid_!=NULL);
}

在在qrviz.hpp中声明Gird对象:

    rviz::Display* Grid_=NULL;

注意理解代码:是如何在main_window.cpp中去更改rviz的显示图层:

//链接Grid_Check是否被选中,来更新rviz图层显示,在槽函数中调用我们qrviz.cpp中写的接口函数Display_Grid
//connect(Grid_Check,SIGNAL(stateChanged(int)),this,SLOT(slot_display_grid(int)));
//更新图层函数,通过调用Display_Grid接口函数,传入设置更改后的参数

void MainWindow::slot_display_grid(int state)
{
    bool enable=state>1?true:false;
    //颜色使用";"分割,所以先对文本框内容进行拆分,转化为int 类型,然后传入Display_Gird接口函数
    QStringList qli=Grid_Color_Box->currentText().split(";");
    QColor color=QColor(qli[0].toInt(),qli[1].toInt(),qli[2].toInt());
    myrviz->Display_Grid(Cell_Count_Box->text().toInt(),color,enable);
}

需要理解的地方:
//这里的"rviz/Grid" 是代表类名,必须和rviz的名称对应,第二个参数图层名称,可以随便起
//还有就是manger必须有一个Display对象接受他,所以我们在对象的.hpp中获取一个display对象
//rviz::Display* Grid_=NULL;

    //通过 RVIZ控制对象创建Gird图层
    Grid_=manager_->createDisplay("rviz/Grid","myGrid",enable);
    //设置cell Count,通过subProp方法
    Grid_->subProp("Plane Cell Count")->setValue(Cell_Count);
    //设置颜色
    Grid_->subProp("Color")->setValue(color);

在这里插入图片描述
tf设计步骤:
qrviz.hpp创建一个接口函数:

    void Display_TF(bool enable);

创建一个私有的TF对象

rviz::Display* TF_=NULL;

去定义这个接口函数

void qrviz::Display_TF(bool enable)
{
    if(TF_!=NULL)
    {
        delete TF_;
        TF_=NULL;
    }
    TF_=manager_->createDisplay("rviz/TF","myTF",enable);
    //每创建一个manger都要ASSER断言一下,避免山退的bug
    ROS_ASSERT(TF_!=NULL);
}

在mian_window.cpp中进行ui设计

    //TF ui
    QTreeWidgetItem* TF=new QTreeWidgetItem(QStringList()<<"TF");
    //设置图标
    TF->setIcon(0,QIcon(":/classes/images/classes/TF.png"));
    //checkbox
    QCheckBox* TF_Check=new QCheckBox();
    connect(TF_Check,SIGNAL(stateChanged(int)),this,SLOT(slot_display_tf(int)));
    //向Treewidget添加TF Top节点
    ui.treeWidget->addTopLevelItem(TF);
    //向TF添加checkbox
    ui.treeWidget->setItemWidget(TF,1,TF_Check);

在main_window.hpp中声明槽函数

void slot_display_tf(int);

定义槽函数

//TF
void MainWindow::slot_display_tf(int state)
{
    bool enable=state>1?true:false;
    myrviz->Display_TF(enable);
}

运行,将FixedFream 坐标系改为base_footprint 即可看见坐标系
搞定:

激光显示:
注意需要把Fiexd_Fream改为laser,LaserScan的话题是"/scan",keyi可以看到几乎和rviz里面效果是一样的在这里插入图片描述

地图显示:
基本步骤:都是一样的和激光雷达
在这里插入图片描述
这里有一个bug,当你在qrviz.hpp中声明rviz::Display* RobotModel_=NULL;
的时候,有可能会出现山退的现象,解决方法:
将他的声明放置到qrviz.cpp中,作为.cpp文件的全局变量

最后

以上就是迷路朋友为你收集整理的3.2加载RVIZ常用的Display的全部内容,希望文章能够帮你解决3.2加载RVIZ常用的Display所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部