えいあーるれいの技術日記

ROS2やM5 Stack、Ubuntuについて書いています

USB接続のハイコスパu-blox GNSSを買った(ROS2)

秋月に行ったところ、またしても何か買ってきてしまいました。

今回はGNSSを購入しました。


GNSS(衛星測位システム)は「GPS」という名前で知られる時刻取得・測位システムで、スマートフォン・カーナビや自動運転などの技術に必須なシステムとなっています。

複数の衛星から受信機を介して位置を計算してコンピュータで受信を行うことで時刻と測位情報を取得可能です。

受信モジュール自体は1000円くらいから入手でき、追加でアンテナやコネクタを購入します。


今回購入したu-blox m8モジュールはアンテナ付き・USB給電・接続可能なモデルで¥2600で購入できるのでハイコスパで便利です。

5年前にディスコンしているのはかなり難点ですが…


UBX-M8030

UBX-M8030はu-blox製の標準的なGNSSモジュールです。

L1のみ対応となっていますが、u-bloxGUIアプリケーション「u-center」の設定によっては10Hz出力や接続先の衛星の設定を変えたりできます。

GUIで詳細に設定できてドキュメントが充実しているGNSSとしては激安ですね。

www.u-blox.com

RTKやマルチバンドには対応していないので、これらを使いたい場合はZED F9Pなどの高精度GNSSを購入するといいでしょう。


設定

ここからはWindows11 Homeを使用します。

u-centerのダウンロード

秋月のページから確認することもできます。

まず、以下のページからu-centerのダウンロードを行います。(u-center2ではありません!)

www.u-blox.com


ドライバのアンインストールとインストール

Windows11では正しくドライバが認識しないようで、デバイスマネージャーを開くと「THIS IS NOT PROLIFIC PL2303. PLEASE CONTACT YOUR SUPPLIER.」という名前で認識されていました。

これを右クリック→アンインストールでアンインストールしてから、秋月のページから PL2303G_Prolific_DriverInstaller_v130.zip をダウンロードします。

中に入っている PL2303G_130_20190311.exe を実行してドライバをインストールすると正しく認識されるようになります。


設定

Windows11上で次の項目を上から順に設定しました。

  • ボーレート:115200 
  • 更新頻度:10Hz
  • 出力フォーマット:NMEA・GPRMC

ボーレートは更新頻度を10Hzにするために上げます。


NMEAフォーマットは以下のサイトで詳しく解説しています。

www.hiramine.com


u-centerを開くと、次のようなウィンドウが開くので赤枠のプルダウンからポートを選択して矢印の接続ボタンを押して接続します。

ボーレートは購入初期状態では9600になっています。


まず、ボーレートを115200にします。

設定画面を開く場合は、 View(F9) からMessage ViewUBX を選択します。

ボーレートは UBXCFGPRT を選択して Baudrate で設定します。

設定したら一旦 sendを押します。

最後に CFGCFG に移動して保存します。

保存すると、接続が切れてしまうので、ボーレートを115200に設定してから再度ポートを開きます。


次に周期を設定します。

CFGRATE を選択して Measurement Period を調整します。

buadrateと同様に保存します。


最後にフォーマットを設定します。

CFGMSG を選択して Message を調整します。

チェック項目はデフォルトで大丈夫だと思います。

buadrateと同様に保存します。


Ubuntu22での動作

ここからはUbuntu22での作業になります。

Ubuntuの場合、デフォルトのドライバで/dev/ttyUSB0 に接続されます。

ボーレートを115200にした場合、catコマンドで出力を確認できます。

ROS2での動作

ROS2では nmea_navsat_driver で動作できます。(Ubloxではうまく動きませんでした…)

github.com

aptでインストールできないので、ビルドする必要があります。

必要に応じて依存関係をダウンロードしてください。

mkdir ws_nmea/src -p
cd ws_nmea/src
git clone https://github.com/ros-drivers/nmea_navsat_driver -b ros2

sudo apt install ros-humble-tf-transformations
sudo pip3 install transforms3d

cd ..
colcon build

バイスの設定については、 nmea_serial_driver.yaml を編集します。

nmea_navsat_driver:
  ros__parameters:
    port: "/dev/ttyUSB0"
    baud: 115200
    frame_id: "gps"
    time_ref_source: "gps"
    useRMC: False


実行は以下のコマンドで実行します。

source ~/ws_nmea/install.bash
ros2 launch nmea_navsat_driver nmea_serial_driver.launch.py

ros2トピックの確認は次のコマンドで確認できます。

source ~/ws_nmea/install.bash
ros2 topic echo /fix

データ型は sensor_msgs/msg/NavSatFix です。

最初は受信待ちをするため位置が決まりませんが、しばらくすると受信できるようになります。

データの status/status を確認するといいでしょう。


補足: /dev/ttyUSB0 で接続したくない場合

他のUSBシリアルモジュールを接続すると、ttyUSB0だと不都合が起こる場合があります。

固有IDを使って接続する方法はいくつかありますが、私はudevルールを編集してシンボリックリンクを貼る方法を使っているので紹介します。

ここでは、 gnssが接続されたときに /dev/ttyUSBx 以外に /dev/gnssx/dev/ublox-m8-xシンボリックリンクを貼ります。


lsusb でIDを確認した上で次のコマンドを入力します。

lsusbの結果

VENDORは 067b、PRODUCTは 2303でした

echo 'SUBSYSTEM=="tty", ATTRS{idVendor}=="067b", ATTRS{idProduct}=="2303", SYMLINK+="gnss%n", SYMLINK+="ublox-m8-%n", MODE="0666"' > ./99-ublox-m8.rules
sudo cp ./99-ublox-m8.rules /etc/udev/rules.d/99-ublox-m8.rules
sudo udevadm control --reload-rules
sudo udevadm trigger

これで /dev/gnss0 を指定してデバイスを接続できるようになります。