ROS学习总结1-自定义消息并实现话题通讯(python)

话题实现了一种发布/订阅(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需要的消息类型即可

 

你可能感兴趣的:(ROS,python)