【服务通信自定义srv调用3----客户端的优化】

客户端的优化

服务通信自定义srv调用,客户端随意提交两个数,完成数的相加。也就是实现参数的动态提交:
1.格式:rosrun xxxx xxxx 12 34
2.节点执行时候,需要获取命令中的参数,并且组织进 request
代码中应该加入

//优化实现。获取命令的参数
    if (argc !=3){
    
    
        ROS_INFO("提交的参数不对");
        return 1;
    }

改掉固定输入值:

 // 5.组织请求数据
    plumbing_server_client::AddInts ai;
    ai.request.num1 = atoi(argv[1]);
    ai.request.num2 = atoi(argv[2]);

总体代码在demo02里面改动,demo01服务端不改动。

/*
    需求: 
        编写两个节点实现服务通信,客户端节点需要提交两个整数到服务器
        服务器需要解析客户端提交的数据,相加后,将结果响应回客户端,
        客户端再解析
 
    服务器实现:
        1.包含头文件
        2.初始化 ROS 节点
        3.创建 ROS 句柄
        4.创建 客户端 对象
        5.请求服务,接收响应
   实现参数的动态提交:
   1.格式:rosrun xxxx xxxx 12 34
   2.节点执行时候,需要获取命令中的参数,并且组织进 request


*/
// 1.包含头文件
#include "ros/ros.h"
#include "plumbing_server_client/AddInts.h"
int main(int argc, char *argv[])
{
    
    
    setlocale(LC_ALL,"");

    //优化实现。获取命令的参数
    if (argc !=3){
    
    
        ROS_INFO("提交的参数不对");
        return 1;
    }
 
    // 2.初始化 ROS 节点
    ros::init(argc,argv,"dabao");
    // 3.创建 ROS 句柄
    ros::NodeHandle nh;
    // 4.创建 客户端 对象
    ros::ServiceClient client = nh.serviceClient<plumbing_server_client::AddInts>("addints");
    // 5.组织请求数据
    plumbing_server_client::AddInts ai;
    ai.request.num1 = atoi(argv[1]);
    ai.request.num2 = atoi(argv[2]);
    // 6.处理响应
    bool flag = client.call(ai);
    // 7.处理响应
    if (flag)
    {
    
    
        ROS_INFO("响应成功");

        ROS_INFO("请求正常处理,响应结果:%d",ai.response.sum);
    }
    else
    {
    
    
        ROS_ERROR("请求处理失败....");
        return 1;
    }
 
    return 0;
}

完毕之后ctrl+shift+b进行编译。
然后ctrl+alt+t打开终端
输入roscore启动ros
然后新开一个终端
输入

```bash
source ./devel/setup.bash
rosrun plumbing_server_client demo01_server

然后新开一个终端
输入

source ./devel/setup.bash
rosrun plumbing_server_client demo02_client 12 334

输出结果如下:
在这里插入图片描述
1.格式:rosrun xxxx xxxx 12 34
注意rosrun的格式在客户端的格式如果后面没有两个数,就会变成提交的参数不对。

猜你喜欢

转载自blog.csdn.net/weixin_47869094/article/details/129989284
今日推荐