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 |
|||
duration |
secs/nsecs signed 32-bit ints |
1. bool在ROS 0.9中引入
2. 由于数组类型,C ++中的bool被别名为uint8_t:std :: vector <bool>实际上是一个不是容器的特殊形式的向量。有关更多信息,请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2160.html。
3. uint8在Python中有特殊的含义。uint8 []被视为Python字节,因此它与Python中的其他面向字节的API兼容。
4. unicode字符串当前不支持作为ROS数据类型。应该使用utf-8与ROS字符串序列化兼容。在Python 2中,这种编码对于unicode对象是自动的,但解码必须手动完成。在python 3中,当使用str时,在生成的消息代码中使用'utf-8'进行编码和解码。
推荐使用:
· char:uint8的不推荐使用的别名
· 字节:int8的已弃用别名
数组处理
Array handling
Python3 |
|||||||||||||||||||||||||
字节(2) |
1. 在rospy中,出于性能原因,数组被反序列化为元组,但您可以将字段设置为元组 s和列表 s交替使用。
2. rospy将uint8 []数据视为字节,这是字节数据的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.txt#msgs_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