SLAM导航机器人零基础实战系列:(四)差分底盘设计——1.stm32主控硬件设计

  • Post author:
  • Post category:其他



SLAM导航机器人零基础实战系列:(四)差分底盘设计——1.stm32主控硬件设计

摘要

运动底盘是移动机器人的重要组成部分,不像激光雷达、IMU、麦克风、音响、摄像头这些通用部件可以直接买到,很难买到通用的底盘。一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的;另一方面是因为底盘包含软硬件整套解决方案,是很多机器人公司的核心技术,一般不会随便公开。出于强烈的求知欲与学习热情,我想自己DIY一整套

两轮差分底盘

,并且将完整的设计过程公开出去供大家学习。说干就干,本章节主要内容:


1.stm32主控硬件设计


2.stm32主控软件设计


3.底盘通信协议


4.底盘ROS驱动开发


5.底盘PID控制参数整定


6.底盘里程计标


温馨提示:

本篇文章已经收录在我最新出版的书籍《机器人SLAM导航核心技术与实战》,感兴趣的读者可以购买纸质书籍来进行更加深入和系统性的学习,购买链接如下:


点这里购买:《机器人SLAM导航核心技术与实战》购买链接


1.stm32主控硬件设计

完整的stm32主控硬件包括:带霍尔编码器的直流减速电机、电机驱动、stm32单片机开发板等配件。

1.1.带霍尔编码器的直流减速电机


(图1)带霍尔编码器的直流减速电机

要制作一台机器人底盘,需要一套完整的电机部件,就如图1中看到的一样,需要有轮胎、联轴器、减速箱、电机和编码器,具体选型可以参考这几个方面的因素:


轮胎:

直径越大,小车的越障能力越好,但会降低小车爬坡的马力;


联轴器:

选择跟轮胎与电机输出轴尺寸相匹配的型号;


减速箱:

减速比决定电机输出轴的扭矩,减速比越大,输出轴扭矩越大,但输出轴转速越慢;


电机:

一般是12V的电机,直流有刷简单易控制;


编码器:

一般为增量式正交编码器,编码线数根据实际需要精度进行选择。


(图2)电机接线端口

如图2,可以清楚的看到电机的接线端口,其实电路板上也是有丝印标注的。接线分为两类,一类是电机控制(电机线+、电机线-),另一类是编码器(编码器5V、编码器A相、编码器B相、编码器GND)。

1.2.电机驱动电路


(图3)TB6612FNG电机驱动

了解了电机的构造知识后,就来介绍一下如何将电机驱动起来。如图3所示,TB6612FNG是很流行的一款电机驱动芯片,相比于传统的L298N效率上提升很多,而且体积大幅减小。TB6612FNG是双驱动,也就是可以驱动两个电机;TB6612FNG每通道输出最高1.2 A的连续驱动电流,启动峰值电流达2A/3.2 A(连续脉冲/单脉冲);4种电机控制模式:正转/反转/制动/停止;PWM支持频率高达100 kHz。


(图4)TB6612FNG引脚定义

TB6612FNG的引脚定义,如图4所示,引脚分为电源脚、控制输入脚、控制输出脚。

VM:为电机驱动电压,根据实际电机额定电压选择,推荐使用12V供电;

VCC:逻辑电源供电,推荐使用5V供电;

STBY:待机/工作状态切换,低电平待机,高电平工作;

PWMA:A端口电机PWM调速信号输入;

AIN1和AIN2:A电机转向控制信号输入;

PWMB:B端口电机PWM调速信号输入;

BIN1和BIN2:B电机转向控制信号输入;

AO1和AO2:A端口电机驱动信号输出;

BO1和BO2:B端口电机驱动信号输出。


(图5)TB6612FNG控制信号真值表

最后,我们来看一下控制信号的逻辑真值表,如图5,输入由单片机IO口给定,再结合PWM信号,便可以实现对电机的正/反转和调速控制了。由于两路电机控制是一模一样的,所以另一路控制信号的逻辑真值表就不重复赘述了。

1.3.霍尔正交编码器原理


(图6)霍尔正交编码器原理

如果两个信号相位相差90度,则这两个信号称为正交。由于两个信号相位相差90度,因此可以根据两个信号哪个先哪个后来判断方向。利用单片机的IO口对编码器的A、B相进行捕获,很容易得到电机的转速和转向。霍尔正交编码器原理,如图6。

1.4.stm32单片机最小系统

stm32单片机常用的型号是stm32f103,根据具体需求的Flash容量、RAM容量、IO口数量进行选择,下面是常用的一些型号参数对比,如图7。


(图7)stm32f103系列单片机参数对比

考虑到stm32主控只是用于两个电机的控制,资源开销不算大,需要用到的IO口也不是很多,定时器资源也不多,出于性价比考虑推荐stm32f103c8t6这个型号。


(图8)stm32f103f103c8t6最小系统板

如图8所示,stm32f103c8t6最小系统板比较简洁,控制两个电动机,只需要用两个IO口输出2路PWM分别给两个电机调速,用4个IO口分别控制两个电机的方向,另外4个IO口分别接两个电机的正交编码器输入,UART1与UART2跟上位机连接分别用于程序debug与上层指令控制。

1.5.stm32主控硬件整体框图

第一个版本的硬件电路是用飞线连接的各个模块,电路稳定性很差,而且外观极其丑陋。痛定思痛,决心老老实实设计电路板,把各模块集成到一个板子上,经过两次改板打样,终于成功了。如图9,板子简洁美观,而且接插端子布局合理,符合我一向严苛的标准。


(图9)stm32主控电路板

好了,有了这个电路板就好办多了。针对这个电路板,讲讲我的设计思路吧。首先需要设计一个电源系统,用于单片机供电、电机供电、外部设备供电,同时还要考虑电源反接、过压、短路等保护;然后需要设计一个stm32单片机最小系统电路;最后围绕stm32最小系统,需要设计电机驱动、UART转USB、编码器信号捕获这些外围电路,同时还要考虑电机堵转保护、电机对系统电源干扰等问题。逐一采坑之后,差不多就完成设计了。stm32主控硬件整体框图,如图10。


(图10)stm32主控硬件整体框图

后记

如果大家对博文的相关类容感兴趣,或有什么技术疑问,欢迎加QQ技术交流群(

117698356

参考文献


[1] 张虎,机器人SLAM导航核心技术与实战[M]. 机械工业出版社,2022.

购书链接:

https://item.jd.com/13041503.html

下载更多资料:

www.xiihoo.com

QQ技术讨论群: 117698356

B站视频教程:

https://space.bilibili.com/66815220

Github源码:

https://github.com/xiihoo/Books_Robot_SLAM_Navigation

前言

编程基础篇

第1章 ROS入门必备知识

1.1 ROS简介 2

1.1.1 ROS的性能特色 2

1.1.2 ROS的发行版本 3

1.1.3 ROS的学习方法 3

1.2 ROS开发环境的搭建 3

1.2.1 ROS的安装 4

1.2.2 ROS文件的组织方式 4

1.2.3 ROS网络通信配置 5

1.2.4 集成开发工具 5

1.3 ROS系统架构 5

1.3.1 从计算图视角理解ROS架构 6

1.3.2 从文件系统视角理解ROS架构 7

1.3.3 从开源社区视角理解ROS架构 8

1.4 ROS调试工具 8

1.4.1 命令行工具 9

1.4.2 可视化工具 9

1.5 ROS节点通信 10

1.5.1 话题通信方式 12

1.5.2 服务通信方式 15

1.5.3 动作通信方式 19

1.6 ROS的其他重要概念 25

1.7 ROS 2.0展望 28

1.8 本章小结 28

第2章 C++编程范式

2.1 C++工程的组织结构 29

2.1.1 C++工程的一般组织结构 29

2.1.2 C++工程在机器人中的组织结构 29

2.2 C++代码的编译方法 30

2.2.1 使用g++编译代码 31

2.2.2 使用make编译代码 32

2.2.3 使用CMake编译代码 32

2.3 C++编程风格指南 33

2.4 本章小结 34

第3章 OpenCV图像处理

3.1 认识图像数据 35

3.1.1 获取图像数据 35

3.1.2 访问图像数据 36

3.2 图像滤波 37

3.2.1 线性滤波 37

3.2.2 非线性滤波 38

3.2.3 形态学滤波 39

3.3 图像变换 40

3.3.1 射影变换 40

3.3.2 霍夫变换 42

3.3.3 边缘检测 42

3.3.4 直方图均衡 43

3.4 图像特征点提取 44

3.4.1 SIFT特征点 44

3.4.2 SURF特征点 50

3.4.3 ORB特征点 52

3.5 本章小结 54

硬件基础篇

第4章 机器人传感器

4.1 惯性测量单元 56

4.1.1 工作原理 56

4.1.2 原始数据采集 60

4.1.3 参数标定 65

4.1.4 数据滤波 73

4.1.5 姿态融合 75

4.2 激光雷达 91

4.2.1 工作原理 92

4.2.2 性能参数 94

4.2.3 数据处理 96

4.3 相机 100

4.3.1 单目相机 101

4.3.2 双目相机 107

4.3.3 RGB-D相机 109

4.4 带编码器的减速电机 111

4.4.1 电机 111

4.4.2 电机驱动电路 112

4.4.3 电机控制主板 113

4.4.4 轮式里程计 117

4.5 本章小结 118

第5章 机器人主机

5.1 X86与ARM主机对比 119

5.2 ARM主机树莓派3B+ 120

5.2.1 安装Ubuntu MATE 18.04 120

5.2.2 安装ROS melodic 122

5.2.3 装机软件与系统设置 122

5.3 ARM主机RK3399 127

5.4 ARM主机Jetson-tx2 128

5.5 分布式架构主机 129

5.5.1 ROS网络通信 130

5.5.2 机器人程序的远程开发 130

5.6 本章小结 131

第6章 机器人底盘

6.1 底盘运动学模型 132

6.1.1 两轮差速模型 132

6.1.2 四轮差速模型 136

6.1.3 阿克曼模型 140

6.1.4 全向模型 144

6.1.5 其他模型 148

6.2 底盘性能指标 148

6.2.1 载重能力 148

6.2.2 动力性能 148

6.2.3 控制精度 150

6.2.4 里程计精度 150

6.3 典型机器人底盘搭建 151

6.3.1 底盘运动学模型选择 152

6.3.2 传感器选择 152

6.3.3 主机选择 153

6.4 本章小结 155

SLAM篇

第7章 SLAM中的数学基础

7.1 SLAM发展简史 158

7.1.1 数据关联、收敛和一致性 160

7.1.2 SLAM的基本理论 161

7.2 SLAM中的概率理论 163

7.2.1 状态估计问题 164

7.2.2 概率运动模型 166

7.2.3 概率观测模型 171

7.2.4 概率图模型 173

7.3 估计理论 182

7.3.1 估计量的性质 182

7.3.2 估计量的构建 183

7.3.3 各估计量对比 190

7.4 基于贝叶斯网络的状态估计 193

7.4.1 贝叶斯估计 194

7.4.2 参数化实现 196

7.4.3 非参数化实现 202

7.5 基于因子图的状态估计 206

7.5.1 非线性最小二乘估计 206

7.5.2 直接求解方法 206

7.5.3 优化方法 208

7.5.4 各优化方法对比 218

7.5.5 常用优化工具 219

7.6 典型SLAM算法 221

7.7 本章小结 221

第8章 激光SLAM系统

8.1 Gmapping算法 223

8.1.1 原理分析 223

8.1.2 源码解读 228

8.1.3 安装与运行 233

8.2 Cartographer算法 240

8.2.1 原理分析 240

8.2.2 源码解读 247

8.2.3 安装与运行 258

8.3 LOAM算法 266

8.3.1 原理分析 266

8.3.2 源码解读 267

8.3.3 安装与运行 270

8.4 本章小结 270

第9章 视觉SLAM系统

9.1 ORB-SLAM2算法 274

9.1.1 原理分析 274

9.1.2 源码解读 310

9.1.3 安装与运行 319

9.1.4 拓展 327

9.2 LSD-SLAM算法 329

9.2.1 原理分析 329

9.2.2 源码解读 334

9.2.3 安装与运行 337

9.3 SVO算法 338

9.3.1 原理分析 338

9.3.2 源码解读 341

9.4 本章小结 341

第10章 其他SLAM系统

10.1 RTABMAP算法 344

10.1.1 原理分析 344

10.1.2 源码解读 351

10.1.3 安装与运行 357

10.2 VINS算法 362

10.2.1 原理分析 364

10.2.2 源码解读 373

10.2.3 安装与运行 376

10.3 机器学习与SLAM 379

10.3.1 机器学习 379

10.3.2 CNN-SLAM算法 411

10.3.3 DeepVO算法 413

10.4 本章小结 414

自主导航篇

第11章 自主导航中的数学基础

11.1 自主导航 418

11.2 环境感知 420

11.2.1 实时定位 420

11.2.2 环境建模 421

11.2.3 语义理解 422

11.3 路径规划 422

11.3.1 常见的路径规划算法 423

11.3.2 带约束的路径规划算法 430

11.3.3 覆盖的路径规划算法 434

11.4 运动控制 435

11.4.1 基于PID的运动控制 437

11.4.2 基于MPC的运动控制 438

11.4.3 基于强化学习的运动控制 441

11.5 强化学习与自主导航 442

11.5.1 强化学习 443

11.5.2 基于强化学习的自主导航 465

11.6 本章小结 467

第12章 典型自主导航系统

12.1 ros-navigation导航系统 470

12.1.1 原理分析 470

12.1.2 源码解读 475

12.1.3 安装与运行 479

12.1.4 路径规划改进 492

12.1.5 环境探索 496

12.2 riskrrt导航系统 498

12.3 autoware导航系统 499

12.4 导航系统面临的一些挑战 500

12.5 本章小结 500

第13章 机器人SLAM导航综合实战

13.1 运行机器人上的传感器 502

13.1.1 运行底盘的ROS驱动 503

13.1.2 运行激光雷达的ROS驱动 503

13.1.3 运行IMU的ROS驱动 504

13.1.4 运行相机的ROS驱动 504

13.1.5 运行底盘的urdf模型 505

13.1.6 传感器一键启动 506

13.2 运行SLAM建图功能 506

13.2.1 运行激光SLAM建图功能 507

13.2.2 运行视觉SLAM建图功能 508

13.2.3 运行激光与视觉联合建图功能 508

13.3 运行自主导航 509

13.4 基于自主导航的应用 510

13.5 本章小结 511

附录A Linux与SLAM性能优化的探讨

附录B 习题