当前位置: 首页 > news >正文

ros2 服务创建与调用范例 python

以下是ROS2中服务创建与调用的Python完整范例,包含服务接口定义、服务端/客户端实现及配置文件:

1. 服务接口定义

srv目录下创建AddTwoInts.srv文件:

int64 a
int64 b
---
int64 sum

2. 服务端实现 (add_two_ints_server.py)

from example_interfaces.srv import AddTwoInts
import rclpy
from rclpy.node import Nodeclass ServiceServer(Node):def __init__(self):super().__init__('add_two_ints_server')self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.handle_request)self.get_logger().info("Service ready")def handle_request(self, request, response):response.sum = request.a + request.bself.get_logger().info(f"Request: {request.a} + {request.b}")return responsedef main():rclpy.init()node = ServiceServer()rclpy.spin(node)rclpy.shutdown()if __name__ == '__main__':main()

3. 客户端实现 (add_two_ints_client.py)

from example_interfaces.srv import AddTwoInts
import rclpy
from rclpy.node import Node
from rclpy.executors import MultiThreadedExecutorclass ServiceClient(Node):def __init__(self):super().__init__('add_two_ints_client')self.cli = self.create_client(AddTwoInts, 'add_two_ints')while not self.cli.wait_for_service(timeout_sec=1.0):self.get_logger().info("Waiting for service...")self.req = AddTwoInts.Request()def send_request(self, a, b):self.req.a = aself.req.b = bself.future = self.cli.call_async(self.req)rclpy.spin_until_future_complete(self, self.future)return self.future.result()def main():rclpy.init()node = ServiceClient()response = node.send_request(5, 3)node.get_logger().info(f"Result: {response.sum}")rclpy.shutdown()if __name__ == '__main__':main()

4. 配置文件 (setup.py)

from setuptools import setup
from glob import globpackage_name = 'py_srvcli'setup(name=package_name,version='0.0.0',packages=[package_name],data_files=[('share/ament_index/resource_index/packages', ['resource/' + package_name]),('share/' + package_name, ['package.xml']),],install_requires=['setuptools'],zip_safe=True,entry_points={'console_scripts': ['server = py_srvcli.add_two_ints_server:main','client = py_srvcli.add_two_ints_client:main',],},
)

5. 编译与运行

# 编译
colcon build --packages-select py_srvcli# 启动服务端
source install/setup.bash
ros2 run py_srvcli server# 启动客户端
ros2 run py_srvcli client

关键点说明

  1. 服务接口:通过.srv文件定义结构,ROS2自动生成Python接口
  2. 服务端
    • 使用create_service创建服务
    • 回调函数处理请求并返回响应
  3. 客户端
    • 使用create_client创建客户端
    • call_async异步发送请求
    • spin_until_future_complete等待响应
  4. 配置:通过setup.py注册可执行节点

常见问题处理

  • 服务未找到:检查服务名是否一致(如add_two_ints
  • 编译失败:确保package.xml包含<exec_depend>python_srvcli</exec_depend>
  • 运行时错误:使用rqt_graph检查节点连接状态

通过以上步骤,您可实现ROS2中基于Python的服务通信。实际开发中,可根据需求自定义服务接口(如修改.srv文件)并扩展处理逻辑。

http://www.dtcms.com/a/462161.html

相关文章:

  • MySQL InnoDB存储引擎缓存刷盘CheckPoint技术底层实现原理详细介绍
  • nginx rewrite if 浏览器分离 防盗链
  • 网站规划文档知乎关键词搜索排名
  • 订餐网站模板下载三亚市住房和城乡建设局网站
  • IT 服务自动化的时代:让效率与体验共进
  • 【学习篇】什么是分布式系统
  • paper.js 实现图片简单框选标注功能
  • 磁悬浮轴承的非线性特性深度解析:从理论到实践的挑战与突破
  • 怎样设计网站静态页面我要发布招聘信息
  • Shape-Guided Diffusion with Inside-Outside Attention
  • MySQL实战篇1:慢查询优化实战-4道题的真实优化记录
  • 怎样建立自己的网站卖东西个人网站备案填写要求
  • term.everything‌ 通过终端运行任意GUI应用程序
  • 去噪自编码器(DAE)
  • 形象设计公司网站建设方案书营销公司的营业范围
  • 关于网站备案的44个问题wordpress 发表文章
  • 做网站定金是多少网站开发项目外包
  • 中国制造网官方网站入口网址秦皇岛黄页大全秦皇岛本地信息网
  • Linux 文件打开函数 `open()` 深入解析
  • ESP8266实现mqtt
  • 初识MYSQL —— 表的约束
  • mysql存储微信Emoji表情问题
  • DzzOffice 通知功能(notification_add)调用
  • 西安手机网站建设公司排名安徽房产网站建设
  • 杭州强龙网站建设电话广西桂林天气预报7天
  • autosar
  • LinkMate 智能会议室系统:基于 Qt / QML / WebRTC / FFmpeg / Whisper / OpenGL 的实时音视频会议平台
  • JavaScript编程工具有哪些?老前端的实用工具清单与经验分享
  • 企业营销网站服务器1g够wordpress 电影网站
  • 360°全景视频 数据集Dataset