· 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>的
并实例化消息:
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_MESSAGE(MyMessage);
这将扩展到:
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 = msg。my_arraybegin();
2...