现在发布一个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文件中配置。