ROS 学习笔记(三):自定义服务数据srv+server+client 示例运行

ROS 学习笔记(三):自定义服务数据srv+Server+Client 示例运行

一、自定义服务数据:

1.向功能包添加自定义服务文件(AddTwoInts.srv)

cd ~/catkin_ws/src/mypackage
mkdir srv 
cd srv

2.生成并编辑自定义服务文件:

gedit AddTwoInts.srv

添加内容:

int64 a
int64 b
---
int64 sum

3.修改添加~/catkin_ws/src/mypackage/package.xml 文件中内容

...<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>
...

4.修改添加~/catkin_ws/src/mypackage/CMakeList.txt 文件中内容
(message_generation 同时针对话题消息和服务消息类型描述文件生成相应的代码)

// 添加生成依赖的功能包
find_package(catkin REQUIRED COMPONENTS
...  
message_generation
)// 添加需要编译的.srv文件
add_service_files(FILESAddTwoInts.srv
)

5.编译后查看服务.srv

cd ~/catkin_ws
rosservice list

注意:对于AddTwoInts.h 是 AddTwoInts.srv文件在编译后自动生成的

二、Server+Client 示例:

1,~/catkin_ws/mypackage/src 目录中,编写俩个源文件server.cpp和client.cpp
(编译器编写或文本编写)

server.cpp 源码:

#include "ros/ros.h"
#include "mypackage/AddTwoInts.h"// 回调函数部分(实现服务功能)
bool add(mypackage::AddTwoInts::Request  &req,mypackage::AddTwoInts::Response &res)
{res.sum = req.a + req.b;ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);ROS_INFO("sending back response: [%ld]", (long int)res.sum);return true;
}int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "add_two_ints_server");// 创建节点句柄   ros::NodeHandle nh;// 创建名为 "add_two_ints" server 实例示例:ros::ServiceServer service = nh.advertiseService("add_two_ints", add);ROS_INFO("Ready to add two ints!");ros::spin();return 0;
}

client.cpp 源码:

#include "ros/ros.h"
#include "mypackage/AddTwoInts.h"
#include <cstdlib>int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "add_two_ints_client");// 终端获取两个数if (argc != 3){ROS_INFO("usage: rosrun package_name executable_name arguments");return 1;}// 创建节点句柄ros::NodeHandle nh;// 创建一个client,请求 "add_two_ints" service :ros::ServiceClient client = nh.serviceClient<mypackage::AddTwoInts>("add_two_ints");mypackage::AddTwoInts srv;srv.request.a = atol(argv[1]);srv.request.b = atol(argv[2]);// 发布service 请求,等待应答if (client.call(srv)){ROS_INFO("with the given [%ld] and [%ld],the sum is: [%ld]", srv.request.a, srv.request.b, (long int)srv.response.sum);}else{ROS_ERROR("Failed to call service: add_two_ints");return 1;}return 0;
}

2 编译功能包源码(catkin_make方式编译)
打开 CMakeList.txt 文件:
1)设置头文件相对位置,默认为功能包的所在目录
2)生成可执行文件 talker 和 listener
3)设置链接库(系统或第三方库函数)此处并没有使用其他库
4)设置依赖
5) 生成server和client 两个可执行文件于 ~/catkin_ws/devel/lib/mypackage 中

CMakeList.txt 添加修改代码如下:

include_directories(include ${catkin_INCLUDE_DIRS})add_executable(server src/server.cpp)
add_dependencies(server ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(server  ${catkin_LIBRARIES})add_executable(client src/client.cpp)
add_dependencies(client ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(client  ${catkin_LIBRARIES})

3.终端工作空间根目录 ~/catkin_ws 开始编译

cd ~/catkin_ws
catkin_make
source devel/setup.bash // 已在于终端环境变量文件中设置的无需重新设置

三、直接运行 server client

1.新建终端,运行ros master

cd ~/catkin_ws
roscore

2.新建终端,运行服务器节点 server

rosrun mypackage server 

3.新建终端,运行客户端节点 client

rosrun mypackage client 100 222

4.结果显示:

[INFO] [146235634.23453542]:with the given [100] and [222],the sum is: [322]

四、创建launch启动文件运行

1.创建launch文件夹,创建启动文件 mypackage.launch

cd catkin_ws/src/mypackage/
mkdir launch
cd launch/
touch mypackage.launch

mypackage.launch文件内容,设置同时启动服务节点:

<launch><node pkg="mypackage" type="server" name="add_two_ints_server" output="screen"/>
</launch>

2.运行launch文件并查看消息(默认会运行roscore)

roslaunch mypackage mypackage.launch  

3.新建终端,运行client 执行文件输入两个整型参数:

rosrun mypackage client 100 100

4.结果显示:

[INFO] [146235634.23453542]:with the given [100] and [100],the sum is: [200]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/491319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十一章 AtomicInteger源码解析

1、原子类 可以实现一些原子操作基于CAS下面就以AtomicInteger为例。 2、AtomicInteger 在没有AtomicInteger之前&#xff0c;对于一个Integer的线程安全操作&#xff0c;是需要使用同步锁来实现的&#xff0c;当然现在也可以通过ReentrantLock来实现&#xff0c;但是最好最方便…

np.random.choice用法

numpy.random.choice(a, sizeNone, replaceTrue, pNone) 返回&#xff1a;从[0,a)中以概率p采样size个数&#xff0c;replacement 代表的意思是抽样之后还放不放回去 如&#xff1a; >>> np.random.choice(5, 3) array([0, 3, 4]) >>> np.random.choice…

趋势 | 2019年人工智能行业的25大趋势

来源&#xff1a;网易智能知名创投研究机构CB Insights调研了25种最大的AI趋势&#xff0c;以确定2019年该技术的下一步趋势&#xff0c;他们根据行业采用率和市场优势评估了每种趋势&#xff0c;并将其归类为必要、实验性、威胁性、暂时的。1胶囊网络将挑战最先进的图像识别算…

ubuntu18.04 Qt Creator 安装+ROS Qt Creator Plug-in 插件安装笔记

ubuntu18.04 Qt Creator 安装ROS Qt Creator Plug-in 插件安装笔记&#xff1a; 一、Qt Creator 5.10安装 官网下载地址&#xff1a; http://download.qt.io/archive/qt/ 参考博客&#xff1a; https://blog.csdn.net/wuweifeng_2017/article/details/78322249 QT 安装包下…

.NET通过NavisWorks API将.nwc文件在窗口中打开及交互

[ 本文原创发表于cnblogs ] NavisWorks API的内容大部分为二次开发&#xff0c;在NavisWorks软件中增加所需要的功能。 而我所接到的工作任务是&#xff0c;将.nwc等格式的文件通过窗口打开并且可交互。也就是说&#xff0c;需要有一个程序去调用API&#xff0c;从而打开NavisW…

工业视觉系统相关知识和选型介绍(一):相机篇

工业视觉系统相关知识和选型介绍&#xff08;一&#xff09;&#xff1a;相机篇一、工业视觉系统二、工业相机三、关键名词解释四、工业相机选型五、工业相机品牌六、相机选型实例一、工业视觉系统 1.机器视觉就是用机器代替人眼来做测量和判断。机器视觉系统是指通过机器视觉…

天冷了思绪也飞远了

近日天冷&#xff0c;扎了有些时日的马尾&#xff0c;我的内心开始犹豫&#xff0c;要不要把它披散下来后稍作修剪&#xff0c;然后做成天然的围脖来保暖呢&#xff1f;不由得回想起多年的理发经历&#xff0c;其中中学的那一次理发仍然记忆犹新...... 常 言道&#xff0c;身体…

终于看见光的速度了:每秒一万亿帧的相机,拍摄到光的运行状态!

来源&#xff1a;机械发明爱好者我是谁&#xff0c;我在哪&#xff0c;我看到了什么&#xff0c;不会是手电筒照射的吧&#xff08;光移动的时候是在标签里面的&#xff0c;所以不可能是手电筒照射的&#xff09;。这个就是传说的中的飞秒拍摄技术飞秒&#xff08;femtosecond&…

win10下TensorFlow-GPU安装(GTX1660+CUDA10+CUDNN7.4)

首先安装anaconda Anaconda下载地址&#xff1a;https://www.anaconda.com/download/ 注意在安装时勾上第一项&#xff1a; 安装CUDA10.0&#xff1a; CUDA下载地址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive 安装CUDA前会先运行一个系统检查&#xff…

工业视觉系统相关知识和选型介绍(二):镜头篇

工业视觉系统相关知识和选型介绍&#xff08;二&#xff09;&#xff1a;镜头篇一、工业镜头介绍二、 关键名词解释二、图解镜头基本参数三、镜头选型四、常用工业镜头品牌一、工业镜头介绍 镜头的基本功能就是实现光束变换&#xff08;调制&#xff09;&#xff0c;在机器视觉…

《科学美国人》评出2019年十大突破性技术

来源&#xff1a;科技日报日前&#xff0c;著名科普杂志《科学美国人》公布了2019年十大突破性技术榜单。榜上有名的既有“高深莫测”的新型核反应堆和DNA存储&#xff0c;也有“平易近人”的新型肥料和食品包装。科技日报记者梳理后发现&#xff0c;这十大技术可分为清洁环境、…

破解百度云

BaiduPCS-Go 打开登录即可使用&#xff0c;这个是论坛大神基于BaiduPCS-Go制作的web版。 这是原贴地址https://www.52pojie.cn/thread-808876-1-1.html 谢谢大神将复杂简单化。&#xff08;不清楚360有没有报毒&#xff0c;有需要的自行测试。&#xff09;下载地址&#xff1a…

浅谈Tuple之C#4.0新特性

一、4.0新特性中的Tuple 大家可以回顾一下c#4.0中增加的一个新特性&#xff0c;元组Tuple&#xff0c;它是一种固定成员的泛型集合: 下面先看看官方的一个使用例子&#xff1a; 创建一个包含7个元素的Tuple数组 // Create a 7-tuple. var population new Tuple<string, int…

MFC 学习笔记(一):MFC单文档程序运行流程梳理与总结

MFC 学习笔记&#xff08;一&#xff09;&#xff1a;MFC单文档程序运行流程梳理与总结 1.MFC单文档程序运行流程 1.首先利用全局变量对象 theApp 启动应用程序 &#xff08;这是因为这个全局对象&#xff0c;基类CWinApp中 this 的指针才能指向这个对象。&#xff09; 2.调…

对话清华教授孙茂松:第三代人工智能要处理“可解释性”问题

来源&#xff1a;澎湃新闻正如人类会综合利用视觉、听觉、触觉、语言等信息&#xff0c;让人工智能&#xff08;AI&#xff09;从多角度、多模态、多学科学习自然语言也是清华大学人工智能研究院的目标与任务。2019年7月1日&#xff0c;清华大学人工智能研究院第八个研究中心&a…

验证gpu版pytorch是否可用

import torchtorch.cuda.is_available() Truetorch.cuda.current_device() 0torch.cuda.device(0) <torch.cuda.device object at 0x0000023034332438>torch.cuda.device_count() 1torch.cuda.get_device_name(0) GeForce GTX 1660

oracle instr函数

语法&#xff1a;instr( fatherstr, sonstr [, start_position [, matchtimes ] ] )fatherstr&#xff1a;父字符串。要在此字符串中查找子字符串的位置。sonstr&#xff1a;要在fatherstr中查找的字符串. start_position&#xff1a;代表从fatherstr開始查找的的開始位置。此參…

QT学习笔记(一):VS2013 +QT 5.8 运行、编译问题解决

QT学习笔记&#xff08;一&#xff09;&#xff1a;VS2013 QT 5.8 运行、编译问题解决 jom: E:\C\4.QT\HelloWord\Makefile.Debug [debug\moc_predefs.h] Error 1 ‘cl’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 jom: E:\C\4.QT\HelloWord\Makefile…

使用清华镜像安装pytorch失败的解决方法

首先添加清华镜像至Anaconda仓库&#xff1a; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ conda config --set show_channel_urls yes …