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 ...
随机推荐
- vue2.0组件之间的传值
1.父子组件--props props:需要注意的是,虽然的是单向的数据流,但是如果传递的是数组或是对象这样的引用类型,子组件数据变化,父组件的数据通也会变化 子组件代码 <template&g ...
- 使用os模块实现展示目录下的文件和文件夹
Windows 10家庭中文版,Python 3.6.4 今天学习了os模块,下面是使用它开发的一个展示目录下的文件和文件夹的函数,代码如下: import os # deep大于等于1的整数,默认为 ...
- ASP .Net Core系统部署到SUSE 16 Linux Enterprise Server 12 SP2 64 具体方案
.Net Core 部署到 SUSE 16 Linux Enterprise Server 12 SP2 64 位中的步骤 1.安装工具 1.apache 2..Net Core(dotnet-sdk ...
- 3.Springboot之修改启动时的默认图案Banner
一.SpringBoot的默认启动图案 在SpringBoot启动的时候,默认的会展示出一个spring的logo,这个图案我们用户是可以自定义的 二.自定义启动图案 方法一: Application ...
- excl筛选求和
Excel中的筛选,是一个很常用的功能.但不知道是有意还是疏忽,Excel没有直接提供在筛选后的一些统计功能,例如求和.平均值等.而由于筛选的主要功能之一就是可以方便快捷的进行变换,所普通的以直接在数 ...
- SQL 标量函数-----日期函数 day() 、month()、year()
select day(createtime) from life_unite_product --取时间字段的天值 select month(createtime) from life_unite_p ...
- Jenkins 集成 Sonar
Jenkins 与 Sonar 集成:Sonar 是 Jenkins 之外独立运行的一个服务.Jenkins 中安装插件 SonarQube(并配置其 Sonar Server 的 URL / Acc ...
- 通过构造系统服务分发实现拦截&过滤 (仿360游戏保险箱)
想写这个程序主要是因为看了KSSD的一篇帖子,http://bbs.pediy.com/showthread.php?t=108378 讲 的是360保险箱保护游戏账号的原理,实际上就是对各种请求的拦 ...
- Android 中.aar文件生成方法与用法
https://i.cnblogs.com/EditPosts.aspx?opt=1 无论是用Eclipse还是用Android Studio做android开发,都会接触到jar包,全称应该是:Ja ...
- inotify 与 rsync文件同步实现与问题
首先分别介绍inotify 与 rsync的使用,然后用两者实现实时文件同步,最后说一下这样的系统存在什么样的问题. 1. inotify 这个具体使用网上很多,参考 inotify-tools 命令 ...