ROS与C++入门教程-消息-消息生成
ROS与C++入门教程-消息-消息生成
说明:
- 介绍消息及生成
消息生成
- 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消息,可以这样:
#include <std_msgs/String.h>
- 实例化消息:
std_msgs::String str;
- 来自不同消息的C++代码的详细信息,请参阅。
- 请注意:消息中的所有字段当前初始化为默认值0(为空字符串或可变长度数组)。
在其他包使用消息(ROS 1.1 +不必要)
- ROS 1.1+ 是自动完成,不需要更改manifest
- 为了在其他使用I消息,你需要在包的manifest里增加export标签,例如:
<export>
<cpp cflags="-I${prefix}/msg/cpp"/>
</export>
- 使用服务的话,同样需要添加,例如:
<export>
<cpp cflags="-I${prefix}/msg/cpp -I${prefix}/srv/cpp"/>
</export>
Forward-declaring(前向声明消息)
- 这是macro宏,可以让你简单前向声明一个消息和它的shared_ptr类型:
ROS_DECLARE_MESSAGE(MyMessage);
- 将会扩展为:
template<class ContainerAllocator> struct MyMsg_;
typedef MyMessage_<std::allocator<void> > MyMsg;
typedef boost::shared_ptr<MyMsg> MyMsgPtr;
typedef boost::shared_ptr<MyMsg const> MyMsgConstPtr;
在模版中获取字段的类型信息
- C++消息生成器提供有用的typedefs,因为C++不提供typeof的操作符。对于每个消息里的字段,都会生成_fieldname_type的typedef。这允许模板代码对消息进行一些有用的introspection。
- 例如, std_msgs/String消息有如下的typedef:
typedef std::string _data_type;
- 这个会对应到字段:
std::string data;
示例:
- 这是有用的一个例子是数组类型。如果你想遍历一个数组,你不需要知道数组的所有类型:
MyMessage::_my_array_type::iterator it = msg.my_array.begin();
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号