Tags: SLAM

本篇博客是慕课《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 "~/catkin_ws/devel/setup.bash" >> ~/.bashcr即可。这样每次CatkinMake后,重新打开终端即可。注意最好不要CatkinMake后直接就运行。因为在打开终端时会载入~/.bashrc的内容,但这个时候你还没有CatkinMake,所以你载入的其实是上一次CatkinMake后的结果。当然如果说你的package项目不是第一次编译、名称也没有改变,那么setup.bash中的内容也就没有变,这样CatkinMake前载入也是可以的。

7.Metapackage

可以翻译为“元包”或“虚包”,其本身没有什么内容,只包含有package必备的CMakeLists.txtpackage.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、发布消息、调用服务等。比较常用的两个是roscpprospy

roscpp常用函数如下。

rospy常用函数如下。

本文作者原创,未经许可不得转载,谢谢配合

返回顶部