首页 > 其他分享 >ROS2 服务实例:探索与实践

ROS2 服务实例:探索与实践

时间:2024-12-05 14:29:14浏览次数:10  
标签:__ service 探索 self two add 实例 ints ROS2

文章目录


ROS2 服务实例:探索与实践

一、ROS2服务的基本概念

ROS2中的服务允许一个节点(服务服务器)接收来自另一个节点(服务客户端)的请求,并返回相应的响应。这种机制非常适合那些需要即时反馈的任务,如设置机器人参数、查询传感器状态等。服务通常由一个接口定义,包括请求和响应的消息类型,这些消息类型可以是ROS2中的任何标准或自定义消息。

二、创建ROS2服务实例

以下是一个简单的ROS2服务实例,用于演示如何创建一个服务服务器和一个服务客户端。

1. 定义服务接口

首先,我们需要在ROS2接口文件中定义服务的请求和响应消息类型。例如,创建一个名为AddTwoInts的服务,该服务接收两个整数作为请求,返回它们的和作为响应。

**add_two_ints.srv**
int64 a
int64 b
int64 sum

2. 实现服务服务器

服务服务器将监听来自客户端的请求,并计算两个整数的和。

**add_two_ints_server.py**
import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts
class AddTwoIntsServer(Node):
    def __init__(self):
        super().__init__('add_two_ints_server')
        self.service = self.create_service(AddTwoInts, 'add_two_ints', self.handle_add_two_ints)
        self.service_name = 'add_two_ints'
        self.get_logger().info(f'{self.service_name} service ready.')
    def handle_add_two_ints(self, request, response):
        response.sum = request.a + request.b
        self.get_logger().info(f'Returning [{request.a} + {request.b} = {response.sum}]')
        return response

def main(args=None):
    rclpy.init(args=args)
    add_two_ints_server = AddTwoIntsServer()
    rclpy.spin(add_two_ints_server)
    add_two_ints_server.destroy_node()
    rclpy.shutdown()
if __name__ == '__main__':
    main()

3. 实现服务客户端

服务客户端将发送请求给服务器,并接收响应。

**add_two_ints_client.py**
import sys
import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoInts
class AddTwoIntsClient(Node):
    def __init__(self):
        super().__init__('add_two_ints_client')
        self.service_proxy = self.create_client(AddTwoInts, 'add_two_ints')
        self.wait_for_service(self.service_proxy)
    def wait_for_service(self, service_proxy):
        while not service_proxy.wait_for_service(timeout=1.0):
            self.get_logger().info('Service not available, waiting again...')
    def call_service(self, a, b):
        req = AddTwoInts.Request()
        req.a = a
        req.b = b
        res = self.service_proxy.call(req)

        if res.sum == a + b:
            self.get_logger().info(f'Success: {a} + {b} = {res.sum}')
        else:
            self.get_logger().error(f'Failed: {a} + {b} != {res.sum}')
def main(args=None):
    rclpy.init(args=args)
    add_two_ints_client = AddTwoIntsClient()
    add_two_ints_client.call_service(10, 20)
    rclpy.shutdown()
if __name__ == '__main__':
    main()

三、运行实例

在ROS2工作空间中编译上述代码后,我们可以分别启动服务服务器和服务客户端。首先,在一个终端中运行服务服务器:
ros2 run your_package_name add_two_ints_server

然后,在另一个终端中运行服务客户端:
ros2 run your_package_name add_two_ints_client

如果一切正常,你应该会在客户端的输出中看到成功的消息,表明服务请求已被成功处理并返回了正确的响应。

标签:__,service,探索,self,two,add,实例,ints,ROS2
From: https://blog.csdn.net/u013050118/article/details/144230968

相关文章

  • ROS2 节点
    文章目录一、ROS2节点概述二、ROS2节点的特性ROS2节点一、ROS2节点概述ROS2节点是ROS2系统中的基本通信单元,它负责执行特定的任务,并与其他节点进行信息交换。每个节点都可以看作是一个独立的进程,拥有自己的生命周期和资源管理。通过节点的协作,ROS2系统能够完成复......
  • WPF笔记9——设置应用程序单实例运行
    设置WPF应用程序单实例运行**方式1:**///<summary>///InteractionlogicforApp.xaml///</summary>publicpartialclassApp:Application{///<summary>///程序启动///</summary>///<pa......
  • 探索实用的Java工具类
    1.排序有时需要对集合进行排序。此时可以使用Collections的sort方法。List<Integer>list=newArrayList<>();list.add(2);list.add(1);list.add(3);Collections.sort(list);//ASCSystem.out.println("ASC-排序后:"+list......
  • 医院综合后勤部门系统运维数智化的探索之路
    一、引言医院后勤运维管控智能化是当前医疗行业发展的重要趋势。随着科技的不断进步,医院的信息化建设也在日益深入。医院综合后勤部门作为医院信息化建设的关键力量,在后勤运维管控中发挥着越来越重要的作用。在当今时代,医院的规模不断扩大,医疗水平和服务质量持续提升,这也......
  • OceanBase 的探索与实践
    作者:来自vivo互联网数据库团队-XuShaohui本文总结了目前我们遇到的痛点问题并通过OceanBase的技术方案解决了这些痛点问题,完整的描述了OceanBase的实施落地,通过迁移到OceanBase实践案例中遇到的问题与解决方案让大家能更好的了解OceanBase功能与特性,最后总结了Oce......
  • 元类,类,实例调用__call__方法
    实例可以调用双下划线call方法;类也可以调用双下划线call方法,但二者有大的差别;实例调用双下划线call方法是在实例及类内部查找,如果没有,直接报错TypeError类调用双下划线call方法会在实例中查找元类(type)内部具有__call__方法1. 类调用触发元类的__call__:• 类的调用行为(MyClas......
  • js怎么实现一个类并实例化这个类?
    在JavaScript中,实现类和实例化类的方式随着ECMAScript的发展而演变。以下是几种常见的方法:1.ES6类语法(推荐)这是现代JavaScript中创建类和实例的首选方法,语法更清晰简洁,更接近传统面向对象语言。classPerson{constructor(name,age){this.name=name;......
  • 深入vendor_boot.img文件格式实例解析
    以mtk平台为例,分析android源码编译生成的vendor_boot.img的结构。vendor_boot包括boot.imgheader、kernel、ramdisk系统。    vendor_boot的文件头信息具体在lk阶段platform/common/include/bootimg.h可以看到:#defineVENDOR_BOOT_MAGIC"VNDRBOOT"#defineVEND......
  • 工业凹槽洗底问题 | 探索研讨
    前情概要在和同事研讨下述题目的解答时,碰到了一些困难,思路不太好把握,探索一番,做个记录。案例分析【2024高二周末训练题】一个工业凹槽的截面是一条抛物线的一部分,它的方程是\(x^2=4y\),\(y\in[0,10]\),在凹槽内放入一个清洁钢球(规则的球体),要求清洁钢球能擦净凹槽的最底部,则清......
  • rcu的实例、注意事项及原理讲解
    一、背景在之前的内核模块里获取当前进程和父进程的cmdline的方法及注意事项,涉及父子进程管理,和rcu的初步介绍-CSDN博客里我们讲到了如何在rcu锁保护的情况下获取一个进程的父进程的pid和comm,另外也贴了一张浓缩了rcu相关概念精华的整理的思维导图。这篇博客里,我们先不涉及rcu......