现在发布一个ROS本身未定义的消息
在std_msgs包定义拉一些基本的类型由这些类型数据构成的定长或变长数组在Python中处理后得到元组并且可以被设置成元组或列表
c++比python有更多的原生数据类型,这在从c++节点和python节点交换数据的时候产生一些问题,
例如在C++中一个8位无符号整数,在pyhton中被当作整数,这就意为着可以给他赋为负数或者大于255的值,当作为ROS消息发送时会被解释成8位无符号数值。
定义一个自定义类型的消息
假设发送随即的复数,复数包含实部和虚部,并且两部分都是浮点型
创建一个Complex.msg文件在basic包的msg目录下
Complex.msg
float32 real
float32 imaginary
消息被定义后需要在根目录下运行catkin_make进行编译,产生语言相关的代码,其中包含 了类型的定义,以及序列化和反序列化的相关的代码,这将能够在任何ROS支持的语言使用这一消息类型。
为了让ROS 产生相关的消息代码,我们需要确保已经告知构建系统新消息的定义
可以通过向package.xml文件添加下以下代码来实现:
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_time> ##书上给出的这一条在运行时出现了错误并提醒改称:<exec_depend>rmessage_runtime</exec_depend>
然后需要更改下CmakeLists.txt文件
1
find_package(catkin REQUIRED COMPONENTS
rospy
roscpp
std_msgs
message_generation
)
添加了message_generation这样catkin知道去哪里寻找这个包
2
catkin_package(
CATKIN_DEPENDS message_runtime
)
在catkin_package()调用末尾加message_runtime 告知catkin我们将在运行时使用消息
3
add_message_files(
FILES
Complex.msg
)
在其末尾添加消息定义文件告知catkin我们想编译他
4
generate_messages(
DEPENDENCIES
std_msgs
)
将其前边的注释去掉,并写入消息依赖的所有依赖项
然后在工作空间的根目录下进行catkin_make进行编译
书上说会产生python类但没有找到
接下来消息的代码
发布者:
#!/usr/bin/env python
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()
订阅者:
#!/usr/bin/env python
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()
可以通过rosmsg命令查看某个消息的内容:
miao@openlib:~$ rosmsg show Complex
[basic/Complex]:
float32 real
float32 imaginary
rosmsg package 将会例举定义了消息的所有包
miao@openlib:~$ rosmsg package basic
basic/Complex
以上即为定义了新的数据类型,并且在消息中引用,如何在package.xml和CmakeLists.txt文件中配置。