[ROS学习]ROS服务浅析及简单实现(C++)

前言

记录这两天的学习情况,以前只是按照教程盲目的走了一遍,很多概念都不太清晰。将这段时间对ROS的服务粗浅理解记录下来。

文章内容只是自己对于该部分内容的暂时性理解,如有错误还请指正

1. ROS下的服务(service)是什么?

总结来说,service就是ROS提供的一种节点间的通信方式。这种通信方式和客户端服务端的通信机理类似。如下图所示。
通行方式图

图中client提出服务请求,server响应请求。从这个模式可以看到几个明显的特点:
(a)这中通信方式是点对点的,他区别与topic的通信。当然一个服务器可以为多个客户端提供服务。
(b)在server和client之间的消息(srv)是需要定义的,server需要知道我要得服务数据是什么,应答给client什么,对client也一样。

2. 编写简单的Server(C++)

2.1 建立工作空间

下面会从建立工作空间开始,到软件包,到具体的可执行文件,确保可以有最终的效果。

step1: 建立工作空间

mkdir -p haley_ws/src
cd haley_ws/src/
catkin_init_workspace 

step2: 创建软件包 包名为“haley_service”

catkin_create_pkg haley_service roscpp std_msgs

2.2 编写自定义srv消息

step3: 创建所需的自定义服务消息(srv),这里我们定义一个求和的srv,在sum.srv中写入消息的格式。

mkdir srv
cd srv
touch sum.srv

sum.srv的内容如下,这里的上半部分是请求数据格式,下半部分是应答的数据格式。中间必须用三个短线隔开。

int32 A
int32 B

---

int32 SUM

好了进行到这里总结一下,我们做了什么,这些事情的目的是啥。
(a)建立了完整的工作空间和软件包
(b)定义了之后要使用到的service消息格式
做完了这些我们的目录从工作空间开始大概是这样的
工作空间目录
现在来查看一下我们的srv消息吧
(a)编译工作空间
(b)查看srv格式

catkin_make
source ./devel/setup.bash 
rossrv show haley_service/sum 

结果
在这里插入图片描述
至此我们上面的工作还是没有什

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ROS中,可以使用C++中的`ros::master::getNodes()`函数来获取当前ROS系统中所有的节点列表。然后,可以使用`ros::NodeHandle::serviceClient()`函数来创建一个ROS服务客户端,用于调用`/rosnode/get_node_info`服务获取指定节点的详细信息。该服务返回一个`rosnode_msgs::NodeInfo`类型的消息,其中包含了节点的名称、URI、发布和订阅的话题列表等信息。 以下是一个示例代码,演示如何使用`ros::master::getNodes()`函数和`ros::NodeHandle::serviceClient()`函数来实现ROS节点信息功能: ```cpp #include <ros/ros.h> #include <rosnode_msgs/GetNodeInfo.h> #include <rosnode_msgs/NodeInfo.h> int main(int argc, char** argv) { // 初始化ROS节点 ros::init(argc, argv, "node_info"); // 创建ROS节点句柄 ros::NodeHandle nh; // 获取ROS节点列表 std::vector<std::string> nodes; ros::master::getNodes(nodes); // 遍历节点列表,逐个获取节点信息 for(std::vector<std::string>::iterator it = nodes.begin(); it != nodes.end(); ++it) { // 创建ROS服务客户端,调用get_node_info服务 ros::ServiceClient client = nh.serviceClient<rosnode_msgs::GetNodeInfo>("/rosnode/get_node_info"); rosnode_msgs::GetNodeInfo srv; srv.request.node = (*it); // 如果服务调用成功,则打印节点信息 if(client.call(srv)) { ROS_INFO("Node %s:", srv.response.node_info.node.c_str()); ROS_INFO(" - URI: %s", srv.response.node_info.uri.c_str()); ROS_INFO(" - Publications:"); for(std::vector<std::string>::iterator pub_it = srv.response.node_info.publications.begin(); pub_it != srv.response.node_info.publications.end(); ++pub_it) { ROS_INFO(" - %s", (*pub_it).c_str()); } ROS_INFO(" - Subscriptions:"); for(std::vector<std::string>::iterator sub_it = srv.response.node_info.subscriptions.begin(); sub_it != srv.response.node_info.subscriptions.end(); ++sub_it) { ROS_INFO(" - %s", (*sub_it).c_str()); } } // 否则,打印错误信息 else { ROS_ERROR("Failed to get info for node %s", (*it).c_str()); } } return 0; } ``` 在上述示例中,我们创建了一个ROS节点句柄,并使用`ros::master::getNodes()`函数来获取当前ROS系统中所有的节点列表。然后,我们遍历节点列表,逐个创建ROS服务客户端,调用`/rosnode/get_node_info`服务获取每个节点的详细信息。如果服务调用成功,则打印节点的URI、发布和订阅的话题列表等信息。否则,打印错误信息。这样就可以实现ROS节点信息功能了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Haley__xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值