ROS Qt5 librviz人机交互界面开发十三(显示话题列表)

本系列教程文章专栏:

ROS机器人GUI程序开发

本系列课程已上线古月学院,欢迎感兴趣的小伙伴订阅:

  1. ROS Qt开发环境搭建以及基础知识介绍
  2. ROS人机交互软件的界面开发
  3. ROS Rviz组件开发方法

在这里插入图片描述
开发交流QQ群: 797497206
完整项目代码:
github

文章目录

    • 一,实现效果
    • 二,核心API
    • 三,程序中调用

一,实现效果

可以显示多机/单机话题列表,就是在终端使用rostopic list查看话题列表的功能实现,主要参考文献:ROS WIKI
ROS Qt5 librviz人机交互界面开发十三(显示话题列表)_第1张图片

二,核心API

主要就是这么两句:

ros::master::V_TopicInfo topic_list;
ros::master::getTopics(topic_list);

首先创建一个 ros::master::V_TopicInfo去存放topic信息列表,之后通过getTopics方法获取topic并存入V_TopicInfo中。
处理topic:
topicInfo中存放了话题名以及对应的话题类型,可以通过循环遍历去处理(我这里处理后放入QMap中):

 QMap<QString,QString> res;
    for(auto topic:topic_list)
    {
     

    res.insert(QString::fromStdString(topic.name),QString::fromStdString(topic.datatype));

    }

三,程序中调用

这里在qnode类中创建一个函数gettopic,函数返回值类型为QMap:

QMap<QString,QString> QNode::get_topic_list()
{
     
    ros::master::V_TopicInfo topic_list;
    ros::master::getTopics(topic_list);
    QMap<QString,QString> res;
    for(auto topic:topic_list)
    {
     

        res.insert(QString::fromStdString(topic.name),QString::fromStdString(topic.datatype));

    }
    return res;
}

在mainwindow中去调用这个函数(注意函数的调用需要放在master连接成功之后),并遍历map中的每个结果,显示在listWidget上:

void MainWindow::initTopicList()
{
     
    ui.topic_listWidget->clear();
    ui.topic_listWidget->addItem(QString("%1   (%2)").arg("Name","Type"));
    QMap<QString,QString> topic_list= qnode.get_topic_list();
    for(QMap<QString,QString>::iterator iter=topic_list.begin();iter!=topic_list.end();iter++)
    {
     
       ui.topic_listWidget->addItem(QString("%1   (%2)").arg(iter.key(),iter.value()));
    }
}

你可能感兴趣的:(ROS机器人GUI程序开发,ROS机器人,QT)