描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787111625766
产品特色
编辑推荐
内容简介
本书共分为六部分。*部分介绍了如何编写ROS节点和ROS工具,也覆盖了消息、类和服务器。第二部分是用ROS进行模拟和可视化,其中包括坐标转换。第三部分讨论了ROS的感知过程。第四部分介绍了ROS中的移动机器人控制和导航。第五部分介绍了ROS机器人臂的相关知识。第六部分涉及系统集成和更高级别的控制,包括基于感知的移动操作。
目 录
译者序
前言
第一部分 ROS基础 / 1
第1章 概述:ROS工具和节点 / 2
1.1 ROS基础概念 / 2
1.2 编写ROS节点 / 5
1.2.1 创建ROS程序包 / 5
1.2.2 编写一个最小的ROS发布器 / 8
1.2.3 编译ROS节点 / 11
1.2.4 运行ROS节点 / 12
1.2.5 检查运行中的最小发布器节点 / 13
1.2.6 规划节点时间 / 15
1.2.7 编写一个最小ROS订阅器 / 17
1.2.8 编译和运行最小订阅器 / 19
1.2.9 总结最小订阅器和发布器节点 / 21
1.3 更多的ROS工具:catkin_simple、roslaunch、rqt_console和rosbag / 21
1.3.1 用catkin_simple简化CMakeLists.txt / 21
1.3.2 自动启动多个节点 / 23
1.3.3 在ROS控制台观察输出 / 25
1.3.4 使用rosbag记录并回放数据 / 26
1.4 最小仿真器和控制器示例 / 28
1.5 小结 / 32
第2章 消息、类和服务器 / 33
2.1 定义自定义消息 / 33
2.1.1 定义一条自定义消息 / 34
2.1.2 定义一条变长的消息 / 38
2.2 ROS服务介绍 / 43
2.2.1 服务消息 / 43
2.2.2 ROS服务节点 / 45
2.2.3 与ROS服务手动交互 / 47
2.2.4 ROS服务客户端示例 / 48
2.2.5 运行服务和客户端示例 / 50
2.3 在ROS中使用C 类 / 51
2.4 在ROS中创建库模块 / 56
2.5 动作服务器和动作客户端介绍 / 61
2.5.1 创建动作服务器包 / 62
2.5.2 定义自定义动作服务器消息 / 62
2.5.3 设计动作客户端 / 68
2.5.4 运行示例代码 / 71
2.6 参数服务器介绍 / 80
2.7 小结 / 84
第二部分 ROS中的仿真和可视化 / 85
第3章 ROS中的仿真 / 86
3.1 简单的2维机器人仿真器 / 86
3.2 动力学仿真建模 / 93
3.3 统一的机器人描述格式 / 95
3.3.1 运动学模型 / 95
3.3.2 视觉模型 / 98
3.3.3 动力学模型 / 99
3.3.4 碰撞模型 / 102
3.4 Gazebo介绍 / 104
3.5 最小关节控制器 / 112
3.6 使用Gazebo插件进行关节伺服控制 / 118
3.7 构建移动机器人模型 / 124
3.8 仿真移动机器人模型 / 132
3.9 组合机器人模型 / 136
3.10 小结 / 139
第4章 ROS中的坐标变换 / 141
4.1 ROS中的坐标变换简介 / 141
4.2 转换侦听器 / 149
4.3 使用Eigen库 / 156
4.4 转换ROS数据类型 / 161
4.5 小结 / 163
第5章 ROS中的感知与可视化 / 164
5.1 rviz中的标记物和交互式标记物 / 168
5.1.1 rviz中的标记物 / 168
5.1.2 三轴显示示例 / 172
5.1.3 rviz中的交互式标记物 / 176
5.2 在rviz中显示传感器值 / 183
5.2.1 仿真和显示激光雷达 / 183
5.2.2 仿真和显示彩色相机数据 / 189
5.2.3 仿真和显示深度相机数据 / 193
5.2.4 rviz中点的选择 / 198
5.3 小结 / 201
第三部分 ROS中的感知处理 / 203
第6章 在ROS中使用相机 / 204
6.1 相机坐标系下的投影变换 / 204
6.2 内置相机标定 / 206
6.3 标定立体相机内参 / 211
6.4 在ROS中使用OpenCV / 217
6.4.1 OpenCV示例:寻找彩色像素 / 218
6.4.2 OpenCV示例:查找边缘 / 223
6.5 小结 / 224
第7章 深度图像与点云信息 / 225
7.1 从扫描LIDAR中获取深度信息 / 225
7.2 立体相机的深度信息 / 230
7.3 深度相机 / 236
7.4 小结 / 237
第8章 点云数据处理 / 238
8.1 简单的点云显示节点 / 238
8.2 从磁盘加载和显示点云图像 / 244
8.3 将发布的点云图像保存到磁盘 / 246
8.4 用PCL方法解释点云图像 / 248
8.5 物体查找器 / 257
8.6 小结 / 261
第四部分 ROS中的移动机器人 / 263
第9章 移动机器人的运动控制 / 264
9.1 生成期望状态 / 264
9.1.1 从路径到轨迹 / 264
9.1.2 轨迹构建器库 / 268
9.1.3 开环控制 / 273
9.1.4 发布期望状态 / 274
9.2 机器人状态估计 / 282
9.2.1 从Gazebo获得模型状态 / 282
9.2.2 里程计 / 286
9.2.3 混合里程计、GPS和惯性传感器 / 292
9.2.4 混合里程计和LIDAR / 297
9.3 差分驱动转向算法 / 302
9.3.1 机器人运动模型 / 303
9.3.2 线性机器人的线性转向 / 304
9.3.3 非线性机器人的线性转向 / 306
9.3.4 非线性机器人的非线性转向 / 308
9.3.5 仿真非线性转向算法 / 309
9.4 相对于地图坐标系的转向 / 312
9.5 小结 / 317
第10章 移动机器人导航 / 318
10.1 构建地图 / 318
10.2 路径规划 / 323
10.3 move_base客户端示例 / 328
10.4 修改导航栈 / 331
10.5 小结 / 335
第五部分 ROS中的机械臂 / 337
第11章 底层控制 / 338
11.1 单自由度移动关节机器人模型 / 338
11.2 位置控制器示例 / 339
11.3 速度控制器示例 / 342
11.4 力控制器示例 / 344
11.5 机械臂的轨迹消息 / 349
11.6 7自由度臂的轨迹插值动作服务器 / 353
11.7 小结 / 354
第12章 机械臂运动学 / 355
12.1 正向运动学 / 356
12.2 逆向运动学 / 360
12.3 小结 / 365
第13章 手臂运动规划 / 366
13.1 笛卡儿运动规划 / 36
前言
第一部分 ROS基础 / 1
第1章 概述:ROS工具和节点 / 2
1.1 ROS基础概念 / 2
1.2 编写ROS节点 / 5
1.2.1 创建ROS程序包 / 5
1.2.2 编写一个最小的ROS发布器 / 8
1.2.3 编译ROS节点 / 11
1.2.4 运行ROS节点 / 12
1.2.5 检查运行中的最小发布器节点 / 13
1.2.6 规划节点时间 / 15
1.2.7 编写一个最小ROS订阅器 / 17
1.2.8 编译和运行最小订阅器 / 19
1.2.9 总结最小订阅器和发布器节点 / 21
1.3 更多的ROS工具:catkin_simple、roslaunch、rqt_console和rosbag / 21
1.3.1 用catkin_simple简化CMakeLists.txt / 21
1.3.2 自动启动多个节点 / 23
1.3.3 在ROS控制台观察输出 / 25
1.3.4 使用rosbag记录并回放数据 / 26
1.4 最小仿真器和控制器示例 / 28
1.5 小结 / 32
第2章 消息、类和服务器 / 33
2.1 定义自定义消息 / 33
2.1.1 定义一条自定义消息 / 34
2.1.2 定义一条变长的消息 / 38
2.2 ROS服务介绍 / 43
2.2.1 服务消息 / 43
2.2.2 ROS服务节点 / 45
2.2.3 与ROS服务手动交互 / 47
2.2.4 ROS服务客户端示例 / 48
2.2.5 运行服务和客户端示例 / 50
2.3 在ROS中使用C 类 / 51
2.4 在ROS中创建库模块 / 56
2.5 动作服务器和动作客户端介绍 / 61
2.5.1 创建动作服务器包 / 62
2.5.2 定义自定义动作服务器消息 / 62
2.5.3 设计动作客户端 / 68
2.5.4 运行示例代码 / 71
2.6 参数服务器介绍 / 80
2.7 小结 / 84
第二部分 ROS中的仿真和可视化 / 85
第3章 ROS中的仿真 / 86
3.1 简单的2维机器人仿真器 / 86
3.2 动力学仿真建模 / 93
3.3 统一的机器人描述格式 / 95
3.3.1 运动学模型 / 95
3.3.2 视觉模型 / 98
3.3.3 动力学模型 / 99
3.3.4 碰撞模型 / 102
3.4 Gazebo介绍 / 104
3.5 最小关节控制器 / 112
3.6 使用Gazebo插件进行关节伺服控制 / 118
3.7 构建移动机器人模型 / 124
3.8 仿真移动机器人模型 / 132
3.9 组合机器人模型 / 136
3.10 小结 / 139
第4章 ROS中的坐标变换 / 141
4.1 ROS中的坐标变换简介 / 141
4.2 转换侦听器 / 149
4.3 使用Eigen库 / 156
4.4 转换ROS数据类型 / 161
4.5 小结 / 163
第5章 ROS中的感知与可视化 / 164
5.1 rviz中的标记物和交互式标记物 / 168
5.1.1 rviz中的标记物 / 168
5.1.2 三轴显示示例 / 172
5.1.3 rviz中的交互式标记物 / 176
5.2 在rviz中显示传感器值 / 183
5.2.1 仿真和显示激光雷达 / 183
5.2.2 仿真和显示彩色相机数据 / 189
5.2.3 仿真和显示深度相机数据 / 193
5.2.4 rviz中点的选择 / 198
5.3 小结 / 201
第三部分 ROS中的感知处理 / 203
第6章 在ROS中使用相机 / 204
6.1 相机坐标系下的投影变换 / 204
6.2 内置相机标定 / 206
6.3 标定立体相机内参 / 211
6.4 在ROS中使用OpenCV / 217
6.4.1 OpenCV示例:寻找彩色像素 / 218
6.4.2 OpenCV示例:查找边缘 / 223
6.5 小结 / 224
第7章 深度图像与点云信息 / 225
7.1 从扫描LIDAR中获取深度信息 / 225
7.2 立体相机的深度信息 / 230
7.3 深度相机 / 236
7.4 小结 / 237
第8章 点云数据处理 / 238
8.1 简单的点云显示节点 / 238
8.2 从磁盘加载和显示点云图像 / 244
8.3 将发布的点云图像保存到磁盘 / 246
8.4 用PCL方法解释点云图像 / 248
8.5 物体查找器 / 257
8.6 小结 / 261
第四部分 ROS中的移动机器人 / 263
第9章 移动机器人的运动控制 / 264
9.1 生成期望状态 / 264
9.1.1 从路径到轨迹 / 264
9.1.2 轨迹构建器库 / 268
9.1.3 开环控制 / 273
9.1.4 发布期望状态 / 274
9.2 机器人状态估计 / 282
9.2.1 从Gazebo获得模型状态 / 282
9.2.2 里程计 / 286
9.2.3 混合里程计、GPS和惯性传感器 / 292
9.2.4 混合里程计和LIDAR / 297
9.3 差分驱动转向算法 / 302
9.3.1 机器人运动模型 / 303
9.3.2 线性机器人的线性转向 / 304
9.3.3 非线性机器人的线性转向 / 306
9.3.4 非线性机器人的非线性转向 / 308
9.3.5 仿真非线性转向算法 / 309
9.4 相对于地图坐标系的转向 / 312
9.5 小结 / 317
第10章 移动机器人导航 / 318
10.1 构建地图 / 318
10.2 路径规划 / 323
10.3 move_base客户端示例 / 328
10.4 修改导航栈 / 331
10.5 小结 / 335
第五部分 ROS中的机械臂 / 337
第11章 底层控制 / 338
11.1 单自由度移动关节机器人模型 / 338
11.2 位置控制器示例 / 339
11.3 速度控制器示例 / 342
11.4 力控制器示例 / 344
11.5 机械臂的轨迹消息 / 349
11.6 7自由度臂的轨迹插值动作服务器 / 353
11.7 小结 / 354
第12章 机械臂运动学 / 355
12.1 正向运动学 / 356
12.2 逆向运动学 / 360
12.3 小结 / 365
第13章 手臂运动规划 / 366
13.1 笛卡儿运动规划 / 36
前 言
ROS(Robot Operating System,机器人操作系统)正在成为现代机器人学的实际标准编程方法。ROS wiki(https://www.ros.org/history/)写道:
ROS生态系统现在由全世界数以万计的用户组成,覆盖了从桌面爱好项目到大型工业自动化系统。
为什么是ROS?在1956年,Joseph Engelberger创立了Unimation公司,世界上第一个机器人公司[7]。然而,在过去的半个世纪里,机器人技术的进步令人失望。世界范围内的机器人学研究也仅限于实验室里的演示和探奇。这一领域的新生研究人员通常一无所有,从头开始构建新型机器人,解决执行器和传感器接口的问题,构建底层的伺服控制,并且通常在实现更高级的机器人能力之前就已经精疲力竭了,而这些自定义的机器人和软件很少被复用于后续工作。
人们认识到采用构建巴比塔的模式是徒劳的,构建更智能的机器人的任务需要持续的、协作的努力,并建立在能够不断达到更高层能力的基础上。在1984年,Vincent Hayward和Richard Paul引入了机器人控制C库(Robot Control C Library, RCCL)[15]作为解决这一长期问题的方法。不幸的是,RCCL没有获得机器人研究人员足够的认可。National Instruments[24]和Microsoft[39-40]均引入了试图使机器人编程标准化的产品。然而,研究人员发现这些方法烦琐而昂贵。
ROS于2007年由斯坦福人工智能实验室发起[26],它试图统一零碎的谷歌所采用的机器人学方法,且于2008年至2013年得到Willow Garage的支持[12],随后自2013年至今得到谷歌开源机器人基金会(Open Source Robotics Foundation,OSRF)的支持[10]。ROS方法遵循了开源软件和分布式协作的现代方法。此外,它桥接和提升了其他并行的开源工作,包括OpenCV[28]、PointCloudLibrary[21]、Open Dynamics Engine[8]、Gazebo[19]和Eigen[20]。对于研究人员而言,ROS在开放性和易用性方面可能与RCCL相似,而谷歌持续七年的支持是ROS存活的关键。
ROS现在在学术界、工业界和研究机构中得到了全世界的广泛使用。开发人员提供了数以千计的软件包,包括来自一些世界领先的专家在相关领域的解决方案。新的机器人公司在它们的产品上提供了ROS接口,并且已建立的工业机器人公司也引入了ROS接口。随着广泛采用ROS作为机器人编程实际标准的做法,人们对提高机器人的能力有了新的希望。在最近的DARPA机器人挑战赛中,大多数入围的团队使用了ROS。新型自动驾驶汽车的开发商正在开发ROS。新的机器人公司正在崛起,这部分是由ROS资源驱动的。鉴于ROS的势头和功绩,显而易见,当今的机器人工程师必须精通ROS编程。
什么是ROS?将其称为“机器人操作系统”并不全面。简洁地定义ROS很困难,因为它包含了很多方面,包括:编程风格(特别是依赖于松散耦合的分布式节点),节点间通信的接口定义和范例,库和包合并的接口定义,可视化、调试、数据记录和系统诊断的工具集合,共享源代码的存储仓库,桥接多个有用的、独立的开源库的桥梁。因此,ROS是机器人程序员的一种生活方式,而不只是一种简单的操作系统。ROS的定义可以参考ROS wiki(https://wiki.ros.org/ROS/Introduction):
ROS是一个针对机器人的开源、元级操作系统。它提供了用户在操作系统上所期望的服务,包括硬件抽象、低层设备控制、常用功能的实现、进程之间的消息传递以及包管理。它还提供了在多台计算机上获取、生成、编写以及运行代码的工具和库。
ROS的主要目标是支持机器人研究和开发中的代码复用。ROS是一个分布式的进程(也称节点)框架,它能使可执行的文件单独设计以及在运行时松散耦合。这些进程可以打包成易于共享和分发的包。ROS还支持一个代码库的联合系统,能够同时分发协作。从文件系统级到社区级的这个设计实现了开发和部署的独立决策,但所有这些都可以与ROS的基础底层工具一起使用。
Brian Gerkey在网上的评论(https://answers.ros.org/question/12230/what-is-ros-exactly-middleware-framework-operating-system/)如下。
我是这样解释ROS的:
1.?管道:ROS提供了发布-订阅消息传递基础结构,旨在支持分布式计算系统的快速、轻松构建。
2.?工具:ROS提供了一套广泛用于配置、启动、反思、调试、可视化、记录、测试和停止的分布式计算系统的工具。
3.?功能:聚焦于移动性、操作性和感知性,ROS提供了实现机器人有用的功能的广泛库集。
4.?生态系统:ROS拥有规模庞大的社区支持,并通过着力聚焦于集成和文档而不断改进。ros.org是一个一站式的站点,在这里可以查找和了解来自世界各地开发者的成千上万个可用ROS包。
来自参考文献[13]对ROS的解释如下:
ROS(发音Ross[rs])的主要目标是提供一个统一的开源编程框架,用于在各种真实世界和仿真环境中控制机器人。
来自参考文献[13]中的ROS管道:
ROS中的核心实体称为节点。节点通常是用Python或C 编写的小程序,用于执行一些相对简单的任务或过程。节点可以相互独立地启动和停止,并通过传递消息进行通信。节点可以在某些主题上发布消息或向其他节点提供服务。
例如,发布器节点可能会报告从连接到机器人微控制器的传感器传来的数
ROS生态系统现在由全世界数以万计的用户组成,覆盖了从桌面爱好项目到大型工业自动化系统。
为什么是ROS?在1956年,Joseph Engelberger创立了Unimation公司,世界上第一个机器人公司[7]。然而,在过去的半个世纪里,机器人技术的进步令人失望。世界范围内的机器人学研究也仅限于实验室里的演示和探奇。这一领域的新生研究人员通常一无所有,从头开始构建新型机器人,解决执行器和传感器接口的问题,构建底层的伺服控制,并且通常在实现更高级的机器人能力之前就已经精疲力竭了,而这些自定义的机器人和软件很少被复用于后续工作。
人们认识到采用构建巴比塔的模式是徒劳的,构建更智能的机器人的任务需要持续的、协作的努力,并建立在能够不断达到更高层能力的基础上。在1984年,Vincent Hayward和Richard Paul引入了机器人控制C库(Robot Control C Library, RCCL)[15]作为解决这一长期问题的方法。不幸的是,RCCL没有获得机器人研究人员足够的认可。National Instruments[24]和Microsoft[39-40]均引入了试图使机器人编程标准化的产品。然而,研究人员发现这些方法烦琐而昂贵。
ROS于2007年由斯坦福人工智能实验室发起[26],它试图统一零碎的谷歌所采用的机器人学方法,且于2008年至2013年得到Willow Garage的支持[12],随后自2013年至今得到谷歌开源机器人基金会(Open Source Robotics Foundation,OSRF)的支持[10]。ROS方法遵循了开源软件和分布式协作的现代方法。此外,它桥接和提升了其他并行的开源工作,包括OpenCV[28]、PointCloudLibrary[21]、Open Dynamics Engine[8]、Gazebo[19]和Eigen[20]。对于研究人员而言,ROS在开放性和易用性方面可能与RCCL相似,而谷歌持续七年的支持是ROS存活的关键。
ROS现在在学术界、工业界和研究机构中得到了全世界的广泛使用。开发人员提供了数以千计的软件包,包括来自一些世界领先的专家在相关领域的解决方案。新的机器人公司在它们的产品上提供了ROS接口,并且已建立的工业机器人公司也引入了ROS接口。随着广泛采用ROS作为机器人编程实际标准的做法,人们对提高机器人的能力有了新的希望。在最近的DARPA机器人挑战赛中,大多数入围的团队使用了ROS。新型自动驾驶汽车的开发商正在开发ROS。新的机器人公司正在崛起,这部分是由ROS资源驱动的。鉴于ROS的势头和功绩,显而易见,当今的机器人工程师必须精通ROS编程。
什么是ROS?将其称为“机器人操作系统”并不全面。简洁地定义ROS很困难,因为它包含了很多方面,包括:编程风格(特别是依赖于松散耦合的分布式节点),节点间通信的接口定义和范例,库和包合并的接口定义,可视化、调试、数据记录和系统诊断的工具集合,共享源代码的存储仓库,桥接多个有用的、独立的开源库的桥梁。因此,ROS是机器人程序员的一种生活方式,而不只是一种简单的操作系统。ROS的定义可以参考ROS wiki(https://wiki.ros.org/ROS/Introduction):
ROS是一个针对机器人的开源、元级操作系统。它提供了用户在操作系统上所期望的服务,包括硬件抽象、低层设备控制、常用功能的实现、进程之间的消息传递以及包管理。它还提供了在多台计算机上获取、生成、编写以及运行代码的工具和库。
ROS的主要目标是支持机器人研究和开发中的代码复用。ROS是一个分布式的进程(也称节点)框架,它能使可执行的文件单独设计以及在运行时松散耦合。这些进程可以打包成易于共享和分发的包。ROS还支持一个代码库的联合系统,能够同时分发协作。从文件系统级到社区级的这个设计实现了开发和部署的独立决策,但所有这些都可以与ROS的基础底层工具一起使用。
Brian Gerkey在网上的评论(https://answers.ros.org/question/12230/what-is-ros-exactly-middleware-framework-operating-system/)如下。
我是这样解释ROS的:
1.?管道:ROS提供了发布-订阅消息传递基础结构,旨在支持分布式计算系统的快速、轻松构建。
2.?工具:ROS提供了一套广泛用于配置、启动、反思、调试、可视化、记录、测试和停止的分布式计算系统的工具。
3.?功能:聚焦于移动性、操作性和感知性,ROS提供了实现机器人有用的功能的广泛库集。
4.?生态系统:ROS拥有规模庞大的社区支持,并通过着力聚焦于集成和文档而不断改进。ros.org是一个一站式的站点,在这里可以查找和了解来自世界各地开发者的成千上万个可用ROS包。
来自参考文献[13]对ROS的解释如下:
ROS(发音Ross[rs])的主要目标是提供一个统一的开源编程框架,用于在各种真实世界和仿真环境中控制机器人。
来自参考文献[13]中的ROS管道:
ROS中的核心实体称为节点。节点通常是用Python或C 编写的小程序,用于执行一些相对简单的任务或过程。节点可以相互独立地启动和停止,并通过传递消息进行通信。节点可以在某些主题上发布消息或向其他节点提供服务。
例如,发布器节点可能会报告从连接到机器人微控制器的传感器传来的数
媒体评论
免费在线读
评论
还没有评论。