注意:ROS 是一个适用于机器人编程的框架,这个框架把原本松散的零部件耦合在了一起,为他们提供了通信架构。虽然叫做操作系统,但并非 Windows、Mac 那样通常意义的操作系统,它只是连接了操作系统和开发的 ROS 应用程序,所以它可以被看为一个中间件,基于 ROS 的应用程序之间建立起了沟通的桥梁,所以也是运行在 Linux 上的运行时环境,在这个环境上,机器人的感知、决策、控制算法可以更好的组织和运行。
ROS设计目标:
代码复用、精简、语言独立、易于测试、大型应用、丰富的组件化工具包、免费且开源
分布式:ROS是进程(也称为Nodes)的分布式框架,ROS中的进程可分布于不同主机,不同主机协同工作,从而分散计算压力。
松耦合:ROS中功能模块封装于独立的功能包或元功能包,便于分享,功能包内的模块以节点为单位运行,以ROS标准的IO作为接口,开发者不需要关注模块内部实现,只要了解接口规则就能实现复用,实现了模块间点对点的松耦合连接
ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”,即ROS是通讯机制、工具软件包、机器人高层技能以及机器人生态系统的集合体。
cd <目录路径> # 改变工作目录。若没有指定“目录路径”,则回到用户的主目录
pwd # 显示出当前工作目录的绝对路径
mkdir [选项] <目录名称> # 创建一个目录
touch [选项] <目录名称> # 新建文件
mv [选项] <源文件或目录> <目地文件或目录> # 为文件或目录改名或将文件由一个目录移入另一个目录中
cp [选项] <源文件或目录> <目地文件或目录> # 把给出的一个文件或目录拷贝到另一文件或目录中,或者把多个源文件复制到目标目录中
rm [选项] <文件名称或目录名称> # 该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件
# 及子目录均删除。对于链接文件,只是删除了链接,原有文件均保持不变。
ls [选项] <目录名称> # 列出目录的内容
sudo apt-get update #更新源
sudo apt-get upgrade #更新已安装的包
sudo apt-get install <文件名>
--help #查看使用方法
sudo apt-get install g++ #安装g++编译器
sudo apt-get install python #安装python解析器
# 新建一个helloworld文件
touch helloworld.cpp
touch helloworld.py
# 编译文件
g++ helloworrld.cpp -o helloworld
./helloworld
python helloworld.py
二进制包里面包括了已经编译完成,可以直接运行的程序。你通过 sudo apt-get install
来进行下载和解包(安装),执行完该指令后就可以马上使用了。因此这种方式简单快捷,适合比较固定、无需改动的程序。而源代码包里是程序的原始代码,在你的计算机上必须经过编译,生成了可执行的二进制文件,方可运行。一些个人开发的程序、第三方修改或者你希望修改的程序都应当通过源代码包的来编译安装。
对于源代码包,我们只有编译才能在系统上运行。而 Linux 下的编译器有 gcc、g++,随着源文件的增加,直接用 gcc/g++ 命令的方式显得效率低下,人们开始用Makefile来进行编译。然而随着工程体量的增大,Makefile 也不能满足需求,于是便出现了 Cmake 工具。CMake 是对 make 工具的生成器,是更高层的工具,它简化了编译构建过程,能够管理大型项目,具有良好的扩展性。对于 ROS 这样大体量的平台来说,就采用的是 CMake,并且 ROS 对 CMake 进行了扩展,于是便有了 Catkin 编译系统。整个编译过程如下图所示:
1、一个Catkin的软件包(package)必须要包括两个文件:
name, description, version, maintainer(s), license
opt. authors, url’s, dependencies, plugins, etc…
调用Catkin的函数/宏
解析package.xml
找到其他依赖的catkin软件包
将本软件包添加到环境变量
2、使用catkin_make进行编译
要用catkin编译一个工程或软件包,只需要用catkin_make指令。一般当我们写完代码,执行一次catkin_make进行编译,调用系统自动完成编译和链接过程,构建生成目标文件。编译的一般流程如下:
cd ~/catkin_ws #回到工作空间,catkin_make必须在工作空间下执行
catkin_make #开始编译
source ~/catkin_ws/devel/setup.bash #设置环境变量
注意: catkin 编译之前需要回到工作空间目录,catkin_make
在其他路径下编译不会成功。编译完成后,如果有新的目标文件产生,那么一般紧跟着要source刷新环境,使得系统能够找到刚才编译生成的 ROS 可执行文件。这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误。
Catkin 工作空间是创建、修改、编译catkin软件包的目录。catkin的工作空间,直观的形容就是一个仓库,里面装载着 ROS 的各种项目工程,便于系统组织管理调用。
1、初始化catkin工作空间
mkdir -p ~/catkin_ws/src #创建一个catkin的工作空间,同时创建了第二层级的文件夹src,存放软件包的地方
cd ~/catkin_ws/ #进入工作空间
catkin_make #初始化工作空间
2、 结构介绍
catkin的结构十分清晰,具体的catkin工作空间结构图如下:
在ROS中,package 的定义更加具体,它不仅是 Linux 上的软件包,更是 catkin 编译的基本单元,我们调用catkin_make
编译的对象就是一个个 ROS 的 package,也就是说任何 ROS 程序只有组织成 package 才能编译。 所以 package 也是 ROS 源代码存放的地方,任何 ROS 的代码无论是 C++ 还是 Python 都要放到 package 中,这样才能正常的编译和运行。一个 package 可以编译出来多个目标文件(ROS可执行程序、动态静态库、头文件等等)。
1、package结构
PS:以上路径中,只有 CMakeLists.txt 和 package.xml 是必须的,其余路径根据软件包是否需要来决定。
2、package的创建
创建一个 package 需要在 catkin_ws/src
下,用到 catkin_create_pkg
命令,用法是:
cd ~/ctakin_ws/src
catkin_create_pkg package depends #package 是包名,depends 是依赖的包名,可以依赖多个软件包
例如,新建一个 package 叫做 learning_pkg
,依赖 roscpp、rospy、std_msgs(常用依赖)。
cd ~/ctakin_ws/src
catkin_create_pkg learning_pkg roscpp rospy std_msgs #软件包初始化,填充 CMakeLists.txt 和 package.xml,并且将依赖项填进了这两个文件中
3、package相关命令
rospack help #显示rospack的用法
rospcak list #列出本机所有package
rospack find package_name #查找某个pkg的地址
roscd package_name #跳转到某个pkg路径下
rosls package_name #列举某个pkg下的文件信息
roscd package_name filename #编辑pkg中的文件
rosdep install [pkg_name] #安装某个pkg所需的依赖
1、launch文件
launch 文件一般以 .launch
或 .xml
结尾,它对 ROS 需要运行程序进行了打包,通过一句命令来启动。一般 launch 文件中会指定要启动哪些 package 下的哪些可执行程序,指定以什么参数启动,以及一些管理控制的命令。 launch 文件通常放在软件包的 launch/
路径中中。
2、msg/srv/acion文件
ROS 程序中有可能有一些自定义的消息/服务/动作文件,为程序的发者所设计的数据结构,这类的文件以 .msg
, .srv
, .action
结尾,通常放在 package 的 msg/
, srv/
, action/
路径下。
3、urdf/xacro文件
urdf/xacro 文件是机器人模型的描述文件,以 .urdf
或 .xacro
结尾。它定义了机器人的连杆和关节的信息,以及它们之间的位置、角度等信息,通过 urdf 文件可以将机器人的物理连接信息表示出来。并在可视化调试和仿真中显示。
4、yaml文件
yaml 文件一般存储了 ROS 需要加载的参数信息,一些属性的配置。通常在 launch 文件或程序中读取 .yaml
文件,把参数加载到参数服务器上。通常我们会把 yaml 文件存放在 param/
路径下。
5、dae/stl文件
dae 或 stl 文件是 3D 模型文件,机器人的 urdf 或仿真环境通常会引用这类文件,它们描述了机器人的三维模型。相比 urdf 文件简单定义的性状,dae/stl
文件可以定义复杂的模型,可以直接从 solidworks 或其他建模软件导出机器人装配模型,从而显示出更加精确的外形。
6、rviz文件
rviz 文件本质上是固定格式的文本文件,其中存储了 RViz 窗口的配置(显示哪些控件、视角、参数)。通常 rviz 文件不需要我们去手动修改,而是直接在 RViz 工具里保存,下次运行时直接读取。
小结
1、节点(Node) —— 执行单元
执行具体任务的进程、独立运行的可执行文件;
不同节点可使用不同的编程语言,可分布式运行在不同的主机;
节点在系统中的名称必须是唯一的。
2、节点管理器(ROS Master) —— 控制中心
为节点提供命名和注册服务;
跟踪和记录话题/服务通信,辅助节点相互查找、建立连接;
提供参数服务器,节点使用此服务器存储和检索运行时的参数。
3、话题(Topic) —— 异步通信机制(发布、订阅模型)
节点间用来传输数据的重要总线;
使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一。
4、消息(Message) —— 话题数据
具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型;
使用编程语言无关的.msg文件定义,编译过程中生成对应的代码文件。
5、服务(Service) —— 同步通信机制
使用客户端/服务器)(C/S)模型,客户端发送请求数据,服务器完成处理后返回应答数据;
使用编程语言无关的.srv文件定义请求和应答数据结构,编译过程中生成对应的代码文件。
6、参数(Parameter) —— 全局共享字典
可通过网络访问的共享、多变量字典;
节点使用此服务器来存储和检索运行时的参数;
适合存储静态、非二讲制的配置参数,不适合存储动态配置的数据。
7、功能包
ROS软件中的基本单元,包含节点源码、配置文件、数据定义等
8、功能包清单
记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等
9、元功能包
组织多个用于同一目的功能包