本系列教程文章专栏:
本系列课程已上线古月学院,欢迎感兴趣的小伙伴订阅:
开发交流QQ群: 797497206
完整项目代码:
github
一,实现效果
可以显示多机/单机话题列表,就是在终端使用rostopic list查看话题列表的功能实现,主要参考文献:ROS WIKI
二,核心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()));
}
}