ROS1云课→05消息类型
Posted zhangrelay
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS1云课→05消息类型相关的知识,希望对你有一定的参考价值。
消息类似各类编程语言中的变量和常量等,ROS1中消息分为:
- 主题消息
- 服务消息
- 行动消息
主题消息
ROS1使用了一种简化的消息类型描述语言来描述ROS节点发布的数据值。通过这样的描述语言,ROS1能够使用多种编程语言生成不同类型消息的源代码。
ROS提供了很多预定义消息类型。如果创建了一种新的消息类型,那么就要把消息的类型定义放到功能包的msg/文件夹下。在该文件夹中,有用于定义各种消息的文件。这些文件都以.msg为扩展名。
消息类型必须具有两个主要部分:字段(fields )和常量(constants)。字段定义了要在消息中传输的数据类型,例如int32、float32、string或之前创建的新类型,如叫做type1和type2的新类型。常量用于定义字段的名称。
一个msg文件的示例如下:
- int32 id
- float32 vel
- string name
颜色案例(rgb):
在下表中找到很多ROS消息所使用的标准数据类型:
Primitive type 基本类型 | Serialization 序列化 | C++ C++ | Python Python |
bool (1) | unsigned 8-bit int | uint8_t(2) | bool |
int8 | signed 8-bit int | int8_t | int |
uint8 | unsigned 8-bit int | uint8_t | int(3) |
int16 | signed 16-bit int | int16_t | int |
uint16 | unsigned 16-bit int | uint16_t | int |
int32 | signed 32-bit int | int32_t | int |
uint32 | unsigned 32-bit int | uint32_t | int |
int64 | signed 64-bit int | int64_t | long |
uint64 | unsigned 64-bit int | uint64_t | long |
float32 | 32-bit IEEE float | float | float |
float64 | 64-bit IEEE float | double | float |
string | ascii string (4) | std::string | string |
time | secs/nsecs signed 32-bit ints | ros::Time | rospy.Time |
duration | secs/nsecs signed 32-bit ints | ros::Duration | rospy.Duration |
ROS1消息中的一种特殊数据类型是报文头,主要用于添加时间戳、坐标位置等。报文头还允许对消息进行编号。通过在报文头内部附加信息,可以知道是哪个节点发出的消息,或者可以添加一些能够被ROS1处理的其他功能。
报文头类型包含以下字段:
- uint32 seq
- time stamp
- string frame_id
可以通过下面命令查看消息的结构:
$ rosmsg show std_msgs/Header
在后续的课程中看到,正是通过报文头才能够记录当前机器人运行的时间戳和坐标位置。
在ROS1中有一些处理消息的工具。例如rosmsg命令行工具能够输出消息定义信息,并可以找到使用该消息类型的源文件。
在后面的课程中,将会学习如何使用正确的工具创建消息。
服务消息
ROS1使用了一种简化的服务描述语言来描述ROS的服务类型。这直接借鉴了ROS msg消息的数据格式,以实现节点之间的请求/响应通信。服务的描述存储在功能包的srv/子目录下.srv文件中。
若要调用服务,需要使用该功能包的名称及服务名称。例如,对于sample_package1/srv/sample1.srv文件,可以将它称为sample_package1/sample1服务。
ROS中有一些执行某些功能与服务的工具。rossrv工具能输出服务说明、.srv文件所在的功能包名称,并可以找到使用某一服务类型的源代码文件。
如果想要在ROS1中创建一个服务,可以使用服务生成器。这些工具能够从基本的服务说明中生成代码。你只需要在CMakeLists.txt文件中加一行gensrv()命令。
在后面的课程中,将会学习如何创建服务。
以上是关于ROS1云课→05消息类型的主要内容,如果未能解决你的问题,请参考以下文章