ASCIIデータ・状態・コマンド

対象:IMU600-V2/FW 0.11.2/GUI v1.6.1。

完全な通信形式:2. データ出力(2.1–2.5) · 3. 状態と統計(3.1–3.4)。完全な形式と各フィールドを掲載。

形式とタイムスタンプ

$<body>*<XX>\r\n

bodyの先頭はSPNVメッセージ名、以降はカンマ区切りです。XXは$と*の間のASCIIバイトのXORを2桁の16進数で表します。$を行の先頭として読み取り、チェックサムが一致しない行は破棄します。メッセージ名で処理を分け、将来末尾にフィールドが増えても読み取れるようにしてください。

ts_usは起動時に0となる64-bitマイクロ秒時刻で、IMUデータでは積分区間の終端を示します。同一区間の3個のRAWと合成値で共通ですがUTCではありません。角速度は°/s、比力はm/s²、Δθはrad、Δvはm/s、dtはsです。固定1/RATEではなく実際のdtを使います。

def spnv_checksum(body: str) -> str:
    value = 0
    for byte in body.encode("ascii"):
        value ^= byte
    return f"{value:02X}"

body = "SPNVCMD,RATE,100"
command = f"${body}*{spnv_checksum(body)}\r\n".encode("ascii")
# ser.write(command)

主要データフィールド

以下はメッセージ名に続く順序です。実際の行には$、名前、*XX、CRLFも含まれます。

SPNVIMURAW:
id,ts_us,gx,gy,gz,ax,ay,az,temp,n,status,dthx,dthy,dthz,dvx,dvy,dvz,dt

SPNVIMU:
ts_us,gx,gy,gz,ax,ay,az,temp,dthx,dthy,dthz,dvx,dvy,dvz,dt,n_used,flags

SPNVBARO:
ts_us,press_hpa,temp_c,alt_m,status

SPNVAHRS:
ts_us,roll,pitch,yaw,q0,q1,q2,q3,align,flags,bgx,bgy,bgz,zb_s

SPNVPPS:
ts_us,edges,captures,state,err_ppm,age_ms,align

SPNVSTAT:
id,dry,out,crc_err,frame_err,spi_timeout,dropped,dcnt_skip,dry_timeout,dry_kicks,dry_pin,isr_us_max,isr_us_last,isr_cpu,resync[,read_retry,read_bad]

SPNVFUS:
outputs,rej1,rej2,rej3,incomplete,degraded,gth,ath
  • RAWは1区間3行でid = 1/2/3です。nは積分した生サンプル数(50 Hzで約29–30)、Δθ/Δvはconing/sculling補正を含みます。
  • 合成値は1区間1行でn_usedは採用数、used_maskはbinaryのみです。BAROはhPa/°C/ISA高度mで、相対高度の参考用です。status = 0は正常です。
  • AHRS角はdeg、qはbody FRD → NED(q0スカラー)、bgは°/s、zb_sは0–10秒の静止バイアス推定進捗です。STATはIMU別1 Hz統計、FUSは合成統計で、SYSのuart_drop/u2_drop増加は各UARTの帯域不足を示します。

IMU status

statusは区間内の全生サンプルフラグのORです。品質判断にはstatus & 0x7Fを用い、通常は非0のIMUを除外します。ただし3個すべてにエラーフラグがあると3個を使う合成へ戻るため、出力継続だけでは正常とは判断できません。PPSのbit7は別に判定します。

Bit Value Name 意味
0 1 SPI_CRC 内部通信エラー;無効
1 2 CE 無効な要求;生データは有効ですが合成から除外
2 4 IDS 内部データ状態異常;要確認
3 8 S_ERROR 自己診断エラー;無効
4 16 S_SAT 範囲超過;クリッピング
5 32 S_INIT 初期化中(約250 ms);無効
7 128 PPS ts_usがPPS立ち上がりと一致;エラーではない

代表値:0正常、16飽和、12センサーエラー、32/44起動時初期化。

合成flags

Bit Value 意味
0–2 1 / 2 / 4 IMU 1/2/3を除外
3 8 SPREAD_WARN
4 16 DEGRADED:有効IMUが2個未満
5 32 INCOMPLETE:区間内のデータ不足
6 64 SATURATED:少なくとも1個が飽和
7 128 PPS:時刻マーカー

AHRSアラインメントとflags

align 状態
0 初期化中;約1秒静止
1 roll/pitch有効、yawは相対角
2 HDGで方位を手動設定済み
Bit 意味
0 動作中
1 バイアス推定停止中
2 HDGで方位設定
3 今回の更新で加速度計不使用
4 アラインメント中に移動;静止してAHRS,reset
5 10秒以上の静止でバイアス推定済み;警告ではない
6 直近10秒静止と判定;状態表示

設定コマンド

UART1コマンドは常にASCIIで、$SPNVCMD,<key>,<value>[*XX]をCRLFで終えます。手入力ではチェックサム省略可、大文字小文字は区別しません。応答は$SPNVACK,<key>,<適用値>または$SPNVNAK,<key>,<理由>です。通常の設定変更はRAMだけに反映されます。電源を切った後も残すにはSAVEを使ってください。

Key Value 初期値 機能
RATE 5 / 10 / 25 / 50 / 100 / 200 / 400 / 500 / 1000 50 IMU出力Hz
OUT raw / fused / both / none both UART1 IMU内容
BARO 0 / 1 1 UART1気圧データ有効
BRATE 10 / 25 / 50 / 100 50 気圧出力Hz
AHRS 0 / 1 / reset 1 姿勢出力;reset後1秒静止
HDG −360 … 360 — 手動方位deg;align ≥1が必要
AKP / AKI 0 … 50 2.0 / 0.05 AHRS比例/積分ゲイン
GTH / ATH 0 < v ≤100 0.5 / 0.5 合成除外しきい値 °/s/m/s²
STAT 0 / 1 / now 1 1 Hz統計;nowで即時1組送信
HB 0 / 1 0 診断ハートビートSPNVHB
MODE ascii / binary ascii UART1形式;ACKは旧形式
BAUD 460800 / 921600 / 1500000 / 2000000 460800 UART1速度;旧速度ACK受信後に切り替え
U2OUT raw + fused + ahrs + baro + stat; none; all raw UART2出力を+で組み合わせ
U2MODE ascii / binary binary UART2形式
U2BAUD 115200 / 230400 / 460800 / 921600 / 1500000 / 2000000 460800 UART2速度
PPS 0 / 1 1 GPS PPS区間整列
TRIG 0 / 1 0 0連続;1外部トリガー
AZB 0 / 1 1 AHRS静止10秒バイアス推定、Z軸含む
SPI off / ardupilot / stream off SPI3出力モード
SPIOUT raw + fused + ahrs + baro + stat; none; all none SPI stream内容
SPIMODE ascii / binary binary SPI stream形式
SPICK 3 / 0 3 SPI Mode 3/Mode 0
SAVE 1 — 設定をflash保存;出力短時間停止
FACTORY 1 — 設定初期化、校正保持;460800 ASCII
CFG 1 — SPNVCFG・SPNVU2・SPNVSPI取得
INFO 1 — 版、リセット原因、シリアル、初期化結果
REINIT 1 — 3個のIMUを再初期化
PING 任意文字列 — エコーテスト
BOOT 1 — 再起動して保存設定をロード
CAL 1 — 校正SPNVCALを取得
ACAL <imu>,<bx>,<by>,<bz>,<kx>,<ky>,<kz> — a = (a_raw − b) × k;|b| ≤2、0.95 ≤k ≤1.05
FWGT g / a,<w1>,<w2>,<w3> 1,1,1 ジャイロ/加速度相対重み;0 < w ≤100
CALSAVE 1 — 校正・重みをflash保存
CALCLR 1 — 校正を消去
DBG 1 — 詳細装置情報。ACK後BOOT/RESET/AUTH/INIT/DBG等。

FWGTの最初の値はgまたはaで、例はFWGT,g,1,1,1です。出荷FWは起動バナーを出しません。INFOでPOR(電源投入)、EXTR(MCLR)、SWR(ソフトリセット)、WDTO(ウォッチドッグ)等を取得します。

最小設定例

以下の手入力用チェックサム省略コマンドを各行CRLFで送ります。100 Hz合成出力へ変更して保存します。

$SPNVCMD,CFG,1
$SPNVCMD,RATE,100
$SPNVCMD,OUT,fused
$SPNVCMD,SAVE,1
$SPNVCMD,CFG,1

RAW・FUSEDフィールド詳細

フィールド ASCII精度/単位 定義
id integer RAWのIMU番号1–3
ts_us u64 · µs IMU積分終端。同バッチのRAW/FUSEDで時計・境界を共有
gx / gy / gz 4 decimals · °/s 公称1475 Hzサンプリングから算出。dth/dtはrad/sで、°/sには180/πを掛ける
ax / ay / az 4 decimals · m/s² 平均比力。静止時も重力の影響を含む
temp 2 decimals · °C RAWは個別内部温度、FUSEDは採用センサーの平均
n integer RAW標本数:約14–15 @100 Hz、29–30 @50 Hz、295 @5 Hz
dthx / dthy / dthz 7 decimals · rad 台形積分・2次coning補正後の回転ベクトル
dvx / dvy / dvz 6 decimals · m/s 回転・sculling補正した速度増分。水平静止時dvz ≈ −9.79 × dt
dt 6 decimals · s 実積分時間。FUSEDは採用したdtの平均
n_used integer FUSED使用IMU数、1–3

3個のサンプリング時計には差があり、同じts_usでもnが1異なり、実際の標本区間・dtも異なる場合があります。共通時刻は完全同時サンプリングを意味しません。

単一応答のS[1:0]は初期化 > エラー > 飽和 > 正常の順で1状態を返します。バッチstatusはORのためbit3/4/5が同時に立つ場合があります。SPI_CRCには応答アドレス不一致も含みます。SPREAD_WARNは有効しきい値の半分超、または除外継続条件未達の偏差を示します。

BARO:タイムスタンプと変換遅延

Forced modeのts_usは気圧計測の開始時刻で、完了時刻やIMU積分終端ではありません。 Normal modeは新データの準備完了を検出した時刻です。同じts_usでも計測区間は異なり、変換時間はSPNVINIT,Bのconv_usで確認します。

BRATE OSR pressure / temperature IIR
10 / 25 Hz 16× / 2× 3
50 Hz 8× / 2× 3
100 Hz 4× / 1× 3

変換時間は周期−3 ms以内に設定されます。press_hpaはhPa(mbar)、100倍でPaです。小数4桁は表示分解能0.01 Paで、測定精度とは異なります。temp_cはチップ温度。alt_m = 44330.77 × [1 − (p/1013.25)^0.190263]は天候に依存し負値もあり、status bit0は取得前のI2C NACK/衝突が再試行で回復したことを示します。

AHRS詳細判定

フィールド/フラグ 範囲/条件
roll / pitch / yaw ASCII小数3桁、deg;roll −180…180、pitch −90…90、yaw 0…360
q0…q3 ASCII小数6桁;Hamilton四元数、q0スカラー、v_n = R(q) · v_b
bgx / bgy / bgz ASCII小数4桁、°/s;機体軸ジャイロバイアス推定
zb_s ASCII小数1桁、0–10 s;移動で0、AZB=0では常に0
HIGH_DYN (bit0) 比力大きさとgの差 >0.5 m/s²、角速度 >50 °/s、または重力方向差 >5°;Kp = 0.2
BIAS_FROZEN (bit1) 動作状態、角速度 >5 °/s、または比力とgの差 >0.2 m/s²;バイアス学習のみ停止
ACC_REJECT (bit3) 比力の大きさとgの差 >3 m/s²;ジャイロのみで更新

合成Δθで四元数を更新し、Δv/dtで重力方向を観測します。AZBは10秒ごとに各軸ジャイロ標準偏差 <0.1 °/s、加速度判定値 <0.1 m/s²、動的フラグなしを確認し、3軸バイアスを推定。初回は直接適用してBIAS_CALを立てます。

コマンド補足とNAK

終端はCRまたはLF(CRLF推奨)、127文字超の行は破棄します。指定チェックサム不正はSPNVNAK,CMD,checksum。DBG,1はINFOより詳細な診断です。BAUDは旧速度ACK完了後約5 msで切り替え、MODE・FACTORYも旧形式/速度で応答します。

コマンド/応答 意味
DBG,1 ACK後に詳細BOOT/RESET/AUTH/INIT/DBG等
CFG saved=1 NVMに保存設定があることのみ。現在RAM全体が保存済みとは限らない
BRATE 気圧計再設定は最大約15 ms、IMUは影響なし。OSRをレートに適合
SPI / TRIG SPIは0/1/2、TRIGはcontinuous/triggerも対応
U2OUT / SPIOUT +、カンマ、縦棒で組合せ可。+を推奨

終端不要の1文字操作:1–6は5/10/25/50/100/1000 Hz、sは統計、rは再初期化です。200/400/500 Hzは完全なRATEコマンドを使います。

checksum
not SPNVCMD
missing value
unknown key
range
osr/odr invalid
i2c error
i2c timeout
not leveled yet
nvm not available
write failed
no bootloader (dev build)

代表的なNAK理由です。use ...は許容値一覧なのでコマンド表と照合してください。HDGには水平初期化が必要で、SAVE/CALSAVE失敗応答は診断用に保管します。

通信詳細はプロトコルv1.1、4–21ページにも基づきます。プロトコル概要を参照。

設定読み出しと応答形式

$SPNVCMD,<key>,<value>[*XX]\r\n
$SPNVACK,<key>,<actual_value>*XX
$SPNVNAK,<key>,<reason>*XX

上記は形式の例で、CRLFを\r\nと表記しています。ACKには実際に適用した値が入ります。ACAL/FWGTの値にはカンマも含まれるため、値全体を読み取ってください。CFGはRAM内の現在値、NVMは保存済みの設定を返します。CALは3個のIMUの各行と、その後のW行を返します。

$SPNVCMD,CFG,1
$SPNVACK,CFG,1*XX
$SPNVCFG,baud=460800,mode=ascii,rate=50,out=3,stat=1,hb=0,baro=1,brate=50,ahrs=1,gth=0.500,ath=0.500,akp=2.000,aki=0.0500,saved=1,fw=0.11.2,trig=0,azb=1*XX
$SPNVU2,out=raw,mode=binary,baud=460800,drop=0,pps=1,pps_state=1,pps_err_ppm=0.000*XX
$SPNVSPI,mode=off,out=none,fmt=binary,ck=3,txn=0,ok=0,short=0,delivered=0,drop=0,...*XX

原資料:IMU600-V2 User Manual v1.1 · PDFページ 17–25

原ページを読む · 3資料の章対応と相違点

このカテゴリの概要 · 設定ガイド一覧