一、ROS wiki
ROS wiki系列|ROS wiki初探(自用)_MMMMMaxine的博客-CSDN博客_ros wiki
ROS wiki是每个ROS人都必不可少会使用到的工具,在ROS学习中我们也经常要使用ROS wiki来查阅一些语法的解析、功能包的使用等。登录的链接为:
ROS Wiki——http://wiki.ros.org/http://wiki.ros.org/ROS wiki首页结构
在这里把ROS wiki的首页粗略的分为三个部分,顶部选项卡、蓝色选项卡以及正文内容,方便后面进行讲解,先看蓝色选项卡中各项对应的内容
Documentation:首页像一个索引目录,在这里可以任意跳转到我们想要查阅的页面,同时这部分也是使用频率最高的部分
二、ros介绍
结点:每一个工作进程都看做是一个节点,使用结点管理统一管理
消息:节点之间通过消息实现彼此的逻辑联系与数据交换
话题:话题是一种传递消息(发布/订阅)的方式。每一条消息都要发布到相应的主题上,每一个话题都是强类型的
服务:服务用于请求应答模型,也必须有一个唯一的名称。当一个节点提供某个服务时,所有的节点都可以通过使用ROS客户端所编写的代码与之通讯。
消息记录包:是一种用于保存和回放ROS消息数据的文件格式,保存在.bag文件中。是一种用于存储数据的重要机制。
通信的机制分为话题和服务
2.1 文件系统级
功能包之间可以配置依赖关系。如果功能包A依赖功能包B,那么在ROS构建系统时,B一定要早于A的构建,并且A可以使用B中的头文件和库文件。
文件系统级的概念如下:
- 功能包清单:
这个清单是指明功能包的依赖关系、源文件编译标志信息等。功能包中的package.xml文件就是一个功能包清单。
- 功能包:
功能包是ROS系统中软件组织的基本形式,包含运行的节点以及配置文件等。
ROS package 相关命令
rospack 命令 | 作用 |
---|---|
rospack help | 显示rospack的用法 |
rospack list | 列出本机所有package |
rospack depends [package] | 显示package的依赖包 |
rospack find [package] | 定位某个package |
rospack profile | 刷新所有package的位置记录 |
- 综合功能包
将几个功能包组织在一起,即可形成综合功能包。
- 消息类型
ROS中节点之间发送消息时需要事先进行消息说明。ROS中提供了标准类型消息,也可以自行定义。消息类型的说明存储在功能包下的msg文件内。
- 服务类型
定义了在ROS系统中由每个进程提供的关于服务请求和响应的数据结构。
1.2.3、开源社区级
- 发行版(Distribution):ROS发行版是可以独立安装、带有版本号的一系列综合功能包。ROS发行版像Linux发行版一样发挥类似的作用。这使得ROS软件安装更加容易,而且能够通过一个软件集合维持一致的版本。
- 软件库(Repository):ROS依赖于共享开源代码与软件库的网站或主机服务,在这里不同的机构能够发布和分享各自的机器人软件与程序。
- ROS维基(ROS Wiki):ROS Wiki是用于记录有关ROS系统信息的主要论坛。任何人都可以注册账户、贡献自己的文件、提供更正或更新、编写教程以及其他行为。
- Bug提交系统(Bug Ticket System):如果你发现问题或者想提出一个新功能,ROS提供这个资源去做这些。
- 邮件列表(Mailing list):ROS用户邮件列表是关于ROS的主要交流渠道,能够像论坛一样交流从ROS软件更新到ROS软件使用中的各种疑问或信息。
- ROS问答(ROS Answer):用户可以使用这个资源去提问题
2.2、通讯机制
Topic
ros中广为使用的是异步的 publish-subscribe 通讯模式。Topic 一般 用于单向,消息流通讯。Topic 一般拥有很强的类型定义:一种类型的topic只能接受/ 发送特定数据类型(message type)的message。Publisher 没有被要求类型一致性,但是接受时subscriber会检查类型 的md5,进而报错。
Service
service 用于处理ros通讯中的同步通讯,采用server/client 语义。每个service type拥 有 request 与 response两部分,对于service中的 server,ros不会检查重名(name conflict),只有最后注册的server会生效,与client建立连接。
Action
action使用多个topic组成,用于定义任务,任务定义包括目标(Goal)、任务执行过程状态反馈(Feedback)和结果(Result)等。编译action将会自动产生7个结构体分别为:Action、ActionGoal、ActionFeedback、ActionResult、Goal、Feedback、Result结构体。
Action的特点:
- 一种问答通讯机制
- 带有连续反馈
- 可以在任务中终止进行
- 基于ROS的消息机制实现
Action的接口:
- goal:发布任务目标
- cancel:请求取消任务
- status:通知客户端当前状态
- feedback:周期反馈任务运行的监控数据
- result:向客户端发送任务的执行结果,只发布一次。
通讯模式特点对比
特点 | Topic | Service | Action |
---|---|---|---|
响应机制 | 无 | 结果响应 | 进度响应,结果响应 |
同步性 | 异步 | 同步 | 异步 |
通讯模型 | Publisher ,Subscriber | Client ,Server | Client ,Server |
Node对应关系 | 多对多 | 多(Client)对一(Server) | 多(Client)对一(Server) |
常用组件
launch启动文件;TF坐标变换;Rviz;Gazebo;QT工具箱;Navigation;MoveIt!
launch:启动文件(Launch File)是ROS中一种同时启动多个节点的途径,它还可以自动启动ROS Master节点管理器,并且可以实现每个节点的各种配置,为多个节点的操作提供很大便利。
TF坐标变换:机器人本体和机器人的工作环境中往往存在大量的组件元素,在机器人设计和机器人应用中都会涉及不同组件的位置和姿态,TF是一个让用户随时间跟踪多个坐标系的功能包,它使用树形数据结构,根据时间缓冲并维护多个坐标系之间的坐标变换关系,可以帮助开发者在任意时间、在坐标系间完成点、向量等坐标的变换。
QT工具箱:为了方便可视化调试和显示,ROS提供了一个Qt架构的后台图形工具套件——rqt_common_plugins
,其中包含不少实用工具:日志输出工具(rqt_console)、计算图可视化工具(rqt_graph)、数据绘图工具(rqt_plot)、参数动态配置工具(rqt_reconfigure)
Rviz:rviz是一款三维可视化工具,很好地兼容了各种基于ROS软件框架的机器人平台。在rviz中,可以使用XML对机器人、周围物体等任何实物进行尺寸、质量、位置、材质、关节等属性的描述,并且在界面中呈现出来。同时,rviz还可以通过图形化方式,实时显示机器人传感器的信息、机器人的运动状态、周围环境的变化等。
Gazebo:Gazebo是一个功能强大的三维物理仿真平台,具备强大的物理引擎、高质量的图形渲染、方便的编程与图形接口,最重要的还有其具备开源免费的特性。虽然Gazebo中的机器人模型与rviz使用的模型相同,但是需要在模型中加入机器人和周围环境的物理属性,例如质量、摩擦系数、弹性系数等。机器人的传感器信息也可以通过插件的形式加入仿真环境、以可视化的方式显示。
Navigation:navigation是ROS的二维导航功能包,简单来说,就是根据输入的里程计等传感器的信息流和机器人的全局位置,通过导航算法,计算得出安全可靠的机器人速度控制指令。
Moveit:Moveit!功能包是最常用的工具包,主要用来进行轨迹规划。Moveit!配置助手用来配置一些在规划中需要用到的文件,非常关键。
三、ROS的工作空间
工作空间就是管理和组织ROS工程项目文件的地方,直观的形容就是一个仓库,里面装载着ROS的各种项目工程,便于系统组织管理调用。在可视化图形界面里是一个文件夹。我们自己写的ROS代码通常就放在工作空间中。其下主要的一级目录有四个:
3.1 功能包
src中存放的都是功能包,package是一种特定的文件结构和文件夹组合。通常将实现同一个具体功能的程序代码放到一个package中。只有 CMakeLists.txt 和 package.xml 是【必须】的,其余路径根据软件包是否需要来决定。
CMakeLists.txt
catkin的CMakeLists.txt
与CMake的基本一致。CMakeLists.txt
的基本语法都还是按照CMake,而Catkin在其中加入了少量的宏,总体的结构如下:
package.xml
具有最小标签的包清单不指定对其他包的任何依赖关系。软件包可以有六种依赖关系:
构建依赖关系<build_depend>指定构建此包所需的包。在构建时需要这些软件包中的任何文件时才是这种情况。这可以包括在编译时的头文件,链接到这些包的库文件或在构建时需要任何其他资源(特别是当这些包在CMake 中是find_package()时)。在交叉编译场景中,构建依赖关系针对目标体系结构。
构建导出依赖关系<build_export_depend>指定根据此包构建库所需的包。当您将此头文件包含在此包中的公用头文件中时(特别是当CMake中的catkin_package()中声明为(CATKIN_DEPENDS 时),就是这种情况。
执行依赖关系<exec_depend>指定在此程序包中运行代码所需的软件包。当您依赖此程序包中的共享库(尤其是当CMake 中的catkin_package()中声明为(CATKIN_DEPENDS )时),就是这种情况。
测试依赖关系<test_depend>仅指定单元测试的附加依赖项。他们不应该将已经提到的任何依赖关系重复为构建或运行依赖关系。
构建工具依赖关系<buildtool_depend>指定此软件包需要构建自身的构建系统工具。通常唯一的构建工具是catkin。在交叉编译场景中,构建工具依赖关系用于执行编译的架构。
文档工具依赖关系<doc_depend>指定此软件包需要生成文档的文档工具。
四、常用命令与工具
4.1 启动结点方式
launch文件
1)、借助 ros package 路径启动
格式如下:
roslaunch package名称 launch文件名称
roslaunch pkg_name launchfile_name.launch
2)、直接给出 launch 文件的绝对路径
格式如下:
roslaunch path_to_launchfile
不论用上述哪种方式启动 launch 文件,都可以在后边添加参数,比较常见的参数有
--screen
: 令 ros node 的信息(如果有的话)输出到屏幕上,而不是保存在某个 log 文件中,这样比较方便调试arg:=value
: 如果 launch 文件中有待赋值的变量,可以通过这种方式赋值,例如:
roslaunch 命令运行时首先会检测系统的rosmaster
是否运行,如果已经启动,就用现有的 rosmaster
;如果没有启动,会先启动rosmaster
,然后再执行 launch 文件中的设置,一次性把多个节点按照我们预先的配置启动起来。
需要注意的是, launch 文件不需要编译,设置好之后可以直接用上述方式运行。
launch 文件本质上是一种 xml 文件,在某些编辑器中可以高亮显示关键字,方便阅读,可以在头部添加,也可不添加
<?xml version="1.0"?>
与其他 xml 格式的文件类似,launch 文件也是通过标签 (tag) 的方式书写, 主要的 tag 如下:
1.标签【node】
标签【node】是 launch 文件的核心部分。
注意: roslaunch 不能保证 node 的启动顺序,因此 launch 文件中所有的 node 都应该对启动顺序有鲁棒性。
还可以设置更多参数,如下:
2.标签【remap】
经常作为node 标签的子标签出现,可以用来修改topic。在很多rosnode源文件中,可能并没有指定接收的或者发送的topic,而仅仅是用 input_topic
和 output_topic
代替,这样在使用中需要将抽象的topic名字替换成具体场景中的 topic 名字。
简单地说, remap 的作用就是方便同一个 node 文件被应用到不同的环境中,用 remap 从外部修改一下 topic 即可,不需要改变源文件。
remap 常见的使用格式如下:
<node pkg="some" type="some" name="some"><remap from="origin" to="new" /></node>
3.标签【include】
这个标签的作用是将另外一个 launch 文件添加到本 launch 文件中,类似 launch 文件的嵌套。基本格式:
<include file="path-to-launch-file" />
上边的文件路径可以给具体路径,但是一般来说为了程序的可移植性,最好借助 find
命令给出文件路径:
<include file="$(find package-name)/launch-file-name" />
上述命令中,$(find package-name)
等价于本机中相应 package 的路径。这样即使换了其他主控,只要安装了同样的 package,就可以找到对应的路径。
有时,另一个 launch 引入的 node 可能需要统一命名,或者具有类似特征的 node 名字,比如 /my/gps, /my/lidar, /my/imu,即 node 具有统一的前缀,方便查找。这可以通过设置 ns
(namespace)属性来实现,命令如下:
<include file="$(find package-name)/launch-file-name " ns="my" />
4.标签【arg】
通过【arg】可以使参数重复使用,也便于多处同时修改。 【arg】三种常用方法:
<arg name="foo">
: 声明一个 【arg】,但不赋值。稍后可以通过命令行赋值,或者通过【include】标签赋值。<arg name="foo" default="1">
: 赋默认值。<arg name="foo" value="1">
: 赋固定值。
通过命令行赋值
roslaunch package_name file_name.launch arg1:=value1 arg2:=value2
5.变量替换
在 launch 文件中常用的变量替换形式有两个
$(find pkg)
: 例如$(find rospy)/manifest.xml
. 如果可能,强烈推荐这种基于 package 的路径设置$(arg arg_name)
: 先设置默认值,如果没有额外的赋值,就用这个默认值了
例如:
<arg name="gui" default="true" />
<!-- 先设置默认值,如果没有额外的赋值,就用这个默认值了 -->
<param name="use_gui" value="$(arg gui)"/>
另一个例子:
<node pkg="package_name" type="executable_file" name="node_name" args="$(arg a) $(arg b)" />
这样设置之后,在启动 roslaunch 时,可以为 args 参数赋值
roslaunch package_name file_name.launch a:=1 b:=5
rosrun
五、实例说明
1.rqt_graph计算图可视化
rosrun rqt_graph rqt_graph
2.rqt_topic 查看话题
rosrun rqt_topic rqt_topic
【Set initial pose】、【Set target pose】、【Publish location point】:一般在建图导航时使用。
rviz界面主要包含以下几个部分:
1:3D视图区,用于可视化显示数据,目前没有任何数据,所以显示黑色。
2:工具栏,提供视角控制、目标设置、发布地点等工具。
3:显示项列表,用于显示当前选择的显示插件,可以配置每个插件的属性。
4:视角设置区,可以选择多种观测视角。
5:时间显示区,显示当前的系统时间和ROS时间。
- 添加显示
第一步:点击【Add】按钮。会弹出一个选框。
第二步:可以通过显示类型【By display type】选择添加,不过需要自己修改对应话题,坐标系才可以显示出来;也可以通过选择话题【By topic】的方式,直接添加就可以正常显示。
第三步:点击【OK】即可。