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 ...
随机推荐
- Python缓存技术,装x新高度。
一段非常简单代码 普通调用方式 def console1(a, b): print("进入函数") return (a, b) print(console1(3, 'a')) pr ...
- 【本地服务器】用nodejs搭建最简单、轻量化的http server
1. 引言 前端程序猿主要关注的是页面,你可能根本就用不到.net,java,php等后台语言. 但是你制作出来的网页总要运行.总要测试吧?——那就免不了用到http server.我先前都是用vis ...
- linux文件处理
取中间的行数作为train.txt sed -n '1000000,170910580p' train.txt > trainv1.txt 取前面的行数作为dev.txt head -10000 ...
- 使用gradle编译安卓APK
一.安装JDK 在安装Gradle之前需要先安装JDK,由于安装的是Gradle是4.4所以需要安装JDK1.8. 之前编译总是提示如下错误就是由于先安装的jdk1.7然后安装的1.8造成的,在Gra ...
- python基础学习之路No.2 数据类型
python中常见的数据类型有:整数.浮点数.字符串.列表.元组.字典 python相较其他语言,可以省略了声明,可以直接定义赋值使用. 例如: a=12 就相当于 其他语言中的 int a=12 ...
- 应用服务器中对JDK的epoll空转bug的处理
原文链接:应用服务器中对JDK的epoll空转bug的处理 前面讲到了epoll的一些机制,与select和poll等传统古老的IO多路复用机制的一些区别,这些区别实质可以总结为一句话, 就是epol ...
- 20165203《Java程序设计》第九周学习总结
20165203<Java程序设计>第九周学习总结 教材学习内容总结 URL类 URL类是java.net包中的一个重要的类,URL的实例封装着一个统一资源定位符,使用URL创建对象的应用 ...
- Asp.net Vnext 实现IView
概述 Iview定义很简单,就是根据View上下文和TextWriter对象实现对View的呈现. 实现 实现IViewEngine public class TestViewEngine : IVi ...
- Storm(二)CentOS7.5搭建Storm1.2.2集群
一.Storm的下载 官网下载地址:http://storm.apache.org/downloads.html 这里下载最新的版本storm1.2.2,进入之后选择一个镜像下载 二.Storm伪分布 ...
- BZOJ囤题计划
决定做一些题,学习jry,开坑(其实是填坑) 大概会刷的很慢,大家别鄙视我..欢迎鄙视 果然慢出翔了,还是填完吧.. 现在做了: 11 [2338][HNOI2011]数矩形 枚举对角线暴力水过,所有 ...