ROS系统学习已经有几周了,但是感觉学的效率有点低。不过还是要把总结先写了,以尽快进入下一阶段学习。
PS:这篇总结主要是根据MOOC网中科院老师的讲义来的。
推荐学习,网址:https://www.icourse163.org/learn/ISCAS-1002580008?tid=1002759011#/learn/content?type=detail&id=1003899799&cid=1004769692
-
catkin编译系统
catkin的诞生是为了替代rosbuild一个Catkin的软件包( package) 必须要包括两个文件:
package.xml: 包括了package的描述信息
name, description, version, maintainer(s), license
opt. authors, url’s, dependencies, plugins, etc…CMakeLists.txt: 构建package所需的CMake文件
调用Catkin的函数/宏
解析 package.xml
找到其他依赖的catkin软件包
将本软件包添加到环境变量
catkin的编译指令为catkin_make。catkin_make一般在创建包之后使用,它可以帮你写好部分CMakeLists和package.xml的内容,所以每一次包的内容修改之后就catkin_make一下。就像编完代码要运行之前必须先编译。catkin_make也可以有一些参数如下:catkin_make [args]
-h, --help 帮助信息
-C DIRECTORY, --directory DIRECTORY 工作空间的路径 (默认为 ‘.’)
–source SOURCE src的路径 (默认为’workspace_base/src’)
–build BUILD build的路径 (默认为’workspace_base/build’)
–use-ninja 用ninja取代make
–use-nmake 用nmake取’make
–force-cmake 强制cmake, 即使已经cmake过
–no-color 禁止彩色输出(只对catkin_make和CMake生效)
–pkg PKG [PKG …] 只对某个PKG进行make
–only-pkg-with-deps ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS …]
将指定的package列入白名单CATKIN_WHITELIST_PACKAGES,
之编译白名单里的package。 该环境变量存在于CMakeCache.txt。
–cmake-args [CMAKE_ARGS [CMAKE_ARGS …]]
传给CMake的参数
–make-args [MAKE_ARGS [MAKE_ARGS …]]
传给Make的参数
–override-build-tool-check
用来覆盖由于不同编译工具产生的错误 -
catkin工作空间结构介绍
catkin工作空间的结构,它包括了 src 、 build 、 devel 三个路径, 在
有些编译选项下也可能包括其他。 但这三个文件夹是catkin编译系统默认的。 它们的具体作用
如下:
src/: ROS的catkin软件包( 源代码包)
build/: catkin( CMake) 的缓存信息和中间文件
devel/: 生成的目标文件( 包括头文件, 动态链接库, 静态链接库, 可执行文件等) 、 环境变量。
下图是catkin编译工作流程。
build和devel文件夹是Catkin自动编译生成的。而src文件夹则是主要用到的,我们写的ROS程序和源代码包都放在这个文件夹。如下图所示:
下载tree工具包可以看到以下结构图:
-
Package软件包
应该说Package包是ROS的基本单元,任何语言程序都需要放到包中,因为包是编译的基本单元。一个package的常见文件如下:
其中定义package的是 CMakeLists.txt 和 package.xml , 这两个文件是package中必不可少的。 catkin编译系统在编译前, 首先就要解析这两个文件。 这两个文件就定义了一个package。
CMakeLists.txt: 定义package的包名、 依赖、 源文件、 目标文件等编译规则, 是package
不可少的成分
package.xml: 描述package的包名、 版本号、 作者、 依赖等信息, 是package不可少的成
分 src
/: 存放ROS的源代码, 包括C++的源码和(.cpp)以及Python的module(.py)
include/: 存放C++源码对应的头文件
scripts/: 存放可执行脚本, 例如shell脚本(.sh)、 Python脚本(.py)
msg/: 存放自定义格式的消息(.msg)
srv/: 存放自定义格式的服务(.srv)
models/: 存放机器人或仿真场景的3D模型(.sda, .stl, .dae等)
urdf/: 存放机器人的模型描述(.urdf或.xacro)
launch/: 存放launch文件(.launch或.xml)
- 创建Package
Package需要在catkin/src的文件夹下创建,可以用catkin_creat_pkg命令。指令如下:
catkin_create_pkg package depends(依赖的包名) - package相关命令
- CMakeLists
- Package.xml
6.Node & Master
node 是ROS的最小进程单元,一个软件包里可以有多个可执行文件, 可执行文件在运行之后就成了一个进程(process), 这个进程在ROS中就叫做节点。
master在整个网络通信架构里相当于管理中心, 管理着各个node。 node首先在master处进行注册, 之后master会将该node纳入整个ROS程序中。node之间的通信也是先由master进行“牵线”, 才能两两的进行点对点通信。 当ROS程序启动时, 第一步首先启动master, 由节点管理器处理依次启动node。
$roscore指令可以启动ROS master ,rosout ,parameter serve。
-
rosnode
-
launch
- Topic
ROS中的通信方式中, topic是常用的一种。 对于实时性、 周期性的消息, 使用topic来传输是
最佳的选择。 topic是一种点对点的单向通信方式, 这里的“点”指的是node, 也就是说node之
间可以通过topic方式来传递信息。 topic要经历下面几步的初始化过程: 首先, publisher节点
和subscriber节点都要到节点管理器进行注册, 然后publisher会发布topic, subscriber在
master的指挥下会订阅该topic, 从而建立起sub-pub之间的通信。 注意整个过程是单向的。 其
结构示意图如下:
- 通信实例
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-b6c3c6d139.css" rel="stylesheet">
<div class="more-toolbox">
<div class="left-toolbox">
<ul class="toolbox-list">
<li class="tool-item tool-active is-like "><a href="javascript:;"><svg class="icon" aria-hidden="true">
<use xlink:href="#csdnc-thumbsup"></use>
</svg><span class="name">点赞</span>
<span class="count">1</span>
</a></li>
<li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{"mod":"popu_824"}"><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-Collection-G"></use>
</svg><span class="name">收藏</span></a></li>
<li class="tool-item tool-active is-share"><a href="javascript:;" data-report-click="{"mod":"1582594662_002"}"><svg class="icon" aria-hidden="true">
<use xlink:href="#icon-csdnc-fenxiang"></use>
</svg>分享</a></li>
<!--打赏开始-->
<!--打赏结束-->
<li class="tool-item tool-more">
<a>
<svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
</a>
<ul class="more-box">
<li class="item"><a class="article-report">文章举报</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="person-messagebox">
<div class="left-message"><a href="https://blog.csdn.net/weixin_42376458">
<img src="https://profile.csdnimg.cn/D/5/9/3_weixin_42376458" class="avatar_pic" username="weixin_42376458">
<img src="https://g.csdnimg.cn/static/user-reg-year/1x/2.png" class="user-years">
</a></div>
<div class="middle-message">
<div class="title"><span class="tit"><a href="https://blog.csdn.net/weixin_42376458" data-report-click="{"mod":"popu_379"}" target="_blank">安东time</a></span>
</div>
<div class="text"><span>发布了101 篇原创文章</span> · <span>获赞 2</span> · <span>访问量 4890</span></div>
</div>
<div class="right-message">
<a href="https://im.csdn.net/im/main.html?userName=weixin_42376458" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
</a>
<a class="btn btn-sm bt-button personal-watch" data-report-click="{"mod":"popu_379"}">关注</a>
</div>
</div>
</div>