ROS通信机制——python实现

一、普通话题通信

1. 创建发布者

注意:不要在开头添加注释,下面代码第一行是指定编译器,第二行是防止因为代码中的中文注释而出现乱码

#! /usr/bin/env python  
#coding:utf-8

#导包
import rospy  
from std_msgs.msg import String

if __name__=="__main__":
    #初始化ROS节点
    rospy.init_node("talker")
    #创建发布者
    pub=rospy.Publisher("Matlab",String,queue_size=10)
    #创建消息类型
    msg=String()
    #设置发布排频率
    rate=rospy.Rate(1)
    count=0
    #休眠1秒,防止出现前面的数据没有接受到
    rospy.sleep(1)
    #循环发布数据,其中rospy.is_shutdown()的意思是只要节点关闭就返回true
    while not rospy.is_shutdown():
        count+=1
        #str(count)可以将count转变为字符串
        msg.data="hello"+str(count)
        pub.publish(msg)
        #rospy.loginfo()相当于C++版本里面的ROS_INFO()
        rospy.loginfo("I talk %s",msg.data)
        #休眠
        rate.sleep()

2. 创建订阅者

注意:不要在开头添加注释,下面代码第一行是指定编译器,第二行是防止因为代码中的中文注释而出现乱码

#! /usr/bin/env python  
#coding:utf-8

#导包
import rospy
from std_msgs.msg import String

def Callback(msg):
    rospy.loginfo("I hear %s",msg.data)

if __name__=="__main__":
    #初始化ROS节点
    rospy.init_node("listener")
    #创建订阅者
    sub=rospy.Subscriber("Matlab",String,Callback,queue_size=10)
    #回调函数
    #spin
    rospy.spin()

3.添加可执行权限

注意:一定要在scripts文件夹下打开终端

4. 编译配置

在Cmakelist中添加如下代码:

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

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

5. 执行

二、自定义话题通信

1. 准备工作

先写好自定义的消息,然后再编译,这时会生成相应的头文件。

打开lib下面的python2.7/dist-package....,鼠标放在这个文件上然后打开终端。

 在终端中输入pwd,然后赋值路径

将路径赋值到setting.json中的“python.autoComplete.extraPaths” 中,保存。

2. 编写发布者

#! /usr/bin/env python  
#coding:utf-8

#导包
import rospy
from learning_communication.msg import person

if __name__ == "__main__":
    #初始化节点
    rospy.init_node("talkermsg")
    #创建发布者
    pub=rospy.Publisher("Matlab",person,queue_size=10)
    #创建消息对象
    per=person()
    per.age=10
    per.name="zhangpeng"
    per.height=180
    #设置频率
    rate=rospy.Rate(1)
    while not rospy.is_shutdown():
        pub.publish(per)
        rospy.loginfo("I am talking %s %d %d",per.name,per.age,per.height)
        per.age+=1
        rate.sleep()

3. 编写接收者

#! /usr/bin/env python  
#coding:utf-8

import rospy
from learning_communication.msg import person

def Callback(per):
    rospy.loginfo("I hear %s %d %d",per.name,per.age,per.height)

if __name__ == "__main__":

    rospy.init_node("listenermsg")
    sub=rospy.Subscriber("Matlab",person,Callback,queue_size=10)
    rospy.spin()

4. 配置相关的文件

 在CmakeList中添加:

catkin_install_python(PROGRAMS
  scripts/talker.py
  scripts/listener.py
  scripts/talkermsg.py
  scripts/listenermsg.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

5. 添加可执行权限

注意:一定要在scripts文件夹下打开终端

6. 编译运行

### ROS通信机制详解及其与强化学习和Gazebo的集成 #### 1. ROS通信基础 ROS(Robot Operating System)提供了一种灵活的分布式架构来支持机器人系统的开发。其核心通信机制主要包括以下几个方面: - **节点 (Node)** 节点是ROS系统中的基本单元,每个节点都可以看作是一个独立运行的程序或进程[^3]。这些节点可以通过不同的方式相互通信。 - **主题 (Topic)** 主题是一种异步的消息传递机制,允许多个节点在同一主题上发布和订阅消息。这种模式非常适合实时数据流的应用场景,例如传感器数据传输或控制命令发送[^3]。 - **服务 (Service)** 服务提供了同步请求-响应式的通信方式。当一个节点需要立即获取另一个节点的结果时,可以使用服务来进行交互。这种方式通常用于低频次的任务处理,比如查询当前状态或者执行特定操作[^3]。 - **动作 (Action)** 动作为长时间运行的操作设计了一个更复杂的接口,它不仅包含了目标、反馈还有一旦完成后的结果报告功能。这对于那些耗时较长的动作特别有用,像路径规划或是机械臂运动等[^3]。 - **参数服务器 (Parameter Server)** 参数服务器用来存储全局可访问的数据项,在启动过程中配置好之后就可以在整个系统范围内被读取修改。这使得调整某些固定不变但又影响整个行为设定变得简单方便[^3]。 #### 2. ROS与Gazebo仿真环境的结合 Gazebo是一款强大的物理引擎模拟器,能够创建逼真的三维世界供机器人进行测试验证。通过插件形式嵌入到ROS生态体系当中后,两者紧密结合形成完整的闭环控制系统——即可以在虚拟环境中对真实硬件平台的行为做出精确预测并优化控制策略[^1]。 具体来说: - 用户能够在Gazebo内部加载各种类型的机器人模型; - 利用ROS话题和服务定义外部控制器如何与其互动; - 实现感知层至执行机构间所有环节的功能模拟; 这样做的好处在于降低了实验成本同时也提高了安全性,因为所有的尝试都在软件层面完成而无需担心损坏昂贵设备的风险。 #### 3. 强化学习在其中的作用 随着深度学习技术的发展,越来越多的研究者开始探索利用强化学习方法解决复杂任务下的自主决策问题。对于基于ROS构建起来的大规模多模态输入输出关系而言,这种方法显得尤为重要因为它可以直接从原始感官信号出发逐步摸索最优解法而不必预先假设太多关于环境的知识结构。 典型的工作流程如下所示: - 构建适合于目标任务特点的状态空间描述以及相应的奖励函数设计方案; - 将采集得到的经验样本存放到经验池里以便后续采样重放提高样本利用率; - 使用神经网络近似Q值或者其他价值估计量并通过梯度下降算法不断迭代更新直至收敛为止; 最后再把学到的政策迁移到真实的物理平台上继续微调适应实际情况差异即可。 ```python import rospy from std_msgs.msg import String def callback(data): rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data) def listener(): rospy.init_node('listener', anonymous=True) rospy.Subscriber("chatter", String, callback) rospy.spin() if __name__ == '__main__': listener() ``` 以上代码片段展示了一个简单的ROS节点例子,该节点会监听名为`chatter`的主题并将收到的信息打印出来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值