【服务通信自定义srv调用1】

需求:
编写服务通信,客户端提交两个整数至服务端,服务端求和并响应结果到客户端。

分析:
在模型实现中,ROS master不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:
1.服务端
2.客户端
3.数据

流程:
1.编写服务端实现;
2.编写客户端实现;
3.编辑配置文件;
4.编译并执行。

0.vscode配置
需要像之前自定义msg 实现一样配置c_cpp_properies.json文件,如果以前已经配置且没有变更工作空间,可以忽略,如果需要配置,配置方式与之前相同:
比如说我这是

"/home/ros/demo03_ws/devel/include/plumbing_server_client"

在这里插入图片描述
添加之后:
在这里插入图片描述
不知道路径查一下:
在devel下面的include的下面找到自己的包,在集成终端中打开
在这里插入图片描述
输入pwd就可以知道路径。
在这里插入图片描述
配置完毕后。
在src下面的自己定义的作用包下面新建文件。
比如我的是一直存在的demo03_ws文件下的src里面,先右击src 创建新的功能包creat catkin package,将包名命名为plumbing_server_client,然后添加roscpp,rospy,std_msgs.创建完成之后。

在plumbing_sever_client下面的src新建文件
命名demo01_server.cpp
输入以下代码:

#include "ros/ros.h"
#include "plumbing_server_client/AddInts.h"
/*
服务端实现:解析客户端提交的数据,并运算再产生响应
1.包含头文件;
2.初始化ROS节点;
3.创建节点句柄;
4.创建一个服务对象;
5.处理请求并产生响应;
6.spin()

*/
//回调函数,进行相关的服务操作,返回值为波尔类型
bool doReq(plumbing_server_client::AddInts::Request &req,
                        plumbing_server_client::AddInts::Response &response)
{
    
    
          //1。处理请求
               int num1 = req.num1;
               int num2 = req.num2;

               ROS_INFO("服务器接收到的数据为:num1 = %d,num2 = %d",num1,num2);
             //2。组织响应
               int sum =num1+num2;
               response.sum = num1 + num2;
                ROS_INFO("求和结果: sum = ",num1,num2);

               return true;

            }
int main(int argc, char *argv[]){
    
    
   setlocale(LC_ALL,"");
   //2.初始化ROS节点
   ros::init(argc,argv,"server");//server为节点名
   //3.创建ROS句柄
   ros::NodeHandle nh;
   //4.创建服务对象,add_int为话题
   ros::ServiceServer server = nh.advertiseService("addints",doReq);//add_int为话题名
   ROS_INFO("服务启动");
   //5.回调函数处理请求并产生响应
   //6.spin函数,没有该函数的话,节点启动后会立即停止
   ros::spin();
   return 0;
}

配置cmakefiles文件

add_executable(demo01_server src/demo01_server.cpp)

target_link_libraries(demo01_server
  ${catkin_LIBRARIES}
)
add_dependencies(demo01_server ${PROJECT_NAME}_gencpp)

配置完毕之后ctrl+shift+b进行编译。

然后ctrl+alt+t打开终端
输入roscore启动ros
然后再新开一个终端

cd demo03_ws/
 source ./devel/setup.bash
 rosrun plumbing_server_client demo01_server 

在这里插入图片描述
然后再开一个终端

source ./devel/setup.bash 
rosservice call addints "num1: 7
num2: 6" 
sum: 13

输入的时候输入rosservice call ***
后面的***是根据自己定义的节点名字来定的,输入节点名字后,按下空格键盘,然后使用tab补齐,就会出现"num1: 0
num2: 0" ,可以通过键盘修改数字,然后键入enter就会输出sum的数值。
以免出现下面的报错
不用tab补齐有可能出现以下报错
在这里插入图片描述

ERROR: Service [/addintS] is not available.

猜你喜欢

转载自blog.csdn.net/weixin_47869094/article/details/129896557