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