编写 ROS 服务节点 Service 和 Client(python/C++)(六)

news2024/12/24 21:06:35

1.编写 Service 节点(C++)

进入目录

cd ~/catkin_ws/src/beginner_tutorials/src

然后vim server.cpp 

 

 

 

复制代码粘贴,shift+insert 粘贴  ,然后按Esc 键,然后输入:wq 就可以保存退出了

#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"

bool add(beginner_tutorials::AddTwoInts::Request &req,beginner_tutorials::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::init(argc, argv, "add_two_ints_server");
        ros::NodeHandle n;
        ros::ServiceServer service = n.advertiseService("add_two_ints",add);
        ROS_INFO("Ready to add two ints.");
        ros::spin();
        return 0;
}

代码解释:

        这段代码是一个 ROS (Robot Operating System) 的服务端程序,它提供了一个名为 add_two_ints 的服务,用于对两个整数进行加法运算。

        具体来说,程序首先包含了 ROS 的头文件和 beginner_tutorials 包中的 AddTwoInts 服务文件,然后定义了一个名为 add 的回调函数,用于实现加法运算。回调函数的输入参数是 beginner_tutorials::AddTwoInts::Request 类型的 req 和 beginner_tutorials::AddTwoInts::Response 类型的 res,分别表示请求和响应。在回调函数中,程序将输入参数 a 和 b 相加,并将结果存储到 res.sum 中,然后打印出请求和响应的信息。

        接着,程序定义了一个 main 函数,其中包含了 ROS 的初始化和节点句柄的创建。节点句柄是 ROS 中用于管理节点、订阅主题、发布消息和提供服务的重要组件。接着,程序调用 n.advertiseService 函数创建了一个名为 add_two_ints 的服务,并将其回调函数设置为 add。最后,程序通过调用 ros::spin() 进入 ROS 的事件循环,等待客户端的请求。

当程序接收到客户端的请求时,回调函数 add 会被自动调用,并将请求和响应作为参数传递给它。回调函数会执行加法操作,并将结果存储到响应中,最后将响应发送给客户端。

整个程序的作用是创建一个 ROS 服务,用于提供加法运算的功能。其他 ROS 节点可以通过调用该服务,实现对两个整数的加法运算。

 

2.编写 Client 节点(C++)

复制代码粘贴,shift+insert 粘贴  ,然后按Esc 键,然后输入:wq 就可以保存退出了

#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>
int main(int argc, char **argv){ 
        ros::init(argc, argv, "add_two_ints_client");
        if (argc != 3){
                ROS_INFO("usage: add_two_ints_client X Y");
                return 1;
        }
        ros::NodeHandle n;
        ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
        beginner_tutorials::AddTwoInts srv;
        srv.request.a = atoll(argv[1]);
        srv.request.b = atoll(argv[2]);
        if (client.call(srv)){
                ROS_INFO("Sum: %ld", (long int)srv.response.sum);
        }
        else{
                ROS_ERROR("Failed to call service add_two_ints");
                return 1;
        }
        return 0;
}

 代码解释:

        这段代码是一个 ROS 的客户端程序,用于调用 add_two_ints 服务,实现对两个整数进行加法运算。

        具体来说,程序首先包含了 beginner_tutorials 包中的 AddTwoInts 服务文件和 ROS 的头文件,然后在 main 函数中进行了初始化,并检查命令行参数是否正确。如果命令行参数不正确,程序会打印一条用法信息并返回 1

接着,程序创建了一个节点句柄,并使用该节点句柄创建了一个 add_two_ints 服务的客户端对象。然后,程序创建了一个 beginner_tutorials::AddTwoInts 类型的服务请求对象 srv,并将其成员变量 a 和 b 分别设置为命令行参数中的两个整数。

接下来,程序调用 client.call(srv) 向服务端发送服务请求,并等待服务端的响应。如果服务调用成功,程序会打印出服务端返回的结果,即两个整数的和;否则,程序会打印一条错误信息并返回 1

        整个程序的作用是创建一个 ROS 客户端,用于调用 add_two_ints 服务,实现对两个整数进行加法运算。用户可以在命令行中输入两个整数,然后运行该客户端程序,程序会自动将这两个整数发送给 add_two_ints 服务,然后等待服务返回结果并将结果打印出来。

 

3.编辑CMakeLists.txt 文件

add_executable(server src/server.cpp)
target_link_libraries(server ${catkin_LIBRARIES})
add_dependencies(server beginner_tutorials_gencpp)
add_executable(client src/client.cpp)
target_link_libraries(client ${catkin_LIBRARIES})
add_dependencies(client beginner_tutorials_gencpp)

 输入cd ..    回到begineer_tutorials 目录下面,然后vim CMakeLists.txt 文件,粘贴,然后按esc ,输入:wq 保存退出

 执行命令:

cd ~/catkin_ws/ && catkin_make -j1

 编译成功:

 

测试我们写的代码:

启动三个终端,分别运行3个命令

roscore
rosrun beginner_tutorials server
rosrun beginner_tutorials client 1 3

 

 好了。我们c++的代码就完成了

-------------------------------------------------下面开始python版本-----------------------------

4.编写 Service 节点(python)

进入目录

cd ~/catkin_ws/src/beginner_tutorials/scripts/

输入vim server.py  

 

 复制代码 shift+insert 粘贴,然后按esc 输入:wq 保存退出

#!/usr/bin/env python 
from __future__ import print_function
from beginner_tutorials.srv import AddTwoInts,AddTwoIntsResponse
import rospy
def handle_add_two_ints(req):
    print("Returning [%s + %s = %s]"%(req.a, req.b, (req.a + req.b)))
    return AddTwoIntsResponse(req.a + req.b)
def add_two_ints_server():
    rospy.init_node('add_two_ints_server')
    s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)
    print("Ready to add two ints.")
    rospy.spin()
if __name__ == "__main__":
    add_two_ints_server()

代码解释:

        这段代码是一个 ROS 的服务端程序,它提供了一个名为 add_two_ints 的服务,用于对两个整数进行加法运算。

        具体来说,代码首先导入了 beginner_tutorials.srv 模块中的 AddTwoInts 服务和 AddTwoIntsResponse 响应类型,以及 ROS 的 Python 接口模块 rospy。然后,程序定义了一个名为 handle_add_two_ints 的回调函数,用于实现加法运算。回调函数的输入参数是 req,表示请求,包含两个整数 a 和 b。在回调函数中,程序将这两个整数相加,并将结果打印出来,然后将结果存储到 AddTwoIntsResponse 类型的响应对象中,并返回它。

接着,程序定义了一个名为 add_two_ints_server 的函数,用于初始化 ROS 节点并创建服务。在函数中,程序首先调用 rospy.init_node 初始化 ROS 节点,并设置节点名称为 add_two_ints_server。然后,程序使用 rospy.Service 函数创建了一个名为 add_two_ints 的服务,服务类型为 AddTwoInts,回调函数为 handle_add_two_ints。最后,程序输出一条提示信息并调用 rospy.spin() 进入 ROS 的事件循环,等待客户端的请求。

        最后,程序通过判断 __name__ 是否等于 "__main__",来确定是否需要执行 add_two_ints_server() 函数。如果将该脚本作为模块导入到其他 Python 脚本中时,__name__ 的值为模块名,此时不会执行 add_two_ints_server() 函数。如果直接运行该脚本时,__name__ 的值为 "__main__",此时会执行 add_two_ints_server() 函数,启动 ROS 服务端程序。

        整个程序的作用是创建一个 ROS 服务,用于提供加法运算的功能。其他 ROS 节点可以通过调用该服务,实现对两个整数的加法运算。此外,该程序编写使用了 Python 语言,是 ROS 中 Python 语言的服务端编写示例。

 

给文件执行权限

chmod +x server.py 

 

 回到上一级目录,编写输入vim CMakeLists.txt 文件,编写文件

catkin_install_python(PROGRAMS scripts/server.py
 DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

 复制粘贴代码。按esc  输入:wq 保存退出

 

继续:

5.编写 Client 节点(python)

进入刚刚的scripts 目录下面,输入vim client.py 

 复制代码粘贴,按esc 输入:wq 保存

#!/usr/bin/env python
from __future__ import print_function
import sys
import rospy
from beginner_tutorials.srv import *

def add_two_ints_client(x, y):
    rospy.wait_for_service('add_two_ints')
    try:
        add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)
        resp1 = add_two_ints(x, y)
        return resp1.sum
    except rospy.ServiceException as e:
        print("Service call failed: %s"%e)

def usage():
    return "%s [x y]"%sys.argv[0]

if __name__ == "__main__":
    if len(sys.argv) == 3:
        x = int(sys.argv[1])
        y = int(sys.argv[2])
    else:
        print(usage())
        sys.exit(1)
    print("Requesting %s+%s"%(x, y)) 
    print("%s + %s = %s"%(x, y, add_two_ints_client(x, y)))

代码解释:

        这段代码是一个 ROS 的客户端程序,用于调用 add_two_ints 服务,实现对两个整数进行加法运算。

        具体来说,代码首先导入了 ROS 的 Python 接口模块 rospy 和 beginner_tutorials.srv 模块中的 AddTwoInts 服务类型。然后,程序定义了一个名为 add_two_ints_client 的函数,用于向 add_two_ints 服务发送请求,并返回服务端返回的结果。在函数中,程序使用 rospy.wait_for_service 函数等待 add_two_ints 服务的出现,然后使用 rospy.ServiceProxy 函数创建一个名为 add_two_ints 的服务代理,并将输入参数 x 和 y 传递给服务代理。最后,程序返回服务端返回的结果,即两个整数的和。

接着,程序定义了一个名为 usage 的函数,用于打印用法信息。如果用户在命令行中没有输入两个整数,程序会调用 usage 函数打印用法信息并退出。

        最后,程序通过判断 __name__ 是否等于 "__main__",来确定是否需要执行客户端程序。如果将该脚本作为模块导入到其他 Python 脚本中时,__name__ 的值为模块名,此时不会执行客户端程序。如果直接运行该脚本时,__name__ 的值为 "__main__",此时会执行客户端程序,先从命令行参数中获取两个整数 x 和 y,然后调用 add_two_ints_client 函数向 add_two_ints 服务发送请求,并将服务端返回的结果打印出来。

        

        整个程序的作用是创建一个 ROS 客户端,用于调用 add_two_ints 服务,实现对两个整数进行加法运算。用户可以在命令行中输入两个整数,然后运行该客户端程序,程序会自动将这两个整数发送给 add_two_ints 服务,然后等待服务返回结果并将结果打印出来。该程序编写使用了 Python 语言,是 ROS 中 Python 语言的客户端编写示例。 

 

给文件执行权限 

chmod +x client.py 

 

 

 回到上一级目录,输入vim CMakeLists.txt 文件

复制代码,粘贴(shift+insert),按esc 输入:wq 保存退出 ,这里自己看着修改

catkin_install_python
(
PROGRAMS scripts/server.py scripts/client.py
 DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

 

 编译节点:

cd ~/catkin_ws/ && catkin_make -j1

 

 编译成功:

分别建立三个终端,分别运行代码:

roscore
rosrun beginner_tutorials server.py
rosrun beginner_tutorials client.py 1 3

 

好了。教程结束。记得虚拟机拍摄快照,以后弄坏了,可以回来到这个

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

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

相关文章

OSI分层

1 应用层 最上层的&#xff0c;也是我们能直接接触到的就是应用层&#xff08;Application Layer&#xff09;&#xff0c;我们电脑或手机使用的应用软件都是在应用层实现。那么&#xff0c;当两个不同设备的应用需要通信的时候&#xff0c;应用就把应用数据传给下一层&#x…

小航助学信息学奥赛C++ GoC模拟试卷(含题库答题软件账号)

信息学奥赛C GoC系统请点击 电子学会-全国青少年编程等级考试真题Scratch一级&#xff08;2019年3月&#xff09;在线答题_程序猿下山的博客-CSDN博客_小航答题助手 单选题10.0分 删除编辑 答案:C 第1题goc命令可以通过多命令拼接方式&#xff0c;优化代码布局&#xff0c;…

DHTMLX Suite JS PRO 8.1.1 Crack

适用于现代 Web 应用程序的强大 JavaScript 小部件库 - DHTMLX 套件 用于创建现代用户界面的轻量级、快速且通用的 JavaScript/HTML5 UI 小部件库。 DHTMLX Suite 有助于推进 Web 开发和构建具有丰富功能的数据密集型应用程序。 DHTMLX Suite 是一个 UI 小部件库&#xff0c;用…

用于脑MRI分割的注意对称自动编码器

文章目录 Attentive Symmetric Autoencoder for Brain MRI Segmentation摘要本文方法Attentive Reconstruction Loss位置编码SPE下游任务网络结构 实验结果 Attentive Symmetric Autoencoder for Brain MRI Segmentation 摘要 基于图像块重建的自监督学习方法在训练自动编码器…

深度学习基础入门篇[9.1]:卷积之标准卷积:卷积核/特征图/卷积计算、填充、感受视野、多通道输入输出、卷积优势和应用案例讲解

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

6个AI绘画网站,可生成海报

目录 1、Midjourney 2、Stable Diffusion Omline 3、Microsoft Designer 4、Craiyon 5、NightCafe S 6、Wombo 1、Midjourney 特点&#xff1a;业内标杆&#xff0c;效果最强大 Midjourney是基于diffusion的AI图画艺术生成器。生成图片不局限于二次元人物&#xff0c;能够…

产品经理在空窗期该做什么?

最近一段时间&#xff0c;就业形势越来越严峻&#xff0c;尤其是互联网行业&#xff0c;尤其是产品经理这个岗位竞争更是激烈&#xff0c;很多产品经理都难免有了数个月的空窗期&#xff0c;而空窗期的存在又使得产品经理竞争力下降&#xff0c;形成了负循环。而唯一能打破这种…

FPGA纯verilog代码实现H265视频压缩 支持4K30帧分辨率 提供工程源码和技术支持

这里写目录标题 1、前言2、我这里已有的视频图像编解码方案3、H265--视频压缩理论4、H265--视频压缩--性能表现5、H265--视频压缩--设计方案6、H265--视频压缩--时序7、Vivado工程详解8、移植上板应用9、Vivado功能仿真10、福利&#xff1a;工程代码的获取 1、前言 H265视频压…

十大排序算法之冒泡排序、快速排序的介绍

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【数据结构初阶&#xff08;C实现&#xff09;】 目录 冒泡排序冒泡排序代码冒泡排序优化 快速排序快速排序代码 冒泡排序 说起来冒泡排…

推荐8款在win11上还能用的“古董级”软件

前几天花重金1.3个w买了一台新电脑华为一体机MateStation X 2023&#xff0c;用了近10年的华硕迷你电脑终于要下岗了。这么多年来一直在用win7操作系统&#xff0c;现在直接迭代到win11了&#xff0c;以前几个用得称手的工具软件不舍得扔&#xff0c;拷到新电脑上居然还能用&am…

前端之CSS常用选择器分享~

目录 1. 标签选择器 2. 类选择器 3. id选择器 4. 后代选择器 5. 子代选择器 6. 并集选择器 7. 兄弟选择器 1. 标签选择器 ● 基本格式 : 标签名{属性1: ; 属性2: ; 属性3: ;....} ● 示例代码 <body><style>div {width: 100px;height: 100px;background-co…

【微报告】行泊一体低、中、高算力平台,谁能率先突围?

行泊一体是大势所趋&#xff0c;且正分层发展&#xff0c;这是业内已有的共识。但对身处其中的竞争者&#xff0c;更重要且更难的显然为踏准市场节奏&#xff0c;从而用既有的资源取舍布局&#xff0c;最终吃下窗口期爆发红利&#xff0c;在细分赛道中脱颖而出。 高工智能汽车…

[Hadoop]数据仓库基础与Apache Hive入门

目录 大数据导论与Linux基础 Apache Hadoop、HDFS 大数据导论与Linux基础 数据仓库基本概念 数据仓库概念 数据仓库主要特征 数据仓库主流开发语言--SQL Apache Hive入门 Apache Hive概述 场景设计&#xff1a;如何模拟实现Hive功能 Apache Hive架构、组件 Apache H…

Python实现ACO蚁群优化算法优化卷积神经网络分类模型(CNN分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 蚁群优化算法(Ant Colony Optimization, ACO)是一种源于大自然生物世界的新的仿生进化算法&#xff0c…

深入理解 go sync.Waitgroup

本文基于 Go 1.19。 go 里面的 WaitGroup 是非常常见的一种并发控制方式&#xff0c;它可以让我们的代码等待一组 goroutine 的结束。 比如在主协程中等待几个子协程去做一些耗时的操作&#xff0c;如发起几个 HTTP 请求&#xff0c;然后等待它们的结果。 WaitGroup 示例 下面…

CH32V3xx USART 空闲中断+DMA接收

目录 1、CH32V3xx USART简介2、测试程序2.1 USART 初始化配置2.1 发送函数2.1 接收中断1、CH32V3xx USART简介 CH32V3xx系列MCU包含3个同步异步收发器(USART1、2、3)和5个通用异步收发器(UART4、5、6、7、8)。USART模块支持DMA功能,DMA可以实现快速连续收发。使用DMA发送时…

windows安装pcl

文章目录 vcpkg方式安装默认安装x86默认没安装cloud_viewer.h AllInOne安装pcl的官方例程 vcpkg方式安装 官方建议在windows下&#xff0c;采用vcpkg的方式来安装&#xff1a; 安装vcpkg的&#xff0c;可以看这里&#xff1a;【WIN安装vcpkg】 默认安装x86 要注意的是 vcpkg…

品牌线上推广:如何进行电商控价?

随着电商平台的迅速崛起&#xff0c;电商控价已经成为了一个十分重要的话题。所谓电商控价&#xff0c;是指在电子商务平台上&#xff0c;品牌方针对自己的产品进行价格的控制&#xff0c;以确保产品的售价不被平台和第三方商家恶意砍价而影响品牌形象和盈利。那么&#xff0c;…

iptables 防火墙(二)SNAT/DNAT

目录 一&#xff1a;SNAT原理与应用 1.SNAT介绍 2.SNAT 应用环境 3.SNAT原理 二&#xff1a;SNAT配置 第一步&#xff1a;设置各个端口的网卡 1.先准备客户机、web服务器、网关服务器 2.网关服务器设置 &#xff08;1&#xff09;添加网卡 &#xff08;2&#xff09;修…

10分钟!Python写一个角色扮演带上下文功能的chatgpt聊天机器人!上篇!

大家都在网页上玩ChatGPT玩的不亦乐乎&#xff0c;但是很多时候我们需要打造个人专属的GPT&#xff0c;比如我是律师&#xff0c;我是医生&#xff0c;我是营养师&#xff0c;我是财会&#xff0c;我是猎头&#xff0c;我需要专属的某个领域的GPT&#xff0c;其实也不难。 今天…