消息文件的头文件源码

随便找一个简单的 ros msg 所生成的 python 对应的代码,会发现其实主要做了以下几件事:

继承了 genpy.Message。在使用时会强制校验是否是 genpy.Message 的子类
实现了 serialize 方法,对内容进行序列化
实现了 deserialize 方法,对内容进行反序列化

ctrl.msg的内容如下:

1
2
3
int8 cmd
---
bool ret

经过catkin_make后,生成的头文件在devel/include,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// Generated by gencpp from file riki_msgs/ctrl.msg
// DO NOT EDIT!

#ifndef RIKI_MSGS_MESSAGE_CTRL_H
#define RIKI_MSGS_MESSAGE_CTRL_H

#include <ros/service_traits.h>
#include <riki_msgs/ctrlRequest.h>
#include <riki_msgs/ctrlResponse.h>

namespace riki_msgs
{
struct ctrl
{
typedef ctrlRequest Request;
typedef ctrlResponse Response;
Request request;
Response response;

typedef Request RequestType;
typedef Response ResponseType;
}; // struct ctrl
} // namespace riki_msgs

namespace ros
{
namespace service_traits
{
template<>
struct MD5Sum< ::riki_msgs::ctrl >
{
static const char* value()
{
return "cb6150bb24e971aa4496e4ada0219f83";
}
static const char* value(const ::riki_msgs::ctrl&) { return value(); }
};

template<>
struct DataType< ::riki_msgs::ctrl >
{
static const char* value()
{
return "riki_msgs/ctrl";
}
static const char* value(const ::riki_msgs::ctrl&) { return value(); }
};

// service_traits::MD5Sum< ::riki_msgs::ctrlRequest> should match
// service_traits::MD5Sum< ::riki_msgs::ctrl >
template<>
struct MD5Sum< ::riki_msgs::ctrlRequest>
{
static const char* value()
{
return MD5Sum< ::riki_msgs::ctrl >::value();
}
static const char* value(const ::riki_msgs::ctrlRequest&)
{
return value();
}
};

// service_traits::DataType< ::riki_msgs::ctrlRequest> should match
// service_traits::DataType< ::riki_msgs::ctrl >
template<>
struct DataType< ::riki_msgs::ctrlRequest>
{
static const char* value()
{
return DataType< ::riki_msgs::ctrl >::value();
}
static const char* value(const ::riki_msgs::ctrlRequest&)
{
return value();
}
};

// service_traits::MD5Sum< ::riki_msgs::ctrlResponse> should match
// service_traits::MD5Sum< ::riki_msgs::ctrl >
template<>
struct MD5Sum< ::riki_msgs::ctrlResponse>
{
static const char* value()
{
return MD5Sum< ::riki_msgs::ctrl >::value();
}
static const char* value(const ::riki_msgs::ctrlResponse&)
{
return value();
}
};

// service_traits::DataType< ::riki_msgs::ctrlResponse> should match
// service_traits::DataType< ::riki_msgs::ctrl >
template<>
struct DataType< ::riki_msgs::ctrlResponse>
{
static const char* value()
{
return DataType< ::riki_msgs::ctrl >::value();
}
static const char* value(const ::riki_msgs::ctrlResponse&)
{
return value();
}
};

} // namespace service_traits
} // namespace ros

#endif // RIKI_MSGS_MESSAGE_CTRL_H

在msg文件中经常看到这样的成员类型:geometry_msgs/PoseStamped[] poses, 这样直接看不出它在C++中的类型,可以去它生成的头文件里查看,结果发现是vector. 可以得出结论, ROS消息中凡是带有 [] 的成员都是vector