ROS服务与客户端编写详解
时间:2021-07-15
本文章向大家介绍ROS服务与客户端编写详解,主要包括ROS服务与客户端编写详解使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
- srv文件
float64 init_x float64 init_y float64 init_z float64 delta_x float64 delta_y float64 delta_z --- float64 x float64 y float64 z
- 服务
// 包括了ROS常用的头文件 #include "ros/ros.h" // 创建srv文件时生成的头文件,其中kinematics_demo为软件包名称,trans为srv文件名称,并在其后加上.h扩展名 #include "kinematics_demo/trans.h" // 软件包名与srv文件名共同组成一个类名(kinematics_demo::trans),此类包括两个成员变量request、response和两个类定义Request、Response // 服务中执行主要功能的回调函数的原型 bool trans_pose(kinematics_demo::trans::Request &req, kinematics_demo::trans::Response &res); int main(int argc, char **argv) { // 初始化ROS,并指定节点名称为kindmatics_sever ros::init(argc, argv, "kinematics_server"); // 为节点创建句柄n ros::NodeHandle n; // 创建名称是trans_pose的服务,并注册回调函数trans_pose // 第一个trans_pose为服务名称,第二个trans_pose为回调函数名 ros::ServiceServer service = n.advertiseService("trans_pose", trans_pose); ROS_INFO("Kinematics server"); // 循环等待回调函数 ros::spin(); return 0; } bool trans_pose(kinematics_demo::trans::Request &req, kinematics_demo::trans::Response &res) { res.x = req.init_x + req.delta_x; res.y = req.init_y + req.delta_y; res.z = req.init_z + req.delta_z; ROS_INFO("Pose before trans: (%f, %f, %f)", (double)req.init_x, (double)req.init_y, (double)req.init_z); ROS_INFO("Pose trans: (%f, %f, %f)", (double)req.delta_x, (double)req.delta_y, (double)req.delta_z); ROS_INFO("Pose after trans: (%f, %f, %f)", (double)res.x, (double)res.y, (double)res.z); return true; }
- 客户端
// 包括了ROS常用的头文件 #include "ros/ros.h" // 创建srv文件时生成的头文件,其中kinematics_demo为软件包名称,trans为srv文件名称,并在其后加上.h扩展名 #include "kinematics_demo/trans.h" #include <cstdlib> // 第一个形参argc(argument counter)表示main函数的参数个数 // 第二个形参argv(argument value)表示main函数的参数值 // 也可写为int main(int argc, char *argv[]),即由指针组成的数组,数组中每个元素都是指向char的指针 // 当不带参数运行主函数时,操作系统向主函数传递的参数argc为1,而argv[0](是一个指针)指向程序的路径及名称 // 当带参数运行主函数时,操作系统向主函数传递的参数argc为1加上参数个数,argv[0]意义不变,从arg[1]开始依次指向参数字符串 int main(int argc, char **argv) { // 初始化ROS,并指定节点名称为kindmatics_client ros::init(argc, argv, "kinematics_client"); // 当参数个数不为7(即未传入6个参数,与默认的1个参数共7个) if (argc != 7) { ROS_INFO("usage: kinematics_client init_x, init_y, init_z, delta_x, delta_y, delta_z"); return 1; } // 为节点创建句柄n ros::NodeHandle n; // 为名称是trans_pose的服务创建客户端,并赋给名称为client的ros::ServiceClient的对象 // 尖括号中为<软件包名::srv文件名> // 此处或为函数模板语法,sericeClient为函数名,尖括号中内容显式表明函数参数类型,圆括号中为参数值 ros::ServiceClient client = n.serviceClient<kinematics_demo::trans>("trans_pose"); // 实例化一个自动生成的服务类,即声明一个kinematics_demo::trans对象srv // *注:此处服务的意义与服务器的服务并不相同,此服务强调服务内容而非动作,与srv文件所表示的服务相同 // 即软件包名与srv文件名二者共同组成一个类名,用此类名声明一个对象srv kinematics_demo::trans srv; // 上面实例化的名为srv的服务类,包括两个成员变量request、response和两个类定义Request、Response // 为request成员赋值 srv.request.init_x = atof(argv[1]); srv.request.init_y = atof(argv[2]); srv.request.init_z = atof(argv[3]); srv.request.delta_x = atof(argv[4]); srv.request.delta_y = atof(argv[5]); srv.request.delta_z = atof(argv[6]); // 客户端调用服务 if(client.call(srv)) { ROS_INFO("Pose after trans: (%f, %f, %f)", (double)srv.response.x, (double)srv.response.y, (double)srv.response.z); } else { ROS_ERROR("Failed to call service"); return 1; } return 0; }
- 说明
原文地址:https://www.cnblogs.com/cpp-blog/p/15016304.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 今日算法题-动态规划法
- 3分钟短文 | PHP获取函数的代码片段,唯有反射最高效!
- ggforce|绘制区域轮廓-区域放大-寻找你的“onepiece”
- 基因矩阵转置文件格式(* .gmt)
- gganimate|创建可视化动图,让你的表会说话
- ggplot2|玩转Manhattan图-你有被要求这么画吗?
- deconstructSigs|探寻cosmic的独特“气质”-mutation signature !
- barplot3d|圣诞节送你一个mutation signature搭建的“乐高”
- R读取gmt文件
- 一个画双层pie图的函数
- DEapp(差异表达分析)本地版——自由飞翔
- 盘一盘Tidyverse| 筛行选列之select,玩转列操作
- 2-14 |“特殊”的日子,多学一种表达爱的方式
- 盘一盘Tidyverse| 只要你要只要我有-filter 筛选行
- RNA相互作用神器——ENCORI