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

第 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) 若需完全接收发布者消息,可以先启动订阅者节点,再启动发布者节点。


  • 46
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
ROS中,我们可以通过自定义消息类型来定义自己的话题消息。以下是一些ROS高级自定义话题消息的示例: 1. 多维数组消息类型 在ROS中,您可以通过定义多维数组消息类型来传递多维数据。例如,您可以定义一个名为“my_array”的消息类型,其中包含一个3x3的二维数组: ``` # my_array.msg float32[9] data ``` 这将定义一个名为“my_array”的消息类型,其中包含一个名为“data”的浮点数数组,大小为9。您可以使用以下代码在ROS中发布此消息类型: ```python import rospy from my_package.msg import my_array rospy.init_node('my_node') pub = rospy.Publisher('my_topic', my_array, queue_size=10) msg = my_array() msg.data = [1,2,3,4,5,6,7,8,9] pub.publish(msg) ``` 2. 自定义消息头 在ROS中,每个消息都具有一个消息头,其中包含有关消息的元数据(例如时间戳、帧ID等)。您可以通过定义自己的消息头来添加其他元数据。 例如,您可以定义一个名为“my_header”的消息头,其中包含一个名为“seq”的序列号和一个名为“frame_id”的帧ID: ``` # my_header.msg uint32 seq string frame_id ``` 然后,您可以将此消息头添加到您的自定义消息类型中: ``` # my_message.msg my_header header float32 data ``` 这将定义一个名为“my_message”的消息类型,其中包含一个名为“header”的消息头和一个名为“data”的浮点数。您可以使用以下代码在ROS中发布此消息类型: ```python import rospy from my_package.msg import my_header, my_message rospy.init_node('my_node') pub = rospy.Publisher('my_topic', my_message, queue_size=10) msg = my_message() msg.header.seq = 1 msg.header.frame_id = 'my_frame' msg.data = 3.14 pub.publish(msg) ``` 3. 嵌套消息类型 在ROS中,您可以将一个消息类型嵌套在另一个消息类型中,以创建更复杂的消息结构。 例如,您可以定义一个名为“my_point”的消息类型,其中包含x、y和z坐标,然后将其嵌套在名为“my_pose”的消息类型中,以表示一个3D位姿: ``` # my_point.msg float32 x float32 y float32 z # my_pose.msg my_point position my_point orientation ``` 这将定义一个名为“my_pose”的消息类型,其中包含名为“position”和“orientation”的两个嵌套的“my_point”消息类型。您可以使用以下代码在ROS中发布此消息类型: ```python import rospy from my_package.msg import my_point, my_pose rospy.init_node('my_node') pub = rospy.Publisher('my_topic', my_pose, queue_size=10) msg = my_pose() msg.position.x = 1.0 msg.position.y = 2.0 msg.position.z = 3.0 msg.orientation.x = 0.0 msg.orientation.y = 0.0 msg.orientation.z = 1.0 pub.publish(msg) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

命运从未公平

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

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

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

打赏作者

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

抵扣说明:

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

余额充值