ROS基础学习笔记

来源:https://blog.csdn.net/weixin_43795921/article/details/85034673

目录

1. 学习资料推荐

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

2. ROS的安装

ROS不能再详细的安装教程16.04+kinetic:http://www.cnblogs.com/liu-fa/p/5779206.htmlu
安装过程中若是报错的话,建议用以下指令:

$ sudo apt update
$ sudo apt full-update

   
   
  • 1
  • 2

重新更新一遍系统后,再按照教程中的过程进行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

   
   
  • 1
  • 2
  • 3

其中catkin_ws是自定义的工作空间名,也就是文件夹名。

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

可通过以下的命令来配置:

$ source devel/setup.bash

   
   
  • 1

也可直接在.bashrc里写入:

source ~/catkin_ws/devel/setup.bash

   
   
  • 1

5.3 创建一个功能包

首先切换到工作空间的src目录下:

$ cd ~/catkin_ws/src

   
   
  • 1

再使用catkin_create_pkg命令来创建功能包:

$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp

   
   
  • 1

其中,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>

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

5.5 编写ROS程序

在 ~/工作空间/src/功能包名 目录下,创建并编辑cpp程序文件(以hello.cpp为例)。运行如下命令:

$ cd ~/catkin_ws/src/beginner_tutorials
$ touch hello.cpp
$ gedit hello.cpp

 
 
  • 1
  • 2
  • 3

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! ");
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5.6 编译ROS程序

5.6.1 声明依赖库

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

find_package(catkin REQUIRED COMPONENTS
#依次写上所依赖的功能包
  roscpp
)

 
 
  • 1
  • 2
  • 3
  • 4

同样,我们也需要在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>

 
 
  • 1
  • 2
  • 3
  • 4

5.6.2 声明可执行文件

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

add_executable(hello hello.cpp)

 
 
  • 1

其中,hello是我们想要生成的可执行文件的文件名,hello.cpp是生成此可执行文件所需的源文件列表。如果有多个源文件,把它们列在此处,并用空格将其区分开。
第二行:

target_link_libraries(hello ${catkin_LIBRARIES})

 
 
  • 1

该行告诉Cmake当链接此可执行文件时需要链接哪些库(在上面的find_package中已经定义了)。

5.6.3 编译工作区

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

$ cd ~/catkin_ws
$ catkin_make

 
 
  • 1
  • 2

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

5.7 运行ROS程序

hello 程序是一个节点(Node),需要节点管理器才可以正常运行,启动节点管理器后,用rosrun命令运行程序:

$ roscore
$ rosrun beginner_tutorials hello

 
 
  • 1
  • 2

至此,完成了创建工作空间、功能包、编写、编译、运行简单的ROS程序。

上一篇:Ubuntu+ROS+SICK LMS500


下一篇:ROS学习(2)——创建工作空间和创建功能包