ROS----msg

msg

ROS使用简化的消息描述语言来描述ROS节点发布的数据值(即消息)。通过此说明,ROS工具可以轻松地为几种目标语言的消息类型自动生成源代码。消息描述存储在ROS软件包的msg /子目录中的.msg文件中。
.msg文件有两部分:字段和常量。字段是在消息内部发送的数据。常量定义可用于解释这些字段的有用值(例如,整数值的类枚举常量)。
消息类型引用使用包资源名称。例如,文件geometry_msgs / msg / Twist.msg通常被称为geometry_msgs / Twist。

1.命令行工具

rosmsg输出消息定义信息,并可以找到使用消息类型的源文件。

2.消息描述规范

这种语言的格式很简单:消息描述是数据字段描述和不同行上的常量定义的列表。

2.1字段

每个字段由一个空格分隔的类型和名称组成,即:

fieldtype1 fieldname1

fieldtype2 fieldname2

fieldtype3 fieldname3

例如:

int32 x

int32 y

字段类型

字段类型可以是:

1.  内置类型,如“float32 pan”string name

2.  消息描述的名称自定义,例如“geometry_msgs / PoseStamped”

3.  上述的固定或可变长度数组(列表),例如“float32 []范围“Point32 [10]

4.  特殊的Header类型,它映射到std_msgs / Header

嵌入其他消息描述时,如果类型名称在同一个包中,则它可能是相对的(例如“Point32”); 否则它必须是完整的消息类型(例如“std_msgs / String”)。此规则的唯一例外是Header
注意:在构建自己的消息类型时,不得使用内置类型或标题的名称。

内置类型Built-in types:

Primitive Type

Serialization

C++

Python2

Python3

bool (1)

unsigned 8-bit int

uint8_t (2)

bool

int8

signed 8-bit int

int8_t

int

uint8

unsigned 8-bit int

uint8_t

Int (3)

int16

signed 16-bit int

int16_t

int

uint16

unsigned 16-bit int

uint16_t

int

int32

signed 32-bit int

int32_t

int

uint32

unsigned 32-bit int

uint32_t

int

int64

signed 64-bit int

int64_t

long

int

uint64

unsigned 64-bit int

uint64_t

long

int

float32

32-bit IEEE float

float

float

float64

64-bit IEEE float

double

float

string

ascii string (4)

std::string

str

bytes

time

secs/nsecs unsigned 32-bit ints

ros::Time

rospy.Time

duration

secs/nsecs signed 32-bit ints

ros::Duration

rospy.Duration

1.       bool在ROS 0.9中引入

2.     由于数组类型,C ++中的bool被别名为uint8_tstd :: vector <bool>实际上是一个不是容器的特殊形式的向量。有关更多信息,请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2160.html

3.     uint8Python中有特殊的含义。uint8 []被视为Python字节,因此它与Python中的其他面向字节的API兼容。

4.     unicode字符串当前不支持作为ROS数据类型。应该使用utf-8ROS字符串序列化兼容。在Python 2中,这种编码对于unicode对象是自动的,但解码必须手动完成。在python 3中,当使用str,在生成的消息代码中使用'utf-8'进行编码和解码。

推荐使用:

·    charuint8的不推荐使用的别名

·    字节:int8的已弃用别名

数组处理

Array handling

Array Type

Serialization

C++

Python2

Python3

fixed-length

no extra serialization

0.11+: boost::array, otherwise:std::vector

tuple(1)

variable-length

uint32 length prefix

std::vector

tuple(1)

uint8[]

see above

as above

str

bytes(2)

bool[]

see above

std::vector<uint8_t>

List of bool

 

Python3

字节(2)

1. rospy,出于性能原因,数组被反序列化为元组,但您可以将字段设置为元组 s列表 s交替使用。

2. rospyuint8 []数据视为字节,这是字节数据的Python表示形式。在Python 2中,这与str相同。

rospy还可以将数组反序列化为numpy数据结构。请参阅rospy文档以获取更多信息。

2.1.2字段名称

字段名称决定了如何在目标语言中引用数据值。例如,假设'obj'是存储消息的变量,那么称为'pan'的字段在Python中将被引用为'obj.pan'

字段名称必须由消息生成器翻译为多种目标语言,因此我们将字段名称限制为字母字符,后跟字母数字和下划线的任意组合,即[a-zA-Z] [a-zA-Z1-9 _] * 。建议您避免使用与通用语言中的关键字相对应的字段名称 - 尽管这些名称是合法的,但它们会对字段名称的翻译方式造成混淆。

2.1.3头

ROS提供了特殊的Header类型来为像tf这样的库设置帧ID提供一个通用的机制。虽然标题不是内置类型(它在std_msgs / msg / Header.msg中定义),但它通常使用且具有特殊的语义。如果.msg的第一个字段是:

Header header

它将被解析为std_msgs / Header。

Header.msg

#Standard metadata for higher-levelflow data types

#sequence ID: consecutivelyincreasing ID

uint32 seq

#Two-integer timestamp that isexpressed as:

# * stamp.secs: seconds (stamp_secs)since epoch

# * stamp.nsecs: nanoseconds sincestamp_secs

# time-handling sugar is provided bythe client library

time stamp

#Frame this data is associated with

string frame_id

标题的特殊性主要是由于历史原因,例如保存记录的数据。

2.2常量

每个常量定义就像一个字段描述,除了它也分配一个值。该值分配通过使用相等的'='符号表示,例如

constanttype1 CONSTANTNAME1 = constantvalue1

constanttype2 CONSTANTNAME2 = constantvalue2

例如:

int32 X=123

int32 Y=-123

string FOO=foo

string EXAMPLE="#comments"are ignored, and leading and trailing whitespace removed

笔记:

·    时间持续时间外,您可以将任何内置类型声明为常量。

·   字符串常量被赋值为等号右边的所有内容,并删除了前导空白和尾随空白。因此,您不能对字符串常量定义留言。

·    整数常量必须以十进制指定(以10为底)。

3.建立.msg文件

ROS客户端库实现了将.msg文件转换为源代码的消息生成器。这些消息生成器必须从构建脚本中调用,尽管通过包含一些通用构建规则来处理大部分站点类别的细节。按照惯例,所有.msg文件都存储在包名为“msg”的目录中,您可以通过编辑CMakeLists.txt文件和catkin / package.xml文件来构建所有.msg文件。
打开package.xml,并确保它们包含在这两行中:

  <build_depend>message_generation </ build_depend>

  <run_depend> message_runtime</ run_depend>

请注意,在构建时,我们需要“message_generation”,而在运行时,我们只需要“message_runtime”。
开放的CMakeLists.txt在你喜欢的文本编辑器(rosed从以前的教程是一个不错的选择)。
将message_generation依赖项添加到CMakeLists.txt中已存在的查找包调用,以便生成消息。您可以通过简单地将message_generation添加到COMPONENTS列表中来实现,如下所示:

# Do not just add this line to yourCMakeLists.txt, modify the existing line

find_package(catkin REQUIREDCOMPONENTS roscpp rospy std_msgs message_generation)

即使您没有调用带有所有依赖关系的find_package,您也可能会注意到您的项目有时可以正常生成。这是因为catkin将所有项目合并为一个,因此如果较早的项目调用find_package,则您的配置具有相同的值。但忘记调用意味着您的项目在隔离构建时可能很容易中断。
还要确保您导出消息运行时依赖关系。

catkin_package

  ...

  CATKIN_DEPENDS message_runtime...

  ...

找到以下代码块:

# add_message_files(

#  FILES

#  Message1.msg

#  Message2.msg

# )

通过删除取消它#符号,然后重新装上底座的Message*.msg与您的文件*.msg文件,使得它看起来是这样的:

add_message_files

  FILES

  Num.msg

找到以下代码块:

# generate_messages(

#   DEPENDENCIES

#   std_msgs  # Or other packagescontaining msgs

# )

通过删除#符号来取消注释,然后将std_msgs替换为消息所依赖的消息,使其看起来像这样:

generate_messages(

  DEPENDENCIES

  std_msgs

)

通过手动添加.msg文件,我们确保在添加其他.msg文件后,CMake知道何时需要重新配置项目。

另请参阅:catkin / CMakeLists.txtmsgs_srvs_actions

4.客户端库支持

在Python中,生成的Python消息文件(例如std_msgs.msg.String)几乎提供了有关.msg文件的所有信息。您可以检查__slots__和_slot_types以及其他字段来反思关于消息的信息。

 http://wiki.ros.org/action/fullsearch/msg?action=fullsearch&context=180&value=linkto%3A%22msg%22 

猜你喜欢

转载自blog.csdn.net/cookie909/article/details/79842389