02 辅助定位(AGPS)

02 辅助定位(AGPS)

02 辅助定位(AGPS)

一、AGPS 概述

AGPS(Assisted GPS,辅助全球卫星定位系统)通过移动网络预先获取卫星星历、时间等辅助数据,可大幅缩短 GPS 首次定位时间。LuatOS 提供 AGPS 原生支持,适用于物流追踪、车载定位等场景。

1.1 GPS、WiFi、基站、AGPS 几种常用定位原理介绍与区别

GPS

GPS(Global Positioning System)即全球定位系统,它是由美国研究的一种定位方式,特点是:不需要 SIM 卡,不需要连接网络,只要在户外,基本上就能随时随地的准确定位。但是 GPS 启动后搜索卫星的时间比较多,一般需要2分钟左右(俗称冷启动)

冷启动包括:

1.GPS 初次使用

2.GPS 电池耗尽

3.关机状态下移动 1000 公里以上的距离或持续关机超过 4 小时。

原理:接收机接收 GPS 卫星广播,通过解析可见 GPS 卫星的位置、距离等信息以及相应算法得出自己的位置信息。

优势:定位精度高,只要能接收到四颗卫星的定位信号,就可以进行定位。

缺点:GPS 受天气和位置的影响较大。当遇到天气不佳的时候、或者处于高架桥/树荫的下面,或者在高楼的旁边角落、地下车库、室内或露天的下层车库(或者简单地说当见不到天空的时候),GPS 的定位就会受到相当大的影响,甚至无法进行定位服务。

注意:各国定位系统有:中国北斗、美国 GPS、俄罗斯 GLONASS、欧洲伽利略等,统称卫星定位。

合宙 gps 模组定位精度:3~5 米

LBS(基站)定位

基站包括移动、联通和电信基站。基站定位是通过移动通信的基站信号差异,通过一定的算法来计算出手机所在的位置,取决于定位地点附近所处的基站覆盖密度,如果基站多,定位则准确,如果是山区,基站少,则定位就不那么精确;LBS 定位必须联网,手机处于 SIM 卡注册状态(飞行模式下开 wifi 和拔出 SIM 卡都不行)。

原理:运营商蜂窝基站的位置信息都是固定的,通过接收一个或多个基站信号终端,再根据信号强度及基站位置进行推算自身位置

优点:方便,因为它是通过 SIM 卡接收基站信号进行定位的。理论上说,只要计算三个基站的信号差异,就可以判断出手机所在的位置。因此,只要用户手机处于移动通信网络的有效范围之内,就可以随时进行位置定位,而不受天气、高楼、位置等等的影响。

缺点:通过计算基站信号差异而得出的位置坐标值,很明显地逊于 GPS 的定位精度,受环境影响较大,在郊区和农村可以将移动台定位在 10~20 米范围内,在城区由于高大建筑物较多,电波传播环境不好,信号很难直接从基站到达移动台,一般要经过折射或反射,因此定位精度会受到影响;其次是使用范围较窄,LBS 虽然不会受到天气、高架桥或高楼的影响,但如果超出手机的服务范围,或者手机所处的基站数量不足,则无法进行 LBS 定位,从这一点上说不太适合野外使用。

定位精度:10-2000 米。

WIFI 定位

Wifi 定位,顾名思义,周围必须有 wifi 才可以!WiFi 定位的目的是解决室内精确定位,原理类似基站定位。WiFi 定位的条件是:1、必须具有 WIFISCAN 功能,可以扫描到周围 wifi 的 mac 地址。2、必须能上网,移动数据或者 wifi 联网皆可。

原理:每一个无线 AP 都有一个全球唯一的 MAC 地址, WiFi 定位靠的是侦测附近周围所有的无线网络基地台 (WiFi Access Point) 的 MAC 地址,去比对数据库中该 MAC 地址的坐标,交叉计算出所在地。

优点:

1.定位精度高,wifi 密集人流多的地方相当精确;

2.速度快;

3.周围的 wifi 即使连接不上也能定位。在不依赖外部设备的情况下,没有比 WIFI 定位更精准的室内定位方式,室内定位不精准,偏二三十米远,这个问题当前科技无解。

缺点:

1.依赖wifiscan! 没有 wifiscan 就不能定位;

2.必须处于联网状态。

3.用户被迫共享了一点流量

精确度:10~200 米

AGPS 辅助定位

AGPS 是辅助 GPS 定位的一种方法。AGPS 和 GPS 是一样的,只是加上网络的辅助而已,定位时,必须有 GPS 模块存在,如果没有 GPS 模块,这种定位是不起什么作用的。A-GPS 定位是用来加快定位速度的,由于 GPS 冷启动时,搜星速度很慢(需要把头上二十多颗卫星挨个搜一遍),大约 2 分钟才能搜到,合宙定位模组冷启动 35s 左右就可以定上位。增加了 AGPS 定位之后可以利用基站大体定位下你所在的位置,然后通过网络将这个位置发送到服务器,服务器根据这个位置将此时经过你头顶的卫星参数(哪几颗、频率、位置、仰角等信息)反馈给你的定位设备,设备上的 GPS 就可以很有目的的去搜索卫星,此时你的搜星速度大大提高,几秒钟就可以定位。

原理:接收机接收 GPS 星历文件,通过解析可见 GPS 卫星的位置、距离等信息以及相应算法得出自己的位置信息。

和 GPS 相比比优势:

1.搜星定位快,不管是冷启动还是热启动都秒定

2.有效减少设备的电量消耗

3.缓解弱 GPS 信号情况下无法定位或精度降低的问题

4.对移动设备的计算能力要求更低。

缺点:

1.必须联网,如果你的设备不能上网,或是停机了身边又没有 wifi,是没法应用 AGPS 达到秒定效果的。

2.必须有 AGPS 位置服务器的支持

3.与 GPS 一样,仍无法完美解决室内(室内无法接收 GPS 信号)定位的问题。

精确度:3~5 米

二、演示功能概述

本教程将演示如何使用 Air8000 的 GPS 功能,使用 agps 实现快速定位功能。agps 实现流程图如下:

Air8000 的 AGPS 实现原理为:通过蜂窝基站或 Wi-Fi 定位获取粗略位置坐标,再结合网络下发的卫星辅助数据(星历),显著缩短卫星信号搜索时间并加速定位解算,最终实现快速精准定位。

注意:GPS 星历文件能保持 4 小时,定位成功后会自动更新星历。

由上面原理可知 Air8000 使用 agps 功能需要访问两个服务器,基站定位服务器和星历下载服务器。(注意:如果使用的是专网卡,需要将下面两个服务器配置在 sim 卡的白名单中,基站定位服务器 和[星历下载服务器] (download.openluat.com)。)

基站定位使用教程以及基站定位收费情况可以参考这篇文章基站和 WiFi 定位。

三、准备硬件环境

3.1 Air8000 核心板

淘宝购买链接:Air8000 核心板淘宝购买链接 ;

核心板使用教程参考:Air8000 核心板使用说明

3.2 GPS 天线

上面购买链接可以选择套餐三,里面包含一个 gps 天线。

参考:硬件环境清单,准备以及组装好硬件环境。

四、准备软件环境

1. 烧录工具 Luatools;

2. 内核固件文件(底层 core 固件文件):LuatOS-SoC_V2005_Air8000;此页面有新版本固件的话选用最新版本固件。

3. LuatOS 需要的脚本和资源文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/GPS

4. lib 脚本文件:使用 Luatools 烧录时,勾选 添加默认 lib 选项,使用默认 lib 脚本文件;

准备好软件环境之后,接下来查看如何烧录项目文件到 Air8000 开发板中,将本篇文章中演示使用的项目文件烧录到 Air8000 开发板中。

五、GPS 软硬件参考

5.1 API 接口介绍

本教程使用 api 接口为:

https://docs.openluat.com/osapi/core/libgnss/

5.2 GPS 硬件设计

GPS 在硬件设计中天线部分是比较关键的,可以参考这篇文章:Air8000 GNSS 硬件设计指导

在核心板上内置 GNSS ipex 连接器,同时内置 3.3V LDO, 用于有源天线供电。因此可以使用外部有源天线直接连接 GNSS 连接器。

注意:目前有源天线供电仅支持 3.3V 有源天线,请注意连接的有源天线的供电范围。

六、代码示例介绍

6.1 软件代码介绍

--[[

必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量

PROJECT:项目名,ascii string类型

可以随便定义,只要不使用,就行

VERSION:项目版本号,ascii string类型

如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:

X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同

因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000

如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可

本demo演示的功能为:

使用Air8000核心板演示GPS定位功能以及agps辅助功能

]]

PROJECT = "air8000_gnss"

VERSION = "1.0.0"

log.info("main", PROJECT, VERSION)

-- sys库是标配

_G.sys = require("sys")

--[[特别注意, 使用http库需要下列语句]]

_G.sysplus = require("sysplus")

-- mobile.flymode(0,true)

if wdt then

--添加硬狗防止程序卡死,在支持的设备上启用这个功能

wdt.init(9000)--初始化watchdog设置为9s

sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗

end

log.info("main", "air8000_gnss")

mcu.hardfault(0) --死机后停机,一般用于调试状态

pm.ioVol(pm.IOVOL_ALL_GPIO, 3300) -- 所有GPIO高电平输出3.3V

local gnss = require("agps_icoe")

function test_gnss()

log.debug("提醒", "室内无GNSS信号,定位不会成功, 要到空旷的室外,起码要看得到天空")

pm.power(pm.GPS, true)

gnss.setup({

uart_id=2,

uart_forward = uart.VUART_0, -- 转发到虚拟串口,方便对接GnssToolKit3

debug=true,

sys=1

})

gnss.start() --初始化gnss

gnss.agps() --使用agps辅助定位

--循环打印解析后的数据,可以根据需要打开对应注释

while 1 do

sys.wait(5000)

log.info("RMC", json.encode(libgnss.getRmc(2) or {}, "7f")) --解析后的rmc数据

log.info("GGA", libgnss.getGga(3)) --解析后的gga数据

-- log.info("GLL", json.encode(libgnss.getGll(2) or {}, "7f"))

-- log.info("GSA", json.encode(libgnss.getGsa(1) or {}, "7f"))

-- log.info("GSV", json.encode(libgnss.getGsv(2) or {}, "7f"))

-- log.info("VTG", json.encode(libgnss.getVtg(2) or {}, "7f"))

-- log.info("ZDA", json.encode(libgnss.getZda(2) or {}, "7f"))

-- log.info("date", os.date())

-- log.info("sys", rtos.meminfo("sys"))

-- log.info("lua", rtos.meminfo("lua"))

end

end

sys.taskInit(test_gnss)

-- 订阅GNSS状态编码

sys.subscribe("GNSS_STATE", function(event, ticks)

-- event取值有

-- FIXED 定位成功

-- LOSE 定位丢失

-- ticks是事件发生的时间,一般可以忽略

log.info("gnss", "state", event, ticks)

if event == "FIXED" then

local locStr = libgnss.locStr()

log.info("gnss", "locStr", locStr)

-- if locStr then

-- -- 存入文件,方便下次AGNSS快速定位

-- io.writeFile("/gnssloc", locStr)

-- end

end

end)

-- 用户代码已结束---------------------------------------------

-- 结尾总是这一句

sys.run()

-- sys.run()之后后面不要加任何语句!!!!!

local agps_icoe = {

version = "1.0.1"

}

local sys = require("sys")

function agps_icoe.setup(opts)

agps_icoe.opts = opts

if not agps_icoe.opts.uart_id then

agps_icoe.opts.uart_id = 2

end

end

function agps_icoe.start()

-- 初始化串口

local gps_uart_id = agps_icoe.opts.uart_id

local opts = agps_icoe.opts

-- local write = agps_icoe.writeCmd

uart.setup(gps_uart_id, 115200)

-- 是否为调试模式

if opts.debug then

libgnss.debug(true)

end

if agps_icoe.opts.uart_forward then

uart.setup(agps_icoe.opts.uart_forward, 115200)

libgnss.bind(gps_uart_id, agps_icoe.opts.uart_forward)

else

libgnss.bind(gps_uart_id)

end

-- 是否需要切换定位系统呢?

if opts.sys then

if type(opts.sys) == "number" then

if opts.sys == 1 then

uart.write(gps_uart_id, "$CFGSYS,H01\r\n")

elseif opts.sys == 2 then

uart.write(gps_uart_id, "$CFGSYS,H10\r\n")

elseif opts.sys == 5 then

uart.write(gps_uart_id, "$CFGSYS,H101\r\n")

else

uart.write(gps_uart_id, "$CFGSYS,H11\r\n")

end

end

end

if not opts.nmea_ver or opts.nmea_ver == 41 then

uart.write(gps_uart_id, "$CFGNMEA,h51\r\n") -- 切换到NMEA 4.1

end

-- 打开全部NMEA语句

if opts.rmc_only then

uart.write(gps_uart_id, "$CFGMSG,0,0,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,1,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,2,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,3,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,4,1\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,5,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,6,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,7,0\r\n")

sys.wait(20)

elseif agps_icoe.opts.no_nmea then

uart.write(gps_uart_id, "$CFGMSG,0,0,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,1,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,2,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,3,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,4,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,5,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,6,0\r\n")

sys.wait(20)

uart.write(gps_uart_id, "$CFGMSG,0,7,0\r\n")

sys.wait(20)

else

uart.write(gps_uart_id, "$CFGMSG,0,0,1\r\n") -- GGA

sys.wait(10)

uart.write(gps_uart_id, "$CFGMSG,0,1,1\r\n") -- GLL

sys.wait(10)

uart.write(gps_uart_id, "$CFGMSG,0,2,1\r\n") -- GSA

sys.wait(10)

uart.write(gps_uart_id, "$CFGMSG,0,3,1\r\n") -- GSV

sys.wait(10)

uart.write(gps_uart_id, "$CFGMSG,0,4,1\r\n") -- RMC

sys.wait(10)

uart.write(gps_uart_id, "$CFGMSG,0,5,1\r\n") -- VTG

sys.wait(10)

uart.write(gps_uart_id, "$CFGMSG,0,6,1\r\n") -- ZDA

sys.wait(10)

-- uart.write(gps_uart_id, "$CFGMSG,0,7,1\r\n") -- GST

-- sys.wait(10)

end

end

-- function agps_icoe.writeCmd(cmd)

-- log.info("agps_icoe", "写入指令", cmd:trim())

-- uart.write(agps_icoe.opts.uart_id, cmd)

-- end

function agps_icoe.reboot(mode)

local cmd = "$RESET,0,"

if not mode then

mode = 0

end

if mode == 2 then

cmd = cmd .. "hff\r\n"

elseif mode == 1 then

cmd = cmd .. "h01\r\n"

else

cmd = cmd .. "h00\r\n"

end

uart.write(agps_icoe.opts.uart_id, cmd)

if mode == 2 then

agps_icoe.agps_tm = nil

end

libgnss.clear()

end

function agps_icoe.stop()

uart.close(agps_icoe.opts.uart_id)

end

local function do_agps()

-- 首先, 发起位置查询

local lat, lng

if mobile then

mobile.reqCellInfo(6)

sys.waitUntil("CELL_INFO_UPDATE", 6000)

local lbsLoc2 = require("lbsLoc2")

lat, lng = lbsLoc2.request(5000)

-- local lat, lng, t = lbsLoc2.request(5000, "bs.openluat.com")

log.info("lbsLoc2", lat, lng)

if lat and lng then

lat = tonumber(lat)

lng = tonumber(lng)

log.info("lbsLoc2", lat, lng)

-- 转换单位

local lat_dd,lat_mm = math.modf(lat)

local lng_dd,lng_mm = math.modf(lng)

lat = lat_dd * 100 + lat_mm * 60

lng = lng_dd * 100 + lng_mm * 60

end

elseif wlan then

-- wlan.scan()

-- sys.waitUntil("WLAN_SCAN_DONE", 5000)

end

if not lat then

-- 获取最后的本地位置

local locStr = io.readFile("/hxxtloc")

if locStr then

local jdata = json.decode(locStr)

if jdata and jdata.lat then

lat = jdata.lat

lng = jdata.lng

end

end

end

-- 然后, 判断星历时间和下载星历

local now = os.time()

local agps_time = tonumber(io.readFile("/hxxt_tm") or "0") or 0

if now - agps_time > 3600 then

local url = agps_icoe.opts.url

if not agps_icoe.opts.url then

if agps_icoe.opts.sys and 2 == agps_icoe.opts.sys then

-- 单北斗

url = "http://download.openluat.com/9501-xingli/HXXT_BDS_AGNSS_DATA.dat"

else

url = "http://download.openluat.com/9501-xingli/HXXT_GPS_BDS_AGNSS_DATA.dat"

end

end

local code = http.request("GET", url, nil, nil, {dst="/hxxt.dat"}).wait()

if code and code == 200 then

log.info("agps_icoe", "下载星历成功", url)

io.writeFile("/hxxt_tm", tostring(now))

else

log.info("agps_icoe", "下载星历失败", code)

end

else

log.info("agps_icoe", "星历不需要更新", now - agps_time)

end

local gps_uart_id = agps_icoe.opts.uart_id or 2

-- 写入星历

local agps_data = io.readFile("/hxxt.dat")

if agps_data and #agps_data > 1024 then

log.info("agps_icoe", "写入星历数据", "长度", #agps_data)

for offset=1,#agps_data,512 do

log.info("gnss", "AGNSS", "write >>>", #agps_data:sub(offset, offset + 511))

uart.write(gps_uart_id, agps_data:sub(offset, offset + 511))

sys.wait(100) -- 等100ms反而更成功

end

-- uart.write(gps_uart_id, agps_data)

else

log.info("agps_icoe", "没有星历数据")

return

end

-- 写入参考位置

-- "lat":23.4068813,"min":27,"valid":true,"day":27,"lng":113.2317505

if not lat or not lng then

-- lat, lng = 23.4068813, 113.2317505

log.info("agps_icoe", "没有GPS坐标", lat, lng)

return -- TODO 暂时不写入参考位置

end

if socket.sntp then

socket.sntp()

sys.waitUntil("NTP_UPDATE", 1000)

end

local date = os.date("!*t")

if date.year > 2023 then

local str = string.format("$AIDTIME,%d,%d,%d,%d,%d,%d,000", date["year"], date["month"], date["day"],

date["hour"], date["min"], date["sec"])

log.info("agps_icoe", "参考时间", str)

uart.write(gps_uart_id, str .. "\r\n")

sys.wait(20)

end

local str = string.format("$AIDPOS,%.7f,%s,%.7f,%s,1.0\r\n",

lat > 0 and lat or (0 - lat), lat > 0 and 'N' or 'S',

lng > 0 and lng or (0 - lng), lng > 0 and 'E' or 'W')

log.info("agps_icoe", "写入AGPS参考位置", str)

uart.write(gps_uart_id, str)

-- 结束

agps_icoe.agps_tm = now

end

function agps_icoe.agps(force)

-- 如果不是强制写入AGPS信息, 而且是已经定位成功的状态,那就没必要了

if not force and libgnss.isFix() then return end

-- 先判断一下时间

local now = os.time()

if force or not agps_icoe.agps_tm or now - agps_icoe.agps_tm > 3600 then

-- 执行AGPS

log.info("agps_icoe", "开始执行AGPS")

do_agps()

else

log.info("agps_icoe", "暂不需要写入AGPS")

end

end

function agps_icoe.saveloc(lat, lng)

if not lat or not lng then

if libgnss.isFix() then

local rmc = libgnss.getRmc(3)

if rmc then

lat, lng = rmc.lat, rmc.lng

end

end

end

if lat and lng then

log.info("待保存的GPS位置", lat, lng)

local locStr = string.format('{"lat":%7f,"lng":%7f}', lat, lng)

log.info("agps_icoe", "保存GPS位置", locStr)

io.writeFile("/hxxtloc", locStr)

end

end

sys.subscribe("GNSS_STATE", function(event)

if event == "FIXED" then

agps_icoe.saveloc()

end

end)

return agps_icoe

6.2 效果展示

可以看到没有使用 agps 辅助定位需要 31 秒左右才能定位成功。使用 agps 后,注入星历数据后 3s 左右就能定位成功

七、总结

本教程演示了 Air8000 如何使用 AGPS 来进行快速定位,并讲解了 AGPS 的实现原理以及注意事项。

八 、GPS 常见名词解释

[1]GNSS:混合定位,不同于 GPS 定位,狭义上讲的 GPS 系统,单指美国的 24 颗 GPS 卫星以及地面上 1 个主控站、3 个数据注入站和 5 个监测站及作为用户端的 GPS 接收机组成的一整套系统。GNSS 是指通过观测 GNSS 卫星获得坐标系内绝对定位坐标的测量技术。 GNSS 是所有导航定位卫星的总称,凡是可以通过捕获跟踪其卫星信号实现定位的系统,均可纳入 GNSS 系统的范围。国内用户接触最多的应该是美国的 24 颗 GPS 卫星,以及中国的北斗卫星(截至到 2023 年 5 月 17 日 10 时 49 分,中国已有五十六颗北斗导航卫星),其余还有俄罗斯 GLONASS、欧盟 GALILEO、 日本的准天顶卫星系统、印度的 IRNSS(独立的区域导航系统,覆盖印度领土及周边 1500 km 范围内,提供定位精度优于 20 米的服务)等其余定位系统。

[2]冷启动:指在一个陌生的环境下启动 GPS,直到 GPS 芯片和可用卫星联系并且计算出坐标的过程。以下几种情况开机均属冷启动:

初次开机使用时;

电池耗尽导致 GPS 芯片内星历信息丢失时;

关机状态下将接收机移动 1000 公里以上距离。

也就是说,冷启动是通过硬件方式的强制性启动,因为物理距离较远,或者时间间隔很久,GPS 芯片已经把内部的星历信息清除掉,或者内部的星历信息完全失效。GPS 接收机失去卫星参数,或者已经存在的参数和实际接收到卫星参数相差太多,导致 GPS 芯片无法靠星历快速搜星,所以必须从新获得卫星提供的坐标数据。

这也是很多定位器(譬如车载定位器)启动后,搜星时间长、定位耗时久的原因

[3]热启动:指在上次关机的地方没有过多移动过,且距离上次定位时间小于 1 个小时。再次定位时,GPS 芯片通过软件的方式,可以继续使用之前的星历快速搜星,实现秒定位。PS:普通的 GNSS 芯片,星历最长有效期为 12 小时,故此星历过期后,GPS 芯片无法使用星历实现快速定位。

[4]温启动:指距离上次定位时间超过 1 个小时的启动,搜星定位时间介于冷启动和热启动之间的情况。

譬如某时间使用过 GPS 定位实现 3D FIX,GPS 芯片内部生成星历(或者外部灌入 AGPS 数据),那么在 1 小时内启动 GPS 芯片进行定位的行为就属于温启动。启动后,GPS 芯片首先会输出上次的位置信息。因为上次关机前的经纬度和高度已知,但由于关机时间过长,卫星状态发生了变化,之前 3D FIX 时的卫星接受不到了,所以星历中参数中的若干颗卫星已经和 GPS 接收机失去了联系,GPS 芯片需要继续搜星补充位置信息,所以搜星的时间要长于热启动,短于冷启动。

[5]星历:是用于描述太空飞行体位置和速度的表达式———两行式轨道数据系统。卫星、航天器或飞行体一旦进入太空,即被列入 NORAD 卫星星历编号目录。列入 NORAD 卫星星历编号目录的太空飞行体将被终生跟踪。卫星、火箭残骸等飞行体成为太空垃圾时,仍被列入 NORAD 卫星编号目录,直到目标消失。卫星星历以开普勒定律的 6 个轨道参数之间的数学关系确定飞行体的时间、坐标、方位、速度等各项参数,具有极高的精度。卫星星历能精确计算、预测、描绘、跟踪卫星、飞行体的时间、位置、速度等运行状态;能表达天体、卫星、航天器、导弹、太空垃圾等飞行体的精确参数;能将飞行体置于三维的空间;用时间立体描绘天体的过去、现在和将来。卫星星历的时间按世界标准时间(UTC)计算。卫星星历定时更新。

[6]AGPS:辅助全球卫星定位系统(英语:Assisted Global Positioning System,简称:AGPS)指的是一种 GPS 的运行方式。它可以利用地面基地站的资讯,配合传统 GPS 卫星,让定位的速度更快

[7]有源天线:通常对于设备或车载机而言,由于设备与 GPS 接收模块之间往往有距离,考虑到安装的便利性可能会有超过 1 米的距离,在这种情况下我们只能选择有源 GPS 天线,由于天线长度的信号衰减需要进行补偿,一般有两级低噪声放大器(LNA)进行天线前端信号放大,放大后的信号经电缆输出,电缆同步提供 LNA 所需要的直流电压

由于天线收到的信号在有源天线接受头内完成信号接受与天线放大,并且远离 GPS 设备或其他电器设备,干扰源最小,而且安装位置由于天线距离延长安装位置可以选择非常理想的环境,所以实际使用时往往感觉信号较强

[8]无源天线:使用无源 GPS 天线时,由于只有一个陶瓷片接收天空的卫星信号,直接连接到模块的 RF-IN 脚,这种联接方式结构简单,而且标准的 25254 的陶瓷片成本低廉,技术成熟,占空体积小,适合于强调紧凑型空间 GPS 导航产品,蓝牙 GPS,手机 GPS 及其他小型 GPS 消费类产品。

这种天线的布局是从天线的引脚直达模块的 RF-IN 脚,这根导线需要进行 50 欧阻抗匹配,而且在天线附近不能有电磁干扰,对 PCB 的设计及整机的 EMI 设计要求较高,但如果设计得优良的无源天线 GPS 产品同样有非常好的表现效果,而且功耗比较低,无需考虑天线自身的功耗。

[9]半边天以及开拓地带:GPS 卫星运行在距地 36000KM 的轨道上,信号强度相当弱(GPS 卫星的功率有多大?)。GPS 的民用 C/A 码从卫星发出来的时候信号只有 27W 左右,达到地球的时候在-158.5dBW 以上。用对数形式表示可能不直观,换算成十进制等于将近 0.0000000000000001W,相当小。所以,只有室外开阔的、无遮挡、晴好的地方,才能搜到更多的卫星,SNR 值更高(阴天都会有影响哦),GPS 芯片才能更快、更好的实现定位。

半边天一般指楼宇内窗边,打开窗户,只能搜到一半天空的卫星。

[10]定位纠偏:OpenLuat 的所有 GNSS 模块均使用国际标准 WGS-84 坐标系,所以开发者在国内常见地图定位时,会发现与实际情况有几十米甚至上百米的误差。这并非模块问题, 而是国内地图采用了非标坐标系所致。

国内常见地图如高德地图使用 GCJ-02 坐标系, 百度地图使用 BD-09 坐标系,故此开发者需要对模块输出的经纬度进行加偏处理,才能在国内的地图上实现精确定位,坐标转换可在合宙提供的坐标转换网站上直观的展示处理

[11]重捕:是指接收终端在丢失所接收信号状态下,从重新接收到信号开始,至终端设备输出符合定位精度要求的定位结果所需的时间。失锁重捕时间反映了在接收机信号失锁,定位中断后重新恢复定位的速度。失锁重捕时间短的接收机在易中断环境中(如隧道等)的定位性能好,因此失锁重捕时间可以有效评估车载终端的性能

[12]低噪声放大器:主要用于接收信号的前端,放大天线从空中接收到的微弱信号,降低噪声干扰,以供系统解调出所需的信息数据

🌸 相关推荐

中国十大影帝排名 获得影帝最多的十大男明星 中国影帝大全
宝塔面板+闲置的服务器挖矿(门罗币) – 看看如何换个其他矿池
燕云十六声门派怎么选 各门派特色与选择攻略