前言
《Ros机器人编程实践》第三章例程二定义虚数数据类型。
实现过程
创建工作区参见上一章博客: ros机器人编程实践(3.1)-将消息发布在话题上 先看下basic包的文件结构:
cd ~/catkin_ws/src/basic
ls
tree
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