睡前ROS学习之ROS组件
ROS项目文件的结构如下图所示:
- Packages: 这是ROS软件最常用的单元,它包含ROS 的运行时进程 nodes,库,配置文件等
- package manifest: package 清单文件位于一个package里面,包含了关于包的作者,依赖关系等信息,和nodejs的package.json类似
- Meta Package:指的是一组特殊目的而存在的包
- Meta Package manifest: 作用和package manifest一样,但是二者有较大的区别,这会在后面的部分进行介绍
- Messages: 用于ROS 进程间的
- Services: 和Message一样也是一种进程间通信的方式,但是它是基于一种请求/答复的交互方式
- Repositories:和我们通常所说的git Repositories一个概念
Packages 结构:
一个典型的ROS 包结构包含下面几个目录:
config: 这个包所需要的所有的配置文件都放在这个位置
include/package_name: 这个目录下包含这个包所需要的全部头文件以及库文件
scripts: 这个目录用于存放可执行的Python脚本
src: 这个目录用于存放可执行的C++代码
launch: 这个目录用于存放用于加载ROS 节点的加载文件
msg: 这个目录用于存放自定义的消息
srv: 这个目录用于存放自定义的服务
action: 这个目录用于存放自定义的Action
package.xml: 这个是这个package的清单文件
CMakeLists.txt: 这个是编译这个package的CMake 编译文件
Package有关的命令:
catkin_create_pkg :用于创建一个新的package
catkin_make :用于编译Ros package包
rospack : 获取package信息
rosdep : 用于安装package的依赖关系
package.xml
|
ROS meta packages
Meta packages 和其他的package 不一样它只有一个package.xml文件.它不包含其他目录和文件,它只是将多个包组织成一个逻辑意义上的包。
在package.xml 文件中没有
ROS messages
ROS 节点可以发布特定类型的数据,消息的数据类型定义在ROS package的msg包里面,以.msg为扩展名的文件里面
消息类型的定义和我们定义一个变量形式上很类型,下面是一些例子:
int32 number
string name
float32 speed
在上面的例子中第一部分称为“field type” 第二部分称为“field name” 用于从消息中获取数据,通过上面的定义我们可以使用msg.number来获取number消息的值
下表是ROS内建的数据类型:
| Primitive type | Serialization | C++ | 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 unsigned 32-bit ints |ros::Time|rospy.Time|
|duration|secs/nsecssigned 32-bit ints |ros::Duration|rospy.Duration|
除了上述的消息类型,ROS还支持特殊的消息类型 — 消息头,消息头中可以包含时间信息,消息序列id等,它主要用于指定是谁正在发送这个消息
下面是一个简单的消息头例子:
uint32 seq
time stamp
string frame_id
下面的命令可以用于查看某个特定消息头的消息
ROS services
ROS 是节点之间基于请求答复的模式的交互方式,一个节点发送一个请求,直到从另个请求获得答复为止,请求的描述符和消息的描述符相似,都是定义在一个以.msg结尾的文件中,而服务的定义是存放在包的srv目录下,以.srv为结尾的文件中。
下面是一个描述服务的例子:
#Request message type |