ROS1中使用Python发布和订阅主题

ROS是开发机器人应用的极具生产力的工具,最常用于概念开发、算法验证。在算法开发工具中,Python是一个极佳的选择,因为Python的工具包十分丰富,脚本语言的特性也使得无需编译,算法修改方便。

本文以ROS1为开发环境,以经典的Turtlesim的发布和订阅为例子,介绍用Python开发ROS机器人应用的步骤。例子中将实现用Python控制小乌龟的运动。

1. 操作系统Ubuntu18.04,安装ROS1、Python,网上安装教程很多,不再赘述。安装成功的标志是:终端中运行 roscore,不报错;终端中运行 python,不报错。

2. 通常安装ROS1后,会附带turtlesim功能包,在终端中运行 rosrun turtlesim turtlesim_node,会有一只很可爱的小乌龟出现在窗口中。

3. ROS1实际上就是实现了一个通信机制,发布/订阅是其中主要的一个通信形式。如果想查看有哪些主题在发布和订阅,可以通过命令,当然还有更直接的方式,就是用ROS1自带的rqt工具,在终端中运行 rqt,即出现可视化工具了。如果turtulesim还在运行的话,可以看到Topic中看到turtle1/cmd_vel这一主题,以及它的类型、刷新频率,这一主题实际上就是小乌龟的线速度、角速度指令了,如果去改一下数值,是可以在实际的Turtlesim窗口中观察到小乌龟的运动的。

4. 了解了ROS1的通信机制,那小乌龟的运动控制思路就很简单了:只要给相应的主题发指令就行了。我们的Python代码的目的也很明确了:新建一个节点 -> 连接到一个话题 -> 向话题发布信息。

就这么简单,下面就构建ROS1中的Python开发环境,用到caktin指令。

5. 在Ubuntu中新建文件夹,作为工作空间,文件夹下新建src文件夹,这很重要,编译时要找这个文件夹的。

6. 定位到src文件夹下,运行终端,输入命令 catkin_init_workspace,初始化工作空间。再输入命令 catkin_create_pkg demo rospy std_msgs,建立文件包,这里的demo是起的包的名字,请修改成你自己的包的名字。不出意外的话,src文件夹下自动出现了demo文件夹,下面有自动建立的一系列文件和文件夹。

7. 定位到src/demo文件夹下,新建scripts文件夹,这是python文件的存放位置,当然也可以放在别的位置,后面可以在CMakeLists文件中修改。在scripts文件夹下新建python文件,比如 talker.py。右键修改其属性为 Allow executing file as program,这一步很关键,否则后面运行会提示找不到可执行文件。

8. 双击打开,用文本编辑该文件。输入你的python程序,比如下面,注意检查语法中的缩进字符:

#! /usr/bin/env python

import rospy
from geometry_msgs.msg import Twist
import numpy as np

def talker():
    rospy.init_node('talker', anonymous=True)
    pub = rospy.Publisher('turtle1/cmd_vel', Twist, queue_size=10)
    rate = rospy.Rate(1) # 1hz
    while not rospy.is_shutdown():
        vel_msg = Twist()
        vel_msg.linear.x = 0.5 * np.random.uniform(-1, 1)
        vel_msg.angular.z = 0.2 * np.random.uniform(-1, 1)
        pub.publish(vel_msg)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass
 

9. 修改CMakeList.txt,主要是找到 catkin_install_python 这一重要信息,将它从注释中释放出来,并把my_python_script修改为你的python文件的地址。(看到第7步中建立scripts文件夹的意义了吧)

## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
 catkin_install_python(PROGRAMS
   scripts/my_python_script
   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
 )

10. 定位到工作空间根目录,在终端中运行命令 catkin_make demo,这里demo是包的名字。可以看到自动生成了一系列文件,build中存放的是可执行文件,devel中存放的是安装包。

11. 在终端中运行 source devel/setup.bash,这一步是将包的名字放到环境变量中,否则后面ROS会提示无法找到这个包。

12. 万事具备,来检验一下我们的环境是否搭建成功吧。首先运行 roscore,启动基础通信服务;然后运行 rosrun turtlesim turtlesim_node,启动小乌龟程序,该程序订阅了turtle1/cmd_vel主题;最后运行 rosrun demo talker.py,启动我们的python程序,程序将按照1Hz的频率向主题turtle1/cmd_vel发布数据。可以看到我们的小乌龟按照预期运动起来了!

13. python程序可以随时修改,但修改后要先 ctrl+c 结束运行,然后重新输入 rosrun demo talker.py,才可以执行新的程序。

其实gazebo仿真算法的思路也是类似的,主要就是用rqt找到相应的主题,然后订阅或发布数据给该主题。剩下就是python算法的设计了。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
ROS(Robot Operating System)是一个用于构建机器人应用程序的开源框架。它提供了一系列工具、库和约定,用于简化机器人软件开发的过程。ROS,多线程发布订阅是一常见的通信机制,用于实现不同节点之间的数据传。 在ROS发布者(Publisher)节点责将数据发布到特定的主题(Topic),而订阅者(Subscriber)节点则负责从主题接收数据。多线程发布订阅允许多订阅者同时接收来自同一个主题的数据,从而提高系统的并发性能。 在Python使用ROS进行多线程发布订阅,可以按照以下步骤进行: 1. 导入所需的ROS库和模块: ```python import rospy from std_msgs.msg import String ``` 2. 初始化ROS节点: ```python rospy.init_node('node_name') ``` 3. 创建发布者对象,并指定要发布主题和消息类型: ```python pub = rospy.Publisher('topic_name', String, queue_size=10) ``` 4. 创建订阅者回调函数,用于处理接收到的消息: ```python def callback(data): rospy.loginfo("Received: %s", data.data) ``` 5. 创建订阅者对象,并指定要订阅主题和消息类型,以及回调函数: ```python sub = rospy.Subscriber('topic_name', String, callback) ``` 6. 编写发布数据的逻辑,并使用发布者对象发布消息: ```python rate = rospy.Rate(10) # 设置发布频率为10Hz while not rospy.is_shutdown(): msg = "Hello ROS!" pub.publish(msg) rate.sleep() ``` 以上是使用ROS进行多线程发布订阅的基本步骤。通过创建发布者和订阅者对象,并在回调函数处理接收到的消息,可以实现节点之间的数据传输和通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangzq02

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值