欢迎光临散文网 会员登陆 & 注册

【自己动手做一台SLAM导航机器人】第三章:感知与大脑

2023-03-19 03:01 作者:小虎哥哥爱学习  | 我要投稿

本专栏目录

  • 前言

  • 第一章:Linux基础

  • 第二章:ROS入门

  • 第三章:感知与大脑

  • 第四章:差分底盘设计

  • 第五章:树莓派3开发环境搭建

  • 第六章:SLAM建图与自主避障导航

  • 第七章:语音交互与自然语言处理

  • 附录A:用于ROS机器人交互的Android手机APP开发

  • 附录B:用于ROS机器人管理调度的后台服务器搭建

  • 附录C:如何选择ROS机器人平台进行SLAM导航入门

视频教程

https://www.bilibili.com/video/BV1jS4y1a7Lz

在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话。朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人。实现的关键是让机器人能通过传感器感知周围环境,并通过机器人大脑处理并输出反馈和执行动作。本章节涉及到的传感器有激光雷达、IMU、轮式里程计、麦克风、音响、摄像头,和用于处理信息的嵌入式主板。关于传感器的ROS驱动程序开发和在机器人上的使用在后面的章节会展开,本章重点对机器人传感器和嵌入式主板进行讲解,主要内容:

1.ydlidar-x4激光雷达

2.带自校准九轴数据融合IMU惯性传感器

3.轮式里程计与运动控制

4.音响麦克风与摄像头

5.机器人大脑嵌入式主板性能对比

6.做一个能走路和对话的机器人

下面这本书是本篇文章的参考文献,大家有需要可以入手一本:

1.ydlidar-x4激光雷达

在移动机器人中,获取机器人周围障碍物和环境的轮廓形状是非常重要的。使用激光雷达正是为了实现这个目的。利用扫描得到的障碍物信息,机器人就可以利用SLAM建立地图、并进行避障和自主导航。考虑到成本,推荐大家选用低成本的2D激光雷达,这里推荐的ydlidar-x4激光雷达正是一款极低成本的2D激光雷达,作为学习性能足够用了。

1.1.硬件概述

(图1)ydlidar-x4激光雷达实物

雷达主体由激光测距模组和电机构成,雷达主体需要连接转接板,用于实现外部供电和UART转USB,如图1。

(图2)ydlidar-x4激光雷达性能参数

测距频率是指每秒钟测距的次数(即激光测距模组的采样率),测距频率默认为5KHz;扫描频率是指电机每秒钟转过的圈数,扫描频率默认为8Hz;测距范围是指落在此距离范围的障碍物才能被测量,测距范围为0.12~10m;扫描角度为0~360度,也就是能够360度全方位扫描;测距分辨率就是测距精度;角度分辨率就是两个相邻扫描点之间的夹角。ydlidar-x4激光雷达性能参数,如图2。

关于激光雷达的性能参数对SLAM建图与避障导航的影响,这里做一个简短的分析。

扫描频率:

扫描频率越高,电机转动一圈的时间约短,扫描获取1帧雷达数据的时间越短,这样可以使SLAM建图和避障导航实时性更好。简单点说就是机器人运动速度很快时,扫描到的点云数据连续性也比较好,这有利于SLAM算法建立稳定的地图,有利于避障导航算法及时发现并避开障碍物。

测距范围:

小于测距范围最小值的区域就是雷达的测量盲区,处于盲区中的障碍物无法被探测,所以,盲区当然是越小越好以保证机器人不发生碰撞;大于测距范围最大值的区域就是雷达超量程的区域,在超量程的区域的障碍物无法被探测或者可以探测但误差很大,所以,在比较开阔的环境下应该采用远距离量程的雷达。

扫描角度:

大部分雷达都是0~360度全方位扫描的,所以就没什么太大的区别了,其实就是机器人不用转动身体的情况下就能一次性扫描出四周的障碍物信息。

测距分辨率:

测距分辨率也就是测距精度,测距精度越高当然有利于SLAM建图和避障导航,但是测距精度越越高的雷达成本当然也越高,现在国产低成本的雷达普遍为厘米级(cm)的精度,差一点的雷达5cm左右的精度,稍微好一点的雷达2cm左右的精度,如果要达到毫米级(mm)的精度成本就非常高了。

角度分辨率:

角度分辨率决定了两个相邻点云之间的夹角,由于雷达是通过旋转进行扫描的,随着距离增加点云会越来越稀疏。如果角度分辨率比较低,在扫描远距离物理时只能得到非常稀疏的几个点云,这样的点云基本上没有什么用处了。

角度分辨率 = 360 /(测距频率 / 扫描频率)  

从上面的角度分辨率计算公式来看,一般测距频率为常数值(由激光模组特性决定),那么通过降低扫描频率可以提升角度分辨率,但同时扫描频率降低会影响雷达的实时性,所以这是一个权衡的过程,根据实际情况做选择。

1.2.工作原理

激光雷达之所以流行,得益于它能够精确的测距。主流的激光雷达基于两种原理:一种是三角测距法,另一种是飞行时间(TOF)测距法。其实很好理解,就是利用了最基本的数学与物理知识。

(图3)三角测距原理

三角测距原理如图3,激光器发射一束激光,被物体A反射后,照射到图像传感器的A’,这样就形成了一个三角形,通过解算可以求出物体A到激光器的距离。激光束被不同距离的物体反射后,形成不同的三角形。我们不难发现随物体距离不断变远,反射激光在图像传感器上的位置变化会越来越小,也就是越来越难以分辨。这正是三角测距的一大缺点,物体距离越远,测距误差越大。

(图4)TOF测距原理

飞行时间(TOF)测距原理如图4,激光器发出激光时,计时器开始计时,接收器接收到反射回来的激光时,计时器停止计时,得到激光传播的时间后,通过光速一定这个条件,很容易计算出激光器到障碍物的距离。由于光速传播太快了,要获取精确的传播时间太难了。所以这种激光雷达自然而然成本也会高很多,但是测距精度很高。

1.3.在机器人中使用ydlidar-x4激光雷达

(图5)在机器人中使用ydlidar-x4激光雷达

ydlidar-x4激光雷达通过串口与机器人相连接,机器人中通过运行雷达ROS驱动,来实现读取串口的雷达数据和将雷达数据发布到/scan这个主题,这样机器人上的其它节点就可以通过订阅/scan主题来获取激光雷达数据了。关于雷达ROS驱动在机器人上的具体使用,将在后面的章节中具体讲解。

2.带自校准九轴数据融合IMU惯性传感

IMU是惯性测量单元的简称,用于测量物体的三轴姿态角(roll、pitch、yaw)、三轴加速度(acc_x、acc_y、acc_z)、三轴角速度(w_x、w_y、w_z)等。IMU惯性测量单元在制造过程中,由于物理因素,导致IMU惯性测量单元实际的坐标轴与理想的坐标轴之间会有一定的偏差,同时三轴加速度、三轴角速度、三轴磁力计的原始值会与真实值有一个固定的偏差等。这里提到的自校准就是要通过给的补偿值来减小或消除坐标轴的偏差及原始值的固定偏差,也就是所谓的IMU内部标定。如果将IMU安装到机器人或摄像头上后,需要知道IMU与机器人或摄像头的相对位置,这个时候进行的标定就是所谓的IMU外部标定。特此说明,这里提到的自校准指IMU内部标定。这里提到的九轴数据融合,是指通过三轴加速度、三轴角速度数据融合得到更加精准的三轴加速度、三轴角速度,同时通过三轴加速度、三轴角速度、三轴磁力计数据融合得到测量物体的三轴姿态角。选用一款带自校准九轴数据融合的IMU,能很好的提升机器人的SLAM建图与导航性能,同时降低机器人上软件的开发难度。出于这一点,我们选用了一款基于MPU9250的.带自校准九轴数据融合IMU,如图6。

(图6)带自校准九轴数据融合IMU惯性传感器

2.1.自校准

IMU误差模型:

误差主要来自三部分:噪声(bias and noise)、尺度误差(scale error)、轴偏差(axis misalignment)。通过对这些误差的补偿来实现IMU测量数据的校准,校准的数学表达如图7。

(图7)校准的数学表达

噪声部分考虑零偏Bias和高斯白噪声noise。零偏Bias也叫随机游走,一般是由传感器内部构造、温度变换多方面综合影响的结果;高斯白噪声noise,一般是由于AD转换引起的一种外部噪声。

尺度误差部分,来自于AD转换中量化过程,比如采样电压值1V对应acc(x)轴的1.4g,同样采样电压值1V对应acc(y)轴的1.6g,也就是说不通的轴上AD转换量化是不同的。

轴偏差部分,三轴加速度、三轴角速度、三轴磁力计的坐标轴严格上都不是正交坐标系。但是最后我们期望的使用值默认是在正交坐标系下测量的,所以就需要将在非正交坐标系测量的原始值变换到正交坐标系中。

加速度校准:

校准过程中需要判断传感器是否处于静止状态,其实很简单,在时间t内(t一般取50s),分别计算acc(x)、acc(y)、acc(z)三轴数据的方差var[acc(x)]、var[acc(y)]、var[acc(z)],如果var[acc(x)]+var[acc(y)]+var[acc(z)]小于阈值H(H为经验值,需要通过实验法确定),就判断传感器静止。

在静止状态下,加速度计测量值的二范数等于当地重力加速度g。在这一约束条件下,利用最小二乘法进行优化问题求解,由于加速度采样值取得是一个小窗口采样区间的平均值,所以可以忽略白噪声Na的影响,便可以求解出待标定参数Ta、Sa、Ba。在静止状态取一串加速度采样值共M个,构建代价函数如图8,对代价函数进行最优化求解即可,可以选用ceres或g2o等优化工具来完成具体的优化计算过程。

(图8)代价函数

角速度校准:

角速度校准分为两部分:用Allan方差校准零偏Bias、用最优化方法求解尺度误差Sw和轴偏差Tw。加速度校准中需要用到加速度校准信息,所以加速度校准好坏影响整个IMU校准。

同加速度校准一样,也需要在静止状态下采集角速度,简便的做法是在采集加速度的同时也采集角速度。利用角速度采样值计算Allan方差,Allan方差计算比较繁琐就不展开,请直接参考wiki百科:https://en.wikipedia.org/wiki/Allan_variance。

Allan方差中共有5个噪声参数:量化噪声Q、角度随机游走N、零偏B、角速度随机游走K、角速度斜坡R。通过图9的步骤便可以求出角速度的零偏Bw,由于角速度采样时是一个小窗口采样区间的平均值,所以可以忽略白噪声Nw的影响。

(图9)用Allan方差校准零偏Bias

角速度的零偏Bw校准完后,将零偏值Bw带入,接着校准尺度误差Sw和轴偏差Tw。挑选加速度校准过程中两静止状态夹杂的动态片段,这样经过校准后的静态值的平均值可作为acc_calib向量的起始值acc_calib(k-1)和旋转完成后的结束值acc_calib(k)。

通过图10的步骤便可以求出角速度的尺度误差Sw和轴偏差Tw。

(图10)求角速度的尺度误差Sw和轴偏差Tw

磁力计校准:

与加速度校准比较类似,磁力计测量值的二范数等于当地磁场强度m,不同的是磁力的测量不需要在静止状态。在这一约束条件下,利用最小二乘法进行优化问题求解,由于磁力采样值取得是一个小窗口采样区间的平均值,所以可以忽略白噪声Nm的影响,便可以求解出待标定参数Tm、Sm、Bm。构建代价函数如图11,对代价函数进行最优化求解即可。

(图11)代价函数

由于需要用加速度/磁力计进行融合,需要将磁力计测量值变换到加速度坐标系。变换矩阵Tm2a求解比较简单,通过多组关联的加速度acc_calib和磁力计mag_calib,通过最小二次法优化求解,可以求出变换矩阵Tm2a。这里基于一个假设,磁力向量与加速度向量成固定夹角,也就是两向量的点乘为一个常数C,利用这个约束可以构建代价函数如图12,对代价函数进行最优化求解即可。

(图12)代价函数

IMU校准软件流程图:

(图13)代价函数

IMU手动校准与自校准对比:

通常的校准过程是,将IMU接入PC端,手动将IMU置不同的状态,PC端通过采集这些数据,完成校准。另一种校准过程是,将校准算法内置在IMU模块上的MCU中,在IMU工作的过程中实时采集数据,并自动完成校准,不需要人为的干预。本文介绍的MPU9250模块就属于自校准这一方式。手动校准与自校准对比如图14。

(图14)手动校准与自校准对比

2.2.九轴数据融合

IMU的校准完成后,就可以利用校准后的九轴数据进行数据融合,得到IMU的空间姿态了。

MPU9250模块包括三轴加速度计、三轴陀螺仪和三轴磁力计。因为加速度/磁力计具有高频噪声,也就是说它们的瞬时值不够精确,解算出来的姿态会震荡,但长期来看姿态方向是对的。而陀螺仪具有低频噪声,即每个时刻的得到的角速度是比较精确的,使用积分就能得到旋转角度(姿态),但是积分会累积误差,因此积分到后面姿态就不对了,也就是漂移现象。 加速度/磁力计和陀螺仪在频域上的特性互补,可以融合这三种传感器的数据,提高精度和系统的动态特性。

由于欧拉角在求解姿态时存在万向节锁,不能用于全姿态解算;故采用四元数Quaternion进行姿态解算。常用的九轴数据融合算法包括:高低通互补滤波、扩展卡尔曼滤波EKF、Mahony滤波。在实际情况中根据不同的用途进行选择,这里对这三种滤波方法进行原理性的介绍。

高低通互补滤波:

(图15)高低通互补滤波的过程

高低通互补滤波的过程如图15,通过加权系数融合陀螺仪估计姿态和加速度/磁力计融合姿态,达到对陀螺仪低通滤波、对加速度/磁力计高通滤波的效果。

扩展卡尔曼滤波EKF:

和高低通互补滤波过程类似,也是分为估计、校正。

(图16)EKF滤波的过程

EKF滤波的过程如图16,想要了解EKF滤波的详细推导请直接参考wiki百科:

https://en.wikipedia.org/wiki/Extended_Kalman_filter。估计过程中,利用陀螺仪积分推算出估计姿态;在校正过程中,计算估计姿态下的加速度/磁力计,再用在实际姿态下测量的加速度/磁力计按照EKF校正方程进行校正。

Mahony滤波:

同样,Mahony滤波也分为估计、校正。主要使用了PI控制思想。

(图17)Mahony滤波的过程

Mahony滤波的过程如图17。在估计过程中,同样利用陀螺仪积分推算出估计姿态;在校正过程中,计算估计姿态下的加速度/磁力计,测量在实际姿态下的加速度/磁力计,这两个向量叉乘便可以得到姿态误差e,姿态误差e通过PI控制过程可以实现对陀螺仪测量角速度的补偿,利用补偿后的角速度重新估计出来的姿态,就是滤波后的姿态了。

(图18)MPU9250模块九轴数据融合后的效果

MPU9250模块九轴数据融合后的效果如图18,图中左侧显示的分别是加速度、角速度、磁力计的实时数据,图中右侧显示的是融合后的姿态实时数据,可以看出融合后的姿态还是非常平稳的。

2.3.在机器人中使用IMU

(图19)在机器人中使用MPU9250-IMU模块

MPU9250-IMU模块通过串口与机器人相连接,机器人中通过运行IMU的ROS驱动,来实现读取串口的IMU数据和将IMU数据发布到/imu这个主题,这样机器人上的其它节点就可以通过订阅/imu主题来获取IMU数据了。关于IMU的ROS驱动在机器人上的具体使用,将在后面的章节中具体讲解。

3.轮式里程计与运动控制

底盘提供轮式里程计与运动控制,是机器人SLAM建图与避障导航的基础。所以对底盘进行了解,和熟悉轮式里程计与运动控制的底层原理是很有益处的。这里以我们的miiboo机器人的底盘为例,对底盘上的轮式里程计和运动控制的原理进行分析。

3.1.硬件概述

(图20)miiboo机器人底盘

底盘主要由电机控制板和带编码器的减速电机构成,如图20。电机控制板通过串口与机器人的大脑(如树莓派3)相连接,通过接收大脑下发的控制指令,利用PID算法对电机进行控制;同时,采集电机上的编码器数据发送给大脑,利用航迹推演算法得到底盘的里程计信息。

3.2.轮式里程计与运动控制

(图21)轮式里程计与运动控制

如图21,为轮式里程计与运动控制的系统框图。首先是机器人大脑发送控制命令,其实就是期望左、右电机达到的目标转速,我们都知道在一个控制系统中,被控对象很难完全按照期望目标来运行,这就需要引入反馈对被控对象进行实时的闭环控制,让被控对象尽量逼近期望目标,电机控制板主要就是用来实现这个过程。同时,电机控制板还负责对电机编码信号进行采样,将单位采样时间(一般为10ms)内的编码脉冲累计值作为里程数据发送给机器人大脑,机器人大脑利用航迹推演算法求解出里程计信息。

通信协议:

电机控制板与机器人大脑之间采用串口通信。电机左、右轮期望转速被封装到串口的字符串中,作为控制命令发送给电机控制板;单位时间(一般10ms)内采样到的电机编码脉冲累计值(等效为实际电机速度)作为里程数据,以同样的方式被封装到串口的字符串中发送给机器人大脑。可以看出,控制命令与里程数据遵循一样的封装协议,协议具体形式如图22。

(图22)通信协议

电机控制:

(图23)PID算法流程

电机控制最常用的就是PID控制算法,如图23为PID算法流程。以电机转速控制为例,r(t)就是给定的目标转速,c(t)就是电机实际运行时的转速,通过闭环反馈可以求得r(t)与c(t)的偏差值e(t),PID控制算法中的比例(P)、积分(I)、微分(D)调节器利用e(t)生成新的控制量u(t),u(t)通过执行机构(电机驱动器)作用于被控对象(电机),电机的实际运行速度c(t)通过闭环反馈,进入下一次PID调节。就这样,不断的通过闭环反馈调节,使电机实际运行速度c(t)最终逼近给定的目标速度r(t)。

在连续和离散时间域上PID会有不同的表现形式,在连续时间域上积分、微分调节通过积分计算、微分计算实现,而在离散时间域上积分、微分调节通过累加和、差分计算实现。由于电机控制需要在程序上进行实现,所以需要采用离散域的PID。按照PID算法生成的调节量的形式,又可以分为位置式PID和增量式PID;位置式PID生成的u(t)为直接的控制量,增量式PID生成的Δu(t)是控制量的修正量,需要叠加上一次的u(t-1)才能作为控制量。离散形式的位置式与增量式PID数学表达如图24。

(图24)离散形式的位置式与增量式PID数学表达

可以看出,利用位置PID的数学表达式经过简单的变形就能得到增量PID的数学表达式。增量算法不需要做累加,控制量增量的确定仅与最近几次误差采样值有关,计算误差或计算精度问题,对控制量的计算影响较小。而位置算法要用到过去的误差的累加值,容易产生大的累加误差。增量式算法得出的是控制量的增量,例如阀门控制中、只输出阀门开度的变化部分,误动作影响小,必要时通过逻辑判断限制或禁止本次输出,不会严重影响系统的工作。而位置算法的输出是控制量的全量输出,误动作影响大。增量型PID的程序实现,如如图25。关于PID参数的整定,将放在后面的文章进行详细讲解。

(图25)增量型PID的程序实现

差动两轮底盘轮式里程计:

轮式里程计是机器人底盘的重要组成部分,采用航迹推演算法对机器人的位姿进行估计,并对机器人当前的速度、旋转速度、左右轮速度进行转换。无论是机器人的定位导航还是普通的运动控制,都需要轮式里程计。

(图26)通过航迹推演计算里程计

如图26,为通过航迹推演计算里程计的过程。随时间推移机器人底盘的实时位姿p1、p2、p3、...、pn连接起来就形成了机器人的航迹,考虑很短的时间内两相邻机器人位姿p1和p2,在已知机器人位姿p1和机器人当前左右轮速度vl、vr的条件下,利用微积分的思想可以推算出机器人在下一个时刻的位姿p2,通过这样不断的推演,就可以计算出机器人当前的位姿以及速度、角速度等信息,这就是所谓的航迹推演。关于航迹推演的具体数学推导和程序实现,将在后面的文章中进行展开讲解。

底盘电机控制板软件框架:

(图27)stm32电机控制板软件架构

如图27,为stm32电机控制板软件架构。底盘中的电机控制与里程数据采集的程序在stm32单片机上实现,TIM1定时器产生周期性的循环,循环中进行电机编码器数据采集、PID计算、电机速度pwm控制,剩下的就是usart1串口与usart2串口跟机器人大脑之间的通信了,底盘debug接口是用于stm32程序开发阶段使用的,所以在机器人正常运行的过程中只需要使用底盘控制接口。关于stm32部分的代码和对应机器人大脑中ROS驱动代码将在后面介绍。

3.3.在机器人中使用底盘

通过前面的讲解,我们已经对机器人底盘的用途及工作原理有了一定的了解,并且知道了电机控制和里程计的工作过程。这时候肯定很想知道如何在机器人中把底盘使用起来呢?其实很简单,和激光雷达、IMU这些传感器一样,底盘也可以当做一个传感器来使用,只不过不同之处是这个传感器与机器人大脑是双向交互的,机器人大脑向底盘发送控制命令,底盘反馈里程数据给机器人大脑。但是,不论交互的细节如何,只需要装上底盘的ROS驱动包,上层算法只需要发布和订阅相应的主题就能达到使用底盘的目的。

(图28)在机器人中使用底盘

底盘通过串口与机器人相连接,机器人中通过运行底盘控制ROS驱动,来实现读取串口的速度反馈,利用航迹推演算法计算得到里程计并发布到/odom这个主题;底盘控制ROS驱动订阅/cmd_vel主题的运动控制数据,并转换为速度控制指令通过串口发送给底盘。这样机器人上的其它节点就可以通过发布/cmd_vel主题来对底盘进行控制,通过订阅/odom主题获取底盘的里程计。关于底盘控制ROS驱动、底盘里程计标定、底盘的debug,将在后面的章节中具体讲解。

4.音响麦克风与摄像头

要让机器人能跟人进行对话,需要麦克风和音响。其实麦克风就相当于机器人的耳朵,音响就相当于机器人的嘴巴。摄像头作为机器人的眼睛,摄像头可以用来帮助机器人定位或认识环境。

4.1.音响

(图29)音响

如图29,为音响的基本配件。这里需要说明一下,由于后面使用树莓派3作为机器人的大脑,不过树莓派3的自带声卡不好用,驱动容易崩溃,所以这里推荐使用免驱的USB声卡。其实,声卡就是DA转换器,就是将数字音频信号转换为模拟电压信号;音响就是将声卡输出的模拟电压进行放大并通过喇叭播放出来。

4.2.麦克风与摄像头

(图30)麦克风与摄像头

如图30,摄像头上直接集成了麦克风。这里选用的是四麦阵列指向性麦克风,可以对特定方向上的声音拾取,并过滤其他方向上的杂音。这里的摄像头是640x480像素60fps。

4.3.在机器人中使用音响麦克风与摄像头

(图31)麦克风与摄像头

我们只需要在机器人上安装对应的ROS驱动,就可以通过发布和订阅相应的主题来实现对传感器的访问了。如图31,iat语音识别节点用于驱动麦克风,并将麦克风采集的语音转换为文字;问答(QA)和自然语言处理(NLP)节点处理iat语音识别节点发布的文字,并将处理结果发布给tts语音合成节点;tts语音合成节点订阅问答(QA)和自然语言处理(NLP)节点发布的文字,并驱动声卡将文字转换为语音;摄像头ROS驱动将摄像头数据直接发布到相应的话题。这样机器人上的其他节点都可以通过订阅与发布相应的节点来访问麦克风、声卡和摄像头。关于图像、语音、文字等处理的具体应用将在后面详细展开。

5.机器人大脑嵌入式主板性能对比

从事SLAM与机器人导航也有几年时间了,期间用过不少的嵌入式主板做开发。机器人是软硬件结合的一个实体,这里就对机器人的大脑(嵌入式主板)进行一些讨论。结合我用过的一些嵌入式开发板,展开对比分析,具体型号如图32。

(图32)我用过的嵌入式板型号

5.1.树莓派3

树莓派一直很火,现在已经推出第三代了。这里放一张树莓派0、树莓派2、树莓派3的全家福吧,如图33。

(图33)树莓派全家福

接下来看看具体的性能参数,如图34。如果想了解更多关于树莓派的资料,可以阅读树莓派的wiki教程https://en.wikipedia.org/wiki/Raspberry_Pi。

(图34)树莓派性能参数

树莓派3,售价200RMB左右,CPU是1.2Ghz ARM-Cortex-A53,内存1GB,板载wifi模块,还有一个多媒体显示GPU(不过感觉没什么用)。CPU和内存配置算的的上是同等价位嵌入式主板的战斗机了,板载wifi这个也很实用。虽然树莓派支持安装很多种linux系统,由于我这里要跑ROS机器人系统,所以我选择了安装ubuntu-mate-16.04, ubuntu-mate-16.04 LTS实际上是ubuntu-16.04 LTS的一部分,为桌面、Raspberry Pi 2和3单片机准备的,这也是Ubuntu MATE的首个LTS长期支持版,亮点在于包含MATE 1.12.1桌面环境,针对平板支持多点触控和“自然滚动”,对多屏幕设置提供更好的支持,更好的会话管理,扩展的systemd支持,改进过的Power小程序——可显示产品型号和提供商信息等内容。

(图35)ubuntu-mate-16.04系统界面

安装好ubuntu-mate-16.04操作系统后,上电可以看到图35所示的系统界面,就可以安装kinetic版本的ROS了,然后就可以验证SLAM算法了。Gmapping激光SLAM建图和ros-navigation自动导航跑的都很顺畅;google-cartographer进行建图和重定位也没什么问题;跑ORB-SLAM2的Mono模式就不太行了,帧率5帧以内。

5.2.Firefly-RK3399

萤火虫开发板还是很强大的板子分RK3288和RK3399两个版本,先看一下官方的宣传广告。

(图36)Firefly-RK3399

如图36所示,RK3399双核CortexA72+四核CortexA53的CPU和2GB/4GB可选配的内存,一看这些配置就知道很强大,的确跑各种视觉算法很不错,不过1000RMB的售价感觉有点小贵。

5.3.Nvidia-jetson-TK1

(图37)Nvidia-jetson-TK1

Tegra K1是Nvidia推出的一款AI级别的嵌入式主板,ARM-Cortex-A15的CPU,192个CUDA核心的kepler架构的GPU,2GB内存,如图37。有人用Tegra K1做了一个计算集群,感觉还挺有意思的,如图38。

(图38)Nvidia-jetson-TK1计算集群

5.4.Nvidia-jetson-TX2

Jetson TX2的是可以作为核武器的处理器的(@~@),性能是十分强大的。简单的智能小车或者机器人不推荐使用TX2,性价比比较低。利用TX2做处理器,控制移动平台(高精度的小车底盘)做SLAM我觉得是一个相当有意思的项目,TX2的处理能力非常适合实现机器视觉。

(图39)Nvidia-jetson-TX2

图39中左边是官方的开发板和扩展板,不过由于官方扩展板体积太大了用在很多地方不方便,于是网上推出了一款小巧的扩展板Connect Tech Inc很不错。

(图40)Nvidia-jetson-TX1/2性能参数

这个是性能表,看上去也是叼叼的,不过售价不便宜接近5000RMB。。。

5.5.Intel-NUC

前面介绍的都是ARM架构的主板,现在介绍一款X86架构的主板NUC。

(图41)Intel-NUC

之前用过Intel-NUC7-i7,19V供电65W功耗感觉不适合嵌入式级别的应用场合,而且3000RMB的售价也没法和Nvidia-jetson-TX2比较性价比,所以不推荐在机器人上使用。

5.6.Intel-Edison

其实这是intel一个失败的尝试,主打物联网应用,CPU采用intel的Atom处理器,最大的亮点是可以在主板上直接扩展Ardunio单片机开发板。如图42。

(图42)Intel-Edison

其实个人不推荐用Edison来开发SLAM算法,不过也有公司做这方面的尝试,比如上海思岚科技的SLAMWARE-CORE就是Edison的模仿者。

(图43)SLAMWARE-CORE

5.7.Google-Tango-phone

其实Tango-phone是一个完整的AR方案,手机内集成了深度相机和VO视觉里程计。

(图44)Tango-phone

看网上的演示视频也是十分的炫酷,不过最终这个项目还是没有在google中火起来,可能还是存在不少问题的吧。

5.8.总结

(图45)性能对比

最后,总结一些各个开发板的性能对比,见图45。玩机器人和SLAM的朋友们,如果是中低端需求推荐树莓派3,高端需求推荐jetson-TX2。

6.做一个能走路和对话的机器人

在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话。朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人。为了更形象的表达我的想法,我的小学五年级的绘画水平也是豁出去了,如果有大神路过,恳请多多包涵,画好后的样子大概就是这样啦,如图46。

(图46)想象中的机器人

有了想法,接下来就要开始亲自动手DIY了。体验动手乐趣的同时,以玩耍的形式融入当下前沿的SLAM、自动导航、图像识别、语音识别、自然语言处理等技术,提高自己的同时找到属于儿时的那一份快了。

说干就干,首先需要准备好激光雷达、IMU、底盘、音响、麦克风、摄像头这些传感器,然后还要准备一块树莓派3开发板作为机器人的大脑。其实这些知识已经通过前面的文章打好了基础,所以就好办多了,准备好这些东西就好了,如图47。

(图47)DIY部件准备

准备好传感器和树莓派3后,就可以进行组装了。经过紧张有趣的组装后,一台有趣的机器人就被DIY出来了,这时候终于可以看到传说中的机器人的真容了,如图48,虽然机器人的真实样子没有想象中的那么有艺术感,但科技感十足有木有@^@

(图48)DIY出来的机器人真容

麻雀虽小五脏俱全,现在就来对这个会说话会走路的机器人做一做剖析吧。机器人的骨架是由亚克力板和铜柱组合而成;两个带编码器的减速电机和一个万向轮作为运动执行机构;可充电锂电池给整个机器人供电;stm32电机控制板用于控制电机运动并提供里程数据,是底盘的核心部件;激光雷达提供环境障碍信息,用于SLAM建图和避障导航;IMU用于在里程计数据融合、SLAM建图、导航中提供惯导数据;免驱USB声卡、音响、四麦阵列指向性麦克风作为语音交互过程中的输入输出部件;摄像头用于物体识别、物体跟踪、环境监控、视觉辅助定位;树莓派3是整个机器人的中央处理单元,各个传感器的ROS驱动、SLAM算法、导航算法、语音交互、自然语言处理算法、图像处理算法都将运行在上面。为了更好的理解机器人的工作原理,这里给出机器人的硬件框架,如图49。

(图49)机器人硬件框架

机器人的硬件搭建完毕后,就要赋予机器人灵魂了。这里说的灵魂就是我们的软件及算法,包括各个传感器的ROS驱动、轮式里程计与IMU融合、激光SLAM建图、自主导航避障、语音识别、语音合成、自然语言处理、物体识别、物体跟踪、远程视频监控、视觉辅助定位、机器人与工作PC、Android手机之间的通信等。为了更好的理解机器人的工作原理,这里给出机器人的软件框架,如图50。

(图50)机器人软件框架

做了如此长的铺垫,大家肯定已经等不及要亲自动手去开发机器人上的软件代码了。别急,接下来的章节将跟你娓娓道来,让你体验动手写程序真正的快乐$^$

后记

为了防止后续大家找不到本篇文章,我同步制作了一份文章的pdf和本专栏涉及的例程代码放在github和gitee方便大家下载,如果下面给出的github下载链接打不开,可以尝试gitee下载链接:

  • github下载链接:https://github.com/xiihoo/DIY_A_SLAM_Navigation_Robot

  • gitee下载链接:https://gitee.com/xiihoo-robot/DIY_A_SLAM_Navigation_Robot

技术交流

QQ技术交流群:117698356

参考文献

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


【自己动手做一台SLAM导航机器人】第三章:感知与大脑的评论 (共 条)

分享到微博请遵守国家法律