ROS(机器人操作系统)基础:

一、 安装好ROS。在搜索引擎中搜索ROS官方网站,然后进入网站查看官方安装步骤进行安装。

二、ROS默认的安装目录为“文件/其他位置/计算机/opt”,找到“ros”文件夹并打开,可以看到一个以当前安装的ROS版本号命名的文件夹,这里面就包含所有ROS的文件,共有5个文件夹。

(1) bin文件夹中里面放置的是一些终端指令,如经常用到的“catkin_make”“roslaunch”“rosrun”等。

(2)etc主要是用来存放“catkin”和“ros”的配置文件的文件夹。

(3)include文件夹中里面放置的是通过终端安装的功能包里的头文件。某个功能包中具有一些头文件,在创建功能包时,如果需要依赖另一个功能包,就必须包含那个功能包的头文件。

(4)lib文件夹中放置的是通过终端安装的功能包里的可执行程序,也就是功能包中的节点,运行其中的节点就可以启动相应功能。

(5)share文件夹中放置的是通过终端安装的功能包里的共享数据,是功能包里面接口的一些具体信息。接口包含话题、服务、action等。

三、测试ROS

1) 明确了安装的ROS版本为“noetic”,接下来我们可以通过在终端中输入指令查看ROS版本。在终端中输入“rosversion -d”,在终端窗口里显示出了指令“noetic”

2)打开一个终端

(1)输入"roscore"这条指令是启动ROS节点管理器

(2)保持之前的终端不要关闭,打开一个新终端,输入如下指令。rosrun turtlesim turtlesim_node
这条指令是启动小乌龟节点,运行后弹出一个“TurtleSim”窗口,在其中心有一只静止的小乌龟。
(3)保持之前的终端不要关闭,打开一个新的终端,输入如下指令。
rosrun turtlesim turtle_teleop_key 这条指令是启动键盘控制小乌龟移动的节点,运行后可以通过键盘上的方向键控制小乌龟在窗口内移动并留下轨迹。

四 ros架构

ROS架构分为三个部分:开源社区、文件系统和计算图

ROS用户可以在通过网络建立的开源社区中共享和获取知识、代码与算法。现在开源社区中的资源非常丰富,这些资源包括以下几种。
(1)ROS Distribution:它类似于Linux发行版,是一个特定版本的所有程序包集合。
(2)ROS Wiki:它是用于记录有关ROS信息的主要论坛,大家都可以进行注册、登录,分享、更正、更新和编写教程等。
(3)ROS Repository:ROS依赖于共享开源代码与软件库,不同的机构组织能够在这里发布或共享各自的机器人软件或程序。
(4)ROS Answer:它是用于咨询ROS相关问题的网站。

ROS文件系统的组织形式是一个标准化的架构,编写的时候不要改变,以下是常用的各文件系统。
(1)catkin workspace:工作空间,是用户自定义的存放工程开发相关文件的文件夹,包含3个文件夹,即src、Build、devel。
(2)src:源码空间,用于储存功能包、项目、克隆包等。
(3)Build:编译空间,用于储存CMake和catkin的缓存信息、配置信息及其他中间文件。
(4)devel:开发空间,用于储存变异后生成的目标文件,包括头文件、动态或静态链接库和可执行文件等,这些都是可以直接运行的程序。

(5)Package:功能包。单个功能包称为软件包,多个功能包称为堆。功能包是ROS程序的基本单元,每个功能包可以包含多个节点(进程或可执行文件)、程序库、脚本、配置文件及其他可以手动创建的东西。这些内容可以在逻辑上被定义为一个完整的软件模块。
(6)CMakeList.txt:编译规则文件,用于设定编译规则,如源文件、依赖项和目标文件等。

(7)Manifest(Package.xml):功能包清单文件,是一个名为Package.xml的XML文件,它必须位于功能包文件夹中。它是对功能包相关信息的介绍,用于定义软件包相关信息之间的依赖关系,如功能包名称、版本、作者、描述(某功能的软件包)、维护者的邮箱、许可,这些可以改也可以不改,但是格式不能出错;这里面还包括编译标志及对其他功能包的依赖项。注意,系统包的依赖关系也应该在Package.xml中声明,当用户需要在设备上通过源代码来构建包时,这一点是非常有必要的。
(8)scripts:用于储存Python文件、Linux操作系统下的shell文件和其他可执行文件。

(9)msg:在ROS框架中,节点(Node)之间通过将消息发布到话题(Topic)中来实现彼此的异步通信,这里的话题是一种数据结构,而消息文件的扩展名为.msg,它位于功能包msg中,即msg是用来储存消息通信格式的文件夹。
(10)srv:ROS服务。ROS节点还可以通过系统服务的调用来同步交换请求(Request)和响应(Response)消息。这些交换请求和响应消息位于srv文件夹中,扩展名为.srv。
(11)include:用于储存头文件。
(12)src:用来储存源文件。

(13)launch:用于储存launch文件。launch文件的作用是一次性运行多个节点。

如果要获得关于ROS环境中的功能包和栈的信息,如它们的路径、依赖关系等,则需要用到ROS文件系统工具。它们可以帮助我们查询ROS工作空间中的相关文件,可以简化操作,常用的指令有如下几个。
1)rospack 可以得到一个包的信息,rospack help指令会运行出来许多相关操作,其中find的功能是得到一个功能包的路径。
格式:rospack find 功能包名。
实例:rospack find roscpp。
结果:/opt/ros/melodic/share/roscpp。

2)roscd可以直接进入pkg,不需要使用绝对路径。
格式:roscd 包名。
实例:roscd roscpp。
结果:/opt/ros/melodic/share/roscpp$。
注意:roscd只会在ROS_PACKAGE_PATH 环境变量指定的路径中查找ros包,并进入这个包,所以在使用roscd来进入一个pkg前,一定要保证pkg的路径在ROS_PACKAGE_PATH中。

3)rosls直接列出一个包的目录,也不需要使用绝对路径,只需要一个包名即可。

4)Tab自动补全。对于已经存在的文件,可以只输入文件名的前面几个字母,剩余部分使用“Tab”键补全。

ROS软件的各功能以节点为单位独立运行。ROS创建了连接所有节点的通信网络,通过这个网络,各个相互独立的节点可以进行交互。ROS计算图如图所示,计算图这一层级中包括节点、节点管理器、参数服务器、消息、主题、服务和消息记录包

格式:rosls 包名。
实例:roscd roscpp_tutorials。
结果:cmake launch Package.xml srv。

1.节点
在ROS中,节点相当于模块,一个机器人具有很多的功能,每个功能都可以独立出来成为功能模块,而节点就相当于软件层面的功能模块,使软件设计更加便捷。rosrun turtlesim turtlesim_node和rosrun turtlesim turtle_teleop_key两步,就是启动了对应的节点。
2.节点管理器
节点管理器在ROS中扮演着管理者的角色,管理着各个节点,保证节点正常运行,节点需要先在节点管理器中进行注册,才能融入ROS程序这个“大家庭”进行交流。“roscore”指令的作用就是启动节点管理器。

3.参数服务器
参数服务器相当于ROS程序“大家庭”中的“家族图书馆”,是可以通过网络访问的共享字典,节点将关键字储存在节点管理器中,节点使用参数服务器储存和检索参数。
4.消息
消息相当于ROS程序“大家庭”中各成员联系所使用的“书信”,节点之间通过传递消息进行通信,每种消息都有自己严格的数据结构。

5.主题
主题相当于ROS所在世界的“邮局”,可以有针对性地传递消息。在2.2节中已经运行的那两个指令的状态基础上,可以打开一个新的终端运行如下指令。
rqt_graph
运行后会弹出rqt_graph_RosGraph-rqt界面,可以看出节点“/teleop_turtle”和节点“/turtlesim”之间通过名为“/turtle1/cmd_vel”的主题进行通信。节点“/teleop_turtle”在此主题上发布按键输入消息,节点“/turtlesim”订阅此主题接收该消息。

6. 服务

服务相当于升级版的主题,相对于主题来说,服务可以进行同步消息传递,其基于客户端/服务器(Client/Server)模型,包含两个部分的通信数据类型:一个用于请求;另一个用于应答,类似于Web服务器。与主题不同的是,ROS中只允许有一个节点提供指定命名的服务。

创建工作空间

(1)打开终端,输入如下指令。

mkdir -p ~/catkin_ws/src

这条指令会先在主文件夹(用户文件夹)下创建一个名为“catkin_ws”的文件夹,然后在其下创建一个下一级的src文件夹

(2)在终端中输入如下指令。

cd ~/catkin_ws/src

这条指令会使终端在“~/catkin_ws/src”目录下运行

(3)在终端中输入如下指令。
catkin_init_workspace
这条指令是初始化src文件夹,将其变为ROS工作空间。运行后会在“src”文件夹中生成一个名为“CMakeLists.txt”的文件,此时一个最初始的ROS工作空间便创建成功。

要编译工作空间,就要先回到工作空间的根目录。
(1)在终端中输入如下指令。
cd ~/catkin_ws/
这条指令会使终端在“~/catkin_ws”目录下运行。catkin_ws是指自定义的工作空间名称

(2)在终端中输入如下指令。
catkin_make
这条指令是进行编译的指令,编译成功后会在“~/catkin_ws”目录下生成“build”和“devel”两个文件夹。“devel”文件夹中存放了编译完成的内容。加上“src”文件夹,此时catkin_ws文件夹下共有三个文件夹。需要注意的是,“catkin_make”如果不在工作空间文件夹下运行,则系统将会报错。

(3)在终端中输入如下指令。
catkin_init_workspace
这条指令是初始化src文件夹,将其变为ROS工作空间。运行后会在“src”文件夹中生成一个名为“CMakeLists.txt”的文件

将工作空间添加到环境变量中可以省去每次打开终端时手动刷新的步骤,具体步骤如下。
(1)在终端中输入如下指令。
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
该指令的意思是把“source ~/catkin_ws/devel/setup.bash”这条指令加载到“~/.bashrc”这个脚本的后面。实际上,这与直接打开.bashrc文件将“source ~/catkin_ws/devel/setup.bash”粘贴进去的结果是一样的。这样每次打开终端时,系统就会自动刷新工作空间环境。这个工作空间中的所有Package都可以在编译后直接运行,不用再source。

(2)在终端中输入如下指令。
source ~/.bashrc
使用该指令就可以成功将工作空间添加到环境变量中

工作空间生效后,通过指令“echo $ROS_PACKAGE_PATH”可以查看当前环境中的工作变量,在当前工作空间中运行以上指令后,会显示创建的工作空间和二进制安装的核心库与依赖包两个路径(/home/robot/catkin_ws/src:/opt/ros/melodic/share)。

来源: 部分来自网络