< >
Home » ROS与C++入门教程 » ROS与C++入门教程-消息-消息生成

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();

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ROS与C++入门教程