| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 开发工具 -> 我的ROS学习之路——服务通信 -> 正文阅读 |
|
[开发工具]我的ROS学习之路——服务通信 |
本知识点将用一个实例(服务端处理客户端提交的两个数字求和,然后返回处理结果)来理解 服务通信的基本使用,大致分为三块: 1.自定义消息*.srv的编写() 2.服务端编写 3.客户端编写 一.首先创建一个工作空间和软件包 创建工作空间
创建软件包
二.自定义消息*.srv的编写——srv编写其实与前面说的话题通信步骤一样,只不过改成了srv自己的东西。 (PS:这里可以完全参考ros wki上面的教程,消息创建部分,照搬就可以) 2.1编写srv文件 方式一:在终端中创建msg
方式二:在vscode中创建srv 在终端中输入:
这样就打开了vscode编辑器,在~/catkin_ws_srv_self/src/plumbing_server_client/目录下,创建一个srv文件夹,在srv文件下,创建一个sum_ints.srv文件,在输入自己定义的信息:
最终效果如下: 以上两种方式实现效果一样,但是显然vscode的交互界面舒服。 2.2编辑配置文件(简记:231——package.xml改动两项,CMakeLists.txt改动三项,放开注释一项) 2.2.1首先在package.xml中添加编译依赖与执行依赖
好了,至此已经自定义消息配置完了。但是还没完,编译完了之后,还需要继续配置环境。 2.3编译 编译之后,会产生一些中间文件(后续调用相关 msg 时,是从这些中间文件调用的),但我只关注头文件在创建的工作空间的开发空间下 include的文件夹里 即(~/catkin_ws_example/devel/inlcude下)。 因为这是自己定义的消息,所以现在需要做的是,把这个头文件包含进本工作空间的路径里面(在c_cpp_properties.json 里的 includepath属性引入,这样可以避免的是 在用vscode开发时,引入 自定义消息头文件,不会出现误报错误和代码无法补齐的情况) PS:如何快速的得到这个头文件的路径呢?——这个路径可以鼠标放在include上,然后右击鼠标打开终端,输入pwd可得 引入的框架大致如下:
在本例中,引入图为: 最后面 ~/include/**的意思是,引入inlcude文件夹下的所有头文件。 至此,自定义消息部分,已经配置完成。 总结一下,做了哪些事?编写: 自定义消息 然后配置package.xml,CMakeLists.txt 引入头文件 三.服务端编写 3.1在~/catkin_ws_srv_self/src/server_client/src文件夹下创建一个*.cpp文件(本例为 server.cpp),然后放如下代码:
3.2配置CMakeLists.txt(需要修改三个地方,都是找到对应的地方,然后复制注释下来,修改需要改的部分即可)? ?第二句放的位置 有坑的说明,已经在发布的 话题通信之自定义消息 里已经说明了。? OK~发布方已经编写好了,接下来就可以编译测试了(这个模块写好了,先测试没有问题在写其他模块)。 3.3编译测试 3.3.1 方式一(终端编译方式):
方式二(vscode的快捷键编译方式): 在vscode中,shift+ctrl+B 3.3.2运行发布者节点(前提是已经运行了 roscore) 打开一个新的终端:
另开一个终端:
到这一步之后,就运行成功了,服务端已经挂起了,但是在终端看不到什么反应,但是我们可以用内置指令,在终端上提交数字让服务端计算并把结果打印出来到终端来看结果,如: 另开一个终端:输入rosservice list 可以查看当前挂起的服务(发现/two_sum为我们所需的服务),然后输入rosservice ?-h可以查看rosservice有什么功能(指令忘记了,可以走这一步),然后输入rosservice call /two_sum "num1:[自己随便输入数字,如1] num2:[自己随便输入数字,如2]" (这一串指令这么长,怎么记得住?——小技巧:可以输入到rosservice call /two_sum 然后多按几次tab键盘,就能自动补齐后面的东西,PS:后面可以自己输入的数字,其实就是自己写的服务端所做的事情。) 结果如图: 验证成功~ 总结一下干了哪些事? 编写*.cpp文件 配置CMakeLists.txt ? 四.客户端编写 以固定方式(即程序运行前,数字已经固定死)提交: 4.1在~/catkin_ws_srv_self/src/server_client/src文件夹下创建一个*.cpp文件(本例为 client.cpp),然后放如下代码:
4. 2配置CMakeLists.txt(需要修改三个地方,都是找到对应的地方,然后复制注释下来,修改需要改的部分即可,改的方法与发布方一样,因此这里只放了最终效果图即可,用红笔标出改了哪些部分) ?shift+ctrl+B编译(或者用终端方式的编译,上面3.3.1写过了)通过,好了。可以联合调试了。 总结一下干了哪些事? 编写*.cpp文件 配置CMakeLists.xtxt 五.联合调试 5.1 编译(不会编译的见3.1) 5.2运行roscore 5.3运行服务端节点 新开一个终端:
5.4运行客户端节点 新开一个终端:
最后效果如图所示: ?OK~完成,结束~ ? --------------------------------------------------------分割线-------------------------------------------------------- 这里值得一提的是(主要体会思想动态提交的思想,可以从终端输入数据,然后从mian函数入口进到程序里面):上面第四部分,写了一个以固定方式(即程序运行前,数字已经固定死)提交,这里优化客户端的编写,以动态的方式提交(就是灵活的填写两个数字,都可以实现求解): 可以在client.cpp文件中,放如下代码:
然后就可以开始调试了。 1. 编译(不会编译的见3.1) 2。运行roscore 3运行服务端节点 新开一个终端:
4。运行客户端节点 新开一个终端:
最后效果如图所示(如图演示了 两组动态提交数据,分别是 1和2 ,5和10): OK~完成,结束~ |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/15 20:52:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |