SLEIPNIR-ZERO の機体は、飛行中のセンサ計測値を BLE で地上へ送り続けます。この記事では、テレメトリ送信機のハードウェア構成と、限られた無線帯域で「送り切る」ための設計を解説します。
ハードウェア構成
| 部品 | 役割 |
|---|---|
| Raspberry Pi Pico 2 W(RP2350) | デュアルコア Cortex-M33 マイコン。無線チップ CYW43 で BLE を担う |
| BME280 | 気圧・気温・湿度センサ。気圧から高度を推定する |
| BNO055 | 9軸 IMU(加速度・角速度・地磁気)。姿勢と加速度を計測する |
| WS2812 | フルカラー LED。機体の状態を色で表示し、離れた場所から目視確認できる |
2つのコアは役割分担しています。core1 がセンサの I2C 読み出し専任、core0 がセンサ融合と BLE 送信の担当で、コア間はロックフリーのリングバッファでつながっています。読み出しの取りこぼしを融合や通信の負荷から切り離すための構成です。
何を送るか
現在飛んでいるのは 50 Hz のテレメトリです。気圧高度・融合高度・上下速度・姿勢(ロール/ピッチ/方位)・線形加速度・制御指令(エレベータ/ラダー/スロットル)などを 1 サンプル 1 行の形式で送り、地上局が CSV として記録します。
さらに、センサの生値をフルレートで降ろすバイナリストリームプロトコルを設計しています。チャンネル構成は次のとおりです。
| チャンネル | レート | 内容 |
|---|---|---|
| 加速度 | 1000 Hz | 3軸 raw 値(int16 × 3) |
| 角速度 | 500 Hz | 3軸 raw 値(int16 × 3) |
| 地磁気・気圧 | 20 Hz | 3軸 raw 値/気圧+気温 |
| STATUS | 1 Hz | 取りこぼし数・キャリブレーション状態・死活 |
| CONFIG | 変更時 | スケール係数・レート設定の通知 |
生値を raw のまま送るのがポイントです。物理量への換算は PC 側で行い、換算に必要なスケール係数は CONFIG チャンネルで別途通知します。機体側の計算を減らせるだけでなく、換算で情報を落とさずに PC 側の大規模なフィルタ(EKF)へそのまま食わせられます。
帯域の収支
BLE の実効帯域は実測で上限 125 kbps 程度です。上の全チャンネルを合計するとフレーミング込みで約 85 kbps、上限の 68% に収まり、32% のヘッドルームが残ります。また 1 回の notification は 244 バイト以下に厳守しています(これを超えると無線チップが不安定になる実測既知の問題があるため)。
電波状況が悪化して帯域が細った場合は、チャンネルごとに間引き率を上げて縮退します(例:加速度を 1/4 の 250 Hz に)。機内の融合処理は常にフルレートで動き続けるので、最悪「ダウンリンクほぼ停止」までプロトコルを変えずに落とせます。
墜落してもデータは残る
機体内に記録するフライトレコーダ方式と違い、テレメトリは送信した時点でデータが機体を離れます。実験機にとって墜落は起こり得ることですが、直前までの計測値が地上に残っていれば原因分析ができます。0 号機の任務は教訓を集めることなので、これは設計上の重要な性質です。
リポジトリ
ファームウェアと地上局ツール(Python 製の受信 GUI・記録クライアント)は danfunc/flight_robocon_telemetory_sender で公開しています。ファームウェアの土台になっている自作カーネルについては「自作マイクロカーネル Shizuku」で解説しています。
コメントを残す