
如果你想DIY 一款轮式自主移动机器人,又不知道如何实现,本书可能会帮到你。
《轮式自主移动机器人编程实战》系统讲解轮式自主移动机器人如何从0 到1 实现自主运动。以树莓派和STM32 单片机为例,
详细介绍轮式机器人的硬件结构,包括驱动控制器的搭建、中央处理器的选型开发、滤波算法、平面
地图构建算法、规划算法、导航算法、室外GPS 定位实战案例(异地远程控制和地图路径规划等)、
室内BreezySLAM 建图案例、ROS 开发案例等,以及自主移动机器人和无人车驾驶的基本实现原理,
都能在本书中找到答案。《轮式自主移动机器人编程实战》还提供开放的云平台路径规划,可在农田、工业园区巡检、物流送货等
场景测试。
《轮式自主移动机器人编程实战》可作为高等院校物联网、机器人、计算机、通信、电气及自动化等专业的教材,也可作为计
算机、电子及智能车设计竞赛的自学或培训教材,还可供各类电子工程、自动化技术人员和计算机爱
好者学习参考。
··
背 景
“仙侠”剧中的御剑飞行,剑就像拥有灵魂一样,能自行飞到任何地方。也许,我
们很难造出一把神剑,但是我们却可以造出一辆“指哪去哪”的自主移动机器人。本书
更像一本“失传已久”的武功秘籍,带你系统学习如何搭建轮式自主移动机器人(文中
简称轮式机器人)。
10年前我还是大学生,为了参加全国电子专业人才设计与技能大赛,白天在图书馆
一笔一画地抄代码(为了增强理解,将代码抄到本上),晚上到实验室做验证实验,尽
管那时候还年轻,精力旺盛,但还是累坏了,尤其是搜索不到感兴趣的智能车制作系列,
那段时期过后,感觉像是灵魂出了窍,轮胎放了炮,很久没有精气神。毕业后,在电子、
计算机相关行业工作了近10年,通过不断地学习新知识,借助博客和机器人爱好者分
享互动等,我对机器人的理解有了一个质的变化,机器人不再是简单的机器人,而是具
有自主意识的机器人。后来,众多的网友咨询和鼓励我将博客上的这些技术文章整理成
书,经过一年的辛苦整理,终于有了您面前的这本书。
本 书 内 容
本书囊括了约20种算法,仿真实验23次,真车实验上百次,可展示的实验数据和
配图几百张,是真正意义上的以实验数据为导向、以调试分析为原则的作品。
本书分为三部分,第1~3章为基础知识部分,介绍机器人的基础知识,包括轮式
机器人的底盘结构、驱动结构、开发软件、通信协议等。第4~9章为技术提升部分,
涉及内容较多,每章内容都是由浅入深、循序渐进,机器人涉及的核心和关键知识皆有
提及,包括建图、路径规划、导航避障等。该部分反复强调 “避障需有图”的原则,讲
解常见的算法并编写代码进行验证。本部分的特色在于将云平台融入机器人系统,实现
异地远程控制、地图路径规划等。第10~12章为实战案例部分,介绍云平台的相关使
用说明、室内建图机器人、ROS的搭建和节点开发,是对前9章知识的总结和验证。
轮式自主移动机器人编程实战
- II -
案 例
本书涉及的开发语言有C/C++、Python、JavaScript、HTML、Shell等。书中案例
主要使用C/C++和Python编写,其中,使用C/C++编写的程序全部在Ubuntu 18.04版
和树莓派Raspbian 系统中编译通过,Python程序支持Python 2.7和Python 3.x,书中的
原理图和代码可以扫描本书封底的“案例源代码”二维码下载。
致 谢
感谢河北科技师范学院包长春教授对我参赛时的帮助以及写书时的支持!
感谢北京理工大学赐予我“德以明理、学以精工”的治学理念!
感谢我的父母将我养育成人,感谢我的兄长、亲戚、朋友们的支持。
感谢我的爱人杨雪娜在怀孕至哺乳期对娃儿的悉心照料,我才能静心写作,顺利交
稿,感谢!
感谢清华大学出版社这个大舞台能让我发光!
感谢网友和同事们的支持!感谢开源作者!
最后,感谢博客上的所有读者,是你们的期待让我动力十足!
本书难免有疏漏和不足之处,恳请各位同行和读者批评指正。
特别感谢奥松机器人于欣龙、吴朝霞、安丽丽、刘金雷、Eric、王航、林瑞和、李
杉、李晓波、贾明华、王兴兴、吴功富、 田松召、李歌、王淑芹提出的针对性的建议,
以及对部分源代码的审核等帮助。
个 人 寄 托
在编写此书的过程中,查阅了大量的文献,比较有感触的是大部分的知名算法是由
国外学者发明,并以他们的名字或者规则命名,希望今后有更多的知名算法能来自国内
的学者,并且以他们的姓名或者定义的规则命名,让国内的算法百花争艳!
愿读者在本书的帮助下快速实现自己的自主移动机器人。
愿智能机器人和无人驾驶技术进一步发展,实现更大价值!共勉!
交 流
由于编者水平有限,书中难免存在疏漏之处,希望读者指出书中不足,共同进步。
李德
2022年 3月于北京
··
第1部分 基础知识
第1章 轮式机器人的基础知识 ···································································2
1.1 轮式机器人的定义与应用 ······································································2
1.2 轮式机器人的结构················································································3
1.3 机器人的驱动方式················································································4
1.4 本章总结····························································································5
第2章 机器人的构成 ···············································································6
2.1 机器人的规划······················································································6
2.2 轮式机器人的转向结构 ·········································································8
2.2.1 轮式机器人的差速转向 ··················································································8
2.2.2 轮式机器人的独立舵机转向 ············································································9
2.2.3 阿克曼转向结构 ··························································································11
2.2.4 轮式机器人转向比较 ····················································································11
2.2.5 差速机器人里程计运动模型 ···········································································12
2.3 轮式机器人电动机的选型 ····································································13
2.3.1 轮式机器人:电动机性能 ··············································································13
2.3.2 轮式机器人:GA370电动机参数计算 ·······························································14
2.4 机器人的驱动模块··············································································15
2.4.1 驱动芯片L298N性能 ····················································································15
2.4.2 驱动模块 L298N的使用方法 ···········································································16
2.4.3 驱动板TB6612FNG的使用方法 ·······································································17
2.5 轮式机器人的大脑:控制器选型 ···························································18
2.6 轮式机器人底盘DIY ···········································································19
2.6.1 DIY的两种方法 ···························································································19
2.6.2 轮式机器人DIY改装法 ··················································································21
2.7 轮式机器人总结·················································································23
2.7.1 轮式机器人整体框图 ····················································································23
2.7.2 轮式机器人开发中涉及的软件列表 ··································································23
2.8 本章总结··························································································24
第3章 轮式机器人的软件提升 ··································································25
3.1 Keil软件 ··························································································25
3.1.1 Keil软件的安装 ···························································································25
3.1.2 Keil 5软件的使用 ························································································27
3.2 Linux基础知识 ··················································································28
3.2.1 Linux的Shell ·······························································································28
3.2.2 编写程序与脚本 ··························································································31
3.3 网络基础知识····················································································32
3.3.1 基础通信 ···································································································32
3.3.2 MQTT协议 ································································································33
3.3.3 Linux安装Mosquitto ·····················································································36
3.3.4 MQTT测试工具 ··························································································37
3.3.5 HTTP POST方法 ·························································································38
3.4 算法································································································39
3.4.1 PID控制算法 ······························································································39
3.4.2 移位滤波均值算法 ·······················································································44
3.4.3 高、低通滤波和互补滤波器 ···········································································45
3.4.4 初识贝叶斯 ································································································48
3.4.5 二值贝叶斯滤波 ··························································································49
3.4.6 卡尔曼滤波 ································································································51
3.5 本章总结··························································································58
第2部分 技术提升
第4章 轮式机器人的底盘控制器:STM32开发 ············································60
4.1 底盘控制器的对外神经元:输出PWM ····················································61
4.1.1 使用Keil模拟PWM输出 ·················································································61
4.1.2 机器人中使用的PWM ···················································································66
4.2 底盘控制器的运动神经元:驱动控制 ·····················································66
4.2.1 驱动控制器的连接 ·······················································································66
目 录
- V -
4.2.2 驱动源码分析 ·····························································································66
4.3 底盘控制器的捕获神经元:PWM捕获测速 ··············································68
4.3.1 硬件 ·········································································································68
4.3.2 测速源码分析 ·····························································································69
4.4 底盘控制器的中枢神经元:串口通信控制指令 ·········································71
4.5 底盘控制器的触觉神经元:ADC电池电压监测 ·········································75
4.5.1 硬件连接 ···································································································75
4.5.2 源码分析 ···································································································75
4.6 底盘控制器的发光控制神经元:LED控制 ················································77
4.6.1 硬件连接 ···································································································77
4.6.2 源码分析 ···································································································77
4.7 本章总结··························································································78
第5章 轮式机器人的主控制器:树莓派开发 ················································79
5.1 树莓派简介·······················································································79
5.2 树莓派资源·······················································································80
5.3 轮式机器人的交互窗口:树莓派Shell ·····················································80
5.4 轮式机器人上网接口:Socket通信 ·························································83
5.5 轮式机器人从控制器通信接口:树莓派串口 ············································83
5.5.1 树莓派串口配置 ··························································································83
5.5.2 树莓派USB转串口 ·······················································································86
5.5.3 绑定串口 ···································································································87
5.6 轮式机器人无线联网接口:树莓派的WiFi功能 ·········································88
5.6.1 树莓派WiFi连接路由器 ·················································································88
5.6.2 树莓派WiFi做AP热点 ···················································································89
5.7 机器人和手机App通信接口:树莓派蓝牙 ················································93
5.7.1 了解蓝牙 ···································································································93
5.7.2 使用Socket功能进行蓝牙通信 ·········································································95
5.8 轮式机器人野外上网接口:4G模块 ························································96
5.8.1 USB-4G模块的配置 ·····················································································97
5.8.2 USB-4G转WiFi ···························································································97
5.9 轮式机器人的指南针:RTIMU模块开发 ··················································98
5.9.1 RTIMULib库介绍 ························································································98
5.9.2 RTIMULib库的编译和测试 ············································································99
5.9.3 基于RTIMULib的地磁计校准 ·······································································101
5.9.4 基于RTIMULib的加速计校准 ·······································································104
5.9.5 基于RTIMULib的陀螺仪校准 ·······································································104
5.10 轮式机器人的Web搭建 ······································································104
5.11 轮式机器人树莓派固件烧录 ·······························································113
5.12 本章总结 ·······················································································114
第6章 轮式机器人的其他神经元:传感器开发 ···········································115
6.1 DS18B20温度传感器开发 ····································································115
6.1.1 DS18B20温度传感器的接口定义 ···································································115
6.1.2 代码实现 ·································································································116
6.2 GPS户外定位传感器 ··········································································118
6.2.1 定位模块的接口定义 ··················································································118
6.2.2 NMEA-0183协议 ·······················································································118
6.2.3 协议解析流程及实现 ··················································································119
6.3 激光雷达传感器················································································121
6.3.1 激光雷达介绍 ···························································································122
6.3.2 激光雷达协议 ···························································································123
6.4 摄像头图像传感器·············································································127
6.4.1 摄像头的使用 ···························································································128
6.4.2 视觉循迹机器人实例 ··················································································128
6.5 本章总结·························································································129
第7章 轮式机器人的云:物联网云平台 ····················································130
7.1 微型服务云平台简介··········································································130
7.2 搭建局域网的Server ···········································································130
7.2.1 安装PhpStudy ···························································································131
7.2.2 搭建第一个物联网云 ··················································································132
7.3 阿里云服务器···················································································133
7.3.1 阿里云服务器选型 ·····················································································133
7.3.2 搭建LNMP服务器 ······················································································135
7.3.3 LAMP服务器的搭建 ···················································································138
7.4 JavaScript建立简单的MQTT通信 ··························································140
7.5 本章总结·························································································143
第8章 轮式机器人路径规划 ···································································144
8.1 机器人路径规划················································································144
8.2 机器人全局规划················································································145
8.2.1 机器人栅格建图概述 ··················································································145
8.2.2 借助OpenCV画轨迹 ···················································································146
8.2.3 栅格地图的建图过程 ··················································································151
8.2.4 机器人全局整合规划 ··················································································157
8.2.5 A*算法 ···································································································159
8.3 机器人局部决策················································································170
8.3.1 DWA算法 ································································································170
8.3.2 VFH避障算法 ···························································································173
8.4 本章总结·························································································177
第9章 轮式机器人路径的定位和导航 ·······················································178
9.1 轮式机器人路径跟随··········································································178
9.1.1 MovePose和PID整定 ··················································································178
9.1.2 PurePuresuit跟随算法··················································································182
9.1.3 路径跟随与测试 ························································································185
9.2 轮式机器人定位匹配··········································································189
9.2.1 粒子滤波 ·································································································189
9.2.2 粒子滤波定位(蒙特卡罗定位) ···································································190
9.3 GNSS定位导航 ·················································································190
9.4 本章总结·························································································192
第3部分 实战案例
第10章 机器人定位终端实例 ·································································194
10.1 机器人实体终端:模块构成 ······························································194
10.2 轮式机器人通信:STM32和树莓派之间的通信协议 ·································195
10.3 机器人与云平台通信:MQTT通信协议 ················································197
10.4 轮式机器人:配置网络 ·····································································198
10.5 轮式机器人软件说明 ········································································202
10.5.1 软件框架 ·······························································································202
10.5.2 控制App:navigation ·················································································203
10.5.3 硬件信息确认 ·························································································205
10.6 轮式机器人的人机交互 ·····································································205
10.7 轮式机器人云平台功能介绍 ······························································206
10.7.1 添加设备 ·······························································································206
10.7.2 设备信息 ·······························································································207
10.7.3 趣味玩法 ·······························································································207
10.7.4 路径规划 ·······························································································209
10.8 手动规划路径的原理及操作 ·······························································210
10.9 本章总结 ·······················································································211
第11章 BreezySLAM室内定位导航机器人实例 ··········································212
11.1 BreezySLAM的安装 ·········································································212
11.2 BreezySLAM测试 ············································································214
11.3 BreezySLAM源码分析 ······································································217
11.4 硬件搭建 ·······················································································221
11.5 软件实现 ·······················································································221
11.6 测试运行 ·······················································································227
11.7 本章总结 ·······················································································227
第12章 ROS机器人开发实例 ·································································228
12.1 ROS介绍 ························································································228
12.2 ROS工具包 ····················································································229
12.3 Ubuntu环境下安装ROS ·····································································230
12.4 发布GPS定位 node ···········································································233
12.5 发布imu node ··················································································234
12.6 STM32 通信node ·············································································235
12.7 Qt for ROS 界面 ··············································································238
12.8 本章总结 ·······················································································243
如果你想DIY 一款轮式自主移动机器人,又不知道如何实现,本书可能会帮到你。
《轮式自主移动机器人编程实战》系统讲解轮式自主移动机器人如何从0 到1 实现自主运动。以树莓派和STM32 单片机为例,
详细介绍轮式机器人的硬件结构,包括驱动控制器的搭建、中央处理器的选型开发、滤波算法、平面
地图构建算法、规划算法、导航算法、室外GPS 定位实战案例(异地远程控制和地图路径规划等)、
室内BreezySLAM 建图案例、ROS 开发案例等,以及自主移动机器人和无人车驾驶的基本实现原理,
都能在本书中找到答案。《轮式自主移动机器人编程实战》还提供开放的云平台路径规划,可在农田、工业园区巡检、物流送货等
场景测试。
《轮式自主移动机器人编程实战》可作为高等院校物联网、机器人、计算机、通信、电气及自动化等专业的教材,也可作为计
算机、电子及智能车设计竞赛的自学或培训教材,还可供各类电子工程、自动化技术人员和计算机爱
好者学习参考。