需求描述:
编码实现向 turtlesim 发送请求,在乌龟显示节点的窗体指定位置生成一乌龟,这是一个服务请求操作
1.服务名称与服务消息获取
获取话题:
rosservice list
获取消息类型:
rosservice type /spawn
获取消息格式:
rossrv info turtlesim/Spawn
以命令的方式调用服务,生成一只小乌龟:
rosservice call /spawn 'Tab键补齐'
2.服务客户端实现
C++
#include "ros/ros.h"
#include "turtlesim/Spawn.h"
/*
需求:是向服务端发送请求,生成一只新乌龟
话题:/spawn
消息:turtlesim/Spawn
1.包含头文件
2.初始化ROS节点
3.创建节点句柄
4.创建客户端对象
5.组织数据并发布
6.处理响应
*/
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-2 发送请求
//判断服务器状态(二选一)
// ros::service::waitForService("/spawn");
client.waitForExistence();
bool flag = client.call(spawn);
// 6.处理响应
if (flag)
{
ROS_INFO("乌龟生成成功,新乌龟叫:%s",spawn.response.name.c_str());
}else{
ROS_INFO("请求失败!!!");
}
return 0;
}
运行launch文件:
roslaunch plumbing_test start_turtle.launch
运行文件:
rosrun plumbing_test test03_service_client
Python
注:用try进行异常处理
#! /usr/bin/env rospy
from urllib import request, response
import rospy
from turtlesim.srv import Spawn, SpawnRequest, SpawnResponse
"""
需求:向服务器发送请求生成一只乌龟
话题:spawn
消息:turtlesim/Spawn
1.导包
2.初始化ROS节点
3.组织服务的客户端对象
4.组织数据并发送请求
5.处理响应结果
"""
if __name__ == "__main__":
# 2.初始化ROS节点
rospy.init_node("service_call_p")
# 3.组织服务的客户端对象
client = rospy.ServiceProxy("/spawn",Spawn)
# 4.组织数据并发送请求
#4.1 组织数据
request = SpawnRequest()
request.x = 4.5
request.y = 2.0
request.theta = -3
request.name = "turtle3"
#4.2 判断服务器状态并发送
client.wait_for_service()
try:
response = client.call(request)
# 5.处理响应结果
rospy.loginfo("生成乌龟的名字叫:%s",response.name)
except Exception as e:
rospy.logerr("请求处理异常")
运行launch文件:
roslaunch plumbing_test start_turtle.launch
运行文件:
rosrun plumbing_test test03_service_client_p.py