ROS(二)Service通信
使用自定义的消息类型,实现service方式的节点间双向通信
在package目录下创建msg和srv目录,存放package需要使用的.msg和.srv文件.
在ROS中,message被设计为一种称为"language-neutral interface definition language (IDL)"的接口型定义语言.例如描述点云的消息类型通常被定义为:
Header header // 包含ROS中常用的时间戳和坐标系信息
Point32[] pts
ChannelFloat32[] chan
消息类型类似与C语言中的结构体,但是对于具体的ROS实现语言如C++或者Python,这种消息类型是无法兼容的,因此需要使用message_generation根据具体实现语言转换为C++或者Python源代码.
定义完.msg文件后需要修改Package.xml,编译时使用message_generation生成消息类型对应目标语言的源代码,运行时,需要依赖message_runtime
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
并且修改CMakeLists.txt
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)
add_message_files(
FILES
***.msg
)
generate_messages(
DEPENDENCIES
std_msgs
)
1. 在依赖的catkin组件中添加message_generation.以及动态链接的message_runtime;
2. 添加*.msg文件,要和msg目录下的.msg文件对应;
3. 最后,需要确保一个generate_messages()函数被调用,用于生成自定义msg的C++或者Python源文件,如果自定义的msg中使用了std_msgs类型,例如int64, Header等等,还需要添加依赖,一般std_msgs是必须的,这里还可以添加别的依赖消息类型.
这里需要注意,定义.srv文件完成后和定义.msg文件完成后需要做的事情完全一样,因为.srv文件也是通过message_generation来生成对应的C++/Python/Lisp/Octave源文件的.
生成的.msg和.srv文件(C++或者Python,Lisp,Octave实现)在catkin(而不是package目录)的devel目录下.因此如果其他package使用当前package中定义的消息类型,实际包含的是该文件.唯一的区别就是在CMakeLists.txt中需要加入.srv文件:
add_service_files(
FILES
***.srv
)
一般来说,习惯是"A good ROS practice is to collect related messages, services and actions into a separate package with no other API. That simplifies the package dependency graph."在另外一个独立的package中,将所有需要的messages, services,以及actions都定义好,该package不提供别的功能,这样package的依赖关系比较容易处理.注意,使用别的package的这些类型,需要再修改Package.xml添加包依赖:
<build_depend>name_of_package_containing_custom_msg</build_depend>
<run_depend>name_of_package_containing_custom_msg</run_depend>
最后我们使用C++在package的src目录下实现一个service通信的服务器端server.cpp和client.cpp
server.cpp:
//
// Created by shang on 4/11/17.
// #include "ros/ros.h"
// in ~/catkin_ws/devel/include for C++
#include "my_service_test/my_srv.h" bool judge(my_service_test::my_srv::Request& req, my_service_test::my_srv::Response& res)
{
if(req.req%) res.res = ;
else res.res = ;
ROS_INFO("request:x=%ld", (long int)req.req);
ROS_INFO("sending back response:[%ld]",(long int)res.res);
return true;
} int main(int argc, char** argv)
{
ros::init(argc, argv, "odev_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("odev_service",judge);
ROS_INFO("Ready to judge.");
ros::spin();
return ;
}
client.cpp:
//
// Created by shang on 4/11/17.
// #include "ros/ros.h"
#include "my_service_test/my_srv.h"
#include <cstdlib> int main(int argc, char** argv){
ros::init(argc, argv, "odev_client");
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<my_service_test::my_srv>("odev_service");
my_service_test::my_srv srv;
srv.request.req = atoll(argv[]);
if(client.call(srv)){
if(srv.response.res)
ROS_INFO("odd or even: odd");
else
ROS_INFO("odd or even: even");
}
else{
ROS_ERROR("Failed to judge!");
return ;
}
return ;
}
修改CMakeLists.txt配置这两个文件的编译过程:
# for "ros/ros.h"
include_directories(
# opt/ros/indigo/include
${catkin_INCLUDE_DIRS}
) add_executable(odev_server src/odev_server.cpp)
target_link_libraries(odev_server ${catkin_LIBRARIES})
add_dependencies(odev_server my_service_test_gencpp) add_executable(odev_client src/odev_client.cpp)
target_link_libraries(odev_client ${catkin_LIBRARIES})
add_dependencies(odev_client my_service_test_gencpp)
catkin_make后
运行
roscore
rosrun my_service_test odev_server
rosrun my_service_test odev_client 3
并且注意,其实service并不一定需要使用自定义的msg,因此在该程序的CMakeLists.txt中,不需要add_message_files()
ROS(二)Service通信的更多相关文章
- 通过AIDL在两个APP之间Service通信
一.项目介绍 [知识准备] ①Android Interface definition language(aidl,android接口定义语言),其目的实现跨进程的调用.进程是程序在os中执行的载体, ...
- 【必杀】为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
之前写过一篇文章,https://www.cnblogs.com/qidian10/p/6028784.html 解释如何解决此类问题,但现在回过头来想一下,之前的文章还是太过浅显,无法完全有效的彻底 ...
- Android 四大组件之二(Service)
service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务 ...
- 为应用程序池“XX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误
场景 WCF应用程序部署在IIS7中,使用net.tcp协议对外给几百台客户端提供服务,应用程序池不断崩溃重启. 分析过程 在事件查看器中看到的错误信息类似于 为应用程序池“XX”提供服务的进程在与 ...
- IM开发者的零基础通信技术入门(二):通信交换技术的百年发展史(下)
1.系列文章引言 1.1 适合谁来阅读? 本系列文章尽量使用最浅显易懂的文字.图片来组织内容,力求通信技术零基础的人群也能看懂.但个人建议,至少稍微了解过网络通信方面的知识后再看,会更有收获.如果您大 ...
- [转帖]为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误。该进程 ID 为“XXXX”。数据字段包含错误号。
[终极解决方案]为应用程序池“XXX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误.该进程 ID 为“XXXX”.数据字段包含错误号. ...
- IIS 为应用程序池提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误的解决方法
系统环境:Windows Server 2008 R2 64位, IIS 7.0 错误信息: 为应用程序池提供服务的进程在与 Windows Process Activation Service 通信 ...
- Service通信
1.简介 Service通信是双向的, 它不仅可以发送消息, 同时还会有反馈. 所以service包括两部分, 一部分是请求方( Clinet) , 另一部分是应答方/服务提供方( Server) . ...
- Activity与Service通信
Activity与Service通信的方式有三种: 继承Binder类 这个方式只有当你的Acitivity和Service处于同一个Application和进程时,才可以用,比如你后台有一个播放背景 ...
随机推荐
- hdu5194 DZY Loves Balls 【概率论 or 搜索】
//yy:那天考完概率论,上网无聊搜个期望可加性就搜到这题,看到以后特别有亲和感,挺有意思的. hdu5194 DZY Loves Balls [概率论 or 搜索] 题意: 一个盒子里有n个黑球和m ...
- Java对象表示方式1:序列化、反序列化的作用
1.序列化是的作用和用途 序列化:把对象转换为字节序列的过程称为对象的序列化. 反序列化:把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存 ...
- 线程锁的本质:线程控制、线程状态控制 while if:根据线程的关系(模式)协调线程的执行
线程锁的本质:线程控制.线程状态控制 while if https://www.cnblogs.com/feng9exe/p/8319000.html https://www.cnblogs.com/ ...
- 【[USACO15JAN]草鉴定Grass Cownoisseur】
这大概是我写过的除了树剖以外最长的代码了吧 首先看到有向图和重复经过等敏感词应该能想到先tarjan后缩点了吧 首先有一个naive的想法,既然我们要求只能走一次返回原点,那我们就正着反着建两遍图,分 ...
- 2018.09.23模拟总结(T2)
T1,T3我就不说啦,反正也不会.主要想讲的是T2. T2用了一个神奇的算法:折半搜索. 因为这个坑爹的数据范围告诉我们暴搜或是状压会TLE,而一半刚好能卡过去. 折半搜索其实跟暴搜没什么区别,就是折 ...
- 2018 Multi-University Training Contest 4 Problem B. Harvest of Apples 【莫队+排列组合+逆元预处理技巧】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6333 Problem B. Harvest of Apples Time Limit: 4000/200 ...
- 优化器,sgd,adam等
https://zhuanlan.zhihu.com/p/32230623 首先定义:待优化参数: ,目标函数: ,初始学习率 . 而后,开始进行迭代优化.在每个epoch : 计算目标函数关于 ...
- 利用arduino给PCB800099液晶驱动板烧录程序
某宝上购买了一块PCB800099液晶驱动板, 卖家出货的时候刷的驱动不对,遂需要重新烧录程序 可是苦于没有编程器,寻遍网络后找到几种解决方案: arduino刷,树莓派I2C口刷,linux下用vg ...
- PAT——1015. 德才论
宋代史学家司马光在<资治通鉴>中有一段著名的“德才论”:“是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人.凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人 ...
- 双T滤波电路用于PWM方式DAC的分析
双T滤波电路用于PWM方式DAC的分析 之前做温度控制的时候,用到了PWM到DAC的转化,PWM方波,经过滤波,怎么就变成了直流的信号,之前我也很困惑这一点.用频域的方法可以近似说明,但是严格的数 ...