
本书是学习ROS的实用化书籍。从对机器人的介绍开始,由浅入深依次讲解ROS依赖的Linux系统、常用的高级编程语言Python、ROS环境和机器人编程开发实训等内容。在学习ROS开发过程中,本书在实战篇加入了SLAM建图、视觉跟随和物联网控制等前沿知识的介绍,使读者在学习编程技能的同时,能够更加深入地理解最新的机器人控制理论。为了发挥ROS与ROS2各自的优势,本书提出了ROS与ROS2混合编程方法,并给出了翔实的实践案例。 本书可供从事无人驾驶和移动机器人研究的科研工作者、高校教师及相关专业学生使用。
序 从微软在2014年对Windows XP停止服务,到2020年对Windows 7停止服务,这就不仅需要我国加快推动国产操作系统的建设,也需要加强我国在开源软件生态中的话语权,提高国产软件的核心研发能力。 现在,我们正处于进入辅助驾驶的重要阶段,这一阶段是实现无人驾驶的过渡期。也许三五年后,在路况较好的情况下,人们就可以坐在车内欣赏窗外的风景,只需要在拥堵等特殊情况下握住方向盘。相较于欧美国家,我国在无人驾驶技术研发方面稍有差距,但后劲却十足,这是因为无人驾驶需要基于大数据技术的高精度导航。 包括操作系统在内的核心关键技术,我国是必须掌握的。关键核心技术要立足于自主创新、要自主可控,得到了国家层面的大力支持。希望在IT一线的科技工作者,要始终坚持关键核心技术不能受制于人的原则,加强产业链上下游的组织与协作,提升关键软硬件供给能力。北京钢铁侠科技有限公司(“钢铁侠科技”)在这方面做得比较成功。 “钢铁侠科技”在理论积累和实践创新的基础上,编著了“智能驾驶理论与实践系列丛书”。该丛书涵盖无人驾驶感知智能、深度学习与机器人、ROS与ROS2开发指南等。丛书蕴含着“钢铁侠科技”多年的研发实践和成果积累,对从业者学习机器人编程基础、深度学习理论知识和无人驾驶实现方法有所裨益。 《ROS与ROS2开发指南》是该丛书之一,系统讲解了ROS、ROS2的开发环境及方法,介绍了跨平台交叉编译器的设计,为读者掌握智能终端操作系统,尤其是机器人操作系统,提供了宝贵的财富。在“钢铁侠科技”成立8周年之际,迎来了该书的出版。若读者能从本书中受到启发,产生两三点新思想,实现与时俱进,则更是我期待看到的。 倪光南 中国工程院院士 前 言 北京钢铁侠科技有限公司(简称钢铁侠科技)于2015年成立时,研发的第一款产品是双足大仿人机器人。研发过程中团队做了大量调研,专门分析采用什么样的操作系统更加适合这种高难度的机器人,最后综合比较发现,ROS最有优势。一直到现在,钢铁侠科技研发的各类机器人产品普遍采用ROS系统。ROS也成为钢铁侠科技积累时间最长的一项技术。 在长期的开发过程中,编者发现采用ROS的实时性不够强,缺少机器人开发调试工具,对多机协作支持不佳,于是做了大量的改良开发工作,并与国产化的Linux厂家合作,开发了国产改良的ROS系统。后来发现,这些也成为ROS2在慢慢改进的地方。考虑到大部分读者可能是初学人员,本书还是选用了ROS原版系统作为讲解对象,但部分章节介绍了如何改良的具体方法。 在过去的8年里,全国有超过500所大学与北京钢铁侠科技有限公司进行过产学研项目合作。清华大学、北京理工大学、北京航空航天大学、山东大学、吉林大学等都是钢铁侠科技非常深入的合作伙伴。很多学校希望钢铁侠科技通过新兴的产业技术,为学校提供最新的教学平台,助力学校的科研教学和人才培养。 本书基于钢铁侠科技打造的一款适合学习ROS的机器人硬件平台,提供了配套的开发指南。与其他机器人平台相比,本平台加入了环境信息感知和物联网控制两个特色功能,同时对视觉跟随、导航建图做了加强,使ROS与机器人需要实现的具体功能紧密结合,更具有实战化的特点。书中的具体技术都介绍了开发思路,均可用于其他机器人研发过程。 最后两章是本书的特色章节。在第10章,讲解了ROS2的安装与使用,详细介绍了ROS与ROS2的桥接通信,为在ROS2环境下实现具体开发提供了指导。在第11章,重点介绍了交叉编译器的设计与开发,使不同的硬件平台和Linux操作系统版本都能安装同一套ROS环境。第11章是钢铁侠科技多年开发实战经验所得,难度较大,可以作为选读章节。但如果在日后科研工作中,比如原本在x86架构下编写的ROS程序计划移植到ARM架构下,本书则提供了难得一见的法宝。 本书全部代码由钢铁侠科技的研发团队反复验证多年,兼具学习和实用的功能。本次公开出版,是对钢铁侠科技历年来在ROS方面的积累做了系统化的总结。本书希望能够帮助学生、从业者和感兴趣的读者朋友快速理解ROS相关原理及实践方法,推进我国智能机器人事业的快速发展。由于编者能力有限,书中难免有不妥之处,烦请读者批评指正。 值此付梓之际,感谢公司北京和青岛两地研发团队的辛勤付出,感谢电子工业出版社编辑的悉心指导,感谢北京市科学技术委员会、中关村科技园区管理委员会给予“高算力低功耗机器人步态控制器研制”和“高抗扰性目标检测技术及应用”两项科技重大专项支持,感谢以各种形式帮助我们的朋友们。钢铁侠科技向各位致以深深的谢意。 北京钢铁侠科技有限公司 2023年7月
目 录 预 备 篇 第1章 绪论 1 1.1 机器人的概念及特点 1 1.1.1 机器人的由来 1 1.1.2 机器人的定义 2 1.1.3 机器人的主要特点 3 1.2 机器人的组成与分类 3 1.2.1 机器人的组成 3 1.2.2 机器人的分类 4 1.3 智能机器人 10 1.3.1 智能机器人的定义 10 1.3.2 脑科学与智能机器人 11 1.3.3 人工智能在机器人中的应用 11 第2章 Linux基础 14 2.1 Linux简介 14 2.1.1 Linux的发行版 14 2.1.2 Linux应用领域 15 2.2 Linux系统目录结构 15 2.3 Linux用户及用户组管理 18 2.4 Linux文件属性管理 20 2.4.1 查看文件属性 20 2.4.2 文件属性修改 21 2.4.3 文件权限修改 22 2.5 Linux目录管理 24 2.5.1 常用命令 24 2.5.2 文件内容查看指令 27 2.5.3 重定向与追加 28 2.6 Linux包操作 29 第3章 Python基础 31 3.1 Python简介 31 3.1.1 Python发行版 31 3.1.2 Python特点 32 3.2 Python基础介绍 32 3.2.1 基础导引 32 3.2.2 变量 33 3.2.3 数据类型 34 3.2.4 条件语句 35 3.2.5 循环语句 36 3.2.6 切片操作 37 3.3 数据常用操作方法 38 3.3.1 字符串常见操作 38 3.3.2 列表常见操作 43 3.3.3 字典常见操作 46 3.3.4 集合常见操作 51 3.3.5 元组常见操作 52 3.3.6 逻辑运算 54 3.4 函数 54 3.4.1 函数简介 54 3.4.2 参数(argument-list) 55 3.4.3 局部变量与全局变量 57 3.4.4 返回值 58 3.4.5 递归函数 59 3.4.6 匿名函数 59 3.4.7 列表推导式 59 3.4.8 字典推导式 60 3.4.9 常用内置函数 61 3.5 面向对象 64 3.5.1 面向过程与面向对象 64 3.5.2 类与实例 65 3.5.3 类属性与实例属性 65 3.5.4 类方法与静态方法 68 3.5.5 魔法方法 69 3.5.6 面向对象的三大特性 71 3.6 常用术语介绍 74 基 础 篇 第4章 ROS概述 76 4.1 初识ROS 76 4.2 PC安装ROS 79 4.3 Raspberry 系统下安装ROS的脚本 83 第5章 ROS基础 84 5.1 文件系统级 84 5.2 计算图级 86 5.3 开源社区级 87 5.4 文件系统工具 87 5.4.1 使用rospack 87 5.4.2 使用roscd 88 5.4.3 使用rosls 89 5.4.4 使用rosed 89 5.4.5 使用roscp 89 5.5 创建工作空间 89 5.5.1 创建工作空间简介 90 5.5.2 工作空间目录解析 90 5.6 功能包的创建与编译 91 5.6.1 catkin功能包的组成 91 5.6.2 创建功能包 92 5.6.3 功能包依赖关系 92 5.6.4 功能包命名规范 93 5.6.5 删除功能包 94 5.6.6 编译功能包 94 5.7 ROS节点 96 5.7.1 启动ROS 97 5.7.2 使用rosnode 97 5.8 ROS主题与节点交互 98 5.8.1 控制turtle移动 98 5.8.2 查看节点信息 99 5.8.3 查看主题信息 100 5.8.4 使用 rqt_graph 102 5.9 ROS服务和参数 103 5.10 创建ROS消息和ROS服务 106 5.10.1 消息(msg)和服务(srv)介绍 107 5.10.2 使用 msg 107 5.10.3 使用 srv 109 5.11 编写发布器与订阅器 110 5.11.1 定义msg消息 110 5.11.2 编写发布器 112 5.11.3 编写订阅器 114 5.11.4 启动rqt查看节点信息 115 5.12 编写服务端和客户端 116 5.12.1 定义srv服务 116 5.12.2 编写服务端 118 5.12.3 编写客户端 120 5.13 编写launch文件 122 5.13.1 roslaunch使用方法 122 5.13.2 编写launch文件介绍 125 实 战 篇 第6章 ARTROBOT机器人移动平台搭建 127 6.1 三轴全向移动机器人介绍 127 6.1.1 全向轮结构 127 6.1.2 底盘结构设计 127 6.1.3 直流电机的选择 129 6.1.4 电机驱动板 129 6.1.5 ROS的主控板 130 6.2 运动学建模和分析 130 6.2.1 机器人坐标系系统分析 130 6.2.2 运动学模型分析 132 6.2.3 逆运动学模型方程推导 133 6.2.4 正运动学模型方程推导 135 6.2.5 航迹推算 136 6.3 ros_arduino_bridge功能包集 136 6.3.1 ros_arduino_bridge功能包集简介 137 6.3.2 安装ros_arduino_bridge功能包集 139 6.3.3 安装python-serial功能包 139 6.3.4 串口的操作权限 139 6.4 下位机Arduino代码详解 140 6.4.1 ros_arduino_bridge功能简介 140 6.4.2 创建ros_arduino_bridge项目 141 6.4.3 mobileBaseArduinoCode.ino 141 6.4.4 commands.h 147 6.4.5 encoder_driver.h 147 6.4.6 encoder_driver.ino 148 6.4.7 motor_driver.h 151 6.4.8 motor_driver.ino 151 6.4.9 omniWheel_controller.h 154 6.4.10 sensors.h 157 6.5 上位机ros_arduino_python代码 158 6.5.1 ros_arduino_python功能简介 158 6.5.2 arduino.launch 159 6.5.3 my_arduino_params.yaml 159 6.5.4 arduino_node.py 160 6.5.5 base_controller.py 161 第7章 机器人传感器配置与使用 167 7.1 惯性测量单元校准和调试 167 7.1.1 惯性测量单元相关介绍 167 7.1.2 IMU功能包简介 167 7.1.3 在ROS环境下复制并编译IMU源码 168 7.1.4 IMU初始标定 168 7.1.5 启动IMU测试 168 7.1.6 单独运行IMU 169 7.2 雷达调试 170 7.2.1 雷达选型 170 7.2.2 下载编译ROS下驱动源码 171 7.2.3 生成挂载点 172 7.2.4 启动雷达测试 174 7.2.5 读取雷达数据 174 7.3 udev串口配置 177 7.3.1 udev简介 177 7.3.2 udev规则 177 7.3.3 udev内容 179 7.3.4 udev生效 183 7.4 ROS中TF变换 184 7.4.1 TF功能包 185 7.4.2 TF广播与监听 187 7.4.3 TF常用工具 193 第8章 SLAM及导航 198 8.1 SLAM简介 198 8.2 常见激光SLAM算法简介 199 8.3 应用gmapping构建机器人约束条件 200 8.4 slam_gmapping功能包 201 8.5 应用gmapping构建二维地图 201 8.6 SLAM构建地图过程分析 205 8.6.1 地图分析 205 8.6.2 SLAM执行过程 206 8.6.3 gmapping参数设定 207 8.7 ROS机器人导航简介 209 8.8 机器人路径规划算法简介 212 8.9 应用导航功能包实现自主路径规划 214 8.9.1 路径规划执行过程 214 8.9.2 导航功能包参数设定 215 第9章 机器人功能扩展实例 218 9.1 机器人视觉跟随功能 218 9.1.1 ROS下摄像头的标定 218 9.1.2 ROS跟随功能实现 226 9.1.3 launch启动及效果演示 236 9.2 机器人+物联网功能 239 9.2.1 物联网模块介绍 240 9.2.2 物联网模块硬件接线 240 9.2.3 物联网模块协议 244 9.2.4 机器人+物联网功能实现 244 9.2.5 launch启动及效果演示 246 第10章 ROS2简介 249 10.1 从ROS1到ROS2 249 10.1.1 ROS1的局限性 250 10.1.2 ROS2对ROS1的改进 250 10.2 ROS2系统架构 251 10.3 ROS2安装 252 10.3.1 ROS2在Ubuntu上安装 252 10.3.2 Ubuntu ROS2测试 253 10.4 ROS2通信 253 10.4.1 节点 254 10.4.2 主题 254 10.4.3 服务 256 10.4.4 参数 259 10.4.5 基本操作 261 10.5 ROS2编程 262 10.5.1 工作空间 262 10.5.2 ROS2功能包 263 10.5.3 发布者和订阅者 264 10.5.4 编写简单的服务和客户端节点 270 10.5.5 创建ROS2消息和服务类型 275 10.6 ROS1和ROS2之间的桥接通信 283 10.6.1 ros1_bridge功能包 283 10.6.2 ros1_bridge之主题通信 283 10.6.3 ros1_bridge之服务通信 285 第11章 交叉编译器 286 11.1 GNU toolchain介绍 286 11.1.1 gcc和g++ 286 11.1.2 as、ld和ar 287 11.2 从源码制作gcc编译器 288 11.3 交叉编译器的制作 289