需求描述
编码实现向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:0,0
y:0,0
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应用中,服务调用常常用于节点之间的数据交换和任务协作