1.5.1 服务模型(客户端/服务器)
Client客户端发布产生海龟的请求
Server端收到请求后会产生一个新的海龟 并且给客户端一个反馈
spawn :产卵。。。。。。
turtle_spawn是turtlesim中定义的数据结构
1.5.2首先我们先创建一个新的功能包,取名为learning_service
cd ~/catkin_ws/src
catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs turtlesim
1.5.3 编写C++源文件
/**
* 该例程将请求/spawn服务,服务数据类型turtlesim::Spawn
*/
#include <ros/ros.h>
#include <turtlesim/Spawn.h>
int main(int argc, char** argv)
{
// 初始化ROS节点 并命名节点名"turtle_spawn"
ros::init(argc, argv, "turtle_spawn");
// 创建节点句柄
ros::NodeHandle node;
//在等待“/spawn”服务在 ROS 网络中变得可用之前暂停程序执行。
//waitForService 是一个函数,允许节点等待指定的服务变得可用。在这种情况下,等待的服务名为“/spawn“ 如果没有这个服务 那么系统就会处于等待阶段
ros::service::waitForService("/spawn");
//发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service
ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");
/**创建了一个名为 add_turtle 的 ROS 服务客户端,
* 用于请求生成一个新的 turtlesim 海龟。
* 在这个客户端中,服务请求的消息类型是 turtlesim::Spawn,服务的名称是 "/spawn"。
*/
// 初始化turtlesim::Spawn的请求数据
turtlesim::Spawn srv;
srv.request.x = 2.0;
srv.request.y = 2.0;
srv.request.name = "turtle2";
turtlesim::Spawn srv3;
srv3.request.x = 3.0;
srv3.request.y = 3.0;
srv3.request.name = "turtle3";
// 请求服务调用
ROS_INFO("Call service to spwan turtle[x:%0.6f, y:%0.6f, name:%s]",
srv.request.x, srv.request.y, srv.request.name.c_str());//表示保留小数点后6位
ROS_INFO("Call service to spwan turtle[x:%0.6f, y:%0.6f, name:%s]",
srv3.request.x, srv3.request.y, srv3.request.name.c_str());
add_turtle.call(srv);//客户端请求发送给服务器,然后就等待服务器的反馈
add_turtle.call(srv3);
// 显示服务调用结果
ROS_INFO("Spwan turtle successfully [name:%s]", srv.response.name.c_str());
ROS_INFO("Spwan turtle successfully [name:%s]", srv3.response.name.c_str());
return 0;
};
1.5.4配置客户端代码编译规则
在CMake中,add_executable是一个命令,用于创建一个可执行文件。它的第一个参数是可执行文件的名称,而后面的参数是与该可执行文件相关联的源代码文件。
1.5.5编译客户端
cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun turtlesim turtlesim_node
rosrun learning_service turtle_spawn