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

在ROS中实现消息通信和服务通信Python

在ROS中实现消息通信和服务通信,需创建功能包并编写相应代码。以下是详细步骤:

1. 创建工作空间和功能包

# 创建并初始化工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make# 创建功能包(添加必要依赖)
cd src
catkin_create_pkg msg_pkg_demo roscpp rospy std_msgs message_generation message_runtime

2. 创建自定义消息和服务

# 创建msg和srv目录
cd msg_pkg_demo
mkdir msg srv# 创建消息文件 msg/DemoMsg.msg
echo -e "string content\nint32 id" > msg/DemoMsg.msg# 创建服务文件 srv/DemoSrv.srv
echo -e "string request\n---\nstring response" > srv/DemoSrv.srv

在这里插入图片描述

3. 修改配置文件

package.xml 添加:

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

CMakeLists.txt 修改:

# 添加message_generation
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)# 声明消息/服务
add_message_files(FILES DemoMsg.msg)
add_service_files(FILES DemoSrv.srv)# 生成消息
generate_messages(DEPENDENCIES std_msgs)# 添加运行时依赖
catkin_package(CATKIN_DEPENDS message_runtime roscpp rospy
)

4. 编写节点代码

创建 scripts 目录存放Python节点:

mkdir scripts
发布者节点 (scripts/publisher.py)
#!/usr/bin/env python
import rospy
from msg_pkg_demo.msg import DemoMsgdef publisher():pub = rospy.Publisher('demo_topic', DemoMsg, queue_size=10)rospy.init_node('publisher_node', anonymous=True)rate = rospy.Rate(1)  # 1Hzmsg_id = 0while not rospy.is_shutdown():msg = DemoMsg()msg.content = "Hello ROS!"msg.id = msg_idpub.publish(msg)rospy.loginfo(f"Published: {msg.content} ID: {msg.id}")msg_id += 1rate.sleep()if __name__ == '__main__':try:publisher()except rospy.ROSInterruptException:pass
订阅者节点 (scripts/subscriber.py)
#!/usr/bin/env python
import rospy
from msg_pkg_demo.msg import DemoMsgdef callback(data):rospy.loginfo(f"Received: {data.content} ID: {data.id}")def subscriber():rospy.init_node('subscriber_node', anonymous=True)rospy.Subscriber('demo_topic', DemoMsg, callback)rospy.spin()if __name__ == '__main__':subscriber()
服务端节点 (scripts/server.py)
#!/usr/bin/env python
import rospy
from msg_pkg_demo.srv import DemoSrv, DemoSrvResponsedef handle_request(req):rospy.loginfo(f"Request: {req.request}")return DemoSrvResponse(f"Processed: {req.request}")def server():rospy.init_node('service_server')s = rospy.Service('demo_service', DemoSrv, handle_request)rospy.loginfo("Service Ready")rospy.spin()if __name__ == '__main__':server()
客户端节点 (scripts/client.py)
#!/usr/bin/env python
import rospy
from msg_pkg_demo.srv import DemoSrvdef service_client():rospy.wait_for_service('demo_service')try:demo_service = rospy.ServiceProxy('demo_service', DemoSrv)resp = demo_service("Test Request")rospy.loginfo(f"Response: {resp.response}")except rospy.ServiceException as e:rospy.logerr(f"Service call failed: {e}")if __name__ == '__main__':rospy.init_node('service_client')service_client()

5. 设置执行权限

chmod +x scripts/*.py

6. 编译并测试

# 编译工作空间
cd ~/catkin_ws
catkin_make# 加载环境
source devel/setup.bash
测试消息通信

终端1:发布者

rosrun msg_pkg_demo publisher.py

终端2:订阅者

rosrun msg_pkg_demo subscriber.py
测试服务通信

终端1:服务端

rosrun msg_pkg_demo server.py

终端2:客户端

rosrun msg_pkg_demo client.py

预期输出

  • 发布者终端:每秒输出 Published: Hello ROS! ID: [递增数字]
  • 订阅者终端:实时显示接收到的消息内容
  • 服务端终端:显示 “Service Ready” 和客户端请求内容
  • 客户端终端:显示服务端返回的响应字符串

关键说明

  1. 消息/服务生成:ROS会在编译时自动生成Python/C++消息代码(位于devel/lib/python2.7/dist-packages/msg_pkg_demo
  2. 依赖关系
    • message_generation:编译时生成消息
    • message_runtime:运行时依赖
  3. 通信类型
    • 话题通信:异步发布/订阅(publisher.pysubscriber.py
    • 服务通信:同步请求/响应(client.pyserver.py

通过此实现,您已完整演示了ROS中的消息通信(话题)和服务通信机制。可根据需要扩展消息/服务数据结构或节点逻辑。

http://www.xdnf.cn/news/916597.html

相关文章:

  • 【图像处理基石】如何构建一个简单好用的美颜算法?
  • 【win | docker开启远程配置】使用 SSH 隧道访问 Docker的前操作
  • 手拉手处理RuoYi脚手架常见文问题
  • win11系统 Docker Desktop 突然提示Docker Engine stopped解决情况之一
  • CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
  • 【Linux】系统部分——进程控制
  • 使用 Python + SQLAlchemy 创建知识库数据库(SQLite)—— 构建本地知识库系统的基础《一》
  • Python Cookbook-7.11 在 PostgreSQL 中储存 BLOB
  • github中main与master,master无法合并到main
  • 《绩效管理》要点总结与分享
  • SpringBoot 配置加载顺序?
  • AI驱动的B端页面革命:智能布局、数据洞察的底层技术解析
  • vue前端字典映射
  • 【数据分析】探索婴儿年龄变化对微生物群落(呼吸道病毒和细菌病原体)结构的影响
  • opencv_stereoRectify源码解析
  • 辊式矫平机:金属板材的“整形大师”
  • 18-Oracle 23ai JSON二元性颠覆传统
  • Github 2025-06-07 Rust开源项目日报Top10
  • ThingsCloud事物云平台搭建-微信小程序
  • Python Cookbook-7.12 在 SQLite 中储存 BLOB
  • WPF学习PropertyChanged
  • 【工具教程】PDF电子发票提取明细导出Excel表格,OFD电子发票行程单提取保存表格,具体操作流程
  • Xilinx FPGA MIPI DSI TX Subsystem 仿真笔记
  • 向日葵远程控制debian无法进入控制画面的解决方法
  • 征文投稿:如何写一份实用的技术文档?——以软件配置为例
  • PHP文件包含漏洞详解:原理、利用与防御
  • 低代码平台前端页面表格字段绑定与后端数据传输交互主要有哪些方式?华为云Astro在这方面有哪些方式?
  • R语言AI模型部署方案:精准离线运行详解
  • Ubuntu2404 下搭建 Zephyr 开发环境
  • 【JVM】Java虚拟机(二)——垃圾回收