前言

 

1 初识ROS

1.1 ROS是什么

1.1.1 ROS的起源

1.1.2 ROS的设计目标

1.1.3 ROS的特点

1.2 如何安装ROS

1.2.1 操作系统与ROS版本的选择

1.2.2 配置系统软件源

1.2.3 添加ROS软件源

1.2.4 添加密钥

1.2.5 安装ROS

1.2.6 初始化rosdep

1.2.7 设置环境变量

1.2.8 完成安装

1.3 本书源码下载

1.4 本章小结

 

2. ROS系统架构

2.1 ROS架构设计

2.2 计算图

2.2.1 节点(Node)

2.2.2 消息(Message)

2.2.3 话题(Topic)

2.2.4 服务(Service)

2.2.5 节点管理器

2.3 文件系统

2.3.1 功能包

2.3.2 元功能包

2.4 开源社区

2.5 ROS的通信机制

2.5.1 话题

2.5.2 服务

2.5.3 参数

2.6 话题与服务的区别

2.7 本章小结

 

3 ROS基础

3.1 第一个ROS例程——小乌龟仿真

3.1.1 turtlesim功能包

3.1.2 控制乌龟运动

3.2 创建工作空间

3.2.1 什么是工作空间

3.2.2 创建工作空间

3.2.3 创建功能包

3.3 工作空间的覆盖

3.3.1 ROS中的空间覆盖

3.3.2 工作空间之间的覆盖

3.4 搭建Eclipse IDE开发环境

3.4.1 安装Eclipse

3.4.2 创建Eclipse工程文件

3.4.3 将工程导入Eclipse

3.4.4 设置头文件路径

3.4.5 运行/调试程序

3.5 RoboWare IDE

3.5.1 RoboWare的特点

3.5.2 RoboWare的安装与使用

3.6 话题中的Publisher与Subscriber

3.6.1 乌龟例程中的Publisher与Subscriber

3.6.2 如何创建Publisher

3.6.3 如何创建Subscriber

3.6.4 编译功能包

3.6.5 运行Publisher与Subscriber

3.6.6 自定义话题消息

3.7 服务中的Server和Client

3.7.1 乌龟例程中的Service

3.7.2 如何自定义服务数据

3.7.3 如何创建Server

3.7.4 如何创建Client

3.7.5 编译功能包

3.7.6 运行Server和Client

3.8 ROS中的命名空间

3.8.1 有效的命名

3.8.2 命名解析

3.8.3 命名重映射

3.9 分布式多机通信

3.9.1 设置IP地址

3.9.2 设置ROS_MASTER_URI

3.9.3 多机通信测试

3.10 本章小结

 

4 ROS中的常用组件

4.1 launch启动文件

4.1.1 基本元素

4.1.2 参数设置

4.1.3 重映射机制

4.1.4 嵌套复用

4.2 TF坐标变换

4.2.1 TF功能包

4.2.2 TF工具

4.2.3 乌龟例程中的TF

4.2.4 创建TF广播器

4.2.5 创建TF监听器

4.2.6 实现乌龟跟随运动

4.3 Qt工具箱

4.3.1 日志输出工具——rqt_console

4.3.2 计算图可视化工具——rqt_graph

4.3.3 数据绘图工具——rqt_plot

4.3.4 参数动态配置工具——rqt_reconfigure

4.4 rviz三维可视化平台

4.4.1 安装并运行rviz

4.4.2 数据可视化

4.4.3 插件扩展机制

4.5 gazebo仿真环境

4.5.1 gazebo的特点

4.5.2 安装并运行gazebo

4.5.3 构建仿真环境

4.6 rosbag数据记录与回放

4.6.1 如何记录数据

4.6.2 如何回放数据

4.7 本章小结

 

5 机器人平台搭建

5.1 机器人的定义

5.2 机器人的组成

5.2.1 执行机构

5.2.2 驱动系统

5.2.3 传感系统

5.2.4 控制系统

5.3 机器人系统搭建

5.3.1 MRobot

5.3.2 执行机构的实现

5.3.3 驱动系统的实现

5.3.4 内部传感系统的实现

5.4 基于Raspberry Pi的控制系统实现

5.4.1 硬件平台Raspberry Pi

5.4.2 安装Ubuntu 16.04

5.4.3 安装ROS

5.4.4 控制系统与MRobot通信

5.4.5 PC端控制MRobot

5.5 为机器人装配摄像头

5.5.1 usb_cam功能包

5.5.2 PC端驱动摄像头

5.5.3 Raspberry Pi驱动摄像头

5.6 为机器人装配Kinect

5.6.1 freenect_camera功能包

5.6.2 PC端驱动Kinect

5.6.3 Raspberry Pi驱动Kinect

5.6.4 Kinect电源改造

5.7 为机器人装配激光雷达

5.7.1 rplidar功能包

5.7.2 PC端驱动rplidar

5.7.3 Raspberry Pi驱动rplidar

5.8 本章小结

 

6 机器人建模与仿真

6.1 统一机器人描述格式——URDF

6.1.1 <link>标签

6.1.2 <joint>标签

6.1.3 <robot>标签

6.1.4 <gazebo>标签

6.2 创建机器人URDF模型

6.2.1 创建机器人描述功能包

6.2.2 创建URDF模型

6.2.3 URDF模型解析

6.2.4 在rviz中显示模型

6.3 改进URDF模型

6.3.1 添加物理和碰撞属性

6.3.2 使用xacro优化URDF

6.3.3 xacro文件引用

6.3.4 显示优化后的模型

6.4 添加传感器模型

6.4.1 添加摄像头

6.4.2 添加Kinect

6.4.3 添加激光雷达

6.5 基于ArbotiX和rviz的仿真器

6.5.1 安装ArbotiX

6.5.2 配置ArbotiX控制器

6.5.3 运行仿真环境

6.6 ros_control

6.6.1 ros_control框架

6.6.2 控制器(Controllers)

6.6.3 硬件接口(Hardware Interface)

6.6.4 传动系统(Transmissions)

6.6.5 关节约束(Joint Limits)

6.6.6 控制器管理器(controller manager)

6.7 gazebo仿真

6.7.1 机器人模型添加gazebo属性

6.7.2 在gazebo中显示机器人模型

6.7.3 控制机器人在gazebo中运动

6.7.4 摄像头仿真

6.7.5 RGB-D摄像头仿真

6.7.6 激光雷达仿真

6.8 本章小结

 

7 机器视觉

7.1 ROS中的图像数据

7.1.1 二维图像数据

7.1.2 三维点云数据

7.2 摄像头标定

7.2.1 camera_calibration功能包

7.2.2 启动标定程序

7.2.3 标定摄像头

7.2.4 标定Kinect

7.2.5 加载标定参数的配置文件

7.3 OpenCV库

7.3.1 安装openCV

7.3.2 在ROS中使用OpenCV

7.4 人脸识别

7.4.1 应用效果

7.4.2 源码实现

7.5 物体跟踪

7.5.1 应用效果

7.5.2 源码实现

7.6 二维码识别

7.6.1 ar_track_alvar功能包

7.6.2 创建二维码

7.6.3 摄像头识别二维码

7.6.4 Kinect识别二维码

7.7 物体识别

7.7.1 ORK功能包

7.7.2 建立物体模型库

7.7.3 模型训练

7.7.4 三维物体识别

7.8 本站小结

 

8 机器语音

8.1 让机器人听懂你说的话

8.1.1 pocketsphinx功能包

8.1.2 语音识别测试

8.1.3 创建语音库

8.1.4 创建launch文件

8.1.5 语音指令识别

8.1.6 中文语音识别

8.2 通过语音控制机器人

8.2.1 编写语音控制节点

8.2.2 语音控制小乌龟运动

8.3 让机器人说话

8.3.1 sound_play功能包

8.3.2 语音播放测试

8.4 人工智能标记语言——AIML

8.4.1 AIML中的标签

8.4.2 Python中的AIML解析器

8.5 来和机器人对话吧

8.5.1 语音识别

8.5.2 智能匹配应答

8.5.3 文本转语音

8.5.4 智能对话

8.6 让机器人听懂中文

8.6.1 下载科大讯飞SDK

8.6.2 测试SDK

8.6.3 语音听写

8.6.4 语音合成

8.6.5 智能语音助手

8.7 本章小结

 

9 机器人SLAM与自主导航

9.1 理论基础

9.2 准备工作

9.2.1 传感器信息

9.2.2 仿真平台

9.2.3 真实机器人

9.3 gmapping

9.3.1 gmapping功能包

9.3.2 gmapping节点的配置与运行

9.3.3 在gazebo中仿真SLAM

9.3.4 真实机器人SLAM

9.4 hector

9.4.1 hector功能包

9.4.2 hector节点的配置与运行

9.4.3 在gazebo中仿真SLAM

9.4.4 真实机器人SLAM

9.5 google cartographer

9.5.1 cartographer功能包

9.5.2 官方demo测试

9.5.3 cartographer节点的配置与运行

9.5.4 在gazebo中仿真SLAM

9.5.5 真实机器人SLAM

9.6 rgbdslam

9.6.1 rgbdslam功能包

9.6.2 使用数据包实现SLAM

9.6.3 使用Kinect实现SLAM

9.7 ORB_SLAM

9.7.1 ORB_SLAM功能包

9.7.2 使用数据包实现单目SLAM

9.7.3 使用摄像头实现单目SLAM

9.8 导航功能包

9.8.1 导航框架

9.8.2 move_base功能包

9.8.3 amcl功能包

9.8.4 代价地图的配置

9.8.5 本地规划器配置

9.9 在rviz中仿真机器人导航

9.9.1 创建launch文件

9.9.2 开始导航

9.9.3 自动导航

9.10 在gazebo中仿真机器人导航

9.10.1 创建launch文件

9.10.2 运行效果

9.10.3 实时避障

9.11 真实机器人导航

9.11.1 创建launch文件

9.11.2 开始导航

9.12 自主探索SLAM

9.12.1 创建launch文件

9.12.2 通过rviz设置探索目标

9.12.3 自主探索SLAM

9.13 本章小结

 

10 MoveIt!机械臂控制

10.1 MoveIt!系统架构

10.1.1 运动组(move_group)

10.1.2 运动规划器(motion_planner)

10.1.3 规划场景(Planning Scene)

10.1.4 运动学求解器(Kinematics)

10.1.5 碰撞检测(Collision Checking)

10.2 如何使用MoveIt!

10.3 创建机械臂模型

10.3.1 声明模型中的宏

10.3.2 创建六轴机械臂模型

10.3.3 加入gazebo属性

10.3.4 显示机器人模型

10.4 使用Setup Assistant配置机械臂

10.4.1 加载机器人URDF模型

10.4.2 配置自碰撞矩阵(Self-Collisions)

10.4.3 配置虚拟关节(Virtual Joints)

10.4.4 创建规划组(Planning Groups)

10.4.5 定义机器人位姿(Robot Poses)

10.4.6 配置终端夹爪(End effectors)

10.4.7 配置无用关节(Passive Joints)

10.4.8 设置作者信息(Author Information)

10.4.9 生成配置文件(Configuration Files)

10.5 启动MoveIt!

10.5.1 拖动规划

10.5.2 随机规划

10.5.3 初始位姿更新

10.5.4 碰撞检测

10.6 配置文件

10.6.1 SRDF文件

10.6.2 fake_controllers.yaml

10.6.3 joint_limits.yaml

10.6.4 kinematics.yaml

10.6.5 ompl_planning.yaml

10.7 添加ArbotiX关节控制器

10.7.1 添加配置文件

10.7.2 运行ArbotiX节点

10.7.3 测试例程

10.7.4 运行效果

10.8 配置MoveIt!关节控制器

10.8.1 添加配置文件

10.8.2 启动插件

10.9 MoveIt!编程学习

10.9.1 关节空间规划

10.9.2 工作空间规划

10.9.3 笛卡尔运动规划

10.9.4 避障规划

10.10 Pick and Place

10.10.1 应用效果

10.10.2 创建抓取的目标物体

10.10.3 设置目标物体的放置位置

10.10.4 生成抓取姿态

10.10.5 pick

10.10.6 place

10.11 Gazebo中的机械臂仿真

10.11.1 创建配置文件

10.11.2 创建launch文件

10.11.3 开始仿真

10.12 使用MoveIt!控制Gazebo中的机械臂

10.12.1 关节轨迹控制器

10.12.2 MoveIt!控制器

10.12.3 关节状态控制器

10.12.4 运行效果

10.13 ROS-I

10.13.1 ROS-I的目标

10.13.2 ROS-I的安装

10.13.3 ROS-I的架构

10.14 本章小结

 

11 ROS与机器学习

11.1 AlphaGo的大脑——TensorFlow

11.2 TensorFlow基础

11.2.1 安装TensorFlow

11.2.2 核心概念

11.2.3 第一个TensorFlow程序

11.3 线性回归

11.3.1 理论基础

11.3.2 创建数据集

11.3.3 TensorFlow解决线性回归问题

11.4 手写数字识别

11.4.1 理论基础

11.4.2 TensorFlow中的MNIST例程

11.4.3 基于ROS实现MNIST

11.5 物体识别

11.5.1 安装TensorFlow Object Detection API

11.5.2 基于ROS实现动态物体识别

11.6 本章小结

 

12 ROS进阶功能

12.1 action

12.1.1 什么是action

12.1.2 action的工作机制

12.1.3 action的定义

12.1.4 实现action通信

12.2 plugin

12.2.1 工作原理

12.2.2 如何实现一个插件

12.2.3 创建基类

12.2.4 创建plugin类

12.2.5 注册插件

12.2.6 编译插件的动态链接库

12.2.7 将插件加入ROS系统

12.2.8 调用插件

12.3 rviz plugin

12.3.1 速度控制插件

12.3.2 创建功能包

12.3.3 代码实现

12.3.4 编译插件

12.3.5 运行插件

12.4 dynamic reconfigure

12.4.1 创建配置文件

12.4.2 创建服务端节点

12.4.3 参数动态配置

12.5 SMACH

12.5.1 什么是SMACH

12.5.2 状态机跑起来

12.5.3 状态机实现剖析

12.5.4 状态间的数据传递

12.5.5 状态机嵌套

12.5.6 多状态并行

12.6 ROS-MATLAB

12.6.1 ROS-MATLAB是什么

12.6.2 ROS-MATLAB可以做什么

12.6.3 连接Matlab和ROS

12.6.4 Matlab可视化编程

12.6.5 创建可视化界面

12.6.6 编辑控件的回调函数

12.6.7 运行效果

12.7 Web GUI

12.7.1 ROS中的Web功能包

12.7.2 创建Web应用

12.7.3 使用Web浏览器控制机器人

12.8 本章小结

 

13 ROS机器人实例

13.1 PR2

13.1.1 PR2功能包

13.1.2 gazebo中的PR2

13.1.3 使用PR2实现SLAM

13.1.4 PR2机械臂的使用

13.2 TurtleBot

13.2.1 TurtleBot功能包

13.2.2 gazebo中的TurtleBot

13.2.3 使用TurtleBot实现导航

13.2.4 尝鲜TurtleBot 3

13.3 Universal Robot

13.3.1 Universal Robots功能包

13.3.2 gazebo中的UR机器人

13.3.3 使用MoveIt!控制UR机器人

13.4 catvehicle

13.4.1 构建无人驾驶仿真系统

13.4.2 运行无人驾驶仿真器

13.4.3 控制无人驾驶汽车

13.4.4 实现无人驾驶汽车的SLAM功能

13.5 HRMRP

13.5.1 总体架构设计

13.5.2 SLAM与导航

13.5.3 多机器人扩展

13.6 Kungfu Arm

13.6.1 总体架构设计

13.6.2 具体层次功能

13.6.3 功夫茶应用展示

13.7 本章小结

 

14 ROS 2.0

14.1 ROS 1存在的问题

14.2 什么是ROS 2.0

14.2.1 ROS 2的设计目标

14.2.2 ROS 2的系统架构

14.2.3 ROS 2的关键中间件——DDS

14.2.4 ROS 2的通信模型

14.2.5 ROS 2的编译系统

14.3 Ubuntu安装ROS 2

14.3.1 安装步骤

14.3.2 运行talker和listener例程

14.4 Windows安装ROS 2

14.4.1 安装Chocolatey

14.4.2 安装Python

14.4.3 安装OpenSSL

14.4.4 安装Visual Studio Community 2015

14.4.5 配置DDS

14.4.6 安装OpenCV

14.4.7 安装依赖包

14.4.8 下载并配置ROS 2

14.4.9 运行talker和listener例程

14.5 ROS 2中的话题通信

14.5.1 创建工作目录和功能包

14.5.2 创建talker

14.5.3 创建listener

14.5.4 修改CMakeLists.txt

14.5.5 编译并运行节点

14.6 自定义话题和服务

14.6.1 自定义话题

14.6.2 自定义服务

14.6.3 修改CMakeLists.txt和package.xml

14.6.4 编译生成头文件

14.7 ROS 2中的服务通信

14.7.1 创建Server

14.7.2 创建Client

14.7.3 修改CMakeLists.txt

14.7.4 编译并运行节点

14.8 ROS 2与ROS 1的集成

14.8.1 ros1_bridge功能包

14.8.2 话题通信

14.8.3 服务通信

14.9 本章小结