ROS——Server、Client的编程实现,服务数据的定义与使用,参数的使用和编程方法

客户端

在这里插入图片描述

创建功能包

在这里插入图片描述

创建客户端、创建服务、配置请求数据、请求调用、等待应答

在这里插入图片描述

设置编译规则

在这里插入图片描述

编译运行客户端

在这里插入图片描述

服务端

在这里插入图片描述

创建服务器

在这里插入图片描述

编译成目标执行文件、相关库的连接

add_executable(turtle_command_server src/turtle_command_server.cpp)
target_link_libraries(turtle_command_server ${catkin_LIBRARIES})

编译运行服务器

在这里插入图片描述

服务数据的自定义与使用

在这里插入图片描述

如何自定义数据

在这里插入图片描述

工作空间编译后,生成自定义相关的头文件

在这里插入图片描述

自定义客户端代码

// 本例程用于请求 /show_person 服务,服务数据类型 learning_service::Person
#include <ros/ros.h>
#include "learning_service/Person.h"

int main(int argc,char** argv){
  
  ros::init(argc,argv,"person_client");
  
  ros::NodeHandle node;
  
  //发现一个 /show_person 服务后,创建一个服务客户端,连接名为 /show_person 的service
  ros::service::waitForServicee("/show_person");
  ros::ServiceClient person_client = node.serviceClient<learning_service::Person>("/show_person");
  
  //初始化larning_service::Person 的请求数据
  learning_service::Person srv;
  srv.request.name = "vodka";
  srv.request.age = 23;
  srv.request.gender = learning_service::Person::Request::male;
  
  //请求服务调用
  ROS_INFO("Call service to show person[name:%s , age:%d ,gender:%d]",
           srv.request.name.c_str(),srv.request.age,srv.request.gender);
  person_Client.call(srv);
  
  //服务调用结果
  ROS_INFO("Show person result: %s",srv.response.result.c_str());         
  return 0;
}

服务端自定义代码

// 本例程执行   /show_person 服务,服务数据类型 learning_service::Person
#include <ros/ros.h>
#include "learning_service/Person.h"

//service 回调函数,输入参数req, 输出参数 res
bool personCallback(learning_service::Person::Request &req,learning_service::Person::Response &res){
    
    ROS_INFO("Person's name:%s sex:%d",req.name.c_str(),req.age,req.gender);
   
    res.result = "OK";
    
    return true;
}

int main(int argc,char **argv){
  
  ros::init(argc,argv,"person_server");
  
  ros::NodeHandle node;
  //创建一个名为 /show_person 的server,注册回调函数 personCallback
  ros::ServiceServer Vodka_Server = node.advertiseService("/show_person",personCallback);
  
  ROS_INFO("Ready to show person infomation");
  
  //循环等待,直到收到 /show_person请求,触发回调函数
  ros::spin();
  return 0;
}

配置服务端/客户端代码编译规则

在这里插入图片描述

步骤: 启动ros——运行server——运行client——输入指令进行交互

python代码

在这里插入图片描述

参数模型(参数存在Parameter Server)

在这里插入图片描述

创建功能包

在这里插入图片描述

参数命令行的使用

在这里插入图片描述

更新颜色后,统一改变的指令: rosservice call clear “{}”

实例

// 设置/读取海龟例程中的参数
#include <string>
#include <ros/ros.h>
#include <std_srvs/Empty.h>

int main(int argc , char **argv){
   int red,green,blue;
   
   ros::init(argc,argv,"parameter_config");
   
   ros::NodeHandle node;
   
   //读取背景颜色
   ros::param::get("/turtlesim/background_r",red);
   ros::param::get("/turtlesim/background_g",green);
   ros::param::get("/turtlesim/background_b",blue);
   
   ROS_INFO("Get Background Color[%d,%d,%d]",red,green,blue);
   
   //设置颜色
   ros::param::set("/turtlesim/background_r",100);
   ros::param::set("/turtlesim/background_g",26);
   ros::param::set("/turtlesim/background_b",45);
   
   ROS_INFO("Set background color rgb:[100,26,145]");
   
   //再次读取颜色
   ros::param::get("/turtlesim/background_r",red);
   ros::param::get("/turtlesim/background_g",green);
   ros::param::get("/turtlesim/background_b",blue);
   
   ROS_INFO("Get Background Color again:[%d,%d,%d]",red,green,blue);
   
   //调用服务,刷新背景颜色
   ros::service::waitForService("/clear"); 
   ros::ServiceClient clear_background = node.serviceClient<std_srvs::Empty>("/clear");
   std_srvs::Empty srv;
   clear_background.call(srv);
   
   sleep(1);
    
   return 0;
}

生成执行文件和编译依赖

在这里插入图片描述

执行步骤

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值