外為法抵触IMU (CXD5602PWBIMU) ドキュメント
はじめに
CXD5602PWBIMUは、Spresenseボード上で利用可能な慣性計測ユニット(IMU)センサーです。このセンサーは3軸加速度計+3軸ジャイロスコープの民生用のIMUが16個も!載っており、フュージョンされた外為法に引っかかる高精度な動きの検出と測定を可能にします。なお、2台で32個にもできるそうです(9万円コース!!!!!!!)
本製品は日本国内向けの製品です。本製品は輸出貿易管理令別表第一の1から15までの項に記載の貨物、外国為替令別表1から15までの項に該当します。本製品を輸出、又は非居住者に提供するにあたっては、外為法等に従い必要な手続きを行って頂く必要があります。
主な特徴
高精度
- 低バイアス変動:バイアス安定性0.39 deg/h以下(IMU 16個合成時)
- 低ノイズ密度:1.0 mdps/√Hz以下。地球自転検出によるジャイロコンパスも実現可能
- 二枚スタックにより更なる高精度化が可能
- キャリブレーション済
高いロバスト性
- 複数IMUの冗長信頼性により故障に強い
- 多数決論理回路によるリアルタイム異常値除去
※SPRESENSEメインボードは付属しません。
開発環境の作り方
- Spresense の開発環境(SDK)を入れます。
-
v3.4.0のファームウェアが必要ですが、なぜか公式サイトにまだありません。(気合いでどうにかする)v3.3.0 のままで良いみたいです - Arduino でも使えそうですが、サンプルコードはありませんでした。
使い方の基本
デバイスパス
CXD5602PWBIMUセンサーは以下のデバイスパスでアクセスできます:
/dev/imu0
APIリファレンス
IOCTLコマンド
コマンド | 説明 | パラメータ |
---|---|---|
SNIOC_SSAMPRATE |
サンプリングレートを設定 | int型(15, 30, 60, 120, 240, 480, 960, 1920) |
SNIOC_SDRANGE |
ダイナミックレンジを設定 |
cxd5602pwbimu_range_t 構造体 |
SNIOC_SFIFOTHRESH |
ハードウェアFIFOしきい値を設定 | int型(1〜4) |
SNIOC_ENABLE |
センサーの有効化/無効化 | int型(1=有効、0=無効) |
データ構造体
// ダイナミックレンジ設定用構造体
typedef struct {
int accel; // 加速度計のレンジ(2, 4, 8, 16)
int gyro; // ジャイロスコープのレンジ(125, 250, 500, 1000, 2000, 4000)
} cxd5602pwbimu_range_t;
// センサーデータ構造体
typedef struct {
uint32_t timestamp; // タイムスタンプ
float temp; // 温度
float gx; // ジャイロスコープX軸
float gy; // ジャイロスコープY軸
float gz; // ジャイロスコープZ軸
float ax; // 加速度計X軸
float ay; // 加速度計Y軸
float az; // 加速度計Z軸
} cxd5602pwbimu_data_t;
コード例
センサーの初期化と設定
#include <nuttx/sensors/cxd5602pwbimu.h>
int fd;
int ret;
cxd5602pwbimu_range_t range;
// デバイスを開く
fd = open("/dev/imu0", O_RDONLY);
if (fd < 0) {
printf("エラー: デバイスを開けませんでした\n");
return 1;
}
// サンプリングレートを設定(例:480Hz)
ret = ioctl(fd, SNIOC_SSAMPRATE, 480);
if (ret) {
printf("エラー: サンプリングレートの設定に失敗しました\n");
close(fd);
return 1;
}
// ダイナミックレンジを設定(例:加速度=2G、ジャイロ=125dps)
range.accel = 2;
range.gyro = 125;
ret = ioctl(fd, SNIOC_SDRANGE, (unsigned long)(uintptr_t)&range);
if (ret) {
printf("エラー: ダイナミックレンジの設定に失敗しました\n");
close(fd);
return 1;
}
// FIFOしきい値を設定(例:1)
ret = ioctl(fd, SNIOC_SFIFOTHRESH, 1);
if (ret) {
printf("エラー: FIFOしきい値の設定に失敗しました\n");
close(fd);
return 1;
}
// センサーを有効化
ret = ioctl(fd, SNIOC_ENABLE, 1);
if (ret) {
printf("エラー: センサーの有効化に失敗しました\n");
close(fd);
return 1;
}
データの読み取り
cxd5602pwbimu_data_t data;
struct pollfd fds[1];
// pollの設定
fds[0].fd = fd;
fds[0].events = POLLIN;
// データが利用可能になるまで待機
ret = poll(fds, 1, 1000); // 1秒のタイムアウト
if (ret > 0 && (fds[0].revents & POLLIN)) {
// データを読み取り
ret = read(fd, &data, sizeof(data));
if (ret == sizeof(data)) {
// データを処理
printf("温度: %.2f\n", data.temp);
printf("加速度 (G): X=%.6f, Y=%.6f, Z=%.6f\n", data.ax, data.ay, data.az);
printf("ジャイロ (dps): X=%.6f, Y=%.6f, Z=%.6f\n", data.gx, data.gy, data.gz);
}
}
// 使用終了後、センサーを無効化
ioctl(fd, SNIOC_ENABLE, 0);
close(fd);
サンプルアプリケーション
Spresense SDKには、CXD5602PWBIMUセンサーを使用するためのサンプルアプリケーションが含まれています。
基本サンプル(cxd5602pwbimu)
基本的なセンサーの使用方法を示すシンプルなサンプル。1秒間データを収集し、標準出力に表示します。ビルドしてFlash書き込み後、UART から pwbimu コマンドで起動します。
ロガーアプリケーション(cxd5602pwbimu_logger)
長時間のデータ収集と様々な出力形式をサポートするロガーアプリケーションです。
cxd5602pwbimu_logger [-s <rate>] [-a <acc_range>] [-g <gyro_range>] [-f <fifo_num>] [-o <out_dev>] [-d] [-h]
オプション:
-
-s <rate>
: サンプリングレート(Hz)。有効値: 15, 30, 60, 120, 240, 480, 960, 1920 -
-a <acc_range>
: 加速度計のレンジ(G)。有効値: 2, 4, 8, 16 -
-g <gyro_range>
: ジャイロスコープのレンジ(dps)。有効値: 125, 250, 500, 1000, 2000, 4000 -
-f <fifo_num>
: FIFOサイズ。有効値: 1, 2, 3, 4 -
-o <out_dev>
: 出力デバイス。'uart'、'net'、'/path/to/file.bin'、'/path/to/file.txt' -
-d
: データをUARTに強制的に表示 -
-h
: ヘルプを表示
用途別おすすめ設定
一般的な動き検出
- サンプリングレート:60Hz
- 加速度レンジ:2G
- ジャイロレンジ:250dps
- FIFOしきい値:1
スポーツ活動の追跡
- サンプリングレート:240Hz
- 加速度レンジ:8G
- ジャイロレンジ:1000dps
- FIFOしきい値:2
高精度な動き分析
- サンプリングレート:960Hz
- 加速度レンジ:4G
- ジャイロレンジ:500dps
- FIFOしきい値:1
バッテリー効率重視
- サンプリングレート:30Hz
- 加速度レンジ:2G
- ジャイロレンジ:125dps
- FIFOしきい値:4
トラブルシューティング
データ読み取りエラー
- デバイスパスが正しいことを確認(/dev/imu0)
- センサーが有効化されているか確認
- FIFOしきい値の設定を確認
不正確なデータ
- 最初の50msのデータは無視(初期化中のノイズを含む可能性あり)
- ダイナミックレンジが適切に設定されているか確認
- サンプリングレートが用途に適しているか確認
パフォーマンスの問題
- サンプリングレートを下げてみる
- FIFOしきい値を大きくして、データ処理の頻度を減らす
- 不要なデータ処理を最小限に抑える
応用分野
従来工業用FOG(Fiber Optic Gyroscope)を搭載することが難しかった以下のような用途に適しています:
- 構造物検査用ドローン
- 小型自立移動ロボット
- 精密な位置・姿勢推定が必要なデバイス
- 地球自転検出を利用したジャイロコンパス
参考リンク
SPRESENSE公式
サンプルコード
-
Gistサンプル
↑一回も試してない
動かしてみた例