转载过来的一篇文章 什么是GPS? 通常意义上讲GPS,其实应该是指Global Navigation
Satellite System全球导航卫星系统,即GNSS。主要是用来定位的系统。
GPS的种类? 目前全球定位系统有下面几种: GLONASS 俄罗斯 格洛纳斯 Galileo-NES 欧洲 伽利略 BDS 中国 北斗 GPS 美国 全球定位系统 这里看到,其实GPS只是单指美国的全球定位系统,不过现在习惯上用GPS泛指其他定位系统。
为什么飞控需要GPS? 这是由无人机的操作要求和任务要求决定的。有了GPS后,无人机能够悬停飞行(定点),飞手操作的复杂性大大降低,同时,为了能够执行一些航迹飞行任务,定位信息也是必要的。 简单来说,如果只是姿态自稳的飞行,可以没有GPS,但是随着要求的提高,GPS对飞控、对无人机都是必要的部件。
GPS的工作原理? 首先,宇宙里的卫星会不停的向地面的GPS接收机(常用的GPS模块)广播当前的位置信息,包括该数据包的时间戳,当GPS模块接收到这些信息后,用当前时间减去时间戳的时间,就得到空中传输的时间,乘上传输速度,就得到卫星与GPS模块的距离。 理论来讲,为了确定GPS模块的坐标位置(NEH),3个参数,那只需要3颗卫星与GPS模块的距离就可以计算出来。 但是因为对时间差的要求特别高,由于GPS模块的时钟一般是石英钟,所以认为它的时钟时间与卫星的时间有同步误差,所以加上这个误差作为参数,这样就有4个参数待定,所以一般至少需要4颗卫星进行观测。
飞控上常用的GPS型号? 目前,用于多旋翼无人机中的GPS,常见的是Ublox的NEO-M8系列。 ![](https://pic4.zhimg.com/80/v2-b413e8a18e223bf9fe1baca9b1e87f0a_hd.jpg) 当然,还有其他厂家的高精度GPS模块,比如偌瓦泰,以及这两年广泛使用的差分GPS。
GPS的指标? ![](https://pic2.zhimg.com/80/v2-8412f47721f7d63b97d2a21a59344fd0_hd.jpg) 这里,有比较重要的几个指标: 速度数据的精度在0.05m/s; 水平的定位精度,如图所示,一般设置在GPS模式时,定位精度为2.5m左右; 输出频率,在GPS模式时,最大输出10hz。
GPS的输出协议? 以M8N模块为例,有NMEA、UBX、RTCM3种。默认NMEA、UBX两种协议都已使能,但是输出的只有NMEA协议,这个协议是ASCII码形式输出,如果与电脑上位机进行通讯时,用这种方式解析比较方便,但如果是嵌入式单片机(飞控一般属于此类)与GPS模块进行通信,一般用UBX协议,其输出格式是二进制。
UBX数据帧结构 ![](https://pic2.zhimg.com/80/v2-9d96b5a979e2e6069e9399101f66352b_hd.jpg) 前两个字节是同步头,接收模块通过查找这两个同步头,可以确定这包数据按照什么格式进行接收。 CLASS字节表明接收的数据组信息; IP字节表明接收的数据组里的什么信息; 长度信息用两个字节表示,表明数据包里有多少个数据,且是小端模式(大小端模式,主要是说,比如一个16位的数据在传输过程中,将高8位的数据放在前面还是后面)。 PAYLOAD存放的即数据信息。 CK_A和CK_B是两个字节的校验位,对CLASS到PAYLOAD的数据进行校验,为了确保数据包在传输过程中数据的正确。
GPS模块的设置 为什么需要设置? 设置GPS模块,主要是为了让模块能够输出想要的信息,包括输出频率等。
设置的方法? 1.电脑端上位机设置 ![](https://pic4.zhimg.com/80/v2-657df167eca72e1039174a6a95ce22c1_hd.jpg) 用USB转串口模块,将GPS模块与电脑相连,用官方给的u-center上位机进行设置。 优点:嵌入式程序不需要做相应的代码编写; 缺点:需要GPS模块能够保存设置信息,掉电不丢失;
2.嵌入式程序,在上电初始化的时候进行设置(常用方式)。 优点:对GPS模块没有要求,不要求其能够保存设置信息,方便使用; 缺点:飞控程序需要编写相应的初始化设置代码(代码可参考后面给出的链接);
飞控需要GPS哪些信息(即需要设置哪些参数)? 以开源飞控px4为例: ![](https://pic2.zhimg.com/80/v2-78fc540983ccce8e2598e95563a4a03b_hd.jpg) 实际应用中,我们可以不需要解码出这么多信息,常用的如下: 经纬度、海平面高度 lat lon alt 锁定类型 fix_type 水平/垂直精度估计 eph epv 水平/垂直精度因子 hdop vdop GPS噪声值 noise_per_ms NED系速度 vel_n_m_s vel_e_m_s vel_d_m_s 卫星数 satellites_used
如何设置? 以电脑上位机设置示例: 1.连接相应的com口,打开Messages View窗口 ![](https://pic2.zhimg.com/80/v2-aac3aa2ed59eb9aa6347cc35ff3f3568_hd.jpg) 2.点击UBX窗口,因为与飞控之间的通信都是用的UBX协议,所以我们要在UBX窗口进行配置 ![](https://pic3.zhimg.com/80/v2-d773860980921b10f0a93ba4470afe17_hd.jpg) 3.设置模块输出的方式,选择串口,输入输出都选择UBX协议 ![](https://pic4.zhimg.com/80/v2-90e27ef3557b249da8d4f70ab53913ae_hd.jpg) 4.点击下方按钮,能够看到发出的命令具体是什么,在嵌入式代码编写中,最简单的笨办法就是通过电脑上位机将这些命令保存下来,直接在嵌入式代码中赋值给数组保存起来调用 ![](https://pic2.zhimg.com/80/v2-3b2f6a0ee7c67f765ca491b2aee55176_hd.jpg) 5.设置GPS模块的输出频率,如图,选择UTC时间,5Hz输出 ![](https://pic1.zhimg.com/80/v2-2f7680e3540f58c51c9d908ba9b3129f_hd.jpg) 6.设置一些参数,比如动态模式小于2g(一般飞行不会超过该数值),fix类型为3d锁定等 ![](https://pic1.zhimg.com/80/v2-7680d6923802fd71ce149f53b4186cb4_hd.jpg) 7.设置输出的数据消息类型,在m8n系列中,可以直接选择NAV-PVT输出,就包含了常用的一些信息,比如经纬度、高度、NED速度等 ![](https://pic1.zhimg.com/80/v2-975b38cf5b7d40efb0786ce7491c95aa_hd.jpg) 如下图所示,GPS模块正在输出PVT数据包 ![](https://pic3.zhimg.com/80/v2-c0b4f55e2d95e6a3983a76de5ebd1562_hd.jpg) 8.设置输出DOP数据包 ![](https://pic2.zhimg.com/80/v2-24d87191008e73185a1aa031a2c2016b_hd.jpg) 9.设置输出星数数据包 ![](https://pic1.zhimg.com/80/v2-6c7ea9835c2e2aa291bcce34e8204b3b_hd.jpg)
GPS相关的坐标系 GPS的数据全部是在WGS-84坐标系下的,而飞控做定点控制,对位置进行解算、控制都在北东地NED坐标系下,所以要将GPS的数据进行转换(主要是位置数据经纬度)。 多说一句,GPS输出的高度一般不会用来进行高度推算,在大范围的高度变化情况下,具有一定的参考意义(相对变化),但是GPS的高度会随机漂移,所以一般不会使用这个数据(笔者自己的看法)。 有关坐标系转换的数学表达式这里不再进行推导,有兴趣的可以自行查找资料推导,以工程应用为主,直接给出ned系和WGS-84系互相转换的函数(参考px4代码),图中的ref为原点,即home点。 由home点坐标和当前点坐标,计算出NED系下当前点与原点的距离。 ![](https://pic1.zhimg.com/80/v2-10771aaff867da4ca5c99f6ecede07bc_hd.jpg) 反之,由home点坐标与ned系下的距离,推算出当前点的坐标。 ![](https://pic1.zhimg.com/80/v2-3ff23c84f144dd5da58ae097f3fba6a9_hd.jpg)
飞控中如何判定GPS可用? 标准不定,但是基本原则是根据精度来判定。 这里插入讲一下,笔者有次在某个群里看到有人问飞控算法里的eph epv表示什么意思,有人回答说是水平和垂直的精度因子,然后一大群人附和这个说法,但其实这个说法是错误的。 首先,水平/垂直精度因子是dop数据包解析出来的hdop vdop。 这里的eph epv是pvt数据包里的hAcc vAcc,单位是mm,飞控中将其转换到m。简单理解就是水平和垂直方向的精度,这个数据是估计出来的。
在飞控算法中也更新这个数据。所以,参考开源代码的时候,要看的细致一些,不能想当然的认为,包括网络查找的答案不能尽信,要自己审核确认下。 ![](https://pic3.zhimg.com/80/v2-67ff16aab5a442c91893df8d55638aeb_hd.jpg) 这里通过判定gps的噪声值、fix_type来判定gps是否可用。 在组合导航算法中,通过eph、epv和fix_type来判定。 ![](https://pic4.zhimg.com/80/v2-7b5b066327d2ccccdd88037ce8897c95_hd.jpg)
eph epv在导航算法里的小应用 比如用来自适应调整GPS参与融合的权重值。 ![](https://pic1.zhimg.com/80/v2-2b839e5e14b84eba077d57279edb6fc8_hd.jpg) 如图所示,这里的min_eph_epv为2,也就是说,当GPS的eph、epv小于2的时候,gps 参与融合的权重为1,当GPS的eph、epv大于2的时候,这时候GPS的数据质量不佳,同时,权重值也小于1,达到自适应调整权重值的目的。
为什么不用星数作为判定条件? 星数数据是离散变化的,很容易在设定的阈值上下跳变,这种情况下,飞行模式会不断的进行切换,导航算法也在不停的切换,程序容易出现问题,也不稳定。
Dop是什么意思? Dop分为以下几种: ![](https://pic2.zhimg.com/80/v2-adf7c0b6bc9d87c0235e3bc840b281a5_hd.jpg) 常用的有: PDOP(position dilution of precision ) 三维位置精度因子:为纬度、经度和高程等误差平方和的开根号值 HDOP(horizontal dilution of precision )水平分量精度因子:为纬度和经度等误差平方和的开根号值 VDOP(vertical dilution of precision )垂直分量精度因子 GDOP(Geometric Dilution Precision)几何精度因子:是衡量一个定位系统精度的重要标准之一 它们之间的简单关系为:
HDOP2+VDOP2=PDOP2 DOP值的大小与GPS定位的误差成正比,DOP值越大,定位误差越大,定位的精度就低。PDOP则直接反映GPS卫星的分布情况,当PDOP较大时,表明空中的4颗GPS卫星几何分布不是太理想,他们构成的图形周长太短,定位精度就低,反之亦然。小于等于4的PDOP产生最佳位置。5到7之间的PDOP可接受,大于等于7的PDOP较差。
GPS解码与环形缓冲区 网上有些源码,gps解码采用的是串口中断方式。当然,源码只实现gps解码的话,这种方式问题不大,但是在整个飞控工程中,采用这种方式并不好。 原因: 嵌入式实时响应系统的中断使用,有一个原则,就是快进快出。在进入中断的时候,这个中断执行函数就必须尽可能快地执行完毕,然后跳出这个中断,使得比它优先级低的中断能够得到响应。所以在遇到一些接收数据量大,然后数据同时需要进行计算解析的时候。如果不使用缓冲队列进行管理数据,那必然需要在中断执行函数里面完成,接收同时完成解析。这样解析的时间如果过长,就势必会影响中断的执行长短,然后从而影响着整个系统的实时性。如果系统的任务比较多的时候,这个中断的执行时间太长,从而引起其他的任务无法正常的运行,有可能会导致整个系统的崩溃。所以,采用了缓冲队列的方式,将数据进行保存下来。然后在主控制器中解析这些数据,这样既保证了中断的实时性,又保证了我所接收到的数据能够完整的进行解析。 举个例子:假设这样一种情况,我们在中断里面去接收数据前,同时解析数据。当接收到一个字节的数据的时候,再进行一些计算,如果这个时候有更高优先级的中断发生了,那系统肯定要跳到中断优先级高的执行函数里面去执行,如果这个高执行函数执行时间过长。在还未跳到低优先级的中断的时候,这个时候来了几组新的数据,这样就会新数据会覆盖之前的数据,引起丢桢。
所以为什么要用环形缓冲区ringbuffer? 用于接收不定时、量大、数据,且数据需要分析处理。 还有一个优点,做解码的时候,并不会去判断我是不是接受了一完整的数据包。一般的做法是,把gps的数据接收下来,保存在缓冲区。主函数里面一有空就去解析这个缓冲区里面的数据。因为一个完整格式的数据帧,里面还有数据头和检验,根据这个,就能够识别出这个数据包头。所以并不需要等到一个完整的数据包接收完全之后再去解析。
参考源码(移植pixhawk GPS解码代码): 硬件平台:Pixhawk v2硬件 F4主芯片
软件环境:mdk stm32 cube HAL库 C语言 百度云盘
GPS数据在飞控中如何使用? 首先,在做定点飞行控制时,如果直接使用GPS反馈的数据,也是能够实现功能的。但是需要注意的是,前面讲到GPS模块的输出频率,最大10hz,而通常做定点控制时,控制频率是达到50hz以上(px4在100~200hz左右),反馈的数据频率带宽过低,这样控制增益不能加大,控制效果偏弱,甚至出现不稳定的现象(抖动、电机声音抽搐)。
说到控制,插入两个知识点: 什么是控制带宽? 简单来说一句话,控制带宽决定了系统的快速性。 以飞行器这个对象来说,高带宽意味着高性能,飞机的快速响应能力,但高带宽是建立在高成本的基础上的。比如飞行器的机体材料需要刚性强的,动力系统的响应能力要快,飞控的芯片处理能力快,传感器延迟小等等条件。 一般来说,飞行器的带宽在30hz左右,所以传感器的低通滤波的截止频率一般设置在30hz。某些震动大的飞行器,可以设置更低一些,一般震动大的,轴距也大,所以快速性要求没那么高。
传感器采样频率、控制频率之间的关系? 一般来说,传感器的采样频率尽可能越高越好,比如gyro数据1000hz采样,实际在姿态估计算法中是200hz读取,这样多出来的数据点能用来做滤波处理,尽可能的保存真实信息。 控制器频率则一般根据系统的带宽决定,一般来说,控制频率是带宽的5倍左右(理论推导不详述了,请自行查阅书籍)。 在多旋翼飞行器中,一般包含了4个控制回路,角速度控制、角度控制、速度控制、位置控制。以角速度控制为例,前面gyro滤波器设置的截止频率为30hz,所以最好角速度控制达到150hz以上。当然,这些没有标准的设置,基本合理就可以,底层的角速度控制频率尽可能高些,200~400左右即可。
如果反馈的数据频率低于控制频率怎么样? 常见的,以飞行器的定点控制为例,如直接使用GPS数据作为速度、位置反馈,GPS的数据频率可设置到10hz,但一般速度位置的控制频率在50hz以上。这样做,也是可以的,飞行器能够实现定点功能,但是存在一些问题,比如控制参数不能设置过大(与高频率的反馈数据相比),飞行过程中出现细微的不稳定现象等。 综上:传感器采样频率越高越好,控制频率低于反馈数据的采样频率,同时尽量保证控制频率大于带宽5倍以上。
所以,飞控解码得到GPS的数据之后,会做数据融合,简单来讲,就是通过与加速度计数据、姿态数据、气压计数据进行组合导航,估计出所需的惯性导航数据。 好的融合算法,能够使得估计出来的数据相比GPS原始数据,频率提升,且具有相位超前(GPS的数据一般较实际反应,延迟150ms左右)。 有关组合导航的估计算法,后面会单独写文章进行描述,这里不再赘述。
GPS数据质量不佳会有什么影响? 前面提到,需要用GPS的数据进行数据融合,如果GPS原始数据质量不佳(满足可用条件,但是不够好),会对融合算法产生影响,实际飞行时,比如GPS模式下飞行时,打杆操作不正常,返航精度不够等,总而言之,增大了炸机的风险。
补充: Ø GPS第一次在一个地方上电的时候,搜星时间比较长一些,一般需要1min左右,如果在同一地点,上电间隔时间短的话,搜星很快,20s内就能搜星成功,达到GPS可用状态。 Ø 一般空旷环境下,星数在15颗以上,就认为GPS质量相对较好了,大部分人都是通过星数判定GPS的数据质量。 Ø 阴雨天气,楼层之间等环境下,GPS数据质量会受到很大影响,因此不建议在这种状态下飞行。 |