- 1.ROS版本
- 2.ROS架构
- 3.ROS与IDE安装
- 4.Catkin与工作空间
- 5.ROS的Package结构
- 6.ROS的常用指令
- 7.Metapackage
- 8.Master和Node
- 9.Topic和msg
- 10.Service和srv
- 11.Parameter Server
- 12.Action
- 13.Gazebo
- 14.RViz
- 15.Rqt
- 16.Rosbag
- 17.Client Library
本篇博客是慕课《ROS机器人操作系统入门》的笔记,慕课网址是这里。由于这是我的个人学习笔记,记录的都是我不太熟悉和觉得重要的内容,因此内容不一定很系统以及适合你。想要系统学习推荐上面的视频教程。
1.ROS版本
ROS历史版本
每个ROS版本对应一个Ubuntu版本,如Indigo对应Ubuntu14.04,Kinetic对应Ubuntu16.04。这两个版本也是目前应用最广泛的。推荐Kinetic+Ubuntu16.04搭配。
2.ROS架构
之前想当然以为ROS也是一个操作系统,还是自己写代码在上面跑,和Linux没什么区别,现在觉得有些肤浅了。ROS可以看作是一种中间件,沟通了自己写的代码和真正的操作系统(如Linux)。ROS由四部分组成:框架+工具+功能+社区。
ROS中的节点(Node)=电脑中的进程或可执行文件。ROS是一个模块化、分布式的架构,自带了进程管理和通信的相关功能。因此在开发的时候无需自己考虑进程的并行运行、协同调度等问题,简化了开发。
个人理解ROS就是一个平台,并且也提供了各种“积木”,你可以方便地在这个平台上用这些积木搭建出你想要的东西。很多事情你就不需要重复早轮子,只需要关注你所擅长的内容。了解了ROS之后感觉打开了新世界的大门,原来还可以这么玩的感觉,相见恨晚,之前学的那些零零碎碎的东西感觉被联系整合到了一起。这有点类似于刚学Python的时候用pip
零零碎碎装一些包,直到发现了Anaconda这个好用的集成环境。例如ROS里自带的Gazebo、Rviz等可视化工具可以方便而且“酷炫”的进行展示和调试。这也解决了我之前的一个困惑,在SLAM论坛上看那些老师酷炫的三维演示动画,当时还以为是他们完全自己写的,觉得很厉害。现在想想其实只是用了ROS里的可视化组件而已。
3.ROS与IDE安装
关于ROS的安装,基本上直接按照官网安装流程(中文)安装即可,不难。安装完成后终端输入roscore
,如果出现如下内容说明安装成功。
教程的示例代码在这里。
推荐IDE:RoboWare Studio,官网是这里,但现在貌似上不去了。Github项目主页是这里,基于VS Code开发。官网打不开的话可以去Github下载deb
包自己安装,点击这里去Github下载。
4.Catkin与工作空间
Catkin(中文意思为柳絮))是ROS定制的编译构建系统,是对CMake的扩展。Catkin Workspace则是组织和管理package的文件夹,组织结构如下所示。
src
是实际写代码的地方,可以放多个package,如下,其它是系统自动生成的。
package是Catkin编译的基本单元。
catkin_make
用于初始化创建空间以及编译项目(常用),基本操作命令如下。
初始化工作空间时,工作空间根目录下必须要有src
文件夹,否则会提示没有src
文件夹,新建不了。在编译时注意两点:一是要在工作空间的根目录下catkin_make
,不然会报错;二是catkin_make
之后记得source
一下catkin_ws/devel/setup.bash
,否则可能会提示找不到可执行文件。
建立工作空间可能会遇到如下问题。
提示找不到包,这时候pip install catkin_pkg
安装一下就好了。建好的工作空间终端输出如下。
5.ROS的Package结构
中文可叫做功能包,是ROS软件的基本组织形式,是Catkin的基本编译单元。一个package可以包含多个可执行文件(节点)。Package的完整结构如下:
CMakeLists.txt
(必须):规定Catkin的编译规则
package.xml
(必须):自我描述,定义package的属性信息,如包名、版本、作者等。一般只需要改<build_depend>
和<run_depend>
就可以了。
scripts
:用于存放一些shell或python脚本
include
:源代码的头文件
src
:源代码,如cpp文件、py文件等
msg
:自定义消息格式,*.msg
srv
:自定义服务,*.srv
action
:自定义动作,*.action
config
:参数、设置文件等,如*.yaml
launch
:启动规则文件,*.launch
,配合roslaunch
命令可以一次运行多个可执行文件
6.ROS的常用指令
常用依赖:roscpp、rospy、std_msg、nav_msg等。直接在catkin_create_pkg
时在包名后面空格加上即可。
全新新建工作空间终端代码:
mkdir -p ~/catkin_ws/src
cd catkin_ws
catkin_make
接着在工作空间中新建package:
catkin_create_pkg test roscpp rospy std_msg
这样便建好了一个包。
而对于从Github上clone或下载下来的代码,在建好了工作空间后,可以按照如下方式安装。
cd ~/catkin_ws/src
git clone https://github.com/DroidAITech/ROS-Academy-for-Beginners.git
cd ~/catkin_ws
rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y
catkin_make
source ~/catkin_ws/devel/setup.bash
需要注意的是下载的代码需要放到工作空间的src
文件夹下,第二是需要在工作空间根目录下安装包所需的依赖以及CatkinMake。最后别忘了source
一下。当然如果嫌麻烦也可以将最后一行添加到~/.bashrc
中,在终端中输入echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
即可。这样每次CatkinMake后,重新打开终端即可。注意最好不要CatkinMake后直接就运行。因为在打开终端时会载入~/.bashrc
的内容,但这个时候你还没有CatkinMake,所以你载入的其实是上一次CatkinMake后的结果。当然如果说你的package项目不是第一次编译、名称也没有改变,那么setup.bash
中的内容也就没有变,这样CatkinMake前载入也是可以的。
7.Metapackage
可以翻译为“元包”或“虚包”,其本身没有什么内容,只包含有package必备的CMakeLists.txt
和package.xml
。但它依赖了其它包(在package.xml
中指定),通过这种方式将多个包组合起来。这样做的好处就是在安装的时候就不需要一个个安装,而只安装一个metapackage就可以了。ROS中常见的Metapackage如下:
8.Master和Node
在ROS中,所有的Node都是通过Master管理的,因此如果想启动一个Node,必须先要启动Master(roscore
)然后再启动节点(rosrun
)。
Master:节点管理器。每个node启动的时候都要向master注册,管理node之间的通信。启动Master的命令是roscore
,启动master
的同时也会顺带启动rosout
(日志输出)和parameter server
(参数服务器)。
Node:ROS的进程,package里的可执行文件运行的示例,一般以功能划分。启动Node的命令是rosun [pkg_name] [node_name]
(必须先启动好master);也可以以launch文件的方式启动:roslaunch [pkg_name] [*.launch]
(自动判断master是否运行,没有的话自动启动),这样可以一次启动多个node。rosnode
命令则用于查看和管理node,常用功能如下。
实际项目中,一般将用于启动机器人的包命名成name_bringup
,这样在终端输入roslaunch name_bringup name.launch
就可以启动机器人了。
9.Topic和msg
Topic:ROS中的异步通信方式,可以看作是一个“频道”,Node之间通过publish-subscribe机制通信,如下所示。 一个Topic可以被多个Node订阅,一个Node也可以发布多个Topic,同时一个Topic也可以由多个Node发送,是一种多对多的关系。Topic在代码层面是字符串。
Message:Topic内容的数据类型(格式标准),定义在*.msg
文件中。Message可以理解为类,而发布的一条条的信息则是类的对象。基本Message类型如下:
例如ROS里定义的Image的Message格式如下:
相关命令:
10.Service和srv
Service:ROS中的同步通信方式,Node间可以通过request-reply方式通信,如下。相比于Topic的“发了就不再管”或“只管接收”的单向通信,Service更加“有来有回”,所以比较适用于一些修改等场景,返回结果是是否修改成功。 Topic和Service的对比
srv:Service通信的数据格式,定义在*.srv文件中。一个示例srv文件如下。 Service常用命令如下:
此外在自定义了Topic或Service后,都需要在package.xml和CMakeLists.txt中修改对应内容,如下。
11.Parameter Server
参数服务器中存储各种参数的字典(键值对),可以用命令行、launch文件和node(API)读写。一般将系统中不常改变的参数、设置等放到参数服务器中。可以理解为参数服务器中的参数对于节点是共享的,节点可以读写内容。
命令行修改参数命令rosparam
:
launch文件中修改参数:
<param>
一般用于单个参数设置,<rosparam>
一般用于批量参数设置。
12.Action
可以理解为升级版的Service。 Action通信的数据格式定义在*.action中。一个简单的示例如下:
13.Gazebo
ROS下的机器人仿真工具,Gazebo基于ODE物理引擎,用于动力学、导航、感知等任务的模拟。官网是这里。直接点击Gazebo的图标即可启动。
14.RViz
全称The Robot Visualization tool,是一个方便监控和调试的可视化工具,其本质上就是将一些订阅得到的数据可视化地显示出来,从而方便调试。在终端中直接输入rviz
即可启动(需要先启动Master)。
15.Rqt
可视化工具,显示一些抽象的信息,如rqt_graph
用于显示系统的通信架构,rqt_plot
用于绘制一些动态参数曲线(如线速度、角速度、IMU数据等),rqt_console
用于查看日志等等。
16.Rosbag
ROS的命令行工具,用于记录和回放数据流。 基本使用:
17.Client Library
Client Library是ROS提供的用于编程的API库,如建立node、发布消息、调用服务等。比较常用的两个是roscpp
和rospy
。
roscpp
常用函数如下。
rospy
常用函数如下。
本文作者原创,未经许可不得转载,谢谢配合