温馨提示

本篇文章已经收录在我最新出版的书籍《机器人SLAM导航核心技术与实战》,感兴趣的读者可以购买纸质书籍来进行更加深入和系统性的学习,购买链接如下:

摘要                                          

ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便。我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS基础知识进行详细的讲解,给不熟悉ROS的朋友起到一个抛砖引玉的作用。本章节主要内容:

1.ROS是什么

2.ROS系统整体架构

3.在ubuntu16.04中安装ROS kinetic

4.如何编写ROS的第一个程序hello_world

5.编写简单的消息发布器和订阅器

6.编写简单的service和client

7.理解tf的原理

8.理解roslaunch在大型项目中的作用

9.熟练使用rviz

10.在实际机器人上运行ROS高级功能预览



9.熟练使用rviz                          

1rviz整体界面

(图29rviz整体界面

rvizROS自带的图形化工具,可以很方便的让用户通过图形界面开发调试ROS。操作界面也十分简洁,如图29,界面主要分为上侧菜单区、左侧显示内容设置区、中间显示区、右侧显示视角设置区、下侧ROS状态区。

2)添加显示内容

(图30)设置Global Options

如图30,启动rviz界面后,首先要对Global Options进行设置,Global Options里面的参数是一些全局显示相关的参数。其中的Fixed Frame参数是全局显示区域依托的坐标系,我们知道机器人中有很多坐标系,坐标系之间有各自的转换关系,有些是静态关系,有些是动态关系,不同的Fixed Frame参数有不同的显示效果,在导航机器人应用中,一般将Fixed Frame参数设置为map,也就是以map坐标系作为全局坐标系。值得注意的是,在机器人的tf tree里面必须要有map坐标系,否则该选项栏会包error。至于Global Options里面的其他参数可以不用管,默认就行了。

(图31)添加地图显示

如图31,在机器人导航应用中,我们常常需要用rviz观察机器人建立的地图,在机器人发布了地图到主题的情况下,我们就可以通过rviz订阅地图相应主题(一般是/map主题)来显示地图。订阅地图的/map主题方法很简单,首先点击rviz界面左下角[add]按钮,然后在弹出的对话框中选择[By topic],最后在列出的topic名字中找到我们要订阅的主题名字/map,最后点击[OK]就完成了对/map主题的订阅。订阅成功后,会在rviz左侧栏中看到Map项,并且中间显示区正常显示出地图。

(图32)添加tf显示

如图32,在机器人导航应用中,除了观察地图外,我们常常还需要观察机器人在地图中的位置以及各个坐标系的关系是否工作正常,这个时候就需要通过rviz来显示tf。和上面添加显示主题的方法类似,这里添加TF这个类型主题就可以了。说明一下,添加主题可以按主题类型查找,也可以按主题名称查找。上面添加地图主题就是按主题名称查找的,这里添加tf主题是按主题类型查找的。

(图33)添加里程计显示

如图33,我们可以通过rviz订阅里程计来观察机器人的运动轨迹(图中红色箭头连接起来的轨迹)。和上面添加显示主题的方法类似,这里添加/odom这个主题就可以了。这里特别说明一点,我们需要去掉左侧栏中Odometry里面Covariance项后面后面的勾,也就是在Odometry显示中不启用Covariance信息。Covariance是描述里程计误差的协方差矩阵,如果启用Covariance来描述Odometry将导致显示效果很难看,所以建议去掉。

(图34)添加机器人位置粒子滤波点显示

如图34,在机器人导航中,通常采用AMCL粒子滤波来实现机器人的全局定位。通过rviz可以显示全局定位的例子点。和上面添加显示主题的方法类似,这里添加/particlecloud这个主题就可以了。

(图35)添加激光雷达显示

如图35,机器人SLAM和导航中用到的核心传感器激光雷达数据,我们可以通过rviz显示激光雷达数据(图中红色点组成的轮廓)。和上面添加显示主题的方法类似,这里添加/scan这个主题就可以了。

(图36)添加摄像头显示

如图36rviz还可以订阅摄像头发布的主题,这样在rviz上就可以实现远程视频监控了。和上面添加显示主题的方法类似,这里添加/usb_cam/image_raw这个主题就可以了。

通过上面的实例,我们已经知道在rviz中订阅需要显示的主题了,被订阅的主题会在rviz左侧栏中列出,并且主题的显示与否是相互独立的,可以通过勾选的方式决定是否显现该主题,主题项下拉条目中有很多参数可以设置,这些参数决定显示的风格等等,可以根据需要进行设置。其他一些不常用的主题订阅实例没有给出,有需要可以依葫芦画瓢在rviz中进行订阅显示就行了。

3)主界面中常用按钮

(图37rviz显示配置保存

在上面的添加显示内容的实例中,我们在rviz中添加了很多主题显示项,并对各显示项的参数做了相应的设置。为了下次启动rviz时,能直接显示这些内容和风格,我们需要将当前的rviz显示风格以配置文件的方式保存,下次启动rviz后只需要载入这个配置文件就能进入相应的显示风格。很简单,点击rviz左上角[file]菜单,在下拉中选择[Save Config As],在弹出来的对话框中给配置文件取一个名字(我取名为my_cfg1),然后直接Save,my_cfg1.rviz配置文件会被保存到系统中rviz的默认目录。下次启动rviz后,通过点击rviz左上角[file]菜单,在下拉中选择[Open Config],打开相应的配置文件就行了。如图37

(图38)机器人初始位置设定与导航目标设定

在机器人导航中,当机器人刚启动的时候,机器人位置往往需要人为给定一个大概的估计位置,这样有利于AMCL粒子滤波中粒子点的快速收敛。如图38,点击[2D Pose Estimate]按钮,然后在地图中找到机器人大致的位置后再次点击鼠标左键并保持按下状态,拖动鼠标来指定机器人的朝向,最后松手就完成对机器人初始位置的设定了。其实就是两步,先指定机器人的位置,再指定机器人的朝向。我们可以在地图中指定导航目标点,让机器人自动导航到我们的指定的位置。通过[2D Nav Goal]按钮就可以完成。操作步骤和机器人初始位置的设定是类似的,就不累述了。

(图39)获取地图中指定点的坐标值

有时候我们需要知道地图中某个位置的坐标值,比如我们获取地图中各个位置的坐标值并填入巡逻轨迹中,让机器人按照指定巡逻路线巡逻。通过[Publish Point]按钮就可以知道地图中的任意位置的坐标值,点击[Publish Point]按钮,然后将鼠标放置到想要获取坐标值的位置,rviz底部显示栏中就会出现相应的坐标值。

4rviz启动方法

首先需要启动roscore,然后启动rviz,命令如下:

#打开终端,输入下面命令
roscore
#再打开一个终端,输入下面命令
rviz

后记                                          

——SLAM+语音机器人DIY系列【目录】快速导览——

第1章:Linux基础

1.Linux简介

2.安装Linux发行版ubuntu系统

3.Linux命令行基础操作

第2章:ROS入门

1.ROS是什么

2.ROS系统整体架构

3.在ubuntu16.04中安装ROS kinetic

4.如何编写ROS的第一个程序hello_world

5.编写简单的消息发布器和订阅器

6.编写简单的service和client

7.理解tf的原理

8.理解roslaunch在大型项目中的作用

9.熟练使用rviz

10.在实际机器人上运行ROS高级功能预览

第3章:感知与大脑

1.ydlidar-x4激光雷达

2.带自校准九轴数据融合IMU惯性传感器

3.轮式里程计与运动控制

4.音响麦克风与摄像头

5.机器人大脑嵌入式主板性能对比

6.做一个能走路和对话的机器人

第4章:差分底盘设计

1.stm32主控硬件设计

2.stm32主控软件设计

3.底盘通信协议

4.底盘ROS驱动开发

5.底盘PID控制参数整定

6.底盘里程计标

第5章:树莓派3开发环境搭建

1.安装系统ubuntu_mate_16.04

2.安装ros-kinetic

3.装机后一些实用软件安装和系统设置

4.PC端与robot端ROS网络通信

5.Android手机端与robot端ROS网络通信

6.树莓派USB与tty串口号绑定

7.开机自启动ROS节点

第6章:SLAM建图与自主避障导航

1.在机器人上使用传感器

2.google-cartographer机器人SLAM建图

3.ros-navigation机器人自主避障导航

4.多目标点导航及任务调度

5.机器人巡航与现场监控

第7章:语音交互与自然语言处理

1.语音交互相关技术

2.机器人语音交互实现

3.自然语言处理云计算引擎

第8章:高阶拓展

1.miiboo机器人安卓手机APP开发

2.centos7下部署Django(nginx+uwsgi+django+python3)

 


 

参考文献

 

[1] 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.

 

 

 

 

前言
编程基础篇
第1章 ROS入门必备知识
1.1 ROS简介 2
1.1.1 ROS的性能特色 2
1.1.2 ROS的发行版本 3
1.1.3 ROS的学习方法 3
1.2 ROS开发环境的搭建 3
1.2.1 ROS的安装 4
1.2.2 ROS文件的组织方式 4
1.2.3 ROS网络通信配置 5
1.2.4 集成开发工具 5
1.3 ROS系统架构 5
1.3.1 从计算图视角理解ROS架构 6
1.3.2 从文件系统视角理解ROS架构 7
1.3.3 从开源社区视角理解ROS架构 8
1.4 ROS调试工具 8
1.4.1 命令行工具 9
1.4.2 可视化工具 9
1.5 ROS节点通信 10
1.5.1 话题通信方式 12
1.5.2 服务通信方式 15
1.5.3 动作通信方式 19
1.6 ROS的其他重要概念 25
1.7 ROS 2.0展望 28
1.8 本章小结 28
第2章 C++编程范式
2.1 C++工程的组织结构 29
2.1.1 C++工程的一般组织结构 29
2.1.2 C++工程在机器人中的组织结构 29
2.2 C++代码的编译方法 30
2.2.1 使用g++编译代码 31
2.2.2 使用make编译代码 32
2.2.3 使用CMake编译代码 32
2.3 C++编程风格指南 33
2.4 本章小结 34
第3章 OpenCV图像处理
3.1 认识图像数据 35
3.1.1 获取图像数据 35
3.1.2 访问图像数据 36
3.2 图像滤波 37
3.2.1 线性滤波 37
3.2.2 非线性滤波 38
3.2.3 形态学滤波 39
3.3 图像变换 40
3.3.1 射影变换 40
3.3.2 霍夫变换 42
3.3.3 边缘检测 42
3.3.4 直方图均衡 43
3.4 图像特征点提取 44
3.4.1 SIFT特征点 44
3.4.2 SURF特征点 50
3.4.3 ORB特征点 52
3.5 本章小结 54
硬件基础篇
第4章 机器人传感器
4.1 惯性测量单元 56
4.1.1 工作原理 56
4.1.2 原始数据采集 60
4.1.3 参数标定 65
4.1.4 数据滤波 73
4.1.5 姿态融合 75
4.2 激光雷达 91
4.2.1 工作原理 92
4.2.2 性能参数 94
4.2.3 数据处理 96
4.3 相机 100
4.3.1 单目相机 101
4.3.2 双目相机 107
4.3.3 RGB-D相机 109
4.4 带编码器的减速电机 111
4.4.1 电机 111
4.4.2 电机驱动电路 112
4.4.3 电机控制主板 113
4.4.4 轮式里程计 117
4.5 本章小结 118
第5章 机器人主机
5.1 X86与ARM主机对比 119
5.2 ARM主机树莓派3B+ 120
5.2.1 安装Ubuntu MATE 18.04 120
5.2.2 安装ROS melodic 122
5.2.3 装机软件与系统设置 122
5.3 ARM主机RK3399 127
5.4 ARM主机Jetson-tx2 128
5.5 分布式架构主机 129
5.5.1 ROS网络通信 130
5.5.2 机器人程序的远程开发 130
5.6 本章小结 131
第6章 机器人底盘
6.1 底盘运动学模型 132
6.1.1 两轮差速模型 132
6.1.2 四轮差速模型 136
6.1.3 阿克曼模型 140
6.1.4 全向模型 144
6.1.5 其他模型 148
6.2 底盘性能指标 148
6.2.1 载重能力 148
6.2.2 动力性能 148
6.2.3 控制精度 150
6.2.4 里程计精度 150
6.3 典型机器人底盘搭建 151
6.3.1 底盘运动学模型选择 152
6.3.2 传感器选择 152
6.3.3 主机选择 153
6.4 本章小结 155
SLAM篇
第7章 SLAM中的数学基础
7.1 SLAM发展简史 158
7.1.1 数据关联、收敛和一致性 160
7.1.2 SLAM的基本理论 161
7.2 SLAM中的概率理论 163
7.2.1 状态估计问题 164
7.2.2 概率运动模型 166
7.2.3 概率观测模型 171
7.2.4 概率图模型 173
7.3 估计理论 182
7.3.1 估计量的性质 182
7.3.2 估计量的构建 183
7.3.3 各估计量对比 190
7.4 基于贝叶斯网络的状态估计 193
7.4.1 贝叶斯估计 194
7.4.2 参数化实现 196
7.4.3 非参数化实现 202
7.5 基于因子图的状态估计 206
7.5.1 非线性最小二乘估计 206
7.5.2 直接求解方法 206
7.5.3 优化方法 208
7.5.4 各优化方法对比 218
7.5.5 常用优化工具 219
7.6 典型SLAM算法 221
7.7 本章小结 221
第8章 激光SLAM系统
8.1 Gmapping算法 223
8.1.1 原理分析 223
8.1.2 源码解读 228
8.1.3 安装与运行 233
8.2 Cartographer算法 240
8.2.1 原理分析 240
8.2.2 源码解读 247
8.2.3 安装与运行 258
8.3 LOAM算法 266
8.3.1 原理分析 266
8.3.2 源码解读 267
8.3.3 安装与运行 270
8.4 本章小结 270
第9章 视觉SLAM系统
9.1 ORB-SLAM2算法 274
9.1.1 原理分析 274
9.1.2 源码解读 310
9.1.3 安装与运行 319
9.1.4 拓展 327
9.2 LSD-SLAM算法 329
9.2.1 原理分析 329
9.2.2 源码解读 334
9.2.3 安装与运行 337
9.3 SVO算法 338
9.3.1 原理分析 338
9.3.2 源码解读 341
9.4 本章小结 341
第10章 其他SLAM系统
10.1 RTABMAP算法 344
10.1.1 原理分析 344
10.1.2 源码解读 351
10.1.3 安装与运行 357
10.2 VINS算法 362
10.2.1 原理分析 364
10.2.2 源码解读 373
10.2.3 安装与运行 376
10.3 机器学习与SLAM 379
10.3.1 机器学习 379
10.3.2 CNN-SLAM算法 411
10.3.3 DeepVO算法 413
10.4 本章小结 414
自主导航篇
第11章 自主导航中的数学基础
11.1 自主导航 418
11.2 环境感知 420
11.2.1 实时定位 420
11.2.2 环境建模 421
11.2.3 语义理解 422
11.3 路径规划 422
11.3.1 常见的路径规划算法 423
11.3.2 带约束的路径规划算法 430
11.3.3 覆盖的路径规划算法 434
11.4 运动控制 435
11.4.1 基于PID的运动控制 437
11.4.2 基于MPC的运动控制 438
11.4.3 基于强化学习的运动控制 441
11.5 强化学习与自主导航 442
11.5.1 强化学习 443
11.5.2 基于强化学习的自主导航 465
11.6 本章小结 467
第12章 典型自主导航系统
12.1 ros-navigation导航系统 470
12.1.1 原理分析 470
12.1.2 源码解读 475
12.1.3 安装与运行 479
12.1.4 路径规划改进 492
12.1.5 环境探索 496
12.2 riskrrt导航系统 498
12.3 autoware导航系统 499
12.4 导航系统面临的一些挑战 500
12.5 本章小结 500
第13章 机器人SLAM导航综合实战
13.1 运行机器人上的传感器 502
13.1.1 运行底盘的ROS驱动 503
13.1.2 运行激光雷达的ROS驱动 503
13.1.3 运行IMU的ROS驱动 504
13.1.4 运行相机的ROS驱动 504
13.1.5 运行底盘的urdf模型 505
13.1.6 传感器一键启动 506
13.2 运行SLAM建图功能 506
13.2.1 运行激光SLAM建图功能 507
13.2.2 运行视觉SLAM建图功能 508
13.2.3 运行激光与视觉联合建图功能 508
13.3 运行自主导航 509
13.4 基于自主导航的应用 510
13.5 本章小结 511
附录A Linux与SLAM性能优化的探讨
附录B 习题

版权声明:本文为hiram-zhang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/hiram-zhang/p/10398534.html