気圧と健康の気象病予報士@東京

OpenWeatherMapのデータと生成AIを用いて記事を作成しています

Python と UBX コマンドで更新レートを変更

$ htop

QZSS「みちびき」の災害・危機管理通報サービス(災危通報)のスクリプトについて。UBX コマンドを利用して、更新レートを 5Hz にする、Python スクリプトです。GNSS受信基板 GR-M10-RP を使用しています。ボーレートは、すでに、115200 になっていることに注意してください(デフォルトでは、115200 とは違う値になっています)。下記のスクリプトを実行して、更新レートを変更し、受信を開始したら、確かに出力が早くなっています。ただし、CPU への負荷も大きくなります。「家電のケンちゃん」の URL を見ると、こちらの商品、最大更新レートは「10Hz」と紹介されています。ですが、今回のスクリプトでは、5Hz に変更しています。

www.kadenken.com

prioris.jp

import serial
import time
import binascii

# シリアルポートの設定
port = '/dev/ttyS0'
baudrate = 115200

# UBXコマンドの定義
# 更新レートを5Hz(200ms)に設定するためのVALSETコマンド
UBX_VALSET_5HZ = bytes.fromhex('B5 62 06 8A 0A 00 01 01 00 00 01 00 21 30 C8 00 B6 8B')

# 現在の設定を取得するためのVALGETコマンド
UBX_CFG_VALGET = bytes.fromhex('B5 62 06 8B 08 00 00 00 00 00 01 00 21 30 EB 07')

def send_ubx_command(command):
    try:
        with serial.Serial(port, baudrate, timeout=5) as ser:
            ser.write(command)
            time.sleep(1)  # デバイスが応答するまで少し待つ
            response = ser.read(100)  # 適切なバイト数を設定してください
            return response
    except serial.SerialException as e:
        print(f"SerialException: {e}")
        return None

def set_update_rate():
    print("Setting update rate to 5Hz...")
    response = send_ubx_command(UBX_VALSET_5HZ)
    if response:
        print("Response:", response.hex())
    else:
        print("Failed to set update rate.")

def get_update_rate():
    print("Getting current update rate...")
    response = send_ubx_command(UBX_CFG_VALGET)
    if response:
        print("Response:", response.hex())
        binary_response = binascii.unhexlify(response.hex())
        if binary_response[:2] == b'\xb5\x62':  # UBXヘッダー
            class_id = binary_response[2]
            msg_id = binary_response[3]
            payload_length = int.from_bytes(binary_response[4:6], 'little')
            payload = binary_response[6:6+payload_length]
            checksum = binary_response[6+payload_length:6+payload_length+2]

            print(f"Class ID: {class_id}")
            print(f"Message ID: {msg_id}")
            print(f"Payload Length: {payload_length}")
            print(f"Payload: {payload.hex()}")
            print(f"Checksum: {checksum.hex()}")

            # CFG-RATE-MEASの設定値を抽出
            if class_id == 0x06 and msg_id == 0x8B:  # CFG-VALGET
                rate_meas = int.from_bytes(payload[8:12], 'little')
                print(f"CFG-RATE-MEAS: {rate_meas} ms")
                if rate_meas == 200:
                    print("更新レートは5Hz(200ms)に設定されています。")
                else:
                    print(f"更新レートは{rate_meas} msに設定されています。")
        else:
            print("Invalid UBX response")
    else:
        print("Failed to get update rate.")

if __name__ == "__main__":
    set_update_rate()
    time.sleep(2)  # 設定が反映されるまで少し待つ
    get_update_rate()