新闻动态

从零开始的无人船制作-系统整体框架指南

前言

首先无人船要“无人”,就得能自己跑;自己跑,就得知道它自己的GPS坐标和它自己的姿态。正如飞机一样,可能飞机在地球的某一经\纬度的数值是一样的,但是一架飞机是往天上飞(Upwards),另一架飞机是往地上俯冲(Downwards) ,这是需要测定的 ;这么一来,对一架飞机来说实际上有6个自由度:三维空间的坐标为3个自由度,绕三维空间的三个轴旋转的角度为3个自由度,结合了这6个自由度,我们才能准确的直到一架飞机当前的具体状态,管这个具体状态,我们的行话叫“姿态(Attitude)”。

 

要想控制载具的当前姿态,首先需要良好的测量出姿态数据,然后才能进行控制。

我们利用各种传感器测出当前姿态的这个过程,行话叫“姿态解算”。

对咱的船(车同理)来说,船一般不会像飞机一样go upwards\downwards,不然不是翻船就是宇宙飞“船”。目前我的程序中虽然对这两种角度进行了解算,但实际上并没有用到。因为毕竟是船嘛,在水里一般来说是平稳行驶的,如果roll和pitch两个自由度数值范围变化很大,那么距离翻船也不远了。。如果真出现了,那没办法,跑个无人船还遇着海啸了,翻就翻吧。但是可以利用这两种角度开发出抗风浪的自稳定系统。这个暂时按住不表,继续向下介绍。

所以就只考虑了船头向左偏还是向右偏,这个偏离的角度,行话叫“偏航角(Yaw)”。

好了,如果咱的船知道了目前的四个自由度就可以导航了。本文主要从下面几个维度分别说明:

  1. 传感器
  2. 滤波算法
  3. 系统结构
  4. 路径规划

关于传感器

一般开发一个无人载具(不限于船),想要良好地控制它,至少需要下面的这些传感器:

  • GNSS定位系统(典型:Ublox M8N)
  • 陀螺仪(典型:MPU6050)
  • 加速度计
  • (可选)磁力计(典型:HMC5883)

当然了,如果需要让无人船更加智能,可以考虑加入毫米波雷达、视觉系统等,用于自动避障。这些是未来拓展的内容,我们先从基本的开始。

  1. 从GNSS模块说起:

一般常说的GPS只是老美的那一套定位系统,其实还有咱的北斗、欧洲的伽利略,俄罗斯的格洛纳斯定位系统,这一大堆统称起来叫GNSS,Global Navigation Satellite System,这是全称。好了,GNSS接收机是装在船上的,它能输出当前接收机模块所在地点的经纬度。但是不同的定位系统基于的坐标系不同,GPS基于WGS84坐标系,北斗基于一套咱国家的坐标系。不能乱用经纬度数值,不然偏差能差到夏威夷。

GNSS模块用的比较多的是Ublox牌的 M8N,之前比赛的时候有人说这个的GNSS模块不咋地,但其实M8N很好用了,很多汽车都用装它,很多车的定位系统还不一定赶上M8N (售价200)

唯一的问题是这玩意假货横行,我上面的介绍全部基于咱买了个正品货的情况下。

好了,获取了一定坐标系下的经纬度,还差最后一个自由度:Yaw(偏航角),也就是船头的指向。为了获取Yaw,有两种方法:

1.利用GNSS。让小船下水之后往前走两步,咱就能利用两点连成一条直线的原理就知道船头朝哪了。

2.利用磁力计。有的GNSS模块上边写的一行小字:with compass. 这个compass就是指的磁力计,其实也就是电子指南针啦!利用霍尔原理采集三轴上的磁数据。问题是:它可不知道啥是地磁啥是人造磁,你把无人船放到两块大吸铁石旁边,分分钟这船就得撞。这是问题之一。第二点就是咱的电路板上的高频数字通信,比如IIC协议,也会散播磁力。影响船的导航。基于这个原因,磁力计受争议比较大。我的想法是结合磁力计和GPS,但是具体怎么结合以后再做。首先搭好框架最重要。

2. 说到陀螺仪:

陀螺仪基本作用是测量角度。你可以简单的把它理解成指南针——不过请注意,陀螺仪指向的原理跟磁力没有任何关系,它是利用角动量守恒来测量的。打个比方,设想你手里拿着一台陀螺仪,校准的时候你把它的指针指向了你的家门口(不一定非得是正南正北,这就是和磁力计的一个显著差别),然后你出去围着你家跑一圈,会发现这个陀螺仪的指针始终指着你的家门口——由此可以测量你运动起来的时候跟你家门口的夹角。

这样,有了陀螺仪你就可以实时监测载具运动起来的时候它与设定的原点之间的夹角。但是陀螺仪有一个潜在的问题就是:它测量的数值存在漂移现象。也就是说,测量的角度值会随着时间推移越来越不准。

此外,我们知道加速度计可以测量物体运动的加速度,然后把每个时间内测得的加速度值进行积分两次就可以得到位移的值。因此,单纯使用陀螺仪与加速度计,我们就完全可以制造一个不需要任何其他参考系的惯性导航系统!

 

关于滤波算法

传感器介绍完了。假设咱们已经做好传感器了,然后读取数据,我们直接用读取回来的数据控制无人船。你将会看到的现象是:把小船放下水,上电——这船咋一直哆嗦?

出现这种状况的原因是电子传感器直接获取的数据噪声很大,需要滤波。比如说,在这一秒传感器读取的船头偏航角是30度,下一个时刻可能由于突发的干扰导致读数变成了60度,再下一个时刻恢复了正常30度。

在此,神奇的滤波算法出来了。输入传感器数据中带噪声的数据,它就能给你滤波输出很接近真实数据的结果。一般常见的滤波算法有:卡尔曼滤波、Madgwick梯度下降算法,此外我们还可以采用互补滤波。

以互补滤波为例,互补滤波是指:加速度计的误差是高频误差,陀螺仪误差是低频误差。好了,既然两个传感器擅长的地方不同,那我们就把它们的强项互补——利用陀螺仪纠正加速度计的高频误差,利用加速度计纠正陀螺仪的漂移(低频误差)。其他的姿态解算算法基本的核心思想都是类似的。

但是请注意!互补滤波算法只能修正陀螺仪与加速度计的数值,如果你的载具上还有磁力计,这个算法是无法进行滤波的!

在此比较推荐使用Madgwick的梯度下降姿态解算算法,解算速度很快,在STM32上占用较少的资源;但由于卡尔曼滤波涉及到矩阵运算,因此如果在STM32上进行解算的话将会严重降低系统的表现。
 

关于系统结构

首先,成熟的无人船系统一般是采用上位机+下位机的架构。

  • 所谓上位机,以树莓派为例,类似于人的大脑,用来负责交互、综合与高级运算;
  • 下位机一般采用嵌入式芯片如STM32,类似于人的小脑,负责运动控制,直接对电机等外围设备下达指令。

在大学打智能车大赛的时候做的无人车一般都是只有一块嵌入式芯片,因为学生们做的无人车一般结构简单、功能也不复杂,不涉及到过多的复杂运算与交互。但是一个成熟的无人船需要用户以远程方式直接调试;并且可以即时地远程获取各种传感器数据,因此最好配备一个上位机。

一个简单的例子就是,你要远程控制单位的电脑办公,那么单位的电脑就是一台上位机;单位的打印机就是下位机;可以在家操纵单位的打印机打印资料,这就是一个使用上位机简化了的过程。

此外,通过上位机还可以很方便的拓展很多功能。比如在文章末尾附的无人船项目的上位机就通过仅仅两三行代码加入了语音提示无人船工作状态的功能。如果仅仅使用下位机,那工作量可是很大的。

还有一个问题要注意,就是一般来说上位机的稳定程度不如下位机,因此要做好保障程序。举个例子:文末附的无人船项目中,遥控器的控制信息全权由下位机接管。也就是说就算上位机在自动巡航的过程中突然挂机,只要下位机STM32在线,那么你就可以用遥控器把载具遥控回来。

关于路径规划

有了这些,我们的无人载具机已经具备遥控行驶的能力了。如果需要加入自动巡航功能,那么还需要加入路径规划的部分。假设给你两个经纬度目标点A、B,怎么规划出一条路线?

好了,这里用到了方位角-坐标的转换,也就是说,有了两个GPS坐标,你需要将两个坐标之间的方位角和距离计算出来;有了方位角和距离,你需要反过来根据第一个坐标点计算第二个坐标。