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