ROS知识(20)----使用Master_API查询Master管理的节点话题服务内容
在一些应用中会需要获取master的uri地址,发布的话题,订阅的话题,发布的服务,节点的信息等等。这些功能我们通常可一通过rosnode list, rosnode info, rostopic list, rostopic info, rosservice list和 rosservice info 等命令查询,而这些功能是怎么做到的呢? 这就需要用到Master_API进行查询,ROS官方使用了python来实现(在ros_comm包中),这里我们使用c++来实现这些查询的功能。
1.实现
参考[1]API,功能描述细节不累赘了,下面为实现的代码:
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <ros/master.h>
#include <iostream> /*
* Get the URI of the master.
*/
bool getUri(std::string&uri) {
XmlRpc::XmlRpcValue args, result, payload;
args[] = ros::this_node::getName(); if (!ros::master::execute("getUri", args, result, payload, true)) {
std::cout << "Failed!" << std::endl;
return false;
}
std::cout << "----------Master URI----------" << std::endl;
uri = std::string(payload);
std::cout << std::string(payload) << std::endl;
} /*
* Get list of topics that can be subscribed to.
* This does not return topics that have no publishers.
* See getSystemState() to get more comprehensive list.
* */
bool getPublishedTopics(const std::string& subgraph,
ros::master::V_TopicInfo& topics) {
XmlRpc::XmlRpcValue args, result, payload;
args[] = ros::this_node::getName();
args[] = subgraph;
if (!ros::master::execute("getPublishedTopics", args, result, payload,
true)) {
std::cout << "Failed!" << std::endl;
return false;
}
topics.clear();
std::cout << "----------PublishedTopics----------" << std::endl;
std::cout << "published_topic_name \t message_name" << std::endl;
for (int i = ; i < payload.size(); ++i) {
topics.push_back(
ros::master::TopicInfo(std::string(payload[i][]),
std::string(payload[i][])));
std::string v1 = std::string(payload[i][]);
std::string v2 = std::string(payload[i][]);
std::cout << v1.c_str() << "\t" << v2.c_str() << std::endl;
} return true;
} /*
* Retrieve list topic names and their types.
* */
bool getTopicTypes(ros::master::V_TopicInfo& topics) {
XmlRpc::XmlRpcValue args, result, payload;
args[] = ros::this_node::getName(); if (!ros::master::execute("getTopicTypes", args, result, payload, true)) {
std::cout << "Failed!" << std::endl;
return false;
}
topics.clear();
std::cout << "----------TopicTypes----------" << std::endl;
std::cout << "topic_name\t message_name" << std::endl;
for (int i = ; i < payload.size(); ++i) {
topics.push_back(
ros::master::TopicInfo(std::string(payload[i][]),
std::string(payload[i][])));
std::string v1 = std::string(payload[i][]);
std::string v2 = std::string(payload[i][]);
std::cout << v1.c_str() << "\t" << v2.c_str() << std::endl;
} return true;
} /*
* Get the XML-RPC URI of the node with the associated name/caller_id.
* This API is for looking information about publishers and subscribers.
* Use lookupService instead to lookup ROS-RPC URIs.
*/
bool lookupNode(const std::string& node, std::string&uri) {
XmlRpc::XmlRpcValue args, result, payload;
args[] = ros::this_node::getName();
args[] = node;
if (!ros::master::execute("lookupNode", args, result, payload, true)) {
std::cout << "Failed!" << std::endl;
return false;
}
std::cout << "----------LookupedNode----------" << std::endl;
uri = std::string(payload);
std::cout << node << ":" << std::string(payload) << std::endl;
} /*
* Lookup all provider of a particular service.
*/
bool lookupService(const std::string& service, std::string&uri) {
XmlRpc::XmlRpcValue args, result, payload;
args[] = ros::this_node::getName();
args[] = service;
if (!ros::master::execute("lookupService", args, result, payload, true)) {
std::cout << "Failed!" << std::endl;
return false;
}
std::cout << "----------LookupedService----------" << std::endl;
uri = std::string(payload);
std::cout << service << ":" << std::string(payload) << std::endl;
} /*
* Retrieve list representation of system state
* (i.e. publishers, subscribers, and services).
* */
bool getSystemState() {
XmlRpc::XmlRpcValue args, result, payload;
args[] = ros::this_node::getName();
if (!ros::master::execute("getSystemState", args, result, payload, true)) {
std::cout << "Failed!" << std::endl;
return false;
}
std::cout << "----------SystemState----------" << std::endl; //publishers
int t = ;
std::cout << "Published Topics:" << std::endl;
for (int j = ; j < payload[t].size(); ++j) {
//topics
std::cout << " *" << std::string(payload[t][j][]) << ":"
<< std::endl;
for (int k = ; k < payload[t][j][].size(); ++k) {
//publisher
std::cout << " *" << std::string(payload[t][j][][k])
<< std::endl;
}
}
t = ;
std::cout << "Subscribed Topics:" << std::endl;
for (int j = ; j < payload[t].size(); ++j) {
//topics
std::cout << " *" << std::string(payload[t][j][]) << ":"
<< std::endl;
for (int k = ; k < payload[t][j][].size(); ++k) {
//publisher
std::cout << " *" << std::string(payload[t][j][][k])
<< std::endl;
}
} t = ;
std::cout << "Services:" << std::endl;
for (int j = ; j < payload[t].size(); ++j) {
//topics
std::cout << " *" << std::string(payload[t][j][]) << ":"
<< std::endl;
for (int k = ; k < payload[t][j][].size(); ++k) {
//publisher
std::cout << " *" << std::string(payload[t][j][][k])
<< std::endl;
}
}
return true;
} int main(int argc, char **argv) {
ros::init(argc, argv, "listener");
ros::NodeHandle n; //get master uri
std::string host_uri;
getUri(host_uri); //get published topics
std::string subgraph;
ros::master::V_TopicInfo published_topics;
getPublishedTopics(subgraph, published_topics); //get topic types
ros::master::V_TopicInfo topics;
getTopicTypes(topics); //get node uri
std::string node, node_uri;
node = "/talker";
lookupNode(node, node_uri); //get service uri
std::string service, service_uri;
service = "/talker";
lookupService(service, service_uri); //get all published topics,subscribed topics and services
getSystemState(); ros::spin();
return ;
}
查询的结果如下:
----------Master URI----------
http://192.168.1.21:11311/
----------PublishedTopics----------
published_topic_name message_name
/rosout rosgraph_msgs/Log
/rosout_agg rosgraph_msgs/Log
/talker/message std_msgs/String
----------TopicTypes----------
topic_name message_name
/rosout rosgraph_msgs/Log
/rosout_agg rosgraph_msgs/Log
/talker/message std_msgs/String
----------LookupedNode----------
/talker:http://192.168.1.21:44625/
Failed!
----------SystemState----------
Published Topics:
*/rosout:
*/talker
*/listener
*/rosout_agg:
*/rosout
*/talker/message:
*/talker
Subscribed Topics:
*/rosout:
*/rosout
Services:
*/talker/set_logger_level:
*/talker
*/listener/set_logger_level:
*/listener
*/rosout/get_loggers:
*/rosout
*/talker/get_loggers:
*/talker
*/rosout/set_logger_level:
*/rosout
*/listener/get_loggers:
*/listener
2.参考资料
[1]. Master_API
ROS知识(20)----使用Master_API查询Master管理的节点话题服务内容的更多相关文章
- ROS知识(5)----消息与服务的示例
ROS中已经定义了较多的标准类型的消息,你可以用在这些标准类型的消息上再自定义自己的消息类型.这个在复杂数据传输很有用,例如节点和服务器进行交互时,就可能用到传输多个参数到服务器,并返回相应的结果.为 ...
- ROS知识(2)----理解ROS系统结构
学习新事物,方法高于技术本身,如果没有把握"BIG PICTURE"的话很难理解进去.通过以下几点进行理解ROS: ROS实际上不是操作系统,他只是一个通信的框架,一个代码管理的架 ...
- C#开发微信门户及应用(20)-微信企业号的菜单管理
前面几篇陆续介绍了很多微信企业号的相关操作,企业号和公众号一样都可以自定义菜单,因此他们也可以通过API进行菜单的创建.获取列表.删除的操作,因此本篇继续探讨这个主体,介绍企业号的菜单管理操作. 菜单 ...
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版新增查询引擎管理
欲了解V3.0版本的相关内容可查看下面的链接地址. RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.0 版本发布 RDIFramework.NET — 基于.NET的快速信 ...
- ORACLE表空间查询和管理【转】
红色是自由指定的~~--查询表空间SELECT D.TABLESPACE_NAME, SPACE "SUM_SPACE(M)", SPACE - NVL(F ...
- [敏杰开发]知识路书——图形化文献管理大师 Beta版发布喽!!!
[敏杰开发]知识路书--图形化文献管理大师 Beta版发布喽!!! 一.总览 项目名称:知识路书 发布形式:网页应用 发布地址:http://roadmap.imcoming.top 二.运行环境与使 ...
- MySQL中间件之ProxySQL(6):管理后端节点
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.配置后端节点前的说明 为了让ProxySQL能够找到后端的MySQ ...
- ProxySQL(6):管理后端节点
文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9286922.html 配置后端节点前的说明 为了让ProxySQL能够找到后端的MySQL节点,需要将后端的 ...
- SharePoint 2013管理中心里【管理服务器上的服务】不见了
打开管理中心,准备配置Managed Metadata Service,发现"管理服务器上的服务"不见了 那我自己拼url直接访问:http://xxxx/_admin/Serve ...
随机推荐
- 第一个Django项目:HelloWorld
OS:Windows家庭中文版, Python:3.6.3,Django:2.0.3 在前一篇文章中,Django已经顺利安装到了Python中,下面,开发第一个Python项目吧! 1.django ...
- Python 正则表达式提高
re模块的高级用法 search re.search(pattern, string[, flags]) 若string中包含pattern子串,则返回Match对象,否则返回None,注意,如果 ...
- Linux入门(一)root密码设置和用户切换
从这学期开始,本人将会亲自开一个Linux 专题学习包括Linux 常用命令,常见问题的一些解决方法,以及Linux系统下C和C++一些学习经验 下面这张图片是首次安装Ubuntu后第一次设置root ...
- 关于主键的设计、primary key
主键:用于唯一标识一个表中一行数据. 外键:用于建立两个表之间的关系,A表中有一列是B表中的主键,那么A表中这列的数据就受到B表主键的约束. 那么关于主键应该如何设计呢,这里我说下优缺点: 1.用自动 ...
- Eclipse+Tomcat+Axis2+ADT开发环境配置
一.安装Eclipse和Tomcat 1.安装Eclipse: 2.解压缩安装apache-tomcat-6.0.41 3.tomcat配置环境变量(4个) TOMCAT_HOME D:\An ...
- Hive(八)Hive的Shell操作与压缩存储
一.Hive的命令行 1.Hive支持的一些命令 Command Description quit Use quit or exit to leave the interactive shell. s ...
- vuejs、eggjs、mqtt全栈式开发设备管理系统
vuejs.eggjs.mqtt全栈式开发简单设备管理系统 业余时间用eggjs.vuejs开发了一个设备管理系统,通过mqtt协议上传设备数据至web端实时展现,包含设备参数分析.发送设备报警等模块 ...
- 【LOJ】#2558. 「LNOI2014」LCA
题解 当年LN还是有专门的省选题的,但是还不如没有 看到这道题,我就想到了一个清晰易懂,简单好写,代码优美的树链剖分线段树套主席树的\(O(q\log^{3}n)\)做法,且就5组数据出题人肯定是不会 ...
- bzoj 1212: [HNOI2004]L语言
思路:字典树+dp, dp[ i ] 表示 前缀到 i 能不能被理解, 如果dp[ i ] 是能被理解的那么, 把i + 1, i + 2 .... 在字典树上走,走到一个单词就转移. ,这样可行的 ...
- poj1182 食物链(带权并查集)
题目链接 http://poj.org/problem?id=1182 思路 前面做的带权并查集的权值记录该结点与其父结点是否是同一类,只有两种取值情况(0,1),在这题中某结点a和其父结点b的取值共 ...