在科二考试系统一文中,实现一个科二考试系统依赖于「高精度定位」。以此文来记录下相关技术思路。
定位
要实现高精度定位,需要两个定位设备。设备支持设置 流动站 或者 基站 两种工作模式。当设置为基站之后,设备会将自己的 rtcm 数据(简单理解为差分数据)发送出去。然后流动站接收这个差分数据,再结合自身收到的卫星 gps 数据进行运算,便可以得出一个「基于基站的高精度坐标」了。
在设置基站模式时,需要同时给基站设置一个坐标,这个坐标可以是低精度的,也可以是高精度的。项目中有 3d 场景,利用流动站连接基站采集的高精度坐标数据,是 2d 的。为了让 3d 与 2d 对齐,取用这个基站设置的坐标当做 原点。这样 3d 建模的场景根据原点进行偏移,便可以与 2d 对应了。即车子开到这个侧方停车区域,3d 显示的便也是这个侧方停车区域。就像这样:
多个流动站可以连接到一个基站,进行高精度定位。
地图偏移
基于上述技术实现的产品需求,会伴随着一个问题:当基站架设的实际物理位置变动了,或者原点变化了,都会导致地图发生偏移,即车子在 3D 模型中的位置与实际位置不一致。
而这在实际场景中是十分有可能发生的:
- 实际位置变动可能是因为驾校改装,或者基站周围环境发生变化,必须迁移位置。
- 基站配置设置的坐标变化是因为设备断电重启会自己设置一次原点(项目中采用设备硬件厂商的问题)。
当地图发生偏移了,需要将与该基站关联的所有地图数据进行偏移操作。偏移操作的理论很简单:将同一个实际的物理位置,连接新基站采点,计算差量,做数据偏移。
举个例子:选定一个实际的物理位置(一般选倒库的点,好找一点),在地图中的坐标假设是 (100,100)。再连接新基站(基站移动或者坐标变化,需要重新设置,便不再是之前的那个基站了)之后在这个位置上采集到一个坐标假设是 (99,101),根据这两个坐标计算的差量是 (-1,1),然后将所有地图坐标根据这个差量运算一次,保存新的坐标即可。
理论虽然简单,但实际操作会有一定风险:
- 需要人为定位实际的物理位置,多多少少会有偏差。
- 有地域局限性。比如广西的基站发生偏移了,那么一定得去广西连接这个基站的某个驾校进行定位,重新采集新的坐标。
- 迁移操作不可逆,如果发现没迁移对,得重新迁移,就会导致坐标不停的变化,可能带来一些其他的问题。
- 如果这个基站关联的地图很多,那么就需要操作更多的数据,工作量更大且不可控。
也是因为这些原因,项目中已经废弃这个方案了。
云基站
既然基站移动会到导致上述问题,那是不是可以 选取一个基站,这个基站永远不会变更位置,且不会因为断电重启的原因导致设置坐标变化 呢?应该是可以的,比如在某个大楼的楼顶,只要楼不塌,位置肯定不会变,正常情况下也能保证不会断电重启。
好,现在将这个基站架设好了,代号为 A。
现在来了一个实施需求,需要在某某驾校架设基站 B。组建云基站的操作也很简单:先将 B 基站架设好,同时将 B 设置为流动站,连接上 A 基站。B 根据 A 下发的 rtcm 数据解析出一个高精度坐标 X。再将 B 设置成基站模式,同时将这个高精度坐标 X 设置进去,这样 B 基站便云化了。
假设后面 B 需要移动位置重新架设,那么就只需要把这个操作重新执行一遍就可以了,不需要偏移已经采集好的地图数据。
因为基站本身就只能辐射几十公里的范围,云基站也是一样的。
处于云基站系统 A 区域内,就使用云基站系统 A 里的基站,A1、A2、A3 等等,离哪个基站近就连哪个。如果处于云基站系统 B 的区域,就使用云基站系统 B。
假设在系统 A 下面采集了,结果又要在系统 B 去使用,就会导致偏移问题。但考虑到实际场景,是地域性特别强的科二考试,不存在这样交叉使用的情况。
再经过了许许多多的问题与躺坑后,才有了现在相对“完美”的方案。技术也是需要持续优化、进步的呀!