【ROS实操3服务调用添加乌龟数量】

需求描述

编码实现向turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作。

实现分析

1.首先,需要启动乌龟显示节点。
2.要通过ROS命令,来获取乌龟生成服务的服务名称以及服务消息类型。
3.编写服务请求节点,生成新的乌龟。

实现流程

1.通过ros命令获取服务与服务消息信息。
2.编码实现服务请求节点。
3.启动roscore、turtlesim_node、乌龟生成节点,生成新的乌龟。

1.服务名称与服务消息获取

获取话题:/spawn

rosservice list

在这里插入图片描述
/spawn可以在乌龟界面新建乌龟

获取消息类型:turtlesim/Spawn

rosservice type /spawn

获取消息格式:

rossrv info turtlesim/ Spawn

在这里插入图片描述

简单实现

终端中继续输入rosservice call /spawn "然后tab自动补齐,就可以开始设置了
分别是x,y坐标,唯一需要注意的是theta是乌龟的脑袋朝向,是用弧度来做单位的,3.14为一弧度,要想朝上,就是一半的弧度,就是1.57.

x:00
y:00
theta:0.0
name:“随便设置”

在这里插入图片描述
设置后,回车:
在这里插入图片描述
用c++实现,需要的功能包有roscpp,rospy,std_msgs,turtlesim
之前功能包有这些,直接在src下面新建文件test03_service_client.cpp
粘贴以下代码:

#include "ros/ros.h"
#include "turtlesim/Spawn.h"
/*需求:是向服务端发送请求,生成一只新的乌龟
话题:/spawn
消息: turtlesim/Spawn
1.包含头文件;
2.初始化·ROS·节点;
3.创建节点句柄;
4.创建客户端对象;
5.组织数据并发送:
6.处理响应。
8*/

int main(int argc, char *argv[])
{
setlocale(LC_ALL,"" );
//2.初始化ROS节点;
ros::init(argc ,argv , "service_call" );
//3.创建节点句柄;
ros::NodeHandle nh;
//4.创建客户端对象;
ros::ServiceClient client = nh.serviceClient<turtlesim::Spawn>( "/spawn" );
//5.组织数据并发送;
//5-1.组织请求数据
turtlesim::Spawn spawn;
spawn.request.x = 1.0;
spawn. request.y = 4.0;
spawn. request.theta = 1.57;
spawn. request.name = "turtle2" ;
//5-l
// 6.处理响应。
//5-2.发送请求
//判断服务器状态
// ros : : service: :waitForService( " /spawn" );
client.waitForExistence( );
bool flag = client.call(spawn);// flag 接收响应状态,响应结果也会被设置进spwan对象//6.处理响应。
if (flag){
ROS_INFO("乌龟生成成功,新乌龟叫:8s " , spawn. response.name.c_str());}
else{
ROS_INFO("请求失败!!!");

}
return 0;
}

其中代码按照之前的代码进行修改数字还有文件名字即可。

spawn.request.x = 1.0;
spawn. request.y = 4.0;
spawn. request.theta = 1.57;
spawn. request.name = "turtle2" ;

判断服务器是否响应的函数,二选一即可。

ros : : service: :waitForService( " /spawn" );
client.waitForExistence( );
//判断服务器状态
// ros : : service: :waitForService( " /spawn" );这个也可以
client.waitForExistence( );
bool flag = client.call(spawn);// flag 接收响应状态,响应结果也会被设置进spwan对象//6.处理响应。
if (flag){
ROS_INFO("乌龟生成成功,新乌龟叫:8s " , spawn. response.name.c_str());}
else{
ROS_INFO("请求失败!!!");
}

然后配置cmakelist.txt文件:

add_dependencies(test03_service_client ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

target_link_libraries(test03_service_client
   ${catkin_LIBRARIES}
 )

在这里插入图片描述
然后ctrl+shift+b编译运行无误即可。

运行

先启动roslaunch plumbing_test start_turtle.launch
在这里插入图片描述
新建一个:

source ./devel/setup.bash
rosrun plumbing_test test03_service_client

在这里插入图片描述
再来一次会失败:
在这里插入图片描述
原因是名字turtle2名字重复需要修改name,即可。

在ROS中,服务(Service)是一种允许节点之间进行双向通信的机制。通过服务,一个节点可以请求另一个节点执行特定的任务,并等待任务完成并返回结果。在这个实操场景中,我们将介绍如何通过ROS服务调用,实现一个获取乌龟数量的功能。

首先,我们需要创建两个ROS节点,一个是服务的请求方,另一个是服务的提供方。在请求方的节点中,我们需要编写代码,用于请求获取乌龟的数量。在提供方的节点中,我们需要编写代码,用于处理请求,并返回当前的乌龟数量。

在提供方的节点中,我们需要创建一个服务,它可以接收到请求,处理请求,并返回乌龟数量。首先,我们需要定义一个服务消息类型,它包含一个整数字段,表示乌龟的数量。然后,在提供方节点中,我们需要编写服务的回调函数,用于处理请求。在这个回调函数中,我们可以获取乌龟的数量,并将其作为响应返回给请求方。

在请求方的节点中,我们需要编写代码,用于创建一个服务客户端。这个客户端将发送请求到提供方节点,并等待响应。一旦收到响应,请求方节点可以获取乌龟的数量,并进行相应的处理,比如打印出来或者进行其他操作。

最后,我们需要在ROS系统中启动这两个节点,并确保它们能够相互通信。可以使用roslaunch命令启动这两个节点,也可以使用ROS的参数服务器来传递乌龟数量的信息。通过这种方式,我们就可以实现一个简单的ROS服务调用,实现了乌龟数量的获取功能。

通过以上步骤,我们就成功地实现了一个ROS服务调用的功能,实现了乌龟数量的获取。这种机制使得不同的ROS节点能够方便地进行通信,实现各种复杂的功能。在实际的ROS应用中,服务调用常常用于节点之间的数据交换和任务协作

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值