注意:在自定义话题消息之前,需要先创建工作空间和功能包,具体操作过程可前往目录“ROS第4课 创建工作空间与功能包”查看文档。
自定义话题消息的具体操作步骤如下:
注意:若出现提示“No such package/stack ‘beginner_hiwonder’”,即功能包不存在于环境变量ROS_PACKAGE_PATH中,具体解决方法可前往目录“ ROS第4课 创建工作空间与功能包”查看文档,解决此问题后,请重复一次当前步骤的操作。
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”,并按下回车,查看写入的消息字段能否被系统识别。当出现下图红框所示字样,即代表识别成功。
#!/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赋予可执行权限。
注意:
1) 需要先启动发布者节点,订阅者节点才可订阅消息;
2) 若需完全接收发布者消息,可以先启动订阅者节点,再启动发布者节点。