在LuatOS exgnss擴展庫的使用中,開發者常因坐標系誤區或模式管理不當踩坑。本秘籍結合實戰經驗,針對Air8000平臺,系統總結常見問題(如WGS-84與國內地圖偏差)、解決方案及最佳實踐,從exgnss.open配置到last_loc數據獲取,提供“避坑”清單,助力開發者高效開發。
一、GNSS 概述
GPS 最先來自美國,1978 年,美國發射了第一顆 GPS 衛星,發明和實踐了衛星定位技術。衛星定位技術原理是,覆蓋全球的多顆定位衛星連續發射一定頻率的無線電信號,移動終端上集成便攜式衛星信號接收機,接收機接收衛星信號并測量衛星到終端接收機之間的距離,最終由移動終端利用多顆衛星位置和與這些衛星的距離計算出移動終端的具體位置。后來出現了歐洲的 Galileo、俄羅斯的 GLONASS、中國的北斗等,所以如今的 GPS 實質上是作為一個衛星定位技術體系 GNSS 的代名詞,而不是單只美國的 GPS 系統。
GNSS 提供的服務包括定位、授時和導航。定位服務就是 GNSS 終端獲得其位置的服務,授時服務就是 GNSS 終端獲得正確時間的服務,導航服務是計算 GNSS 終端速度和運動方向的服務。GNSS 不限制終端數,在 GNSS 衛星信號不被阻擋的情況下,在地球上任何地點、任何時間,任何 GNSS 終端都可以得到正確的位置和時間。定位只需要一個條件,那就是能夠接收到足夠多的衛星信號。因此在室內通常無法定位。
Air8000 作為集成了 4G、Wi-Fi、BLE、GNSS(全球導航衛星系統)等多功能的高性能工業引擎,其內置的 GNSS 模塊能夠提供穩定、準確的定位服務。
二、演示功能概述
使用 Air8000 開發板,single 示例主要是展示 exgnss 庫的三種應用模式,
exgnss.DEFAULT 模式
exgnss.TIMER 模式
主要操作為:
1、打開三種應用模式
2、等待 40 秒關閉操作 TIMER 模式
3、然后查詢三種應用模式是否處于激活模式
4、等待 10 秒關閉全部應用模式,再次查詢三種模式是否處于激活模式
5、然后獲取最后一次的定位經緯度數據打印
6、定位成功之后使用 exgnss 庫獲取 gnss 的 rmc 數據
combination 示例主要展示幾種不同的應用場景:
第一種場景是:正常模式,第一步先是通過 tcp_client_main 文件連接服務器,然后第二步模塊會配置 GNSS 參數,開啟 GNSS 應用,第三步會開啟一個 60s 的定時器,定時器每 60s 會打開一個 60sTIMERRORSUC 應用,第四步定位成功之后關閉 GNSS,然后獲取 rmc 獲取經緯度數據,發送經緯度數據到服務器上。
第二種場景是:低功耗模式,第一步先是通過 tcp_client_main 文件連接服務器,然后第二步模塊會配置 GNSS 參數,開啟 GNSS 應用,第三步會開啟一個 60s 的定時器,定時器每 60s 會進入正常模式,打開一個 60sTIMERRORSUC 應用,第四步定位成功之后關閉 GNSS,然后獲取 rmc 獲取經緯度數據,發送經緯度數據到服務器上,進入低功耗模式。
第三種場景是:PSM+ 模式,喚醒之后第一步是配置 GNSS 參數,開啟 GNSS 應用,第二步定位成功之后關閉 GNSS,然后獲取 rmc 獲取經緯度數據,拼接喚醒信息和經緯度信息,連接服務器,然后把數據發送數據到服務器上,配置休眠喚醒定時器 ,進入飛行模式,然后進入 PSM+ 模式。
第四種場景是:三軸加速度的應用場景,第一步先是通過 tcp_client_main 文件連接服務器,第二步配置 GNSS 參數,打開內部加速傳感器,設置防抖和中斷模式,關于中斷觸發提供了兩種方案,有效震動模式和持續震動檢測模式,第三步檢測到有效震動或者持續震動后,打開 GNSS,每隔 5s 獲取 rmc 獲取經緯度數據,發送經緯度數據到服務器上。
三、準備硬件環境
本篇教程用 Air8000 開發板來開發調試。
1. Air8000 開發板
2. GNSS 天線
四、準備軟件環境
1. 燒錄工具Luatools;
2. 內核固件文件(底層 core 固件文件):LuatOS-SoC_V2014_Air8000;此頁面有新版本固件的話選用最新版本固件,本次操作用的是 101 號固件,可以根據自己的需求選擇自己需要的固件。
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;
準備好軟件環境之后,接下來查看如何燒錄項目文件到 Air8000 開發板中,將本篇文章中演示使用的項目文件燒錄到 Air8000 開發板中。
五、GNSS 軟硬件參考
5.1 API 接口介紹
本教程使用 api 接口為:
https://docs.openluat.com/osapi/ext/exgnss/
5.2 GNSS 硬件設計
GNSS 在硬件設計中天線部分是比較關鍵的,可以參考這篇文章:Air8000 GNSS 硬件設計指導;https://docs.openluat.com/air8000/luatos/hardware/design/gnssant/
在開發板上,內置了 3.3V LDO, 用于有源天線供電。因此可以使用外部有源天線直接連接 GNSS 連接器。
注意:目前有源天線供電僅支持 3.3V 有源天線,請注意連接的有源天線的供電范圍。
六、代碼示例介紹
本文主要提供 2 個 demo 目錄,single 和 combination,其中 single 只是對 exgnss 庫的三種 GNSS 應用的展示,combination 主要是提供了四種應用場景
noraml:正常功耗模式定位
lowpower:低功耗模式
psm:PSM+ 模式
vibration:三軸加速度傳感器觸發定位
6.1 exgnss 的三種應用的用法
6.1.1 exgnss 的應用說明
關于 exgnss 庫的三種應用說明:

關于應用需要注意的是:使用 exgnss.close()關閉的只是對應的應用,所有應用關閉,gnss 也會關閉,這樣做的好處是可以處理不同場景下的不同邏輯,比如服務器下發一條定位指令,定位成功之后關掉,這個時候又下發了一個指令需要長開啟定位,這樣兩種指令就會沖突,需要代碼去處理到底是不是要關掉 gnss,這個時候應用的好處就體現出來了,開啟 exgnss.TIMERORSUC 第一個應用,定位成功之后關掉對應的應用,同時開啟 exgnss.DEFAULT 第二個應用,gnss 就會常開,在應用 1 結束之后,只會對應用進行自動關閉,不會影響到第二個應用,gnss 還會處于常開狀態。
關于 agps 輔助定位的邏輯:agps 俗稱輔助定位,其邏輯是把星歷文件發送給 gnss 芯片,同時發送時間和用基站定位獲取的大概位置,然后芯片解析處理,達到快速定位的效果。
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.開啟協程,運行 gnss_fnc 函數,通過 exgnss.setup(gnssotps)配置 gnss 的參數,通過 exgnss.open 開啟三種不同的應用
2.等待 40 秒使用 exgnss.close 關閉 TIMER 模式,使用 exgnss.close 需要兩個參數,第一個是 exgnss 應用模式,第二個是 tag 標簽
3.然后利用 exgnss.is_active 查詢三種應用模式是否處于激活模式,查詢應用是否處于激活狀態同樣需要兩個參數,第一個是 exgnss 應用模式,第二個是 tag 標簽
4.等待 10 秒使用 exgnss.close_all 關閉全部應用模式,再次查詢三種模式是否處于激活模式
5.然后使用 xgnss.last_loc 獲取最后一次的定位經緯度數據打印
6.定位成功之后使用 subscribe 訂閱"GNSS_STATE"消息,根據獲取到的值判斷是否定位成功,定位成功用 exgnss.rmc 獲取 rmc 數據

6.1.3 效果展示





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

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

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

6.2.2 效果展示



測試服務器收到消息:

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

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

6.3.2 效果展示


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

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

6.4.2 效果展示


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

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

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

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



有效震動模式:



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

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

tcp_client_reveiver.lua

tcp_client_sender.lua

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

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

今天的內容就分享到這里了~
審核編輯 黃宇
-
GNSS
+關注
關注
9文章
955瀏覽量
50774 -
LuatOS
+關注
關注
0文章
134瀏覽量
2588
發布評論請先 登錄
LuatOS exgnss擴展庫實戰進階:GNSS功能開發全流程!
技術篇——Air8000開發板,一站式滿足多功能高擴展開發需求!
北斗GPS雙模賦能Air8000:定位精度革命與天線設計優化的實踐路徑
LuatOS藍牙配網全流程解析:Air8000開發入門必備
LuatOS藍牙配網開發全攻略:以Air8000為核心實戰教學
從零到一:基于Air8000的LuatOS softAP配網功能開發教程
高效開發:解鎖Air8000 LuatOS softAP配網功能的核心技術!
揭秘Air8000對講黑科技:AirTalk+MQTT開發示例深度解析
是否必須使用LuatIO?Air8000 GPIO配置與設計規范深度解析
告別代碼迷宮!exgnss擴展庫讓GNSS定位開發秒變簡單
Air8000-LuatOS exvib擴展庫使用全流程:實戰驅動的操作解析
Air8000-LuatOS exvib擴展庫實操指南:全流程技術細節深度解讀

Air8000 LuatOS exgnss擴展庫應用秘籍:定位開發避坑指南!
評論