WitMotionの9軸IMU「BWT901CL」のメモ

WitMotionの9軸IMU「BWT901CL」を使ってみたので、そのメモです。
最初のうちは、値やキャリブレーションで何が正解かわからずに苦労しました。
けど、公式がYouTubeに説明動画をあげてくれていたので、それを見たら、あっさり解決。
(WitMotionは製品ごとに説明動画プレイリストを用意してくれていた。わかりやすい。)

なぜBWT901CL?

WitMotionは似たような型番やインタフェースの製品が多すぎて、よくわからない。。。
(どこかで分かりやすい製品表を見かけたけど、URL無くした。)
「USBで直接接続でき、取り外してキャリブレーションできると便利かな」程度の浅い考えで BWT901CL をチョイス。

購入した結果、キャリブレーションは想定どおり、とてもやりやすかった。
シリアル変換不要も想定通り、使いやすい。
誤算だったのは、電源ボタン。 有線接続時でもONにしないといけなかったこと。あと、電源ON中のLEDがまぶしい。。。

スペックとか

項目 値 / 既定 メモ
出力レート(Output Rate) 既定 10 Hz / 最大 200 Hz
ボーレート(Baud rate) 115200 bps 固定
加速度計の静止時ドリフト 水平時 ±20~40 mg 生成AIによると、加速度計のみで計算すると約 ±1.1~2.3°
ジャイロの静止時ドリフト 水平時 ±0.5~1°/s 実際は融合でこれよりも低く抑えられるはず
ジャイロのバイアス(不)安定性(Bias stability) ≤10 deg/h

搭載チップ、詳細なスペックは製品ページ参照

Windows用ツール、シリアルドライバ、ドキュメント

ダウンロード、できること

こちらでダウンロードできる
ダウンロードすると WitMotion.exe が含まれている。
このプログラムでセンサー値確認、Output Rate変更、6軸と9軸の切り替えができる。


Windows PCとのUSBケーブルで接続したときの認識名称

「USB-SERIAL CH340という名称のCOMポート」として認識。名前の由来は中で使っているチップ。

iPhone用ツール

ダウンロード、できること

AppStoreからダウンロードできる。
画面がわかりにくいけど、各種キャリブレーションもできる。
Android用もあるらしいけど、未確認。

Bluetooth接続時

「HC-06」と認識。(Bluetooth接続時、PINコードが必要な場合は1234。アプリだといらないかも)。名前の由来は中で使っているチップ。

磁気キャリブレーション方法

磁気キャリブレーション方法については、公式動画がわかりやすかった。
https://www.youtube.com/watch?v=BDU8Yy5oYmo

北を向けたときに次のような画面になればOK。
オレンジ色の線が方位。


ネイティブ座標系

公式ドキュメントによると座標系は「northeast sky coordinate system」。日本語訳だと、北東天空座標系。
Y軸が北を差すとき、Xが東、Zが上。

「Angle reference」ボタンでAngle XとYはリセット(=現在の傾きを基準にする)できる。

WitMotion.exeのMain画面で確認した内容は次のとおり。

表示名 回転の基準軸
Angle X X 軸 基準の回転
Angle Y Y 軸 基準の回転
Angle Z Z 軸 基準の回転

Angle X(=X軸基準回転)

条件 表示角
Y 軸が水平なとき
Y 軸が上を向くと +90°
Y 軸がひっくり返ると ±180°
Y 軸が下を向くと −90°

Angle Y(=Y軸基準回転)

条件 表示角
X 軸が水平なとき
X 軸が上を向くと −90°
X 軸が下を向くと +90°
X 軸がひっくり返ると 0°(!!!)
X軸を上経由でひっくり返すと 0度→-90度→0度と変化していく
X軸を下経由でひっくり返すと 0度→90度→0度と変化していく

Angle Z(=Z軸基準回転)

仕様/条件 表示角
Y 軸が北を指すとき
Y 軸が西を指すとき +90°
Y 軸が東を指すとき −90°
Y 軸が南を指すとき ±180°


Linuxでの認識、ROS2ドライバの設定

セットアップ方法

AbudoriLab. さんの「SLAM用のセンサデータを取ろう!【つくチャレ2024-3】」ページの方法がわかりやすかった。セットアップ方法はそちら参照

Ubuntuでのデバイス認識結果

$ lsusb
省略
Bus 001 Device 007: ID 1a86:7523 QinHeng Electronics CH340 serial converter
省略
$ ls /dev/serial/by-id -1
usb-1a86_USB_Serial-if00-port0


witmotion_IMU_rosの設定ファイル例

設定ファイルは次のような内容にしてみた。 temperature、magnetometerはtrueに設定してみたけど、有効にはならなかった。use_native_orientationについては、trueに設定してみた。これで地磁気センサーも考慮した姿勢になるはず?
(なんとなく考慮した姿勢になってる気はするけど未検証)
covarianceは元ファイル(WT901)のまま。

witmotion:
  ros__parameters:
    port: ttyUSB0
    baud_rate: 115200 # baud
    polling_interval: 5 # ms
    timeout_ms: 150 # ms
    restart_service_name: /restart_imu
    imu_publisher:
      topic_name: /imu
      frame_id: imu_link
      use_native_orientation: true
      measurements:
        acceleration:
          enabled: true
          covariance: [0.0364, 0.0, 0.0, 0.0, 0.0048, 0.0, 0.0, 0.0, 0.0796]
        angular_velocity:
          enabled: true
          covariance: [0.0663, 0.0, 0.0, 0.0, 0.1453, 0.0, 0.0, 0.0, 0.0378]
        orientation:
          enabled: true
          covariance: [0.0479, 0.0, 0.0, 0.0, 0.0207, 0.0, 0.0, 0.0, 0.0041]
    temperature_publisher:
      enabled: false # not supported by BWT901CL
      topic_name: /temperature
      frame_id: imu_link
      from_message: magnetometer # acceleration, angular_vel, orientation, magnetometer
      variance: 0.01829
      coefficient: 1.0 # Linear calibration parameters: coefficient
      addition: 0.0 # and addendum
    magnetometer_publisher:
      enabled: false
      topic_name: /magnetometer
      frame_id: compass
      coefficient: 0.00000001 # Linear calibration parameters: coefficient
      addition: 0.0 # and addendum
      covariance:
        [0.000000187123, 0.0, 0.0, 0.0, 0.000000105373, 0.0, 0.0, 0.0, 0.000000165816]
    barometer_publisher:
      enabled: false
      topic_name: /barometer
      frame_id: base_link
      variance: 0.001
      coefficient: 1.0 # Linear calibration parameters: coefficient
      addition: 0.0 # and addendum
    altimeter_publisher:
      enabled: false
      topic_name: /altitude
      coefficient: 1.0 # Linear calibration parameters: coefficient
      addition: 0.0 # and addendum
    orientation_publisher:
      enabled: false # not supported by BWT901CL
      topic_name: /orientation
    gps_publisher:
      enabled: false
      navsat_fix_frame_id: world
      navsat_fix_topic_name: /gps
      navsat_altitude_topic_name: /gps_altitude
      navsat_satellites_topic_name: /gps_satellites
      navsat_variance_topic_name: /gps_variance
      ground_speed_topic_name: /gps_ground_speed
    rtc_publisher:
      enabled: false
      topic_name: /witmotion_clock


Topic確認

200Hzで出力されていることを確認。

$ ros2 topic hz /imu
average rate: 201.013
    min: 0.000s max: 0.011s std dev: 0.00385s window: 202
average rate: 200.505
    min: 0.000s max: 0.011s std dev: 0.00337s window: 402


Topicの詳細も大丈夫そう。

$ ros2 topic echo /imu --once
header:
  stamp:
    sec: 1760181392
    nanosec: 808367199
  frame_id: imu_link
orientation:
  x: 0.021968553947989716
  y: -0.09403750700011992
  z: 0.09731090919587884
  w: 0.99055788163343
orientation_covariance:
- 0.0479
- 0.0
- 0.0
- 0.0
- 0.0207
- 0.0
- 0.0
- 0.0
- 0.0041
angular_velocity:
  x: 0.007456851191818714
  y: 0.007456851191818714
  z: 0.006391586735844612
angular_velocity_covariance:
- 0.0663
- 0.0
- 0.0
- 0.0
- 0.1453
- 0.0
- 0.0
- 0.0
- 0.0378
linear_acceleration:
  x: 1.925595760345459
  y: 0.5460644364356995
  z: 9.5896577835083
linear_acceleration_covariance:
- 0.0364
- 0.0
- 0.0
- 0.0
- 0.0048
- 0.0
- 0.0
- 0.0
- 0.0796


RVizでの表示

RVizでIMUの情報を確認する場合、IMUプラグインのインストールが必要

sudo apt install ros-${ROS_DISTRO}-rviz-imu-plugin


IMUのX,Y,Z軸がそのままRViz上のIMU表示でもX,Y,Z軸として表示される。
こちらでもそうなっているので、これでセットアップ完了・・・でいいのかな。


リンク

製品情報
製品情報
形状の情報、使われているチップなど詳細が記載されている。
ドキュメントやツールのダウンロード
AbudoriLab. さんの「SLAM用のセンサデータを取ろう!【つくチャレ2024-3】」ページ
REP145 Conventions for IMU Sensor Drivers
REP103 Standard Units of Measure and Coordinate Conventions
WitMotion公式 BWT901CL 説明動画プレイリスト