nmea_navsat_driver – 【ROS 學習筆記】

GPS 一般透過 Serial Port 連接 PC,以 NMEA 語句傳輸定位資料。除了自己寫 Serial Reader 讀取資料以外, ROS 或 Python 都有提供許多 Tool 或 Libary。本篇記錄在 ROS2 環境使用開源專案 nmea_navsat_driver,接收 NMEA 資料的過程。

nmea_navsat_driver

nmea_navsat_driver 是 ROS 官方收錄的 Package:

http://wiki.ros.org/nmea_navsat_driver

Github 網址:

https://github.com/ros-drivers/nmea_navsat_driver/tree/master

NMEA 語句是現今 GPS / GNSS 使用的標準資料傳輸語句,定義了資料封包類型、名稱與其內的欄位,包含像是時間、經緯度、速度、衛星狀態等等,我自己常用的 NMEA 查詢網站是 Trimble 的網頁:

https://receiverhelp.trimble.com/alloy-gnss/en-us/NMEA-0183messages_MessageOverview.html

nmea_navsat_driver支援 Serial 及 Socket 兩種通訊方式,本篇只關注 Serial 的部分。

nmea_navsat_driver會發布三種 GPS / GNSS 相關的 topic:

使用的 message type 可以自行在 ROS 官網找到對應的定義:

http://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/NavSatFix.html

nmea_navsat_driver的功能就是把 NMEA 封包的內容, Parser 並依欄位放置到這些 message 內,像是經緯度等。

使用步驟

下載完 source code 之後,先在 config 路徑底下找到 nmea_serial_driver.yaml,打開並修改兩個必要參數,即設備連結的 Serial port name 與其 baudrate。

useRMC 是設定是否要 Parser NMEA RMC message,因為 RMC 的內容與其他 NMEA message 部分重疊, 因此會有一些取代作用,具體邏輯與效果可以參考 src 路徑底下的 driver.py。 useENU 是我自行增加的參數,可以將經緯度坐標轉為 ENU (East-North-Up frame) 坐標,這邊就不多贅述,有機會再補充。


改完設定後,就可以在主目錄下編譯,指令如下:

colcon build
. install/setup.bash

因為本篇是下載 ROS2 branch 使用,所以運行指令與 ROS 1 不同,指令如下:

ros2 launch nmea_navsat_driver nmea_serial_driver.launch.py

使用指令檢查 topic 輸出,應會看到下圖的畫面:

ros2 topic echo /fix

程式碼簡介

src/libnmea_navsat_driver/nodes 路徑底下的 nmea_serial_driver.py 是 Serial 傳輸功能的主程式所在。主要作用是啟動在 driver.py 內定義的 Ros2NMEADriver node,以執行整個 NMEA parser 與發佈 GPS 資料的功能。同時也在此處建立 Serial port 的連接。

src/libnmea_navsat_driver路徑底下程式碼只有三個檔案: parser.py、 driver.py、 checksum_utils.py。 parser.py 的作用是處理 NMEA 語句,基於 NMEA 格式拆解資料封包,並做必要的單位轉換,根據 NMEA 標準建置的 parser map 如下圖:

nmea_navsat_driver

driver.py 則是接收 parser.py 回傳的結果,並依條件分類挑選,將需要的訊息放到對應的 ROS msg 內,此時就遵循 ROS GPS 相關 msg 的定義。部分節錄如下:

最後的 checksum_ulils.py 是依據 NMEA 語句的規則與接收到的 NMEA 語句內容,產生本地端的 checksum,與接收到的 NMEA 語句內的 checksum 比對,判斷接收到的封包是否完整正確。

https://mapostech.com/gnss-nmea/
上一篇:
下一篇: