ROS框架

认识ROS框架

ROS框架_第1张图片

  • 三个层次

ROS计算机图级

ROS框架_第2张图片

  • 上图是一个简单的ROS计算图
  • ROS是一个分布式框架,为用户提供多节点(进程)之间的通信服务,所有软件功能和工具都建立在这种分布式通信机制上,所以ROS的通信机制是最底层也是最核心的技术。在大多数应用场景下,尽管我们不需要关注底层通信的实现机制,但是了解其相关原理一定会帮助我们在开发过程中更好地使用ROS。
  • 以下就ROS最核心的三种通信机制进行介绍:

几个概念

  1. 节点(node)—— 软件模块
  2. 节点管理器(master)—— 控制中心,提供参数管理
  3. 话题(topic)—— 异步通讯机制,传输消息(message)
  4. 服务(service)—— 同步通讯机制,传输请求/应答数据
    ROS框架_第3张图片

节点(Nodes
  • 节点是执行计算的进程
  • 一个机器人控制系统通常包括很多节点,比如节点1控制一个激光测距仪,节点2控制电机,节点3进行定位,节点4进行路径规划,节点5提供系统的图形视图(每个节点应具有特定的单一功能、且名称唯一
  • 节点使用roscpp和rospy等ROS客户端库进行编写
  • ROS提供的节点工:
# 输出当前节点信息
rosnode info NODE
# 结束当前运行节点  
rosnode kill NODE
# 列出当前活动节点
rosnode list
# 列出某一特定计算机上运行的节点或列出主机名称
rosnode machine hostname
# 测试节点间的连通性
rosnode ping NODE
# 清除无法访问节点的注册信息
rosnode cleanup

节点管理器(Master
  • 用于节点的注册和查找
  • 没有节点管理器,节点之间无法发现对方、交换信息或调用服务
  • ROS是一个分布式网络系统,可以在一台计算机上运行节点管理器,在该管理器或其他计算机上运行节点

消息记录包(bags)
  • 消息记录包是由ROS创建的一组文件,使用.bag格式保存消息、主题、服务和其他ROS数据信息
  • 可在事件发生后通过可视化工具调用和回放数据
  • 消息记录包ROS工具
    • rosbag:录制、播放和执行其他操作
    • rqt_bag:可视化bag文件数据
    • rostopic:帮助我们看到节点发送的主题

话题通讯机制

ROS框架_第4张图片

  • Talker向Master注册
  • Listener向Master注册
  • ROS Master进行信息匹配
  • Listener 发送连接请求
  • Talker确认连接请求
  • Listener尝试与Talker建立网络连接
  • Talker向Listener发布数据
例子

ROS框架_第5张图片

  • 主题是节点间用来传输数据的总线
  • 通过主题进行消息路由不需要节点之间直接连接——发布者订阅者之间不需要知道彼此是否存在
  • 一个主题可以有多个订阅者,也可以有多个发布者
  • ROS的主题可以使用TCP/IP和UDP传输:TCPROS(默认),UDPROS(低延迟高效率,数据丢失,远程操作)

ROS rostopic工具

# 显示主题所使用的带宽
rostopic bw /topic
# 将消息输出到屏幕
rostopic echo /topic
# 按照类型查找主题
rostopic find message_type  
# 显示主题的发布频率
rostopic hz /topic
# 输出活动主题、发布的主题、主题订阅者和服务的信息
rostopic info /topic  
# 输出活动主题的列表
rostopic list  
# 将数据发布到主题
rostopic pub /topic type args  
# 输出主题的类型
rostopic type /topic  

服务通讯机制

ROS框架_第6张图片

  • Talker向Master注册
  • Listener向Master注册
  • ROS Master进行信息匹配
  • Listener 发送连接请求
  • 建立网络连接
  • Talker向Listener发布服务应答数据
特点
  • 发布/订阅模型是一种灵活的通讯机制,但是其多对多、单向传输的方式不适合于分布式系统通常要求的请求/应答交互方式
  • 请求/应答通过服务实现。服务由一对消息定义:一个用于请求,一个用于应答
  • 一个节点提供服务名称,客户通过发送请求消息并等待应答来使用服务

ROS Service 工具

# 根据命令行参数调用服务
rosservice call 
# 根据服务类型查找服务
rosservice find 
# 输出服务消息
rosservice info 
# 列出活动服务清单
rosservice list 
# 输出服务类型
rosservice type
# 输出服务的ROSPRC URI
rosservice uri

参数通讯机制

ROS框架_第7张图片
参数类似于ROS中的全局变量,由ROS Master进行管理,其通信机制较为简单,不涉及TCP/UDP的通信

  • Talker 设置变量
    Talker使用RPC向ROS Master发送参数设置数据,包含参数名参数值;ROS Master会将参数名和参数值保存到参数列表
  • Listener查询参数值
    Listener通过RPC向ROS Master发送参数查询请求,包含索要查找的参数名
  • ROS Master向Lisener发送参数值
    Master根据Lisener的查找请求从参数列表中进行查找,查找到参数后,使用RPC将参数发送给Lisener
消息(Messages)
  • 节点间通过传递消息进行沟通
  • 消息是一个包括输入字段的数据结构
  • ROS支持标准的数据类型(整型,浮点型,布尔型等等) ,同时也支持原始数组类型
  • 消息可以包含任意的嵌套结构和数组(类似C语言的structs)

ROS rosmsg工具:

# 显示一条消息的字段
rosmsg show
# 列出所有消息
rosmsg list
# 列出功能包的所有消息
rosmsg package
# 列出所有具有该消息的功能包
rosmsg packages
# 搜索使用该消息类型的代码文件
rosmsg users
# 显示一条消息的MD5求和结果
rosmsg md5

话题与服务的区别

ROS框架_第8张图片

ROS文件系统

类似操作系统,ROS将所有文件按照一定的规则进行组织,不同功能的文件被放置在不同的文件夹下
ROS框架_第9张图片

  • 功能包(Package):功能包是ROS软件中的基本单元,包含ROS节点、库、配置文件
  • 功能包清单(Package Manifest):每个功能包都包含一个名为Package.xml的功能报清单,用于记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等
  • 元功能包(Meta Package ):在新版本的ROS中,将原有功能包集(Stack)的概念升级为“元功能包”,主要作用都是组织多个用于同一目录的功能包。例如一个ROS导航的元功能包中包含建模、定位、导航等多个功能包
  • 消息(Message )类型:消息是ROS节点之间发布/订阅的通信信息,可以使用ROS提供的消息类型,也可以使用.msg文件在功能包的msg文件夹下自定义所需要的消息类型
  • 服务(Service )类型:服务类型定义了ROS客户端/服务器通信模型下的请求与应答数据类型,可以使用ROS系统提供的服务类型,也可以使用.srv文件在功能包的srv文件夹中进行定义
  • 代码(Code):用来放置功能包节点源代码的文件夹

工作空间(Workspace)

  • 一个包含功能包、可编辑源文件或编译包的文件夹
  • 同时编译不同的功能包时非常有用,并且可以用来保存本地开发包

ROS框架_第10张图片

# 使用标准Cmake工作流程,一次编译一个包
$ cmake package/
$ make

# 编译工作空间内的所有包
$ cd workspace
$ catkin_make
catkin简析
  • 程序在cmake编译是这样的流程, cmake指令依据你的CMakeLists.txt 文件,生成makefiles文件,make再依据此makefiles文件编译链接生成可执行文件
  • catkin_make是将cmakemake的编译方式做了一个封装的指令工具, 规范了工作路径与生成文件路径,而且在新建工作空间时就帮我们创建了一个顶层的CMakeLists.txt文件,它会递归的寻找到当前工作空间下的所有功能包内的CMakeLists.txt依次来编译每一个软件包。(src的每个包里都有CmakeLists.txt的)
  • catkin功能包的组成
    • 功能包必须包含一个catkin兼容的注释文件package.xml
    • package.xml文件提供有关功能包的元信息
    • 功能包必须包含采用catkin的CmakeLists.txt文件
    • 例外情况是metapackages不必包含CmakeLists.txt
    • 在一个文件夹中不允许出现多个功能包,这意味着多个功能包不能共享一个路径,也不允许功能包之间相互嵌套包
例子
  • 一般一个机器人项目建立一个工作空间,该项目所有的功能包都组合在该工作空间下
    ROS框架_第11张图片

一个功能包文件结构

ROS框架_第12张图片
ROS框架_第13张图片
上面文件夹的主要功能如下:

  • config:放置功能包中的配置文件,由用户创建,文件名可以不同
  • include:放置功能包中需要用到的文件
  • scripts:放置可以直接运行的Python脚本
  • src:程序源文件
  • launch:放置功能包自定义的消息类型
  • msg:放置功能包自定义的服务类型
  • srv:放置功能包的定义的服务类型
  • action:放置功能包自定义的动作指令
  • CMakeLists.txt:Cmake的生成文件,编译器编译功能包的规则
  • package.xml:功能包清单

package.xml

功能包清单(Package Manifest):每个功能包都包含一个名为Package.xml的功能包清单,用于记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志
ROS框架_第14张图片
除此之外, 标签定义了功能包中代码编译所依赖的其他功能包,而 标签定义了功能包中可执行程序运行时所依赖的其他功能能包。在开发ROS功能包的过程中,这些信息需要根据功能包的具体内容进行修改
ROS框架_第15张图片


CmakeLists.txt

Cmake生成文件:定义package属性,例如:包名、版本号、作者、依赖等
ROS框架_第16张图片


代码文件

ROS框架_第17张图片


自定义通信格式
  • 消息(msg)
  • 服务(srv)
  • 动作(action)

ROS框架_第18张图片


launch以及配置文件
  • Launch文件(launch)
  • 配置文件(yaml)

ROS框架_第19张图片


Metapackage

类似一种虚包,自身没有什么内容,但是依赖了很多其他的包,它的作用就是把一些具有相似功能的包组合起来

文件系统常见命令

#创建功能包
$ catkin_create_pkg   
#获取功能包的信息
$ rospack  
#编译工作空间中的功能包
$ catkin_make   
#查看包的依赖关系图
$ rqt_dep   
#自动安装功能包依赖的其他包
$ rosdep    
#功能包目录跳转
$ roscd     
#编辑功能包中的文件
$ rosed     
#运行功能包中的可执行文件
$ rosrun    
#运行启动文件
$ roslaunch 
#拷贝功能包中的文件
$ roscp     
#列出功能包下的文件
$ rosls     

## package相关命令 ##
#显示rospack的用法
$ rospack help  
#列出本机所有package
$ rospack list  
#显示package的依赖包
$ rospack depends [package]     
#定位某个package
$ rospack find [package]    
#刷新所有package的位置记录
$ rospack profile   

## 注意事项 ##
# catkin_make之后,一定要用source刷新环境
source ~/catkin_ws/devel/setup.bash

ROS开源社区

ROS 开源社区中的资源非常丰富,而且可以通过网络共享以下软件和知识
ROS框架_第20张图片

  • 发行版(Distribution):ROS发行版包括一系列带有版本号、可以直接安装的功能包
  • 软件源(Repository):ROS依赖于共享网络上的开源代码,不同的组织机构可以开发或者共享自己的机器人软件
  • ROS wiki:记录ROS信息文档的主要论坛
  • 邮件列表(Mailing list):交流ROS更新的主要渠道,同时也可以交流ROS开发的各种疑问
  • ROS Answers:咨询ROS相关问题的网站
  • 博客(Blog):发布ROS社区中的新闻、图片、视频

ROS社区官方:http://www.ros.org/

ROSwiki官网:http://wiki.ros.org/cn

操作小记

初试工作空间创建以及功能包创建

搭建工作空间

ddu@ddu-virtual-machine:~$ mkdir -p ~/catkin_ws/src
ddu@ddu-virtual-machine:~$ cd ~/catkin_ws/src
ddu@ddu-virtual-machine:~/catkin_ws/src$ cd ~/catkin_ws
ddu@ddu-virtual-machine:~/catkin_ws$ catkin_make
Base path: /home/ddu/catkin_ws
Source space: /home/ddu/catkin_ws/src
Build space: /home/ddu/catkin_ws/build
Devel space: /home/ddu/catkin_ws/devel
Install space: /home/ddu/catkin_ws/install
Creating symlink "/home/ddu/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake"
####
#### Running command: "cmake /home/ddu/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/ddu/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/ddu/catkin_ws/install -G Unix Makefiles" in "/home/ddu/catkin_ws/build"
####
-- The C compiler identification is GNU 5.4.0
-- The CXX compiler identification is GNU 5.4.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Using CATKIN_DEVEL_PREFIX: /home/ddu/catkin_ws/devel
-- Using CMAKE_PREFIX_PATH: /home/ddu/lvxiang_ws/devel;/home/ddu/tutorial_ws/devel;/opt/ros/kinetic
-- This workspace overlays: /home/ddu/lvxiang_ws/devel;/home/ddu/tutorial_ws/devel;/opt/ros/kinetic
-- Found PythonInterp: /usr/bin/python (found version "2.7.12") 
-- Using PYTHON_EXECUTABLE: /usr/bin/python
-- Using Debian Python package layout
-- Using empy: /usr/bin/empy
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/ddu/catkin_ws/build/test_results
-- Found gmock sources under '/usr/src/gmock': gmock will be built
-- Looking for pthread.h
-- Looking for pthread.h - found
-- Looking for pthread_create
-- Looking for pthread_create - not found
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE  
-- Found gtest sources under '/usr/src/gmock': gtests will be built
-- Using Python nosetests: /usr/bin/nosetests-2.7
-- catkin 0.7.18
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- Configuring done
-- Generating done
-- Build files have been written to: /home/ddu/catkin_ws/build
####
#### Running command: "make -j7 -l7" in "/home/ddu/catkin_ws/build"
####
ddu@ddu-virtual-machine:~/catkin_ws$ source devel/setup.bash
ddu@ddu-virtual-machine:~/catkin_ws$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc

# 查看环境变量
ddu@ddu-virtual-machine:~/catkin_ws$ vim ~/.bashrc

ddu@ddu-virtual-machine:~/catkin_ws$ tree 
.
├── build   # 编译产生的中间文件
│   ├── atomic_configure
│   │   ├── env.sh
│   │   ├── local_setup.bash
│   │   ├── local_setup.sh
│   │   ├── local_setup.zsh
│   │   ├── setup.bash
│   │   ├── setup.sh
│   │   ├── _setup_util.py
│   │   └── setup.zsh
│   ├── catkin
│   │   └── catkin_generated
│   │       └── version
│   │           └── package.cmake
│   ├── catkin_generated
│   │   ├── env_cached.sh
│   │   ├── generate_cached_setup.py
│   │   ├── installspace
│   │   │   ├── env.sh
│   │   │   ├── local_setup.bash
│   │   │   ├── local_setup.sh
│   │   │   ├── local_setup.zsh
│   │   │   ├── setup.bash
│   │   │   ├── setup.sh
│   │   │   ├── _setup_util.py
│   │   │   └── setup.zsh
│   │   ├── order_packages.cmake
│   │   ├── order_packages.py
│   │   ├── setup_cached.sh
│   │   └── stamps
│   │       └── Project
│   │           ├── interrogate_setup_dot_py.py.stamp
│   │           ├── order_packages.cmake.em.stamp
│   │           ├── package.xml.stamp
│   │           └── _setup_util.py.stamp
│   ├── CATKIN_IGNORE
│   ├── catkin_make.cache
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── 3.5.1
│   │   │   ├── CMakeCCompiler.cmake
│   │   │   ├── CMakeCXXCompiler.cmake
│   │   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   │   ├── CMakeSystem.cmake
│   │   │   ├── CompilerIdC
│   │   │   │   ├── a.out
│   │   │   │   └── CMakeCCompilerId.c
│   │   │   └── CompilerIdCXX
│   │   │       ├── a.out
│   │   │       └── CMakeCXXCompilerId.cpp
│   │   ├── clean_test_results.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── DependInfo.cmake
│   │   │   └── progress.make
│   │   ├── cmake.check_cache
│   │   ├── CMakeDirectoryInformation.cmake
│   │   ├── CMakeError.log
│   │   ├── CMakeOutput.log
│   │   ├── CMakeRuleHashes.txt
│   │   ├── CMakeTmp
│   │   ├── download_extra_data.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── DependInfo.cmake
│   │   │   └── progress.make
│   │   ├── doxygen.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── DependInfo.cmake
│   │   │   └── progress.make
│   │   ├── feature_tests.bin
│   │   ├── feature_tests.c
│   │   ├── feature_tests.cxx
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── progress.marks
│   │   ├── run_tests.dir
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── DependInfo.cmake
│   │   │   └── progress.make
│   │   ├── TargetDirectories.txt
│   │   └── tests.dir
│   │       ├── build.make
│   │       ├── cmake_clean.cmake
│   │       ├── DependInfo.cmake
│   │       └── progress.make
│   ├── cmake_install.cmake
│   ├── CTestConfiguration.ini
│   ├── CTestCustom.cmake
│   ├── CTestTestfile.cmake
│   ├── gtest
│   │   ├── CMakeFiles
│   │   │   ├── CMakeDirectoryInformation.cmake
│   │   │   ├── gmock.dir
│   │   │   │   ├── build.make
│   │   │   │   ├── cmake_clean.cmake
│   │   │   │   ├── DependInfo.cmake
│   │   │   │   ├── depend.make
│   │   │   │   ├── flags.make
│   │   │   │   ├── link.txt
│   │   │   │   ├── progress.make
│   │   │   │   ├── src
│   │   │   │   └── usr
│   │   │   │       └── src
│   │   │   │           └── gtest
│   │   │   │               └── src
│   │   │   ├── gmock_main.dir
│   │   │   │   ├── build.make
│   │   │   │   ├── cmake_clean.cmake
│   │   │   │   ├── DependInfo.cmake
│   │   │   │   ├── depend.make
│   │   │   │   ├── flags.make
│   │   │   │   ├── link.txt
│   │   │   │   ├── progress.make
│   │   │   │   ├── src
│   │   │   │   └── usr
│   │   │   │       └── src
│   │   │   │           └── gtest
│   │   │   │               └── src
│   │   │   └── progress.marks
│   │   ├── cmake_install.cmake
│   │   ├── CTestTestfile.cmake
│   │   ├── gtest
│   │   │   ├── CMakeFiles
│   │   │   │   ├── CMakeDirectoryInformation.cmake
│   │   │   │   ├── gtest.dir
│   │   │   │   │   ├── build.make
│   │   │   │   │   ├── cmake_clean.cmake
│   │   │   │   │   ├── DependInfo.cmake
│   │   │   │   │   ├── depend.make
│   │   │   │   │   ├── flags.make
│   │   │   │   │   ├── link.txt
│   │   │   │   │   ├── progress.make
│   │   │   │   │   └── src
│   │   │   │   ├── gtest_main.dir
│   │   │   │   │   ├── build.make
│   │   │   │   │   ├── cmake_clean.cmake
│   │   │   │   │   ├── DependInfo.cmake
│   │   │   │   │   ├── depend.make
│   │   │   │   │   ├── flags.make
│   │   │   │   │   ├── link.txt
│   │   │   │   │   ├── progress.make
│   │   │   │   │   └── src
│   │   │   │   └── progress.marks
│   │   │   ├── cmake_install.cmake
│   │   │   ├── CTestTestfile.cmake
│   │   │   └── Makefile
│   │   └── Makefile
│   ├── Makefile
│   └── test_results
├── devel   # 编译产生的可执行文件
│   ├── cmake.lock
│   ├── env.sh
│   ├── lib
│   ├── local_setup.bash
│   ├── local_setup.sh
│   ├── local_setup.zsh
│   ├── setup.bash
│   ├── setup.sh
│   ├── _setup_util.py
│   └── setup.zsh
└── src     # 功能包集
    └── CMakeLists.txt -> /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake

你可能感兴趣的:(ROS,ros,机器人操作系统,学习笔记,ros框架笔记整理)