3.创建ROS工作空间、创建功能包和python实现topic通信

本文详细介绍了如何在ROS(Robot Operating System)环境中使用Python实现topic通信,包括创建工作空间、功能包,发布std_msgs/String消息,以及接收消息的步骤。通过实例演示,读者将掌握ROS的基本topic操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、创建ROS工作空间

  1. 在/home/USENAME/目录下创建一个ros文件夹,以后所有的ros工作空间都放在该文件夹下。
    mkdir ros && cd ros
  2. 创建工作空间文件夹,这里相当于Java或者C++的工程根目录。
    mkdir -p my_ws/src && cd my_ws/src
  3. 初始化工作空间catkin_init_workspace,src目录下会出现一个cmake文件。
    在这里插入图片描述
  4. 编译工作空间cd .. && catkin_make,编译成功之后有三个文件夹:
  • build:存放在工作空间编译过程中产生的文件。
  • devel:存放编译生成的库和脚本。
  • src:存放功能包。
    在这里插入图片描述
  1. 刷新当前环境变量source devel/setup.bash,在当前终端下运行rosrun命令就可以直接找到==在/my_ws/src/目录==下的功能包。如果不想每次打开终端都要source一下,可以把上面的source命令写到/.bashrc文件的最后一行。
    sudo gedit ~/.bashrc
    在这里插入图片描述

二、创建功能包

  1. catkin_create_pkg命令在/my_ws/src/目录下创建一个名为my_pkg的功能包。这个功能包依赖功能包有roscpp:c++ rospy:python std_msgs:ros的标准消息格式
    catkin_create_pkg my_pkg roscpp rospy std_msgs
    在这里插入图片描述
  2. 创建成功之后,功能包目录下有上述四个文件。
  • include:一般用来存放h/hpp头文件。
  • src:一般用来存放C++代码。
  • CMakeList.txt:该功能包的cmake文件。
  • package.xml:和名字一样,存该功能包依赖的包的信息、当前功能包功能 的描述、版本等。
  1. 重新编译当前工作空间cd ../../ && catkin_make,编译信息会提示当前工作空间多了一个功能包。
    在这里插入图片描述

三、实现topic发布

  1. 进入刚刚创建的工作空间下,创建scripts文件夹来存放python脚本。mkdir scripts
  2. 在Ubuntu下,可以直接从vscode官网下载vscode来写python代码。下面的代码全部参考自B站【古月居】。https://www.bilibili.com/video/BV1zt411G7Vn?from=search&seid=16218413685944115930
  3. 我们创建一个名字为my_publisher.py的python脚本来发布ros标准消息库里的std_msgs/String类型的消息。
  • from std_msgs.msg import String导入String类型消息格式。
  • rospy.init_node('my_publisher', anonymous=True)初始化发布者节点。
  • my_topic = rospy.Publisher('/my_topic', String, queue_size=10)创建一个topic话题,缓冲队列的长度是10个msg。
  • rate = rospy.Rate(1)表示发送msg的频率,单位是hz。
  • 查看String的消息格式是:在这里插入图片描述
    -my_topic.publish(string_msg)向topic中发布msg。
#!/usr/bin/python2.7
#-*- coding:UTF-8 -*-

# 导入ros的python依赖
import rospy
from std_msgs.msg import String

def my_publisher():
    # Ros 节点初始化
    rospy.init_node('my_publisher', anonymous=True)

    # 创建一个Publisher,发布名为/my_topic,消息类型为std_msgs/String,队列长度 10
    my_topic = rospy.Publisher('/my_topic', String, queue_size=10)

    # 设置循环的频率
    rate = rospy.Rate(1)

    while not rospy.is_shutdown():
        # 初始化 std_msgs/String 类型的 msg 对象
        string_msg = String()
        string_msg.data = 'This is my_publisher.'

        # 发消息
        my_topic.publish(string_msg)
        rospy.loginfo("Publish String message %s", string_msg)
        
        # 按照循环频率延时
        rate.sleep()

if __name__ == '__main__':
    try:
        my_publisher()
    except rospy.ROSInterruptException:
        pass
        
  1. 把上面的python脚本的权限调整为可执行文件。
    在这里插入图片描述
    然后运行脚本rosrun my_pkg my_publisher.py
    在这里插入图片描述

四、实现topic的接收

步骤在代码中有注释。

  • ros中接收节点是要通过回调函数来接收从topic传来的msg并处理的。
  • 把python脚本的权限改为可执行。
#!/usr/bin/python2.7
#-*- coding:UTF-8 -*-

import rospy
from std_msgs.msg import String

def MyInfoCallback(msg):
    rospy.loginfo("Received String message %s", msg)

def my_subcriber():
    # ROS节点初始化
    rospy.init_node('my_subcriber', anonymous=True)

    # 创建一个Subcriber,订阅名为 /my_topic 的topic,注册回调函数 MyInfoCallback()
    rospy.Subscriber("/my_topic", String, MyInfoCallback)

    # 循环等待回调函数
    rospy.spin()


if __name__ == '__main__':
    my_subcriber()

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值