Ublox ZED-F9P RTK-GNSS 移動局を ROS で使用

通常、UbloxのRTK-GNSSがu-center、RTKLIBで使用していますが、今回ROSで使用するように試しました。

# 使用環境
- Ubuntu 18.04
- Qt Creator 4.12.4
- QT 5.12.5 GCC 64bit
- RTKLIB 2.4.3 b33
- ROS Melodic
- Ublox ZED-F9P (GNSS受信器)
- Ntripサーバー (www.rtk2go.com)

# 使用パッケージ

- [RTKLIB](https://github.com/tomojitakasu/RTKLIB)

Ntripサーバーから基準局情報を取得してUblox ZED-F9Pの移動局に入力する。


- [ublox ROS package](https://github.com/KumarRobotics/ublox)

Ublox ZED-F9PのRTK-GNSS Fix解をシリアルポートから取得してROS Topic　`sensor_msgs/NavSatFix`　で発信。

# 1. RTKLIBを使って基準局情報をUblox ZED-F9Pの移動局に入力

- RTKLIBからソースをダウンロードしてビルド

[RTKLIB 2.4.3 b33](https://github.com/tomojitakasu/RTKLIB)

```
git clone -b rtklib_2.4.3 https://github.com/tomojitakasu/RTKLIB.git
cd RTKLIB/lib/iers/gcc/
make   
cd RTKLIB/app/consapp
make  
```

注：RTKLIB GUI版のインストールは、[RTKLIB 2.4.3 CLI版 GUI版 をUbuntu18.04にインストール](https://qiita.com/k-koh/items/3cf612eb7428375ef2cf)参考します。

- Ntripサーバーから基準局情報を取得してUblox ZED-F9Pの移動局のserial portに入力

Ublox ZED-F9PはRTK測位演算エンジンを内蔵したので、基準局情報を入力すると、RTK測位を行います。

```console
cd str2str/gcc
./str2str -in ntrip://rtk2go.com:2101/[基準局のMountPoint] -out serial://ttyACM0:230400
```

str2str の実行ログ

```console
stream server start
2020/08/15 12:27:23 [WC---]          0 B       0 bps (0) connecting... (1) /dev/ttyACM0 
2020/08/15 12:27:28 [CC---]       3297 B    6527 bps (0) rtk2go.com/[基準局のMountPoint] (1) /dev/ttyACM0
```

ttyACM0: PCに挿した移動局ZED-F9Pのシリアルポート
230400: u-centerで移動局ZED-F9Pのserial baud rateの設定値

(注：RTKLIB GUI版のSTRSVR-QTでも同じ機能を実行できます。)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386259/8459f57d-1fc2-e22a-3844-a376376c7454.png)


# 2. ublox ROS packageで移動局RTK演算結果をROS Topicで発信

- RTKLIBからソースをダウンロードしてビルド

[ublox ROSパッケージ](https://github.com/KumarRobotics/ublox)

```
cd <catkin_ws>/src
git clone https://github.com/KumarRobotics/ublox.git
cd ../
catkin_make
```

- ublox ROSパッケージのパラメータファイルを生成

ublox/ublox_gps/config/zed_f9p_rover.yamlを以下のように生成します。

```yaml
# Configuration Settings for ZED-F9P device
debug: 1                 # Range 0-4 (0 means no debug statements will print)

device: /dev/ttyACM0     # ZED-F9P rover serial port
frame_id: gps

config_on_startup: false # use chip config

uart1:
  baudrate: 230400       # serial port baudrate
  in: 32
  out: 3

# Enable u-blox message publishers
publish:
  all: false
  nav:
    all: true
    relposned: true
    posllh: true
    posecef: true

```

config_on_startupにtrueを設定した場合、ROSパッケージのRTK-GNSS設定でZED-F9Pチップ設定が上書きされるので、解析Fix解が得られない可能性があります。

- ublox ROSパッケージの起動

```console
roslaunch ublox_gps ublox_device.launch node_name:=ublox param_file_name:=zed_f9p_rover
```

roslaunch の実行ログ

```console
SUMMARY
========

CLEAR PARAMETERS
 * /ublox/

PARAMETERS
 * /rosdistro: melodic
 * /rosversion: 1.14.3
 * /ublox/config_on_startup: False
 * /ublox/debug: 1
 * /ublox/device: /dev/ttyACM0
 * /ublox/frame_id: gps
 * /ublox/publish/all: False
 * /ublox/publish/nav/all: True
 * /ublox/publish/nav/posecef: True
 * /ublox/publish/nav/posllh: True
 * /ublox/publish/nav/relposned: True
 * /ublox/uart1/baudrate: 230400
 * /ublox/uart1/in: 32
 * /ublox/uart1/out: 3

NODES
  /
    ublox (ublox_gps/ublox_gps)

auto-starting new master
process[master]: started with pid [7994]
ROS_MASTER_URI=http://localhost:11311

setting /run_id to 9536ba60-def3-11ea-b404-60f81dc512a8
process[rosout-1]: started with pid [8005]
started core service [/rosout]
process[ublox-2]: started with pid [8009]
[ INFO] [1597494836.219074203]: U-Blox: Opened serial port /dev/ttyACM0
[DEBUG] [1597494836.219916723]: U-Blox: current_baudrate 230400
[DEBUG] [1597494836.220839605]: EXT CORE 1.00 (61b2dd), HW VER: 00190000
[DEBUG] [1597494836.220867963]: ROM BASE 0x118B2060
[DEBUG] [1597494836.220893785]: FWVER=HPG 1.12
[DEBUG] [1597494836.220917198]: PROTVER=27.11
[DEBUG] [1597494836.220937605]: MOD=ZED-F9P
[DEBUG] [1597494836.220956464]: GPS;GLO;GAL;BDS
[DEBUG] [1597494836.220976395]: QZSS
[ INFO] [1597494836.221016654]: U-Blox Firmware Version: 9
[ INFO] [1597494836.225839094]: U-Blox configured successfully.
[DEBUG] [1597494836.225872645]: Subscribing to U-Blox messages
[DEBUG] [1597494836.237840788]: Configuring INF messages
[ WARN] [1597494837.616917996]: INF: DGNSS long baseline (62 km)

```

Ros Topic `/ublox/fix` (sensor_msgs/NavSatFix) ログ

```
$ rostopic echo /ublox/fix

---
header: 
  seq: 250
  stamp: 
    secs: 1597544202
    nsecs:     13159
  frame_id: "gps"
status: 
  status: 2
  service: 1
latitude: XX.6383066
longitude: XXX.0486526
altitude: 46.18
position_covariance: [0.002209, 0.0, 0.0, 0.0, 0.002209, 0.0, 0.0, 0.0, 0.0047610000000000005]
position_covariance_type: 2
---

```

status.status = 2 は、基準局を基づいて解析Fix解が得られています。

sensor_msgs/NavSatStatusの定義：

```
# fix is valid when status >= STATUS_FIX.

int8 STATUS_NO_FIX =  -1        # unable to fix position
int8 STATUS_FIX =      0        # unaugmented fix
int8 STATUS_SBAS_FIX = 1        # with satellite-based augmentation
int8 STATUS_GBAS_FIX = 2        # with ground-based augmentation
```

GoogleMAPで`/ublox/fix`の表示確認は、
[RTK-GNSSのNavSatFixデータをGoogleMAPでリアルタイム表示](https://qiita.com/k-koh/items/91d7ea55cbdfc3d3aaf9)を参考します。