客户端
创建功能包
创建客户端、创建服务、配置请求数据、请求调用、等待应答
设置编译规则
编译运行客户端
服务端
创建服务器
编译成目标执行文件、相关库的连接
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;
}