输入以下代码,建立一个功能包(在建立的工作空间里建立功能包,如何建立工作空间见之前的文章)
catkin_create_pkg learning_service roscpp rospy std_msgs geometry_msgs
然后建立一个源文件
#include <ros/ros.h>
#include<turtlesim/Spawn.h>
int main(int argc, char **argv)
{
ros::init(argc,argv,“turtle_spawn”);
ros::NodeHandle node ;
//等待服务器
ros::service::waitForService("/spawn");
ROS_INFO(“the service is already!”);
//创建客户端
ros::ServiceClient add_turtle=node.serviceClientturtlesim::Spawn("/spawn");
//这里也可以先创建客户端
//疑惑点:如果后创建客户端,那等待服务器是谁在等待呢
turtlesim::Spawn srv;//
srv.request.x=2.0;
srv.request.y=2.0;
srv.request.name=“turtle2”;
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());
add_turtle.call(srv); //调用请求乌龟函数 srv为强求的参数
ROS_INFO(“Spwan turtle successfully [name:%s]”, srv.response.name.c_str());
return 0;
}
设置编译连接
add_executable(client src/client.cpp)
target_link_libraries(client ${catkin_LIBRARIES})
打开终端
rosrun learning_service client
新打开终端
rosrun turtlesim turtlesim_node
这样就能新请求一个小海龟了
客户端/服务器与发布者/订阅者
客户端发送请求,服务器发送请求的内容给客户端
客户端不请求,服务器内容更新也不会对客户端造成影响
若发布者一直在发布,订阅者便立即进行更新