概述
认识ROS框架
- 共三个层次
ROS计算机图级
- 上图是一个简单的ROS计算图
- ROS是一个分布式框架,为用户提供多节点(进程)之间的通信服务,所有软件功能和工具都建立在这种分布式通信机制上,所以ROS的通信机制是最底层也是最核心的技术。在大多数应用场景下,尽管我们不需要关注底层通信的实现机制,但是了解其相关原理一定会帮助我们在开发过程中更好地使用ROS。
- 以下就ROS最核心的三种通信机制进行介绍:
几个概念
- 节点(
node
)—— 软件模块- 节点管理器(
master
)—— 控制中心,提供参数管理- 话题(
topic
)—— 异步通讯机制,传输消息(message)- 服务(
service
)—— 同步通讯机制,传输请求/应答数据
节点(
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
:帮助我们看到节点发送的主题
话题通讯机制
- Talker向Master注册
- Listener向Master注册
- ROS Master进行信息匹配
- Listener 发送连接请求
- Talker确认连接请求
- Listener尝试与Talker建立网络连接
- Talker向Listener发布数据
例子
- 主题是节点间用来传输数据的总线
- 通过主题进行消息路由不需要节点之间直接连接——发布者和订阅者之间不需要知道彼此是否存在
- 一个主题可以有多个订阅者,也可以有多个发布者
- 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
服务通讯机制
- 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中的全局变量,由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文件系统
类似操作系统,ROS将所有文件按照一定的规则进行组织,不同功能的文件被放置在不同的文件夹下
- 功能包(Package):功能包是ROS软件中的基本单元,包含ROS节点、库、配置文件
- 功能包清单(Package Manifest):每个功能包都包含一个名为Package.xml的功能报清单,用于记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等
- 元功能包(Meta Package ):在新版本的ROS中,将原有功能包集(Stack)的概念升级为“元功能包”,主要作用都是组织多个用于同一目录的功能包。例如一个ROS导航的元功能包中包含建模、定位、导航等多个功能包
- 消息(Message )类型:消息是ROS节点之间发布/订阅的通信信息,可以使用ROS提供的消息类型,也可以使用.msg文件在功能包的msg文件夹下自定义所需要的消息类型
- 服务(Service )类型:服务类型定义了ROS客户端/服务器通信模型下的请求与应答数据类型,可以使用ROS系统提供的服务类型,也可以使用.srv文件在功能包的srv文件夹中进行定义
- 代码(Code):用来放置功能包节点源代码的文件夹
工作空间(Workspace)
- 一个包含功能包、可编辑源文件或编译包的文件夹
- 同时编译不同的功能包时非常有用,并且可以用来保存本地开发包
# 使用标准Cmake工作流程,一次编译一个包
$ cmake package/
$ make
# 编译工作空间内的所有包
$ cd workspace
$ catkin_make
catkin简析
- 程序在
cmake
编译是这样的流程, cmake指令依据你的CMakeLists.txt 文件,生成makefiles文件,make
再依据此makefiles文件编译链接生成可执行文件 catkin_make
是将cmake
与make
的编译方式做了一个封装的指令工具, 规范了工作路径与生成文件路径,而且在新建工作空间时就帮我们创建了一个顶层的CMakeLists.txt文件,它会递归的寻找到当前工作空间下的所有功能包内的CMakeLists.txt依次来编译每一个软件包。(src的每个包里都有CmakeLists.txt的)- catkin功能包的组成
- 功能包必须包含一个catkin兼容的注释文件package.xml
- package.xml文件提供有关功能包的元信息
- 功能包必须包含采用catkin的CmakeLists.txt文件
- 例外情况是metapackages不必包含CmakeLists.txt
- 在一个文件夹中不允许出现多个功能包,这意味着多个功能包不能共享一个路径,也不允许功能包之间相互嵌套包
例子
- 一般一个机器人项目建立一个工作空间,该项目所有的功能包都组合在该工作空间下
一个功能包文件结构
上面文件夹的主要功能如下:
- config:放置功能包中的配置文件,由用户创建,文件名可以不同
- include:放置功能包中需要用到的文件
- scripts:放置可以直接运行的Python脚本
- src:程序源文件
- launch:放置功能包自定义的消息类型
- msg:放置功能包自定义的服务类型
- srv:放置功能包的定义的服务类型
- action:放置功能包自定义的动作指令
- CMakeLists.txt:Cmake的生成文件,编译器编译功能包的规则
- package.xml:功能包清单
package.xml
功能包清单(Package Manifest):每个功能包都包含一个名为Package.xml的功能包清单,用于记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等
除此之外,<build_depend> </build_depend>
标签定义了功能包中代码编译所依赖的其他功能包,而<run_depend> </run_depend>
标签定义了功能包中可执行程序运行时所依赖的其他功能能包。在开发ROS功能包的过程中,这些信息需要根据功能包的具体内容进行修改
CmakeLists.txt
Cmake生成文件:定义package属性,例如:包名、版本号、作者、依赖等
代码文件
自定义通信格式
- 消息(msg)
- 服务(srv)
- 动作(action)
launch以及配置文件
- Launch文件(launch)
- 配置文件(yaml)
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 开源社区中的资源非常丰富,而且可以通过网络共享以下软件和知识
- 发行版(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框架认识ROS框架所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复