提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
ros 学习小结
一、ROS 概述与环境搭建
了解了 ROS 概念、设计目标以及发展历程
安装并运行了 ROS 内置的乌龟小程序
使用 Python 实现 ROS 版本的 HelloWorld
搭建了 ROS 的集成开发环境终端 terminator 和 VSCode,并且也可以编写一些简单的 ROS 小程序
ROS 架构设计,主要学习了文件系统与计算图。
1. 文件系统
WorkSpace --- 自定义的工作空间
|--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。
|--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
|--- src: 源码
|-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成
|-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件
|-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)
|-- scripts 存储python文件
|-- src 存储C++源文件
|-- include 头文件
|-- msg 消息通信格式文件
|-- srv 服务通信格式文件
|-- action 动作格式文件
|-- launch 可一次性运行多个节点
|-- config 配置信息
|-- CMakeLists.txt: 编译的基本配置
2. 计算图
(1) 简介:rqt_graph 能够创建一个显示当前系统运行情况的动态图形。ROS 分布式系统中不同进程需要进行数据交互,计算图可以点对点的网络形式表现数据交互过。
(2) 安装:若前期把所有功能包都已安装完成,则直接在终端输入 rosrun rqt_graph rqt_graph,若未安装则输入$ sudo apt install ros-<distro>-rqt $ sudo apt install ros-<distro>-rqt-common-plugins (使用ROS版本如Noetic替换<distro>)
(3) 演示:内置小乌龟案例,终端输入 rqt_graph 或 rosrun rqt_graph rqt_graph,可以看到如下网络拓扑图:
二、ROS 的通信机制
- 本章主要是通过 ROS 内置的 turtlesim 案例,介绍 ROS 命令获取节点、话题、话题消息、服务、服务消息与参数的信息,最终再以编码的方式实现乌龟运动的控制、乌龟位姿的订阅、乌龟生成与乌龟窗体背景颜色的修改。
- ROS 中的基本通信机制主要有如下三种实现策略:话题通信(发布订阅模式) 、服务通信(请求响应模式)、参数服务器(参数共享模式)。
- 话题通信是 ROS 中使用频率最高的一种通信模式,话题通信是基于发布订阅模式的,也即:一个节点发布消息,另一个节点订阅该消息。话题通信的应用场景也极其广泛,像雷达、摄像头、GPS… 等等一些传感器数据的采集,也都是使用了话题通信。话题通信适用于不断更新的数据传输相关的应用场景。
- 服务通信也是 ROS 中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。即 一个节点A向另一个节点B发送请求,B接收处理请求并产生响应结果返回给A。服务通信更适用于对时时性有要求、具有一定逻辑处理的应用场景。ROS Master 负责保管 Server 和 Client 注册的信息,并匹配话题相同的 Server 与 Client ,帮助 Server 与 Client 建立连接,连接建立后,Client 发送请求信息,Server 返回响应信息。
- 参数服务器在 ROS 中主要用于实现不同节点之间的数据共享。参数服务器相当于独立于所有节点的一个公共容器,可以将数据存储在该容器,被不同节点调用,当然不同的节点也可往其存储数据。参数服务器的典型应用场景如下:全局路径规划和本地路径规划。参数服务器不是为高性能而设计的,因此最好用于存储静态的非二进制的简单数据。
- Topic(话题)与Service(服务)的不同点:
| Topic(话题) | Service(服务) |
---|
通信模式 | 发布/订阅 | 请求/响应 |
同步性 | 异步 | 同步 |
底层协议 | ROSTCP/ROSUDP | ROSTCP/ROSUDP |
缓冲区 | 有 | 无 |
实时性 | 弱 | 强 |
节点关系 | 多对多 | 一对多(一个server) |
通信数据 | Msg | Srv |
通信数据 | 连续高频的数据发布与接收:雷达、里程计 | 偶尔调用或执行某一项特定功能:拍照、语音识别 |
三 、 ROS 运行管理
- 元功能包:在 ROS 中,提供了一种方式可以将不同的功能包打包成一个功能包,当安装某个功能模块时,直接调用打包后的功能包即可,该包又称之为元功能包(metapackage)。
- launch 文件启动管理节点:一个程序中可能需要启动多个节点,比如:ROS 内置的小乌龟案例,如果要控制乌龟运动,要启动多个窗口,分别启动 roscore、乌龟界面节点、键盘控制节点。如果每次都调用 rosrun 逐一启动,显然效率低下,故采用的优化策略便是使用 ros launch 命令集合 launch 文件启动管理节点。
- ROS 中重名问题:完成 ROS 中一个系统性的功能,可能涉及到多个功能包,比如实现了机器人导航模块,该模块下有地图、定位、路径规划等不同的子级功能包。本章的重点是“重名”相关的内容:包名重复,会导致覆盖;节点名称重复,会导致先启动的节点关闭;话题名称重复,无语法异常,但是可能导致通信实现出现逻辑问题;参数名称重复,会导致参数设置的覆盖;
- 解决重名问题的实现方案有两种:重映射(重新起名字);为命名添加前缀。
四 、 ROS 常用组件
- ROS 中的常用组件,包括:TF坐标变换实现不同类型的坐标系之间的转换;rosbag 用于录制 ROS 节点的执行过程并可以重放该过程;rqt 工具箱集成了多款图形化的调试工具。
- 完成了 TF 案例:小乌龟跟随(键盘可以控制一只乌龟运动,另一只跟随运动。)需求描述: 产生两只乌龟,中间的乌龟(A)和左下乌龟(B),B 会自动运行至 A 的位置,并且键盘控制时,只是控制 A 的运动,但是 B 可以跟随 A 运行。
- 实现分析:乌龟跟随实现的核心,是乌龟 A 和 B 都要发布相对世界坐标系的坐标信息,然后订阅到该信息需要转换获取 A 相对于 B 坐标系的信息,最后再生成速度信息,并控制 B 运动。
五、 机器人系统仿真
- 使用 URDF 创建机器人模型,并在 Rviz 和 Gazebo 中分别显示;使用 Gazebo 搭建仿真环境;使用机器人模型中的传感器(雷达、摄像头、编码器)获取仿真环境数据。
- ROS 中仿真实现涉及的三大知识点:URDF(Xacro)、Rviz、Gazebo。URDF 只是一个用于描述机器人模型的 xml 文件, 不能单独使用,需要结合 Rviz 或 Gazebo,需要在 Rviz 或 Gazebo 中渲染成图形化的机器人模型,URDF 编写机器人模型代码冗余,xacro 可以优化 URDF 实现,代码实现更为精简、高效、易读。
- Rviz 与 Gazebo 二者的区别:
| rviz | gazebo |
---|
不同点 | 三维可视化工具,强调把已有的数据可视化显示;提供了很多插件,这些插件可以显示图像、模型、路径等信息,但是前提都是这些数据已经以话题、参数的形式发布。rviz做的事情就是订阅这些数据,并完成可视化的渲染,让开发者更容易理解数据的意义。rviz需要已有数据。 | 三维物理仿真平台,强调的是创建一个虚拟的仿真环境。gazebo不是显示工具,强调的是仿真,它不需要数据,而是创造数据。 |
- gazebo 可免费创建一个机器人世界,不仅能仿真机器人的运动功能,还可仿真机器人的传感器数据。而这些数据就可以放到 rviz 中显示,所以使用 gazebo 的时候,经常也会和 rviz 配合使用。当我们手上没有机器人硬件或实验环境难以搭建时,仿真往往是非常有用的。
- 综上,若有机器人硬件平台,并在上边可以完成需要的功能,用 rviz 应该就可满足开发需求。若没有机器人硬件,或想在仿真环境中做一些算法、应用的测试,可采用 gazebo+rviz。
总结
以上就是 ros 学习小结。