> 文章列表 > 【ROS实操3服务调用添加乌龟数量】

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

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

需求描述

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

实现分析

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

实现流程

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

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

获取话题:/spawn

rosservice list

【ROS实操3服务调用添加乌龟数量】
/spawn可以在乌龟界面新建乌龟

获取消息类型:turtlesim/Spawn

rosservice type /spawn

获取消息格式:

rossrv info turtlesim/ Spawn

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

简单实现

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

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

【ROS实操3服务调用添加乌龟数量】
设置后,回车:
【ROS实操3服务调用添加乌龟数量】
用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})

【ROS实操3服务调用添加乌龟数量】
然后ctrl+shift+b编译运行无误即可。

运行

先启动roslaunch plumbing_test start_turtle.launch
【ROS实操3服务调用添加乌龟数量】
新建一个:

source ./devel/setup.bash
rosrun plumbing_test test03_service_client

【ROS实操3服务调用添加乌龟数量】
再来一次会失败:
【ROS实操3服务调用添加乌龟数量】
原因是名字turtle2名字重复需要修改name,即可。