ROS提供了丰富的内建消息,std_msgs包定义了一些基本的类型。

具体例子

首先定义一个消息类型的文件叫做Complex

例Complex.msg

float32 real
float32 imaginary

Complex.msg文件位于basic包的msg目录中,定义了两个相同类型的值

一旦消息被定义了,我们就需要运行catkin_make命令和source devel/setup.bash命令来产生语言相关的代码,这能够使得我们可以用这些消息实现计算机 和其他平台的无缝通信。

为了让ROS生成语言相关的代码,我们需要确保已经告知构建系统新消息的定义。

需要向package.xml文件中添加以下代码来实现

<build_depend>message_generation<build_depend>
<exec_depend>message_runtime</run_depend>

接下来,我们需要更改CMakeLists.txt文件

更改如下

需要在fins_package()调用的末尾添加message_generation,这样catkin就知道了去那寻找message_generation包:
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)

告知catkin我们将运行时使用消息,即在catkin_package()调用末尾调加message_runtime catkin_package(
CATKIN_DEPENDS message_runtime
)
在add_message_flies()调用的末尾调加消息定义文件Complex.msg来告知catkin我们要编译它
add_message_files(
FILES
Complex.msg
)

最后在CMakeLists.txt文件中,需要确保去掉generation_message()调用的注释,并包含 了消息的所赖的所有依赖项

generation_message(
DEPENDENCIES
std_msgs
)

我们已经告知catkin需要知道的一切,然后到catkin工作空间的根目录下使用命令catkin_make编译它,还需运行source devel/setup.bash

还会生成python类代码,不过我没找到

这样的话就定义了自己的消息类型

使用新定义的消息

例message_publisher.py

发布者:

 #!/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,queue_size='number')
rate=rospy.Rate() 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 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()

然后运行节点就能看到消息发布被订阅了

如下

qqtsj@qqtsj-Nitro-AN515-:~/catkin_ws$ rosrun basic message_subscriber.py
Real: 0.704654157162
Imaginary: 0.752943456173 Real: 0.425590842962
Imaginary: 0.338110715151 Real: 0.839413583279
Imaginary: 0.193065851927 Real: 0.748129308224
Imaginary: 0.966568589211 Real: 0.105406813323
Imaginary: 0.329872667789 Real: 0.735990107059
Imaginary: 0.0604162067175 Real: 0.208381637931
Imaginary: 0.373496472836 Real: 0.959863781929
Imaginary: 0.433356046677 Real: 0.11781616509
Imaginary: 0.00478984974325 Real: 0.0790134221315
Imaginary: 0.709028303623 Real: 0.11989364773
Imaginary: 0.0398832447827

然后rosmsg命令能让你看到某个消息类型的内容

qqtsj@qqtsj-Nitro-AN515-:~/catkin_ws$ rosmsg show Complex
[basic/Complex]:
float32 real
float32 imaginary

ROS机器人话题之自定义消息的更多相关文章

  1. ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse

    ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或ja ...

  2. 【2017.10.13 ROS机器人操作系统】ROS系统常用术语及资源

    ROS机器人操作系统是一种后操作系统,提供了类似于软件开发中使用到的中间件的功能. ROS: Robot Operating System 机器人操作系统 Package: 功能包 Stack: 功能 ...

  3. ros机器人之小乌龟仿真-路径记录

    ------------恢复内容开始------------ 通过自己不断地摸索,对ros系统有了一定的了解,首先装系统,这一过程中也遇到了很多问题,但通过不断地尝试,经过一天一夜的倒腾,总算是把系统 ...

  4. ROS 机器人技术 - 广播与接收 TF 坐标

    上次我们学习了 TF 的基本概念和如何发布静态的 TF 坐标: ROS 机器人技术 - TF 坐标系统基本概念 ROS 机器人技术 - 静态 TF 坐标帧 这次来总结下如何发布一个自定义的 TF 坐标 ...

  5. ros机器人开发概述

    1.       ROS项目开发流程? 参照古月大神写的ROS探索总结系列:http://blog.exbot.net/archives/619 具体项目设计可看看<程序员>杂志的最新一篇 ...

  6. Learning ROS for Robotics Programming - Second Edition(《学习ROS机器人编程-第二版》)

    Learning ROS for Robotics Programming - Second Edition <学习ROS机器人编程-第二版> ----Your one-stop guid ...

  7. ROS机器人程序设计(原书第2版)补充资料 教学大纲

    ROS机器人程序设计(原书第2版) 补充资料 教学大纲 针对该书稍后会补充教学大纲.教案.多媒体课件以及练习题等. <ROS机器人程序设计>课程简介 课程编号:XXXXXX 课程名称:RO ...

  8. ROS机器人程序设计-学习小结-

    ROS官网 |易科 |虞坤林 |古月居 |ROSClub 学习ROS相关书籍推荐:http://blog.csdn.net/zhangrelay/article/details/52244746 RO ...

  9. ROS机器人程序设计(原书第2版)补充资料 (拾) 第十章 使用MoveIt!

    ROS机器人程序设计(原书第2版)补充资料 (拾) 第十章 使用MoveIt! 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. MoveIt ...

随机推荐

  1. SQL MAX()函数处理字符型字段

    假设有数据库表student,表中有字段studentCode,它是字符型的,现有需求:“每次向student表插入数据时,自动生成studentCode字段的值” 如果你的实现思路是这样的: if( ...

  2. 敏捷开发流程之Scrum:3个角色、5个会议、12原则

    本文主要从Scrum的定义和目的.敏捷宣言.Scrum中的人员角色.Scrum开发流程.敏捷的12原则等几方面帮助大家理解Scrum敏捷开发的全过程. 一.Scrum的定义和目的 Scrum是一个用于 ...

  3. vue 2.0以上怎么在手机中运行自己的项目

    第一步 打开vue项目 第二步 打开项目config/index.js文件,然后找到 module.exports 配置里面的 dev 配置,修改字段host:0.0.0.0 第三步 打开cmd输入i ...

  4. Magicodes.IE编写多框架版本支持和执行单元测试

    背景 很多情况下,我们编写了一些工具库之后,往往在某些框架版本中会出现一些问题,比如本人最近写的一个导入导出的工具库Magicodes.IE(GitHub:https://github.com/xin ...

  5. HashMap,HashTable 区别,实现原理。

    HashMap是HashTable 的轻量级,非线程安全的,都是实现了map接口 区别:hashmap 允许空键值对的存在,非线程安全,效率高于hashtable,因为hashtable 是synch ...

  6. java序列化(二)

    上一篇我们简单的了解了java的序列化方法.可以想一下,如果有两个类,如果父类实现了序列化,子类没有实现序列化,子类在进行对象序列化读写时,父类和子类均被实现序列化.如果其中父类没有实现序列化,子类实 ...

  7. 关于java php go 中AES加解密秘钥长度问题

    今天心血来朝,想用go把php中的一个小功能重写一下,但在解密aes加密的数据时碰到了个坑! php的mcrypt拓展(貌似php7.1版本以上不支持了)提供了aes的加解密: 而且php aes 的 ...

  8. Spring Boot2 系列教程 (十五) | 服务端参数校验之一

    估计很多朋友都认为参数校验是客户端的职责,不关服务端的事.其实这是错误的,学过 Web 安全的都知道,客户端的验证只是第一道关卡.它的参数验证并不是安全的,一旦被有心人抓到可乘之机,他就可以有各种方法 ...

  9. 枚举 xor

    题意:输入整数n(1<=n<=3千万),有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b.例如:n=7时,有4对:(3,2),(5,4 ...

  10. hive 动态分区

    非常重要的动态分区属性: hive.exec.dynamic.partition  是否启动动态分区.false(不开启) true(开启)默认是 false hive.exec.dynamic.pa ...