猜你喜欢
ROS 2机器人编程实战:基于现代C++和Python 3

ROS 2机器人编程实战:基于现代C++和Python 3

书籍作者:徐海望 ISBN:9787111715504
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:11808
创建日期:2023-05-12 发布日期:2023-05-12
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

本书介绍了基于ROS 2编程所需的各方面知识,并通过结合基本概念、设计思想、工程实践、编程调试和应用技巧等多面一体进行阐述,使读者可以更加快速地掌握ROS 2机器人编程的核心思想。书中包含大量的代码和实战案例,同时还会讲述开源项目及其相关规范和注意事项,结合作者实际的工程经验、与时俱进的 ROS 2设计思想和源码案例,读者可以学习到不拘泥于软件版本与软件环境的编程知识。此外,本书的*后一章还给出了ROS 2在实际项目中落地的应用策略和实用建议。书中所有源码都已按照ROS 2的相关规范进行开源,并与读者共同维护。
本书为读者提供了全部案例源代码下载和高清学习视频,读者可以直接扫描二维码观看。
本书适合机械、自动化、机器人、计算机、自动驾驶和人工智能等行业的从业者、学生和研究人员,以及 DIY 爱好者和极客等阅读学习。

作者简介

徐海望,机器人软硬件研发工程师、社区贡献者、机器人爱好者。曾就职于小米机器人实验室,铁蛋创始团队成员之一,曾参与若干机器人的设计、研发,并负责铁蛋的开源社区运营。擅长移动机器人的软硬件架构设计与实现。

高佳丽,机器人软硬件研发工程师,机器人爱好者。曾就职于小米,铁蛋创始团队成员之一,并参与多项小米自研穿戴类产品开发。擅长嵌入式软件驱动的开发,多传感器系统中间件的开发与调试;擅长机器人上层应用的设计与实现。


前言


前言
欢迎阅读本书!
本书将带领读者了解ROS 2的方方面面,帮助读者从0到1掌握ROS 2的编程知识。

本书编写目的
ROS 2的悄然兴起,带来了许多令人兴奋的新功能,但与 ROS 相比,ROS 2的相关学习资料却相对缺失,中文资料更是如此。我们成书的目的在于提供一本较为通用的ROS 2编程资料,结合基本概念、设计思想、工程实践、调试与应用技巧等多面一体进行阐述,让读者能够快速地掌握ROS 2设计与使用的核心方法,从而实现心中所想。初学者能通过阅读本书循序渐进地学习并掌握ROS 2的基本功能与应用;具备一定技术基础的开发者,也能通过阅读本书获得新的见解和启发,从而得到提升。
全书贯穿了“ROS 2是持续发展的”这一概念,并对一些可能会发生变化的功能和实现进行了提醒。希望能够引导读者以发展的眼光来看待ROS 2,并以发展的理念来学习并设计自己的项目。希望读者在实践学习的过程中,不要过度拘泥于软件的版本与环境,甚至不拘泥于现有的功能,这就是开源的魅力所在。本书还在讲解中贯穿介绍有关ROS开源项目的相关规范和注意事项,目的在于引导读者在参与开源项目的过程中,遵守基本的规则,共建良好的开源环境。
在尝试使用ROS 2的过程中,笔者寻找过诸多资源。期间也发现了很多优秀的英文资料,包括ROS 2的官方文档、ROS Discourse论坛上热心开发者分享的资料,以及 GitHub社区的项目README和issue。虽然这些资料都提供了足够凝练且概括性的基础知识和基本使用技巧,但是这些资料都过于片面化或浅显化,零零散散不成体系,除非开发者能够以此为引,通过反复阅读源码掌握ROS 2的精髓并灵活应用;否则,单纯阅读文档或是通过某一个或几个GitHub的项目主页去了解ROS 2的一些基础功能的使用方法,无异于管中窥豹。由于ROS 2相关的API网站是直接通过Doxygen生成的,所以也并没有给出除注释之外的介绍和讲解,这就导致了如果某个函数接口没有注释且没有文档介绍,那么了解其中的含义的途径便只有阅读源码了。所以本书也会夹杂着一些ROS 2源程序代码的内容,借此做更详细、更扎实的介绍,以便读者更好地学习和理解。
由于本书篇幅有限,所以这里并没有讲解基于ROS 2实现的任何一个大型应用框架,而是着重讲解ROS 2中的每一个关键基础及其细节,力求使本书在具备一定广度的同时也具备一定深度,而不是泛泛地将知识一带而过。在讲述知识的同时,书中也附有大量的源代码示例帮助读者理解相关的内容。希望读者在阅读此书时也同步进行编程练习,以加深理解。只有通过不断练习和理解,才能够真正掌握这些知识。

本书结构
本书共8章,前5章为基础内容,建议读者先按照顺序完成学习。第6~8章是扩展知识章节,相对独立,读者可挑选感兴趣的章节直接阅读。
第 1 章将带领读者从无到有构建和部署一个完整的ROS 2。ROS 2是一个包括上百个功能包的软件堆栈,所谓“安装ROS 2”大部分指的是安装ROS 2的 Core、Base 或 Desktop 版本的集合,本章将会对这些内容进行详细区分和讲解。
第2章会从ROS 2基础、基本的单位(功能包和节点)开始,讲解ROS 2是如何实现功能的模块化抽象的。其中,功能包是ROS 2构建过程中的zui小单位,节点是ROS 2运行过程中的zui小单位。
第3章将着重介绍节点的各类体系化的扩展功能,包括日志系统、启动系统、参数系统、插件系统和组件系统等。正是由于这些扩展功能的存在,才使得ROS 2能够适用于各类丰富多样的应用场景中。
第4章和第5章介绍了ROS 2的基础通信和扩展通信的内容。所谓基础通信,指的是ROS 2中基本的通信单位,即基于发布订阅模式的 topic 通信和基于主从式架构的 service 通信。所谓扩展通信,指的是基于基础通信开发的通信模式,如 action 和 tf2 等。
前5章每章的都会有实战的内容,读者可以根据当前章节讲述的内容进行实战拓展。
第6章是面向调试和测试的实战内容,其中会介绍ROS 2的一些调试方法和技巧,以及ROS 2中规范的自动化测试流程及其实现,包括基于 GDB 的调试、基于 rosbag2 的调试和ROS 2的自动化测试程序编写。
第7章是面向扩展功能的实战内容。ROS 2的扩展可谓千变万化,本章仅选择了具有代表性的三点:面向功能性的扩展——构建ROS 2的vendor功能包、面向接口规范化的扩展——使用通用传感器接口面向诊断功能的扩展——diagnostics。
第8章是面向ROS 2产品化的实战综述,汇集了作者对ROS 2在实际项目中落地的应用策略和实用建议。在ROS 2的许多公开示例和教程中,以及ROS 2的诸多扩展功能中,大部分都是面向原型机的设计和实现,这也使得许多工程师在ROS 2的落地过程屡屡碰壁,本章旨在帮助读者解决这个困扰。

使用方法和书中约定
建议读者准备一台基于x86-64或者ARM64架构的计算机。基于这些计算机,读者便可以在其中尝试本书所讲述的所有功能,并且可以在不同架构、不同操作系统、不同版本操作系统,甚至不同版本编译器和解释器的操作系统的计算机上尝试。
除了学习本书外,ROS官方的一系列网站和平台都是值得读者浏览和了解的,包括:
l主页(ros.org):该网页汇总了主要的ROS平台链接,相当于导航主页。
l论坛(discourse.ros.org):该网站基于开源框架Discourse搭建,是一个纯技术类论坛,所有 ROS 相关的发布、技术讨论和公开说明都会在论坛上进行。
l问答平台(answers.ros.org):该网站基于开源框架Askbot搭建,是一个问答社区,任何人都可以在这里发出有关ROS的提问,也可在这里回答任何人提出的问题。
l文档(docs.ros.org):该网站收集了ROS 2的所有重要文档,包括当下长期支持版本和开发版本,以及开发文档和API文档等。
希望读者在阅读本书的同时,深度探索ROS社区的每个部分,实际上,不少初学者,甚至经验丰富的工程师,都会忽略社区的重要性。由于ROS 2是开源软件,无论是更新大版本,还是修复小问题,都会通过社区的不同渠道进行发布和讨论。所以作为参与者加入社区,可以跟进ROS 2大大小小的改动。这样可以从根本上了解到ROS 2的方方面面,如新特性的从无到有,或某些功能的不足之处等。所以,如果只是一味地看书、读博客和参阅二手翻译的文章,是永远无法跟上时代zui新步伐的。这与想了解领域内zui新的研究成果需要通过阅读和发表论文,以及参与会议交流是异曲同工的。

本书对于代码有一些特别的约定
1. 在普通的脚本代码中
l会使用注释后的“…”代表省略了不重要的部分,并代表此处应有其他代码或日志存在。在shell中,“#”开头为注释。
l会使用“—”代表分割线,用于分隔不同指令执行后的执行结果。
l以“$”开头的指令均执行自普通权限的用户,以“#”开头的指令均执行自超级用户(root)。
2. 在程序源代码中
会使用注释后的“…”代表省略了不重要的部分,并代表此处应有其他代码或日志存在。在C++中,以“//”开头为注释;在Python中,以“#”开头为注释。

前置知识
如果读者掌握了如下知识,则学习本书会事半功倍。
lC++ 编程基础:了解基本的面向对象编程和模板即可,能够了解清楚C++各个版本(03、11、14和 17 等)的不同之处。
lPython 3 的编程基础。
l机器人学基础。如果没有系统学过,可以简单了解一些空间描述、坐标变换、正运动学和逆运动学相关的知识。
lLinux 系统操作基础。能够使用简单的指令,如 cd、ls、mkdir、cat、grep 和 find 等。
l版本管理基础。了解如何使用 GIT 工具管理软件的版本,如如何拉取、提交和合并。当然zui好使用过GitHub,并且了解开源项目运作的基本原理,如了解 issue 和 pull request 等基本概念。

笔者在开发“铁蛋”(CYBERDOG)项目时与ROS 2结下了不解之缘,自此也深知开源对于人类科技发展的重要性。ROS 生态能有今天的盛况,完全得益于开源,我们希望未来持续为开源做出贡献,也希望广大读者能加入其中,为人类的未来添砖加瓦。
本书有大量的代码需要读者去尝试,并且已经将代码开源至GitHub的homalozoa/ros2_for_beginners_code(这是对GitHub开源仓库的一种缩写,在第1章会有讲解),也欢迎读者来社区交流,为本书或本项目提出宝贵建议和意见。本书还提供了高清学习视频,读者可以直接扫描二维码观看。


目录


第1章 构建与部署ROS 2
1.1 ROS 2的开发环境配置
1.1.1 ROS 2的发行方式
1.1.2 解决依赖问题
1.1.3 从源码安装ROS 2的技巧
1.1.4 便于开发的环境配置
1.2 ROS 2的架构体系
1.2.1 核心组件
1.2.2 机器人基础应用组件
1.2.3 可视化组件、示例组件和扩展组件
1.3 ROS 2的构建体系
1.3.1 vcstool的使用
1.3.2 colcon工具链的简介
1.3.3 colcon的构建、测试和查阅
1.4 实战:定制特定功能的ROS 2软件堆栈
第2章 模块化的功能包和节点
2.1 软件功能包的构建
2.1.1 功能包的配置方法
2.1.2 功能包的构建与测试流程
2.1.3 运行指定功能包中的程序
2.2 节点的构建方法与基本操作
2.2.1 节点与节点执行器
2.2.2 建立节点的方法
2.2.3 调试节点的方法
2.2.4 进程、线程与节点的关系
2.3 节点的常见扩展功能
2.3.1 DDS的作用域
2.3.2 ROS的命名空间
2.3.3 生命周期节点
2.4 实战:功能包的打包与发行
第3章 节点的体系化与扩展
3.1 节点的日志系统
3.1.1 日志的基本分类
3.1.2 收集和查阅历史日志
3.1.3 日志的应用技巧
3.2 使用启动脚本
3.2.1 构建启动系统
3.2.2 同时运行多个进程
3.2.3 配置启动脚本
3.3 节点的参数系统
3.3.1 为节点加入参数
3.3.2 YAML的基本语法
3.3.3 在launch文件中引入参数
3.4 通用的插件系统
3.4.1 创建插件
3.4.2 动态加载插件
3.4.3 插件的使用案例
3.5 ROS 2的组件系统
3.5.1 单组件的实现流程
3.5.2 实现自定义的组件
3.5.3 使用组件容器加载多个组件
3.6 实战:RealSense与ROS的桥接
第4章 ROS 2的基础通信
4.1 基于发布订阅模式的topic通信
4.1.1 尝试发布和订阅
4.1.2 调试topic的方法
4.1.3 消息的服务质量
4.1.4 进程内高效通信
4.1.5 尝试共享内存
4.1.6 统计Topic状态
4.2 基于主从式架构的service通信
4.2.1 实现service服务端和客户端
4.2.2 在客户端处理应答
4.2.3 service的局限性
4.3 实战:级联生命周期节点
第5章 ROS 2的扩展通信
5.1 基于主从式架构的action通信
5.1.1 实现action服务端和客户端
5.1.2 在客户端获取反馈、状态和结果
5.1.3 action的抢占和队列
5.2 接口的使用及其自定义
5.2.1 自定义接口
5.2.2 使用自定义接口
5.2.3 消息编写的基本规范
5.2.4 接口的使用技巧
5.3 基于topic实现的坐标系统
5.3.1 广播静态坐标变换
5.3.2 广播动态坐标变换
5.3.3 监听坐标变换
5.4 实战:模块化的导航功能框架
第6章 面向ROS 2的调试与测试
6.1 调试ROS 2的代码
6.1.1 使用GDB调试
6.1.2 使用ros2_tracing
6.2 使用rosbag2实现持久记录
6.2.1 使用ros2bag录制消息
6.2.2 播放和处理bag文件
6.2.3 在程序中调用rosbag2的API
6.3 实现单元测试
6.3.1 编写简单的单元测试
6.3.2 断言的种类
6.3.3 统计测试覆盖率
第7章 探索ROS 2的扩展功能
7.1 了解开源协议与版权
7.1.1 开源协议介绍
7.1.2 版权信息的重要性
7.1.3 项目中的Notice文件
7.2 构建ROS 2的vendor功能包
7.2.1 辨识项目的构建方式
7.2.2 CMake项目的引入
7.2.3 Autoconf项目的引入
7.3 使用ROS 2规范传感器接口
7.3.1 传感器数据的分类
7.3.2 同步多源数据
7.4 实现软硬件诊断系统
7.4.1 更新诊断数据
7.4.2 分析诊断数据
第8章 ROS 2的产品落地指导
8.1 架构设计与硬件选型
8.1.1 硬件平台与外设的选型
8.1.2 软件架构的层次化
8.2 软件实现的注意事项
8.2.1 支持ROS 2的软件平台
8.2.2 原型环境与交付环境
8.2.3 自启动与下电保护
8.3 集成与交付
8.3.1 构建环境的可重复部署
8.3.2 持续集成与持续交付
8.3.3 开放平台中的CI/CD