ROS第 7 课 话题消息的自定义与使用

发布时间:2024年01月17日

第 7 课 话题消息的自定义与使用

1.自定义话题消息


注意:在自定义话题消息之前,需要先创建工作空间和功能包,具体操作过程可前往目录“ROS第4课 创建工作空间与功能包”查看文档。


自定义话题消息的具体操作步骤如下:

  1. 打开命令行终端。
  2. 输入进入功能包所在目录的指令“roscd beginner_hiwonder”,并按下回车。
    在这里插入图片描述

注意:若出现提示“No such package/stack ‘beginner_hiwonder’”,即功能包不存在于环境变量ROS_PACKAGE_PATH中,具体解决方法可前往目录“ ROS第4课 创建工作空间与功能包”查看文档,解决此问题后,请重复一次当前步骤的操作。


  1. 输入指令“mkdir msg”,并按下回车,新建用于存放文本文件的文件夹“msg”。
    在这里插入图片描述
  2. 输入指令“cd msg”,回车。
    在这里插入图片描述
  3. 输入指令“vi Person.msg”编辑程序,复制下面程序。如需修改,再按下“i”即可修改。修改完成,按下“Esc”,输入“:wq”保存并退出。
    在这里插入图片描述
string name
uint8 age
uint8 sex

uint8 unknown = 0
uint8 male = 1
uint8 female = 2

在这里插入图片描述
6) 输入“vi package.xml”,复制下面程序,在下图所示位置添加功能包依赖。如需修改,再按下“i”即可修改。修改完成,按下“Esc”,输入“:wq”保存并退出。
在这里插入图片描述
7) 在下图所示位置添加功能包依赖:

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

在这里插入图片描述
8) 输入“vi CMakeLists.txt”,再按下“i”,修改“CMakeLists.txt”文件。
在这里插入图片描述
9) 在下图所示位置添加所需的编译选项“message_generation”。
在这里插入图片描述
10) 找到下图所示代码,将红框部分进行反注释,并添加所需的编译选项“Person.msg”。
在这里插入图片描述
在这里插入图片描述
11) 找到下图所示代码,将红框部分进行反注释,确保所需的编译选项生效。
在这里插入图片描述
在这里插入图片描述
12) 找 到 下 图 所 示 代 码 , 将 红 框 部 分 进 行 反 注 释 , 并 添 加 所 需 的 编 译 选 项“message_runtime”。
在这里插入图片描述
在这里插入图片描述
13) 修改完成,按下“Esc”,输入“:wq”保存并退出。
在这里插入图片描述
14) 输入指令“rosmsg show beginner_hiwonder/Person”,并按下回车,查看写入的消息字段能否被系统识别。当出现下图红框所示字样,即代表识别成功。
在这里插入图片描述

2.话题消息的使用

2.1 创建发布者和订阅者代码

  1. 打开命令行终端。
  2. 输入进入功能包所在目录的指令“roscd beginner_hiwonder”,并按下回车。
    在这里插入图片描述
  3. 输入指令“cd scripts”,并按下回车,进入用于存放Python脚本的文件夹“scripts”。
    在这里插入图片描述
  4. 输入指令“vi person_publisher.py”编辑程序,复制下面程序。如需修改,再按下“i”即可修改。修改完成,按下“Esc”,输入“:wq”保存并退出
    在这里插入图片描述
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该脚本为ROS节点,用于发布名为/person_info的话题,消息类型为自定义的beginner_hiwonder::Person

# 导入ROS的python库
import rospy
# 从自定义的beginner_hiwonder包中导入Person消息类型
from beginner_hiwonder.msg import Person

# 定义节点的主函数
def velocity_publisher():
    # 初始化ROS节点,命名为'person_publisher',anonymous=True表示自动在节点名后添加随机数防止节点名冲突
    rospy.init_node('person_publisher', anonymous=True)
    
    # 创建一个Publisher,它会发布/person_info话题,消息类型为Person,队列长度设置为10
    person_info_pub = rospy.Publisher('/person_info', Person, queue_size=10)
    
    # 设置发布消息的频率,这里是10Hz
    rate = rospy.Rate(10)
    
    # 当ROS没有被外部关闭,即正常运行时
    while not rospy.is_shutdown():
        # 初始化Person消息类型的实例
        person_msg = Person()
        # 设置消息字段,这里发布的消息包含名字Tom,年龄18,性别为male(假设在Person消息定义中0代表male)
        person_msg.name = "Tom"
        person_msg.age = 18
        person_msg.sex = Person.male

        # 发布Person信息到/person_info话题
        person_info_pub.publish(person_msg)
        # 在终端打印日志信息,显示被发布的消息内容
        rospy.loginfo("Publsh person message[%s, %d, %d]", person_msg.name, person_msg.age, person_msg.sex)
        # 休眠一段时间以符合发布频率,即10Hz
        rate.sleep()
        
# Python的主函数入口
if __name__ == '__main__':
    try:
        # 尝试运行velocity_publisher函数
        velocity_publisher()
    except rospy.ROSInterruptException:
        # 如果运行时出现中断异常(如按Ctrl+C),则不做任何操作,这是ROS的常规操作方式
        pass

在这里插入图片描述
5) 输入指令“vi person_subscriber.py”编辑程序,复制下面程序。如需修改,再按下“i”即可修改。修改完成,按下“Esc”,输入“:wq”保存并退出。
在这里插入图片描述

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 这是一个ROS订阅者脚本,用于订阅/person_info话题,消息类型为自定义的beginner_hiwonder::Person

# 导入ROS的python接口模块
import rospy
# 从自定义的beginner_hiwonder包导入Person消息类型
from beginner_hiwonder.msg import Person

# 定义订阅消息时的回调函数
def personInfoCallback(msg):
    # 打印接收到的消息,包含姓名、年龄和性别
    rospy.loginfo("Subcribe Person Info: name:%s age:%d sex:%d", msg.name, msg.age, msg.sex)
    
# 定义订阅者节点的主函数
def person_subscriber():
    # 初始化ROS节点,节点名为'person_subscriber',anonymous=True确保节点名唯一
    rospy.init_node('person_subscriber', anonymous=True)
    
    # 创建一个Subscriber,订阅名为/person_info的话题,消息类型为Person,当有消息到达时调用personInfoCallback函数
    rospy.Subscriber("/person_info", Person, personInfoCallback)
    
    # rospy.spin()的作用是当节点正在运行时,不会退出程序,而是等待并执行回调函数
    rospy.spin()
    
# Python程序执行的入口点
if __name__ == '__main__':
    # 执行订阅者节点的主函数
    person_subscriber()

在这里插入图片描述
6) 输入指令“chmod +x person_publisher.py”回车,为保存的person_publisher.py赋予可执行权限。
在这里插入图片描述
7) 输入指令“chmod +x person_subscriber.py”回车,为保存的person_publisher.py赋予可执行权限。
在这里插入图片描述

2.2 运行发布者和订阅者节点

  1. 输入指令“cd ~/catkin_ws”,并按下回车,进入catkin工作空间。
    在这里插入图片描述
  2. 输入指令“catkin_make”,并按下回车,构建目录中所有的功能包。
    在这里插入图片描述
  3. 输入指令“source ./devel/setup.bash”,并按下回车,刷新工作空间的环境。
    在这里插入图片描述
  4. 输入指令“roscore”,启动节点管理器。
    在这里插入图片描述
    若已开启,则会出现以下提示:
    在这里插入图片描述
  5. 输入指令“rosrun beginner_hiwonder person_publisher.py”,并按下回车,运行发布者节点。如需停止节点的运行,可按下快捷键“Ctrl+C”。
    在这里插入图片描述
  6. 打开一个新的命令行终端,输入指令“rosrun beginner_hiwonder person_subscriber.py”,并按下回车,运行订阅者节点。如需停止节点的运行,可按下快捷键“Ctrl+C”。
    在这里插入图片描述

注意:
1) 需要先启动发布者节点,订阅者节点才可订阅消息;
2) 若需完全接收发布者消息,可以先启动订阅者节点,再启动发布者节点。


文章来源:https://blog.csdn.net/m0_73841621/article/details/135645628
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。