本篇文章是对ROS基础学习的一个总结。初学者可通过本篇文章对ROS有一个总体上的了解,也可获取一些学习资料,但是无法代替详尽的学习教程;有一定ROS基础者,可以通过本篇文章对ROS的基础知识进行一个回顾,需要用到相关资料时可以进行查阅。

<>1. 学习资料推荐

ROS官方教程(中文版):http://wiki.ros.org/cn/ROS/Tutorials
<http://wiki.ros.org/cn/ROS/Tutorials>
ROS学习笔记系列:https://blog.csdn.net/mountzf/article/details/51931806
<https://blog.csdn.net/mountzf/article/details/51931806>
ROS学习之路的整理:https://blog.csdn.net/zhanshen112/article/details/82792467
<https://blog.csdn.net/zhanshen112/article/details/82792467>
古月居:http://www.guyuehome.com/ <http://www.guyuehome.com/>
本篇的内容也参考了以上学习资料。

<>2. ROS的安装

ROS不能再详细的安装教程16.04+kinetic:http://www.cnblogs.com/liu-fa/p/5779206.htmlu
<http://www.cnblogs.com/liu-fa/p/5779206.htmlu>
安装过程中若是报错的话,建议用以下指令:
$ sudo apt update $ sudo apt full-update
重新更新一遍系统后,再按照教程中的过程进行ROS的安装。

<>3. 基本概念

<>3.1 ROS

ROS(Robot Operating
System)是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。主要可以从以下四个方面去理解:

1.通道:ROS提供了一种发布-订阅式的通信框架用以简单、快速地构建分布式计算系。

2.工具:ROS提供了大量的工具组合用以配置、启动、自检、调试、可视化、登录、测试、终止分布式计算系统。

3.强大的库:ROS提供了广泛的库文件实现以机动性、操作控制、感知为主的机器人功能。


4.生态系统:ROS的支持与发展依托着一个强大的社区。ros.org尤其关注兼容性和支持文档,提供了一套“一站式”的方案使得用户得以搜索并学习来自全球开发者数以千计的ROS程序包。

简单来说,ROS提供了一些开源的可调用的功能库和通信手段供我们使用。

<>3.2 工作空间


工作空间(workspace)是ROS里面最小环境配置单位,可以把workspace看成是一个有结构的文件夹,它包含多个package以及一些结构性质文件。一次将一个workspace配置进环境变量里面,才能使用ROS命令执行与这个workspace里面的package相关的操作。

<>3.3 功能包

功能包(package)是ROS应用程序代码的组织单元,每个软件包都可以包含程序库、可执行文件、脚本或者其它手动创建的东西。
创建了相应的软件包才能实现相应的功能。

<>3.4 清单

清单(Manifest)是对于功能包相关信息的描述,用于定义软件包相关元信息之间的依赖关系,这些信息包括版本、维护者和许可协议等。 也就是
package.xml文件。

<>3.5 脚本文件


CMakeLists.txt是一个Cmake的脚本文件,Cmake是一个符合工业标准的跨平台编译系统。这个文件包含了一系列的编译指令,包括应该生成哪种可执行文件,需要哪些源文件,以及在哪里可以找到所需的头文件和链接库。

<>3.6 节点

节点(Node)是 ROS 功能包中的一个可执行文件,节点之间可以通过 ROS 客户端库(如roscpp 、 rospy
)相互通信。一个机器人控制系统由许多节点组成,这些节点各司其职,如,一个节点控制激光距离传感器,一个节点控制轮子的马达,一个节点执行定位,一个节点执行路径规划,一个节点提供系统的整个视图等。也就是能够执行特定工作任务的工作单元。

<>3.7 节点管理器

节点管理器(Master)是 ROS
名称服务,能够帮助节点找到彼此。节点通过与节点管理器通信来报告他们的注册信息。值得注意的是,当这些节点和节点管理器通信时,它们可以接受其他注册节点的信息,并能保持通信正常。当这些注册信息改变时,节点管理器也会回调这些节点。所以,没有节点管理器,节点将不能相互找到,也不能进行消息交换或者调用服务。

<>3.8 参数管理器

参数管理器( Parameter Server )是节点管理器的一部分,是一个可通过网络访问的共享的多变量字典。节点使用此服务器来存储和检索运行时参数。

<>3.9 消息


消息(Message)是一种ROS数据类型。一个节点向特定主题发布消息,从而将数据发送到另一个节点。消息具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型。消息与话题(发布
/ 订阅模式)是紧密联系在一起的,msg文件实质上就是一个从结构上描述ROS中所使用消息类型的简单文本,描述的是消息的数据类型。

<>3.10 话题

话题( Topic
)是节点间用来传输数据的总线,通过主题进行消息路由不需要节点之间直接连接。节点可以发布消息到话题,也可以订阅话题以接收消息。一个话题可能对应有许多节点作为话题发布者和话题订阅者。当然,一个节点可以发布和订阅许多话题。一个节点对某一类型的数据感兴趣,它只需订阅相关话题即可。一般来说。话题发布者和话题订阅者不知道对方的存在。发布者将信息发布在一个全局的工作区内,当订阅者发现该信息是它所订阅的,就可以接收到这个信息。

<>3.11 服务

当需要直接与节点通信并获得应答时,将无法通过话题来实现,而需要服务(Service)。我们可以看出,发布 /
订阅模式是一种多对多的传输方式,显然这种传输方式不适用于请求 / 回复的交互方式。请求 / 回复交互方式经常被用于分布式系统中。请求服务通过 Service
来进行,Service 被定义为一对消息结构:一个用于请求,一个用于回复。一个客户通过发送请求信息并等待响应来使用服务( ROS中的请求 /
回复交互方式类似于一个远程函数调用,srv文件类似于函数参数和返回值的定义)。

<>3.12 消息记录包

消息记录包(Bag)是一种用于保存和回放 ROS 消息数据的格式。消息记录包是检索传感器数据的重要机制,这些数据虽然很难收集,但是对于发展和测试算法很有必要。

<>4. 常用命令

<>4.1 ROS Shell命令

命令 功能
roscd 移动到指定的ROS软件包目录
rosls 显示ROS软件包的文件与目录
rosed 编辑ROS软件包的文件
roscp 复制ROS软件包的文件
rospd 添加目录至ROS目录索引
rosd 显示ROS目录索引中的目录
* roscd [功能包名称] 。使用它,无需再使用cd一层层到查找,进入功能包里。
* rosls [功能包名称] 。等价与roscd+ls。查看ROS功能包的文件列表更方便,快捷。
* rosed[功能包名称][文件名称]。 用于编辑功能包中的特定文件,优点也是快捷,修改容易。
<>4.2 ROS执行命令

命令 功能
roscore 开启Master(ROS名称服务)
rosrun 运行单个节点
roslaunch 运行多个节点及设置运行选项
rosclean 检查或删除ROS日志文件
* roscore [选项]。运行主节点,主节点管理节点之间的消息通信中的连接信息。关于主节点的具体作用就不累述了。
* rosrun [功能包名称] [节点名称]。执行指定的功能包中的一个节点的命令(rosrun rqt_graph rqt_graph
可查看当前系统的运行情况)。
* roslaunch [功能包名称] [launch文件名]。 类似dat批命令,是运行指定功能包中一个或设置执行选项的命令。
* rosclean [选项]。运行roscore时,对所有节点的记录都会写入日志文件,随着时间的推移,需要定期使用rosclean命令删除这些记录.
<>4.3 ROS信息命令

命令 功能
rostopic 查看ROS话题信息
rosservice 查看ROS服务信息
rosnode 查看ROS节点信息
rosparam 确认和修改ROS参数信息
rosbag 记录和回放ROS消息
rosmsg 显示ROS消息类型
rossrv 显示ROS服务类型
rosversion 显示ROS功能包的版本信息
roswtf 检查ROS系统
* rostopic [选项]
list - 列出活动话题
echo [话题名称] - 实时显示指定话题的消息内容
find [类型名称] - 显示使用指定类型的消息的话题
type [话题名称] - 显示指定话题的消息类型
bw [话题名称] - 显示指定话题的消息类型
hz [话题名称] - 显示指定话题的消息数据发布周期
info [话题名称] - 显示指定话题的消息
pub [话题名称] [消息类型] [参数] - 用指定的话题名称发布消息,许多时候另开一个终端操作 例:rostopic pub -1
/turtle1/cmd_vel geometry_msgs/Twist – ‘[2.0, 0.0, 0.0]”[0.0, 0.0, 0.0]’
* rosservice [选项]
list - 显示活动的服务信息
info [服务名称] - 显示指定服务的信息
type [服务名称] - 显示服务类型
find [服务类型] - 查找指定服务类型的服务
uri [服务名称] - 显示ROSRPC URI服务
args [服务名称] - 显示服务参数
call [服务名称] [参数] - 用输入的参数请求服务,通常用于测试服务
* rosnode [选项]
list - 查看活动的节点列表
ping [节点名称] - 与指定的节点进行连接测试
info [节点名称] - 查看指定节点的信息
machine [PC名称或IP] - 查看该PC中运行的节点列表
kill [节点名称] - 停止指定节点的运行
cleanup - 删除失连节点的注册信息
* rosparam [参数]
list - 查看参数列表
get [参数名称] - 获取参数值
set [参数名称] - 设置参数值
dump [文件名称] - 将参数保存到指定文件
load [文件名称] - 获取保存在指定文件中的参数,经常使用。
delete [参数名称] - 删除参数
* rosmsg [参数]
list - 显示所有消息
show [消息名称] - 显示指定消息
md5 [消息名称] - 显示md5sum
package [功能包名称] - 显示用于指定功能包的所有消息
packages - 显示使用消息的所有功能包
* rossrv [参数]
list -显示所以服务
show [服务名称] - 显示指定的服务信息
md5 [服务名称] - 显示md5sum
package [功能包名称] - 显示指定的功能包中用到的所有服务
packages - 显示使用服务的所有功能包
* rosbag [参数]
record [选项] [话题名称] - 将指定话题的消息记录到bag文件
info [文件名称] - 查看bag文件的信息
play [文件名称] - 回放指定的bag文件,这个使用玩的也多。
compress [文件名称] - 压缩指定的bag文件
decompress [文件名称] - 解压指定的bag文件
filter [输入文件] [输出文件] [选项] - 生成一个删除了指定内容的新的bag文件
reindex bag [文件名称] - 刷新索引
check bag [文件名称] - 检查指定的bag文件是否能在当前系统中回放
fix [输入文件] [输出文件] [选项] - 将由于版本不同而无法回放的bag文件修改可以回放的文件
<>4.4 ROS catkin命令

* catkin_create_pkg - 自动生成功能包(示例命令:catkin_create_pkg [功能包名称] [依赖性功能包1]
[依赖性功能包2]….)。
* catkin_make - 基于catkin构建系统的构建 (示例:catkin_make –pkg [包名] 只构建一部分功能包)。
* catkin_eclipse - 对于用catkin构建系统生成的功能包进行修改,使其能在Eclipse环境中使用。
* catkin_prepare_release - 在发布时用到的日志整理和版本标记。
* catkin_generate_changelog - 在发布时生成或更新CHANGLOG.rst文件。
* catkin_init_workspace - 初始化catkin构建系统的工作目录。
* catkin_find - 搜素catkin,找到并显示工作空间。
<>4.5 ROS功能包命令

* rospack [选项] [功能包名称] - 查看与ROS功能包相关的信息(可以使用find, list, depend-on,
depends和profile等选项)。
* rosinstall - 安装ROS附加功能包。
* rosdep [选项] - 安装该功能包的依赖性文件(check, install, init, update)。
* roslocate [选项] [功能包名称] - ROS功能包信息相关命令(可用的选项是info, vcs, type, uri和repo等)。
<>5. 基本操作

<>5.1 创建ROS工作空间
$ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/ $ catkin_make
其中catkin_ws是自定义的工作空间名,也就是文件夹名。

<>5.2 将工作空间配置进环境变量

可通过以下的命令来配置:
$ source devel/setup.bash
也可直接在.bashrc里写入:
source ~/catkin_ws/devel/setup.bash
<>5.3 创建一个功能包

首先切换到工作空间的src目录下:
$ cd ~/catkin_ws/src
再使用catkin_create_pkg命令来创建功能包:
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

其中,beginner_tutorials是创建的功能包名,后面是该功能包依赖的三个功能包。运行完后可以看出在beginner_tutorials目录下创建了package.xml和CMakeLists.txt两个文件。

<>5.4 配置package.xml文件

接下来对package.xml文件进行配置。package.xml文件主要由4个标签组成,分别为描述标签、维护者标签、许可证标签、依赖项标签。
<?xml version="1.0"?> <package format="2"> <name>beginner_tutorials</name> <
version>0.1.0</version> <description>The beginner_tutorials package</description
> <maintainer email="you@yourdomain.tld">Your Name</maintainer> <license>BSD</
license> <url type="website">http://wiki.ros.org/beginner_tutorials</url> <
author email="you@yourdomain.tld">Jane Doe</author> <buildtool_depend>catkin</
buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</
build_depend> <build_depend>std_msgs</build_depend> <exec_depend>roscpp</
exec_depend> <exec_depend>rospy</exec_depend> <exec_depend>std_msgs</exec_depend
> </package>
<>5.5 编写ROS程序

在 ~/工作空间/src/功能包名 目录下,创建并编辑cpp程序文件(以hello.cpp为例)。运行如下命令:
$ cd ~/catkin_ws/src/beginner_tutorials $ touch hello.cpp $ gedit hello.cpp
hello.cpp代码如下:
#include <ros/ros.h> int main ( int argc , char ** argv) { ros::init ( argc ,
argv, "hello"); ros::NodeHandle nh; ROS_INFO_STREAM( "Hello , ROS! "); }
<>5.6 编译ROS程序

<>5.6.1 声明依赖库


首先,我们需要声明程序所依赖的其他功能包。对于C++程序而言,此步骤是必要的,以确保catkin能够向C++编译器提供合适的标记来定位编译功能包所需的头文件和链接库。
为了给出依赖库,我们需要编辑CMakeLists.txt文件。即修改find_package如下:
find_package(catkin REQUIRED COMPONENTS #依次写上所依赖的功能包 roscpp )

同样,我们也需要在package.xml文件中列出依赖库,由于hello程序在编译时和运行时都需要roscpp库,故将roscpp添加至build_depend(编译依赖)和exec_depend(运行依赖)。如下:
<buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend>
<build_export_depend>roscpp</build_export_depend> <exec_depend>roscpp</
exec_depend>
<>5.6.2 声明可执行文件

接下来,我们需要在CMakeLists.txt中添加两行,来声明我们需要创建的可执行文件。
第一行:
add_executable(hello hello.cpp)

其中,hello是我们想要生成的可执行文件的文件名,hello.cpp是生成此可执行文件所需的源文件列表。如果有多个源文件,把它们列在此处,并用空格将其区分开。
第二行:
target_link_libraries(hello ${catkin_LIBRARIES})
该行告诉Cmake当链接此可执行文件时需要链接哪些库(在上面的find_package中已经定义了)。

<>5.6.3 编译工作区

首先返回工作空间目录,然后使用catkin_make命令进行编译:
$ cd ~/catkin_ws $ catkin_make

完成编译后,将会在工作区中创建devel(开发空间,用来放置编译生成的可执行文件)和build(编译空间,用来储存工作空间编译过程中产生的缓存信息和中间文件)两个子目录。

<>5.7 运行ROS程序

hello 程序是一个节点(Node),需要节点管理器才可以正常运行,启动节点管理器后,用rosrun命令运行程序:
$ roscore $ rosrun beginner_tutorials hello
至此,完成了创建工作空间、功能包、编写、编译、运行简单的ROS程序。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信