前言

《Ros机器人编程实践》第三章例程二定义虚数数据类型。

实现过程

创建工作区参见上一章博客: ros机器人编程实践(3.1)-将消息发布在话题上   先看下basic包的文件结构:  
cd ~/catkin_ws/src/basic
ls
tree
    ok下面开始操作

1、创建我们的消息类型,也就是创建Complex.msg文件

cd ~/catkin_ws/src/basic
mkdir msg
cd msg
vi Complex.msg
  用vim编辑,先按键盘上的i进入输入模式,输入如下:     按Esc退出编辑模式,输入":wq"(注:引号内全部内容包括" : "),保存并退出。

2、编辑package.xml文件

cd ..
vi package.xml
  2.1、在 <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> 在这些build_depend附近加入:
  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>
  注意:如果是indigo版本的ros,exec_depend需要换成run_depend。   2.2 同上esc退出编辑模式,输入“:wq”保存并退出。    

3、编辑CMakeLists.txt文件

vi CMakeLists.txt
  3.1、修改find_package(),加上message_generation:   3.2修改catkin_package(),加上message_runtime:   3.3修改add_message_files(),加上Complex.msg:   3.4修改generate_message(),去掉系统生成时加上的注释:  

4、在basic包的src下添加message_publisher.py和message_subscriber.py文件:

cd src
vi message_publisher.py
vi message_subscriber.py
  分别把代码粘贴进去:   message_publisher.py  
#!/usr/bin/env python
import roslib; roslib.load_manifest('basic')
import rospy
from basic.msg import Complex

from random import random

rospy.init_node('message_publisher')

pub=rospy.Publisher('complex',Complex)

rate=rospy.Rate(2)

while not rospy.is_shutdown():
	msg=Complex()
	msg.real=random()
	msg.imaginary=random()
	pub.publish(msg)
	rate.sleep()

message_subscriber.py  
#!/usr/bin/env python
import roslib; roslib.load_manifest('basic')
import rospy
from basic.msg import Complex

def callback(msg):
	print 'Real:',msg.real
	print 'Imaginary',msg.imaginary
	print

rospy.init_node('message_subscriber')
sub = rospy.Subscriber('complex', Complex,callback)
rospy.spin()
 

5、打开一个终端运行roscore:

roscore
 

6、返回catkin_ws的根目录,catkin_make编译并运行pub脚本

cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun basic message_publisher.py
 

7、打开另一个终端,运行subscriber.py

rosrun basic message_subscriber.py
 

8、运行结果: