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

<?xml version="1.0"?>
<package>
<name>learn_Ros_1</name> 包名
<version>0.0.0</version> 版本
<description>The learn_Ros_1 package</description> 描述

<!-- 需要有一个 maintainer信息,但是不限于一个,可以有多个,每个maintainer信息占用一行-->
<!-- Example: -->
<!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
<maintainer email="tbfungeek@163.com">tbfungeek</maintainer>


<!--需要有一个授权信息,可以有多个,每个占用一行 -->
<!-- 如下是目前最为常用的几个 : BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
<license>BSD</license>


<!-- Url 标签是可选的,但是可以有多个,每个占用一行 -->
<!-- 可选的属性类型可以是 : website, bugtracker, or repository -->
<!-- 比如: -->
<!-- <url type="website">http://wiki.ros.org/learn_Ros_1</url> -->


<!-- Authors 标签是可选的,但是可以有多个,每个占用一行 -->
<!-- Authors 不一定是维护者 -->
<!-- Example: -->
<!-- <author email="tbfungeek@163.com">tbfungeek</author> -->

<!-- *_depend 标签用于特殊的依赖 -->
<!-- 可以依赖 catkin packages 或者系统 system dependencies -->
<!-- Examples: -->
<!-- build_depend 用于定义在编译时所需要的包 -->
<!-- <build_depend>message_generation</build_depend> -->
<!-- buildtool_depend 用于定义所需要的编译工具 -->
<!-- <buildtool_depend>catkin</buildtool_depend> -->
<!-- run_depend 用于定义运行时所需要的包: -->
<!-- <run_depend>message_runtime</run_depend> -->
<!-- test_depend 用于定义只有在测试的时候才需要的包 -->
<!-- <test_depend>gtest</test_depend> -->
<buildtool_depend>catkin</buildtool_depend>

<!-- The export tag contains other, unspecified, tags -->
<export>
<!-- Other tools can request additional information be placed here -->
</export>
</package>
ROS meta packages

Meta packages 和其他的package 不一样它只有一个package.xml文件.它不包含其他目录和文件,它只是将多个包组织成一个逻辑意义上的包。
在package.xml 文件中没有依赖节点只有 来包含组织在meta 包中的包。


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
下面的命令可以用于查看某个特定消息头的消息

$rosmsg show std_msgs/Header

ROS services

ROS 是节点之间基于请求答复的模式的交互方式,一个节点发送一个请求,直到从另个请求获得答复为止,请求的描述符和消息的描述符相似,都是定义在一个以.msg结尾的文件中,而服务的定义是存放在包的srv目录下,以.srv为结尾的文件中。
下面是一个描述服务的例子:

#Request	message	type
string str
---
#Response message type
string str
Contents
  1. 1. Packages 结构:
  2. 2. Package有关的命令:
  • package.xml
    1. 1. ROS meta packages
    2. 2. ROS messages
    3. 3. ROS services