Part1 -- ROS基础知识

文章目录

  • 1 ROS简介
    • 1.1 ROS的定义
    • 1.2 如何学习
    • 1.3 ROS 机器人操作系统
    • 1.4 Linux入门
    • 1.5 C++/Python 基础
    • 1.6 二进制包与源代码包
  • 2 ROS文件系统
    • 2.1 Catkin编译系统
    • 2.2 Catkin工作空间
    • 2.3 Package软件包
    • 2.4 其他常见文件类型
  • 3 ROS核心概念
  • 参考

1 ROS简介

1.1 ROS的定义

  1. 是一个适用于机器人的开源元操作系统,对机器人的硬件进行了封装,不同的机器人、不同的传感器,在 ROS 里可以用相同的方式表示(topic 等),供上层应用程序(运动规划等)调用;
  2. 是一种跨平台模块化软件通讯机制;
  3. 是一系列开源工具、库、协议,提供类似OS所提供的功能,简化对机器人的控制;
  4. 是一系列最先进的算法;
  5. 是一个最活跃的机器人开发交流平台。

        注意:ROS 是一个适用于机器人编程的框架,这个框架把原本松散的零部件耦合在了一起,为他们提供了通信架构。虽然叫做操作系统,但并非 Windows、Mac 那样通常意义的操作系统,它只是连接了操作系统和开发的 ROS 应用程序,所以它可以被看为一个中间件,基于 ROS 的应用程序之间建立起了沟通的桥梁,所以也是运行在 Linux 上的运行时环境,在这个环境上,机器人的感知、决策、控制算法可以更好的组织和运行。

ROS设计目标:

代码复用、精简、语言独立、易于测试、大型应用、丰富的组件化工具包、免费且开源
分布式:ROS是进程(也称为Nodes)的分布式框架,ROS中的进程可分布于不同主机,不同主机协同工作,从而分散计算压力。
松耦合:ROS中功能模块封装于独立的功能包或元功能包,便于分享,功能包内的模块以节点为单位运行,以ROS标准的IO作为接口,开发者不需要关注模块内部实现,只要了解接口规则就能实现复用,实现了模块间点对点的松耦合连接

1.2 如何学习

  • 首先,了解 ROS 的基本架构和开发方式;
  • 其次,在了解 ROS 的基本架构与开发方式后,就可以有针对性地看自己所关心的部分,深入自己研究的部分,练习代码,进行实战;
  • 最后,就是进阶阶段。对于自己研究的内容,必须沉下心去看教材和论文,去理解每种算法背后的原理,知道如何调整算法参数、如何改进算法,最终能够自己编写某部分代码,并替换ROS的相应模块(如自己写运动学正逆解替代 KDL 等)。PS:一定要多交流,不能闭门造车。

1.3 ROS 机器人操作系统

        ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”,即ROS是通讯机制、工具软件包、机器人高层技能以及机器人生态系统的集合体。

Part1 -- ROS基础知识_第1张图片


1.4 Linux入门

	cd <目录路径>								# 改变工作目录。若没有指定“目录路径”,则回到用户的主目录 
	pwd											# 显示出当前工作目录的绝对路径

	mkdir [选项] <目录名称>						# 创建一个目录
	touch [选项] <目录名称>						# 新建文件
	mv [选项] <源文件或目录>  <目地文件或目录>		# 为文件或目录改名或将文件由一个目录移入另一个目录中
	cp [选项] <源文件或目录>  <目地文件或目录>		# 把给出的一个文件或目录拷贝到另一文件或目录中,或者把多个源文件复制到目标目录中
	rm [选项] <文件名称或目录名称>				# 该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件
												# 及子目录均删除。对于链接文件,只是删除了链接,原有文件均保持不变。
	ls [选项] <目录名称>							# 列出目录的内容

	sudo apt-get update							#更新源
	sudo apt-get upgrade						#更新已安装的包
	sudo apt-get install  <文件名>   
	--help     									#查看使用方法

1.5 C++/Python 基础

	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

1.6 二进制包与源代码包

        二进制包里面包括了已经编译完成,可以直接运行的程序。你通过 sudo apt-get install 来进行下载和解包(安装),执行完该指令后就可以马上使用了。因此这种方式简单快捷,适合比较固定、无需改动的程序。而源代码包里是程序的原始代码,在你的计算机上必须经过编译,生成了可执行的二进制文件,方可运行。一些个人开发的程序、第三方修改或者你希望修改的程序都应当通过源代码包的来编译安装。

Part1 -- ROS基础知识_第2张图片

2 ROS文件系统

2.1 Catkin编译系统

        对于源代码包,我们只有编译才能在系统上运行。而 Linux 下的编译器有 gcc、g++,随着源文件的增加,直接用 gcc/g++ 命令的方式显得效率低下,人们开始用Makefile来进行编译。然而随着工程体量的增大,Makefile 也不能满足需求,于是便出现了 Cmake 工具。CMake 是对 make 工具的生成器,是更高层的工具,它简化了编译构建过程,能够管理大型项目,具有良好的扩展性。对于 ROS 这样大体量的平台来说,就采用的是 CMake,并且 ROS 对 CMake 进行了扩展,于是便有了 Catkin 编译系统。整个编译过程如下图所示:
Part1 -- ROS基础知识_第3张图片

1、一个Catkin的软件包(package)必须要包括两个文件:

  • package.xml: 包括了 package 的描述信息

name, description, version, maintainer(s), license
opt. authors, url’s, dependencies, plugins, etc…

  • CMakeLists.txt: 构建 package 所需的 CMake 文件

调用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 可执行文件。这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误。

2.2 Catkin工作空间

        Catkin 工作空间是创建、修改、编译catkin软件包的目录。catkin的工作空间,直观的形容就是一个仓库,里面装载着 ROS 的各种项目工程,便于系统组织管理调用。

1、初始化catkin工作空间

	mkdir -p ~/catkin_ws/src  #创建一个catkin的工作空间,同时创建了第二层级的文件夹src,存放软件包的地方
	cd ~/catkin_ws/				#进入工作空间
	catkin_make 				#初始化工作空间

2、 结构介绍

        catkin的结构十分清晰,具体的catkin工作空间结构图如下:

Part1 -- ROS基础知识_第4张图片


2.3 Package软件包

        在ROS中,package 的定义更加具体,它不仅是 Linux 上的软件包,更是 catkin 编译的基本单元,我们调用catkin_make 编译的对象就是一个个 ROS 的 package,也就是说任何 ROS 程序只有组织成 package 才能编译。 所以 package 也是 ROS 源代码存放的地方,任何 ROS 的代码无论是 C++ 还是 Python 都要放到 package 中,这样才能正常的编译和运行。一个 package 可以编译出来多个目标文件(ROS可执行程序、动态静态库、头文件等等)。

1、package结构

  • CMakeLists.txt: 定义package的包名、依赖、源文件、目标文件等编译规则,是package不可少的成分
  • package.xml: 描述package的包名、版本号、作者、依赖等信息,是package不可少的成分
  • src/: 存放ROS的源代码,包括C++的源码和(.cpp)以及Python的module(.py)
  • include/: 存放C++源码对应的头文件
  • scripts/: 存放可执行脚本,例如shell脚本(.sh)、Python脚本(.py)
  • msg/: 存放自定义格式的消息(.msg)
  • srv/: 存放自定义格式的服务(.srv)
  • models/: 存放机器人或仿真场景的3D模型(.sda, .stl, .dae等)
  • urdf/: 存放机器人的模型描述(.urdf或.xacro)
  • launch/: 存放launch文件(.launch或.xml)

        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所需的依赖

2.4 其他常见文件类型

1、launch文件

        launch 文件一般以 .launch.xml 结尾,它对 ROS 需要运行程序进行了打包,通过一句命令来启动。一般 launch 文件中会指定要启动哪些 package 下的哪些可执行程序,指定以什么参数启动,以及一些管理控制的命令。 launch 文件通常放在软件包的 launch/ 路径中中。

2、msg/srv/acion文件

        ROS 程序中有可能有一些自定义的消息/服务/动作文件,为程序的发者所设计的数据结构,这类的文件以 .msg , .srv , .action 结尾,通常放在 package 的 msg/ , srv/ , action/ 路径下。

Part1 -- ROS基础知识_第5张图片

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 工具里保存,下次运行时直接读取。

小结

Part1 -- ROS基础知识_第6张图片

3 ROS核心概念

1、节点(Node) —— 执行单元

执行具体任务的进程、独立运行的可执行文件;
不同节点可使用不同的编程语言,可分布式运行在不同的主机;
节点在系统中的名称必须是唯一的。

2、节点管理器(ROS Master) —— 控制中心

为节点提供命名和注册服务;
跟踪和记录话题/服务通信,辅助节点相互查找、建立连接;
提供参数服务器,节点使用此服务器存储和检索运行时的参数。

3、话题(Topic) —— 异步通信机制(发布、订阅模型)

节点间用来传输数据的重要总线;
使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一。

4、消息(Message) —— 话题数据

具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型;
使用编程语言无关的.msg文件定义,编译过程中生成对应的代码文件。

5、服务(Service) —— 同步通信机制

使用客户端/服务器)(C/S)模型,客户端发送请求数据,服务器完成处理后返回应答数据;
使用编程语言无关的.srv文件定义请求和应答数据结构,编译过程中生成对应的代码文件。

6、参数(Parameter) —— 全局共享字典

可通过网络访问的共享、多变量字典;
节点使用此服务器来存储和检索运行时的参数;
适合存储静态、非二讲制的配置参数,不适合存储动态配置的数据。

7、功能包

ROS软件中的基本单元,包含节点源码、配置文件、数据定义等

8、功能包清单

记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等

9、元功能包

组织多个用于同一目的功能包

        话题和服务的对比:
Part1 -- ROS基础知识_第7张图片


参考

  1. ROS学习文档:http://wiki.ros.org/cn/ROS/Tutorials
  2. ROS入门教程:
    教程一:https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/
    教程二:http://www.autolabor.com.cn/book/ROSTutorials/
  3. ROS入门视频:https://www.bilibili.com/video/BV1zt411G7Vn?p=1

你可能感兴趣的