ROS----messages

·  roscpp/Overview/Messages

1.消息生成

像所有ROS客户端库一样,roscpp采用msg文件并为它们生成C ++源代码。这种模式是:
package_name / msg / Foo.msg→package_name :: Foo
同样,srv文件也生成了C ++源代码。这种模式是:
package_name / srv / Foo.srv → package_name :: Foo
请注意,roscpp的限制是消息和服务名称空间重叠。
生成文件的来源分别放在消息和服务的msg_gen / cpp /include / package_name /和srv_gen / cpp / include /package_name /目录中。头文件的生成与msg / srv的文件名称相同。
因此,在代码中包含std_msgs / String消息包括:

切换行号显示

   1#包括<std_msgs / string.h>

   2

并实例化消息:

切换行号显示

   1std_msgs :: String  str ;

有关来自不同消息基元的C ++代码的详细信息,请参阅msg页面。
请注意,消息中的所有字段当前都已初始化为默认值0(对于字符串和可变长度数组,为空)。

2.将消息公开给其他软件包(在ROS 1.1+中不需要)

在ROS 1.1+中,这是自动处理的,不需要更改清单。
为了公开要供其他包使用的消息,您必须在包的清单中包含导出标记。例如:

<export>

   <cpp cflags="-I${prefix}/msg/cpp"/>

</export>

如果你还想公开服务:

<export>

   <cpp cflags="-I${prefix}/msg/cpp -I${prefix}/srv/cpp"/>

</export>

3.前向声明消息[ROS 1.1+]

有一个宏可以让你轻松地转发 - 声明一个消息及其shared_ptr类型:

切换行号显示

   1ROS_DECLARE_MESSAGEMyMessage;

这将扩展到:

切换行号显示

   1template < class  ContainerAllocator > struct  MyMsg_ ;

   2typedef  MyMessage_ < std :: allocator < void >> MyMsg ;

   3typedef  boost :: shared_ptr < MyMsg > MyMsgPtr ;

   4typedef  boost :: shared_ptr < MyMsg  const > MyMsgConstPtr ;

4.检索模板中字段的类型信息

C ++消息生成器提供了一些有用的typedef,因为C ++不提供typeof运算符。对于消息中的每个字段,它会生成一个_fieldname_type typedef。这允许模板代码对消息进行一些有用的反省。
例如,std_msgs / String消息在其中包含以下typedef:

切换行号显示

   1typedef  std :: string  _data_type ;

这对应于该领域

切换行号显示

   1std :: string data;

4.1例

一个有用的例子是数组类型。如果你想迭代一个数组,你不需要知道数组的完整类型:

切换行号显示

   1MyMessage :: _my_array_type :: iterator  it = msgmy_arraybegin();

   2...

猜你喜欢

转载自blog.csdn.net/cookie909/article/details/79842420
ROS