GNSS功能開發(fā)涉及多環(huán)節(jié)協(xié)同,LuatOS exgnss擴展庫是其中的關鍵樞紐。本文以全流程探秘形式,從硬件準備、固件燒錄到代碼實現(xiàn),詳解exgnss庫的setup配置、模式生命周期管理及定位數(shù)據(jù)處理,融入?yún)f(xié)程調(diào)度與消息機制,為進階開發(fā)者提供深度洞察,提升開發(fā)效率與系統(tǒng)性能。
一、GNSS 概述
GPS 最先來自美國,1978 年,美國發(fā)射了第一顆 GPS 衛(wèi)星,發(fā)明和實踐了衛(wèi)星定位技術。衛(wèi)星定位技術原理是,覆蓋全球的多顆定位衛(wèi)星連續(xù)發(fā)射一定頻率的無線電信號,移動終端上集成便攜式衛(wèi)星信號接收機,接收機接收衛(wèi)星信號并測量衛(wèi)星到終端接收機之間的距離,最終由移動終端利用多顆衛(wèi)星位置和與這些衛(wèi)星的距離計算出移動終端的具體位置。后來出現(xiàn)了歐洲的 Galileo、俄羅斯的 GLONASS、中國的北斗等,所以如今的 GPS 實質(zhì)上是作為一個衛(wèi)星定位技術體系 GNSS 的代名詞,而不是單只美國的 GPS 系統(tǒng)。
GNSS 提供的服務包括定位、授時和導航。定位服務就是 GNSS 終端獲得其位置的服務,授時服務就是 GNSS 終端獲得正確時間的服務,導航服務是計算 GNSS 終端速度和運動方向的服務。GNSS 不限制終端數(shù),在 GNSS 衛(wèi)星信號不被阻擋的情況下,在地球上任何地點、任何時間,任何 GNSS 終端都可以得到正確的位置和時間。定位只需要一個條件,那就是能夠接收到足夠多的衛(wèi)星信號。因此在室內(nèi)通常無法定位。
Air8000 作為集成了 4G、Wi-Fi、BLE、GNSS(全球導航衛(wèi)星系統(tǒng))等多功能的高性能工業(yè)引擎,其內(nèi)置的 GNSS 模塊能夠提供穩(wěn)定、準確的定位服務。
二、演示功能概述
使用 Air8000 開發(fā)板,single 示例主要是展示 exgnss 庫的三種應用模式,
exgnss.DEFAULT 模式
exgnss.TIMER 模式
主要操作為:
1、打開三種應用模式
2、等待 40 秒關閉操作 TIMER 模式
3、然后查詢?nèi)N應用模式是否處于激活模式
4、等待 10 秒關閉全部應用模式,再次查詢?nèi)N模式是否處于激活模式
5、然后獲取最后一次的定位經(jīng)緯度數(shù)據(jù)打印
6、定位成功之后使用 exgnss 庫獲取 gnss 的 rmc 數(shù)據(jù)
combination 示例主要展示幾種不同的應用場景:
第一種場景是:正常模式,第一步先是通過 tcp_client_main 文件連接服務器,然后第二步模塊會配置 GNSS 參數(shù),開啟 GNSS 應用,第三步會開啟一個 60s 的定時器,定時器每 60s 會打開一個 60sTIMERRORSUC 應用,第四步定位成功之后關閉 GNSS,然后獲取 rmc 獲取經(jīng)緯度數(shù)據(jù),發(fā)送經(jīng)緯度數(shù)據(jù)到服務器上。
第二種場景是:低功耗模式,第一步先是通過 tcp_client_main 文件連接服務器,然后第二步模塊會配置 GNSS 參數(shù),開啟 GNSS 應用,第三步會開啟一個 60s 的定時器,定時器每 60s 會進入正常模式,打開一個 60sTIMERRORSUC 應用,第四步定位成功之后關閉 GNSS,然后獲取 rmc 獲取經(jīng)緯度數(shù)據(jù),發(fā)送經(jīng)緯度數(shù)據(jù)到服務器上,進入低功耗模式。
第三種場景是:PSM+ 模式,喚醒之后第一步是配置 GNSS 參數(shù),開啟 GNSS 應用,第二步定位成功之后關閉 GNSS,然后獲取 rmc 獲取經(jīng)緯度數(shù)據(jù),拼接喚醒信息和經(jīng)緯度信息,連接服務器,然后把數(shù)據(jù)發(fā)送數(shù)據(jù)到服務器上,配置休眠喚醒定時器 ,進入飛行模式,然后進入 PSM+ 模式。
第四種場景是:三軸加速度的應用場景,第一步先是通過 tcp_client_main 文件連接服務器,第二步配置 GNSS 參數(shù),打開內(nèi)部加速傳感器,設置防抖和中斷模式,關于中斷觸發(fā)提供了兩種方案,有效震動模式和持續(xù)震動檢測模式,第三步檢測到有效震動或者持續(xù)震動后,打開 GNSS,每隔 5s 獲取 rmc 獲取經(jīng)緯度數(shù)據(jù),發(fā)送經(jīng)緯度數(shù)據(jù)到服務器上。
三、準備硬件環(huán)境
本篇教程用 Air8000 開發(fā)板來開發(fā)調(diào)試。
1. Air8000 開發(fā)板
2. GNSS 天線
四、準備軟件環(huán)境
1. 燒錄工具Luatools;
2. 內(nèi)核固件文件(底層 core 固件文件):LuatOS-SoC_V2014_Air8000;此頁面有新版本固件的話選用最新版本固件,本次操作用的是 101 號固件,可以根據(jù)自己的需求選擇自己需要的固件。
3. LuatOS 需要的腳本和資源文件:https://gitee.com/openLuat/LuatOS/tree/master/module/Air8000/demo/gnss
4. lib 腳本文件:使用 Luatools 燒錄時,勾選 添加默認 lib 選項,使用默認 lib 腳本文件,如果沒有下載最新的 lib,可以在 luatos 庫里面下載最新的 lib 使用:https://gitee.com/openLuat/LuatOS/tree/master/script/libs;
準備好軟件環(huán)境之后,接下來查看如何燒錄項目文件到 Air8000 開發(fā)板中,將本篇文章中演示使用的項目文件燒錄到 Air8000 開發(fā)板中。
五、GNSS 軟硬件參考
本教程使用 api 接口為:
https://docs.openluat.com/osapi/ext/exgnss/
5.2 GNSS 硬件設計
GNSS 在硬件設計中天線部分是比較關鍵的,可以參考這篇文章:Air8000 GNSS 硬件設計指導;https://docs.openluat.com/air8000/luatos/hardware/design/gnssant/
在開發(fā)板上,內(nèi)置了 3.3V LDO, 用于有源天線供電。因此可以使用外部有源天線直接連接 GNSS 連接器。
注意:目前有源天線供電僅支持 3.3V 有源天線,請注意連接的有源天線的供電范圍。
六、代碼示例介紹
本文主要提供 2 個 demo 目錄,single 和 combination,其中 single 只是對 exgnss 庫的三種 GNSS 應用的展示,combination 主要是提供了四種應用場景
noraml:正常功耗模式定位
lowpower:低功耗模式
psm:PSM+ 模式
vibration:三軸加速度傳感器觸發(fā)定位
6.1 exgnss 的三種應用的用法
6.1.1 exgnss 的應用說明
關于 exgnss 庫的三種應用說明:

關于應用需要注意的是:使用 exgnss.close()關閉的只是對應的應用,所有應用關閉,gnss 也會關閉,這樣做的好處是可以處理不同場景下的不同邏輯,比如服務器下發(fā)一條定位指令,定位成功之后關掉,這個時候又下發(fā)了一個指令需要長開啟定位,這樣兩種指令就會沖突,需要代碼去處理到底是不是要關掉 gnss,這個時候應用的好處就體現(xiàn)出來了,開啟 exgnss.TIMERORSUC 第一個應用,定位成功之后關掉對應的應用,同時開啟 exgnss.DEFAULT 第二個應用,gnss 就會常開,在應用 1 結束之后,只會對應用進行自動關閉,不會影響到第二個應用,gnss 還會處于常開狀態(tài)。
關于 agps 輔助定位的邏輯:agps 俗稱輔助定位,其邏輯是把星歷文件發(fā)送給 gnss 芯片,同時發(fā)送時間和用基站定位獲取的大概位置,然后芯片解析處理,達到快速定位的效果。
exgnss 擴展庫的輔助定位功能,我們處理方式是每個小時都會去更新星歷,原因是北斗是 1h 一更新,gps 是 4h 一更新,所以取最小值,我們選擇了一小時一更新
對于輔助定位需要注意的是,因為輔助定位屬于強行把星歷文件灌給 gnss 芯片,雖然可以達到快速定位的效果,但是 gnss 芯片實際解析星歷需要時間,exgnss 庫默認開啟了一個 20s 的 gnss 應用,做這個操作是因為,假設開啟輔助定位,定位到之后立馬關掉 gnss 電源,會導致 gnss 星歷解析不完全,這樣會影響下次定位為冷啟動,冷啟動時間大概需要 35s。如果不需要這個邏輯,可以接受冷啟動,或者每次都使用輔助定位,可以通過 exgnss.setup()的 auto_open=false 配置添加到配置表里面。
6.1.2 代碼講解
main.lua
主要是為了加載了 exgnss 擴展庫,加載 gnss 代碼

gnss.lua
主要操作為:
1.開啟協(xié)程,運行 gnss_fnc 函數(shù),通過 exgnss.setup(gnssotps)配置 gnss 的參數(shù),通過 exgnss.open 開啟三種不同的應用
2.等待 40 秒使用 exgnss.close 關閉 TIMER 模式,使用 exgnss.close 需要兩個參數(shù),第一個是 exgnss 應用模式,第二個是 tag 標簽
3.然后利用 exgnss.is_active 查詢?nèi)N應用模式是否處于激活模式,查詢應用是否處于激活狀態(tài)同樣需要兩個參數(shù),第一個是 exgnss 應用模式,第二個是 tag 標簽
4.等待 10 秒使用 exgnss.close_all 關閉全部應用模式,再次查詢?nèi)N模式是否處于激活模式
5.然后使用 xgnss.last_loc 獲取最后一次的定位經(jīng)緯度數(shù)據(jù)打印
6.定位成功之后使用 subscribe 訂閱"GNSS_STATE"消息,根據(jù)獲取到的值判斷是否定位成功,定位成功用 exgnss.rmc 獲取 rmc 數(shù)據(jù)

6.1.3 效果展示





利用糾偏網(wǎng)站進行糾偏:合宙所有的 GNSS 功能的坐標系均使用國際標準 WGS-84 坐標系,所以開發(fā)者在國內(nèi)常見地圖定位時,會發(fā)現(xiàn)與實際情況有幾十米的誤差。這并非模塊問題, 而是國內(nèi)地圖采用了非標坐標系所致。 國內(nèi)常見地圖如高德地圖使用 GCJ-02 坐標系, 百度地圖使用 BD-09 坐標系,故此開發(fā)者需要對模塊輸出的經(jīng)緯度進行加偏處理,才能在國內(nèi)的地圖上實現(xiàn)精確定位。
以下是糾偏網(wǎng)站:
http://old.openluat.com/GPS-Offset.html

6.2 正常功耗模式下的 GNSS 應用
main.lua
主要是支持 4 個場景的切換,每次只能打開一個用于測試,選擇對應的功能進行測試

6.2.1 代碼講解
normal.lua
normal 主要操作:
1.開啟協(xié)程,運行 gnss_fnc 函數(shù),通過 exgnss.setup(gnssotps)配置 gnss 的參數(shù),然后 require tcp_client_main 文件,連接服務器
2.通過 exgnss.open 開啟 exgnss.TIMERORSUC 應用模式,設置的 tag 為 normal,定位時間為 60s,回調(diào)函數(shù)為 normal_cb,這個模式定位成功之后會關掉 GNSS,然后觸發(fā)回調(diào)函數(shù),回調(diào)函數(shù)的操作為,通過 exgnss.rmc(0)接口獲取 rmc 數(shù)據(jù),然后把經(jīng)緯度拼接成 json 字符串的形式,通過 sys.publish 函數(shù),把數(shù)據(jù)傳給 tcp_client_sender.lua 文件里面處理。
3.用 sys.timerLoopStart()起一個 60s 觸發(fā)一次的打開 GNSS 定位的定時器,回調(diào)函數(shù)為 normal_open,回調(diào)函數(shù)內(nèi)容和上面開啟 exgnss.TIMERORSUC 應用模式一致

6.2.2 效果展示



測試服務器收到消息:

利用糾偏網(wǎng)站進行糾偏:所有的 GNSS 功能的坐標系均使用國際標準WGS-84坐標系,所以開發(fā)者在國內(nèi)常見地圖定位時,會發(fā)現(xiàn)與實際情況有幾十米的誤差。這并非模塊問題, 而是國內(nèi)地圖采用了非標坐標系所致。 國內(nèi)常見地圖如高德地圖使用GCJ-02坐標系, 百度地圖使用BD-09坐標系,故此開發(fā)者需要對模塊輸出的經(jīng)緯度進行加偏處理,才能在國內(nèi)的地圖上實現(xiàn)精確定位。
以下是糾偏網(wǎng)站:
http://old.openluat.com/GPS-Offset.html

6.3 低功耗模式下的 GNSS 應用
6.3.1 代碼講解
lowpower.lua
normal 主要操作:
1.開啟協(xié)程,運行 gnss_fnc 函數(shù),通過 exgnss.setup(gnssotps)配置 gnss 的參數(shù),然后 require tcp_client_main 文件,連接服務器。
2.通過 exgnss.open 開啟 exgnss.TIMERORSUC 應用模式,設置的 tag 為 lowpower,定位時間為 60s,回調(diào)函數(shù)為 lowpower_cb,這個模式定位成功之后會關掉 GNSS,然后觸發(fā)回調(diào)函數(shù),回調(diào)函數(shù)的操作為,通過 exgnss.rmc(0)接口獲取 rmc 數(shù)據(jù),然后把經(jīng)緯度拼接成 json 字符串的形式,通過 sys.publish 函數(shù),把數(shù)據(jù)傳給 tcp_client_sender.lua 文件里面處理,然后調(diào)用 pm.power(pm.WORK_MODE, 1)--進入低功耗模式,pm.power(pm.WORK_MODE,1,1)--wifi 進入低功耗模式。這兩個函數(shù)主要是為了讓模塊和 wifi 模塊進入低功耗模式。
3.用 sys.timerLoopStart()起一個 60s 觸發(fā)一次的打開 GNSS 定位的定時器,回調(diào)函數(shù)為 lower_open,回調(diào)函數(shù)內(nèi)容主要是調(diào)用 pm.power(pm.WORK_MODE, 0)進入正常模式,然后和上面開啟 exgnss.TIMERORSUC 應用模式一致,
然后關閉 USB,節(jié)省功耗

6.3.2 效果展示


利用糾偏網(wǎng)站進行糾偏:我們所有的 GNSS 功能的坐標系均使用國際標準WGS-84坐標系,所以開發(fā)者在國內(nèi)常見地圖定位時,會發(fā)現(xiàn)與實際情況有幾十米的誤差。這并非模塊問題, 而是國內(nèi)地圖采用了非標坐標系所致。 國內(nèi)常見地圖如高德地圖使用GCJ-02坐標系, 百度地圖使用BD-09坐標系,故此開發(fā)者需要對模塊輸出的經(jīng)緯度進行加偏處理,才能在國內(nèi)的地圖上實現(xiàn)精確定位。
以下是糾偏網(wǎng)站:
http://old.openluat.com/GPS-Offset.html

6.4 PSM+ 模式下的 GNSS 應用
6.4.1 代碼講解
psm.lua
psm 主要操作:
1.開啟協(xié)程,運行 gnss_fnc 函數(shù),通過 exgnss.setup(gnssotps)配置 gnss 的參數(shù)。
2.通過 exgnss.open 開啟 exgnss.TIMERORSUC 應用模式,設置的 tag 為 psm,定位時間為 60s,回調(diào)函數(shù)為 psm_cb,這個模式定位成功之后會關掉 GNSS,然后觸發(fā)回調(diào)函數(shù),回調(diào)函數(shù)的操作為,通過 exgnss.rmc(0)接口獲取 rmc 數(shù)據(jù),獲取經(jīng)緯度并賦值變量,然后使用 sysplus.taskInitEx 開啟 TCP 短連接協(xié)程,連接服務器發(fā)送經(jīng)緯度消息和喚醒消息內(nèi)容。
3.發(fā)送完畢之后設置定時器,然后進入飛行模式,進入 psm+ 模式

6.4.2 效果展示


利用糾偏網(wǎng)站進行糾偏:我們所有的 GNSS 功能的坐標系均使用國際標準WGS-84坐標系,所以開發(fā)者在國內(nèi)常見地圖定位時,會發(fā)現(xiàn)與實際情況有幾十米的誤差。這并非模塊問題, 而是國內(nèi)地圖采用了非標坐標系所致。 國內(nèi)常見地圖如高德地圖使用GCJ-02坐標系, 百度地圖使用BD-09坐標系,故此開發(fā)者需要對模塊輸出的經(jīng)緯度進行加偏處理,才能在國內(nèi)的地圖上實現(xiàn)精確定位。
以下是糾偏網(wǎng)站:
http://old.openluat.com/GPS-Offset.html

6.5 運動檢測定位模式下的 GNSS 應用
6.5.1 代碼講解
vibration.lua
vibration 主要操作:
1.開啟協(xié)程,運行 gnss_fnc 函數(shù),通過 exgnss.setup(gnssotps)配置 gnss 的參數(shù),然后 require tcp_client_main 文件,連接服務器,require exvib 擴展庫,
2.設置三軸加速度傳感器為微小震動模式 exvib.open(1),關于 exvib 的三種模式:

3.8000 內(nèi)置的三軸加速度傳感器的中斷觸發(fā)腳為 gpio.WAKEUP2,設置 gpio 防抖為 100ms,然后設置中斷觸發(fā)
4.代碼里面提供了兩種觸發(fā)方式:
第一種是持續(xù)震動模式:
加速度傳感器震動之后觸發(fā)中斷,中斷觸發(fā)之后使用 exgnss.open 打開定時器,設置 exgnss.DEFAULT 模式,這種模式是一直開啟 GNSS,直到調(diào)用關閉接口關閉才會關掉,定位成功之后每 5s 上傳一次經(jīng)緯度數(shù)據(jù),
假設 10s 內(nèi)沒有再觸發(fā)震動,則關閉 gnss,等待下一次震動觸發(fā)
第二種方式是有效震動模式:
震動觸發(fā)之后計算為一次觸發(fā),如果 10s 內(nèi)觸發(fā) 5 次有效震動,則開啟后續(xù)邏輯,如果 10s 內(nèi)沒有觸發(fā) 5 次,
則判定為無效震動,等待下一次觸發(fā),如果是有效震動就使用 exgnss.open 打開定時器,設置 exgnss.DEFAULT 模式,進行定位,
定位成功之后每 5s 上傳一次經(jīng)緯度數(shù)據(jù)到服務器,有效震動觸發(fā)之后有 30 分鐘的等待時間,在此期間,如果觸發(fā)有效震動則
不去進行后續(xù)邏輯處理,30 分鐘時間到了之后,等待下一次有效震動
這兩種模式通過打開不同的注釋來執(zhí)行

6.5.2 效果展示
有效中斷模式:



有效震動模式:



利用糾偏網(wǎng)站進行糾偏:所有的 GNSS 功能的坐標系均使用國際標準WGS-84坐標系,所以開發(fā)者在國內(nèi)常見地圖定位時,會發(fā)現(xiàn)與實際情況有幾十米的誤差。這并非模塊問題, 而是國內(nèi)地圖采用了非標坐標系所致。 國內(nèi)常見地圖如高德地圖使用GCJ-02坐標系, 百度地圖使用BD-09坐標系,故此開發(fā)者需要對模塊輸出的經(jīng)緯度進行加偏處理,才能在國內(nèi)的地圖上實現(xiàn)精確定位。
以下是糾偏網(wǎng)站:
http://old.openluat.com/GPS

6.6 TCP 部分代碼
TCP 部分代碼為通用格式內(nèi)容,里面有對注釋的描述,在 GNSS 篇章就不過多對 TCP 的代碼做講解了,如果有需要可以看 TCP 章節(jié)
tcp_client_main.lua

tcp_client_reveiver.lua

tcp_client_sender.lua

將定位成功后的經(jīng)緯度復制到https://www.openluat.com/GPS-Offset.html。可以查看位置信息和坐標系轉換后的經(jīng)緯度。

七、總結
本教程詳細介紹了如何使用 exgnss 擴展庫搭配 Air8000 的 GNSS 功能,包括硬件連接、軟件配置、代碼編寫等步驟。通過本教程的學習,讀者應該能夠掌握 exgnss 擴展庫功能的基本使用方法,并能夠根據(jù)實際需求進行擴展和應用。
八、注意事項與常見問題
8.1、GNSS 定位經(jīng)緯度不準確
1、坐標沒有糾偏,參考:http://www.openluat.com/GPS-Offset.html進行糾偏處理
2、周圍有比較高的障礙物,會導致定位誤差
3、在開闊地帶,正常情況下定位精度只能做到 5 米
4、不能在室內(nèi)測試,必須到室外測試;如果只能在室內(nèi)測試,可以淘寶搜索“GNSS 信號轉發(fā)器”
8.2、Air8000 獲取到的經(jīng)緯度數(shù)據(jù)是基于什么坐標系
使用國際標準 WGS-84 坐標系,需要自己進行坐標系轉換各 GNSS 坐標系說明以及轉換方法。
8.3、GPS 天線如何設計
參考:https://docs.openluat.com/air8000/luatos/hardware/design/gnssant/
8.4、可視衛(wèi)星、可用衛(wèi)星有什么區(qū)別
可視衛(wèi)星是當前區(qū)域,接收條件良好情況下,應該可以收到衛(wèi)星信號的衛(wèi)星。
可用衛(wèi)星是當前已經(jīng)收到信號并正在使用參與定位的衛(wèi)星。
8.5、 GGA 和 RMC 應該用哪個
視具體情況而定,建議用 gga,信息相對更全面。
8.6、如何解讀 NMEA 報文每個字段的含義
參考:NMEA-0183 協(xié)議簡介
8.7、車載使用時需要天線引出到車頂上嗎
1、擋風玻璃如果沒有貼膜或者貼了不含金屬材料的膜,可以放在擋風玻璃下,但是 GNSS 信號會有一定衰減,在萬不得已的情況下,可以放在擋風玻璃下,最好再實際測試確認一下。 2、擋風玻璃如果貼了含有金屬材料的膜,則不能放在擋風玻璃下,必須將天線到車頂。
8.8、如何輸出原始 NMEA 數(shù)據(jù)
可以通過 exgnss.setup()接口的 bind 參數(shù)進行綁定。

今天的內(nèi)容就分享到這里了~
審核編輯 黃宇
-
GNSS
+關注
關注
9文章
944瀏覽量
50656 -
LuatOS
+關注
關注
0文章
134瀏覽量
2541
發(fā)布評論請先 登錄
解鎖LuatOS-log庫:全棧工程師的日志管理實戰(zhàn)課!
全棧開發(fā)進階指南:LuatOS-log庫從入門到實戰(zhàn)!
Air8000 LuatOS exgnss擴展庫應用秘籍:定位開發(fā)避坑指南!
LuatOS開發(fā)之4G模組隨機數(shù)(random)|實戰(zhàn)指南
快速入門——LuatOS:sys庫多任務管理實戰(zhàn)攻略!
SFUD驅動庫實戰(zhàn)手冊:串行SPI Flash開發(fā)全流程解析
告別代碼迷宮!exgnss擴展庫讓GNSS定位開發(fā)秒變簡單
LuatOS下GNSS定位開發(fā)實戰(zhàn):初識定位、NMEA解碼與位置追蹤上報
LuatOS AGPS 輔助定位開發(fā)實戰(zhàn)教程
Air8000-LuatOS exvib擴展庫使用全流程:實戰(zhàn)驅動的操作解析
新手必備:LuatOS MCU核心庫功能測試與實踐指南
LuatOS MCU核心庫全接觸:新手操作與功能測試攻略!

LuatOS exgnss擴展庫實戰(zhàn)進階:GNSS功能開發(fā)全流程!
評論