话题实现了一种发布/订阅(publish/subscribe)的通讯机制,这是一种在分布式系统中常用的数据交换的方式。下面将进行话题的创建。
1.建立工作空间并创建软件包
首先通过下述命令建立工作空间并在其中创建新的软件包。
mkdir -p ws_name/src
cd ws_name
catkin_make
echo 'source ~/ws_name/devel/setup.bash'>>~/.bashrc
cd src
catkin_create_pkg package_name rospy std_msgs #创建包并添加相关依赖项
2.新建发布节点(publisher)
创建完成后在package_name的包下面新建scripts文件夹后通过subl XXX.py(sublime编辑器)或gedit XXX.py创建可执行文件。
#! /usr/bin/env python
import rospy
from std_msgs.msg import Int32 #从std_msgs标准库中导入Int32数据类型
rospy.init_node('rospub') #初始化节点
rate = rospy.Rate(2) #设置发布频率,单位Hz,此处为每秒发送两次
pub = rospy.Publisher('publish',Int32,queue_size = 1) #实例化publisher,向话题‘topic’发布Int32类型的数据
while not rospy.is_shutdown():
count = rospy.get_rostime() #获得系统运行时间
pub.publish(count.secs) #发布secs
rate.sleep() #按rate设置的发布频率休眠
注意:
1.#!/usr/bin/env python这一行表明这是一个python程序,将发送给python解释器,如果没有这一行,会出现‘import: not authorized `os' @ error/constitute.c/WriteImage/1028’这个错误代码。
2.话题的通讯方式是一种异步通讯,queue_size表示消息丢失前的最大序列长度,queue_size = 0表示buffer无线长,容易耗尽内存,queue_size = 1~10适用于只取最新值的情况,queue_size>10适用于需要记录这些值的情况。
3.rospy.get_rostime()获取的值是time类型的,查看这个msg的内容可以通过下面的命令进行查看。
rosmsg show Time
3.新建接收节点(subscriber)
#! /usr/bin/env python
import rospy
from std_msgs.msg import Int32
rospy.init_node('subscriber')
def callback(msg): #定义回调函数
print msg.data #msg是Int32类型的,通过rosmsg show命令查看后发现Int32类型下面有data,用于存储数据
sub = rospy.Subscriber('publish',Int32,callback)
rospy.spin()
4.运行节点
新建完上述两个节点后,通过权限命令给两个程序执行的权限。
sudo chmod u+x XXX.py
在此基础上编译工作空间。
cd ws_name
catkin_make
最后在不同的terminal中运行roscore和两个节点即可完成通讯。
roscore
rosrun package_name publisher.py
rosrun package_name subscriber.py
1.新建消息文件
cd ws_name/src
catkin_create_pkg newmsg std_msgs rospy
cd newmsg
mkdir msg
cd msg
subl complex.msg
向新建的消息文件中添加消息类型并保存,此处我们可以用复数为例。
float32 real #实部
float32 imaginary #虚部
2.修改package.xml
因为需要message_generation生成C++或Python能使用的代码,所以向package.xml文件中添加如下两行:
message_generation
message_runtime
3.修改CMakeLists.txt
CMakeLists.txt中有四个地方需要修改:
(1)向find_package()中添加message_generation
find_package(catkin REQUIRED COMPONENTS
message_generation
rospy
std_msgs
)
(2)向add_message_files()中添加complex.msg
add_message_files(FILES
complex.msg
)
(3)去掉generate_messages()注释
generate_messages(DEPENDENCIES
std_msgs
)
(4)向catkin_package()添加message_runtime
catkin_package(
CATKIN_DEPENDS
message_runtime)
至此完成新消息的创建,回到工作空间执行catkin_make后即可在python程序中引入新消息。
from newmsg.msg import complex #make之后会产生一个与包名相同的msg文件,从中import需要的消息类型即可