BUFFALOのUSB WifiアダプタをUbuntu22.04で使えるように設定した話

タイトル通り。自分用にメモしておく。

 

環境

OS:Ubuntu 22.04

 

マザーボードGIGABYTE B660M DS3H DDR4(B660 1700 MicroATX)

1万円くらいで買った安物で、Wifiがついてない。

 

Wifiアダプタ (USB接続):WI-U2-433DHP

Windowsでは刺しただけで使えたが、Ubuntuでは認識しなかった。

中身のチップはRTL8821AUらしい。

 

ドライバをGithubで拾った

色々な方がGithubでドライバを公開しているが、Wifiアダプタ中身のチップと、Ubuntuのバージョンで適切なものを選ばないと動かないらしい (それはそう)

 

私の環境では、下記の手順で動いた。

 

git clone https://github.com/aircrack-ng/rtl8812au.git

cd rtl8812au

sudo make dkms_install

この手順を終えて、Wifiアダプタを刺すと、それまで光っていなかったLEDが点滅。
画面右上からWifiルータのSSIDとパスワードを設定したら、インターネットにつながった。
めでたしめでたし。

小型ロケットのロール制御 ①概要

はじめに

本稿の内容

2022年11月、東工大ロケットサークルCREATEはC-59Jを打ち上げ、団体初となるロール制御を行い成功しました。

本稿では、C-59Jの概要とロール制御の結果を説明します。

CREATEとは

CREATEは、全長1〜2m程度の小型ロケットを製作し打ち上げているサークルです。

図1および図2に過去に打ち上げたロケットの例を示します。

半年ほどかけ1機のロケットを完成させ、伊豆大島裏砂漠または秋田県能代市にて打ち上げています。

 

図1 打ち上がりランチャーを離脱するC-59J (2022年11月打ち上げ)

 

図2 ランチャーに挿入されたC-31J (2017年11月打上)

 

C-59Jの概要

C-59Jは、2022年11月、伊豆大島裏砂漠にて打ち上げられました。

動翼を用いたロール制御 (機軸回りの角度制御) および機体先端に設置したピトー管による対気速度の計測をミッションとしました。

機体姿勢の能動的な制御に挑戦するのは、CREATEとして初めての試みでしたが、成功することができました。

 

機体の全体構造

図3にC-59J全体のCAD図を示します。図3の左から大きく分けてノーズ区画、電装区画、動翼区画、エンジン区画があります。

 

図3 C-59J全体のCAD図

①ノーズ区画

上空で開放するパラシュートが搭載されています。また、先端に対気速度を計測するためのピトー管が搭載されています。

 

②電装区画

基板および電池が搭載されています。基板は、下記の3つが搭載されています。

 

ミッション基板:ロール制御ミッション用の基板

開放基板:上空でパラシュートを開放し、機体を安全に着陸させるための基板

GPS基板:GPSセンサを用いて計測した座標を、地上へ無線送信するための基板

 

③動翼区画

ロール制御ミッションの鍵を握る部分です。図4にCAD図を示します。

1台のエンコーダ付きギアモータを用いて動かす、2枚の動翼が搭載されています。これらの動翼は、ミッション基板が制御します。

また、円筒型の機体の内側から外側方向を撮影する小型カメラが、2台搭載されています。

これらのカメラは、景色と動翼を映すことで、ロール制御の成否を視覚的に確認するために搭載しました。

 

図4 動翼区画のCAD図

 

④エンジン区画

ロケットを飛ばすために最も重要な、エンジンが搭載されています。

また、機体の姿勢を受動的に安定させるための、4枚の固定翼が搭載されています。

 

機体外観

図5、6に機体外観を示します。

 

図5 機体組み立て後、射点搬入まで待機中のC-59J

 

図6 打上直前、ランチャー挿入状態のC-59J

 

打上結果

飛行プロファイル

図7に飛行プロファイルを示します。横軸は離床を基準とした時刻、縦軸は気圧センサの値から算出した高度です。

C-59Jは、エンジン燃焼開始の直後に離床し、約0.4秒でランチクリアしました。

離床後約2.7秒で燃焼終了し、加えてロール制御を開始しました。

その後、7秒程度ロール制御を実施し、離床後約10.2秒でパラシュートを開放しました。

パラシュート開放後はロール制御を終了し、離床後約36.8秒で着地しました。

図6において、着地時点の高度が0mを下回っているのは、着地点の標高が射点の標高よりも低いことに因ります。

 

図7 飛行プロファイル

動画で確認

ロール制御の様子を、まず動画で確認してみましょう。

右側が、搭載したカメラで撮影した映像です。映っている黒い板は、動翼です。

中央上が、MEMSジャイロセンサを用いて計測した機体姿勢を、CGで再現した映像です。

中央下が、ロール角のグラフです。

左上が、エンコーダで計測した動翼角度を、CGで再現した映像です。

左下が、動翼角度のグラフです。

youtu.be

 

離床すると、C-59Jはロールしています。これは、固定翼のミスアラインメント、ノーズ形状の非対称性等により、ロールモーメントが発生したことに因ると考えられます。

その後、ロール制御が開始され、動翼が動くと、すぐにロールが止まっていますね!

データで確認

図8に、ロール角の時間変化を示します。

青色で示したロール制御開始前は、ロール角が変化していることが分かります。

一方、ロール制御開始後は、素早く目標ロール角に収束しています。

図8 ロール角の時間変化。ロール制御開始前を青色、開始後を赤色で示す。

 

 

図9に、ロール制御開始直後の、ロール角の時間変化を示します。

整定時のロール角を90度とみなすと、整定時間 (95%) はたったの0.27秒でした!

 

図9 ロール制御開始直後におけるロール角の時間変化

 

 

図10に、ロール制御開始からパラシュート開放付近までの、ロール角の時間変化を示します。

制御開始直後を除き、目標ロール角からの偏差が±4度以内に抑えられていることが分かります。

図10 ロール制御開始からパラシュート開放付近までのロール角の時間変化

 

図11に、動翼角度および目標動翼角度の時間変化を示します。
動翼角度は目標値に精度よく追従していることが分かります。

モータ軸に取り付けたエンコーダで計測しているので、ギアボックスおよび傘歯車のバックラッシが計測できない誤差として存在はしていますが。

図11 動翼角度および目標動翼角度の時間変化。動翼角度は、ロール制御開始前を青 
色、開始後を赤色で示す。目標動翼角度は黒色で示す。

 

おわりに

今回は、2022年11月に打ち上げたC-59Jと、ロール制御結果の概要を紹介しました。

次回は、動翼区画とミッション基板のハードウェアについて、選定理由等を紹介する予定です。

次々回は、ロール制御系設計の詳細として、モデリング方法や制御ゲイン決定方法について紹介したいですねます。

ロケットのロール制御に適したオイラー角を検討してみた

先日、2022年11月に、ロケットのロール制御に挑戦して成功しました。そのときに用いたオイラー角についてまとめたPDFを公開します。

 

内容はざっと

・制御機構は機軸まわりのモーメントを発生させるので、機軸を再度に回すオイラー角を選んだ
・飛行中に特異点近傍に陥りにくいオイラー角を選んだ
クォータニオンと選んだオイラー角の変換方法を導出した
・選んだオイラー角が実際に特異点近傍に陥りにくいことを、過去の飛行データを使用して確認した
オイラー角速度の算出方法も確認した

という感じです。

 

2023/02/14追記

参考文献としている松永先生のホームページ上の資料にアクセスできなくなっています。とりあえずインターネットアーカイブのURLを貼っておきます。

https://web.archive.org/web/20210407025007/http://lss.mes.titech.ac.jp/~matunaga/Attitude.pdf

 

[http://:title]

Blender+Pythonを用いてクォータニオンから姿勢表示しよう

はじめに

 3次元の姿勢を表現する方法の1つに, クォータニオン(四元数)があります. オイラー角と比較して, 特異点が存在しない, 計算量が少なくすむことが多いなどのメリットが存在しますが, 直感的に理解しづらいのが難点です. 

 そこで今回は, クォータニオンの時系列データを記したCSVデータを読み込んで, 3D CGソフトのBlenderでぐるぐる回す方法を説明します. 本記事で用いているBlenderのバージョンは2.92であり, PCのOSはWindows10です.

Blenderをダウンロード&インストールする

 Blenderの公式サイトからダウンロードし, その後インストールします. 特に迷う部分はないと思います.
https://www.blender.org/

Blenderを起動し, さわってみる

 Bldenderを起動すると, 図1のような画面が表示されます. 中央に立方体が配置され, 選択状態にあります. この画面の右下に, 立方体の位置や姿勢の設定が表示されています. 

f:id:tgkhtknk:20211215235858p:plain

図1 Blenderの起動時の画面

 右下を拡大したのが図2です. 初期設定では原点に配置され, 姿勢はxyzオイラー角の[0° 0° 0°]^Tになっています. そこのプルダウン部分をクリックすると, Quaternion(WXYZ)を選択することができます.

(ところで, Bldnerでxyzオイラー角とされているのは一般的な表記ではzyxオイラー角であり, 同様に例えばzxyオイラー角とされているのはyxzオイラー角が一般的な表記だと思うのですが, 本題ではないので深入りしないことにします.) 

f:id:tgkhtknk:20211215235902p:plain

図2 立方体オブジェクトの設定(初期値)

クォータニオンの定義を確認する

 Blenderのおけるクォータニオンは, WXYZと書かれていることから分かる通り, 1つ目が実部で2~4つ目が虚部です. つまり, ノルムが1のベクトル[x y z]^Tを軸にθ [rad]回転させるときのクォータニオン

f:id:tgkhtknk:20211216002002p:plain,

と表されます. よって, x軸回りにπ/4回転させるときは, 

f:id:tgkhtknk:20211216002938p:plain

です. これを試しにBlenderに入力してみます. 図3の赤枠部分のように入力すると, x軸(赤色の線)を軸に45°回転します. 

f:id:tgkhtknk:20211216120401p:plain

図3 クォータニオンの確認

Pythonコードを書く準備をする

図4のように, 画面上部のタブから赤枠内の"scripting"をクリックし, Pythonコードを書くための画面に移ります. その後, 緑色枠内の"New"をクリックすると, コードを書けるようになります. 

f:id:tgkhtknk:20211216135213p:plain

図4 scripting画面の初期状態

 次に, 必要なライブラリをインストールします. 今回は, osとbpyとpandasを用います.  osとbpyBlender内蔵Pythonには標準で入っているはずですので, pandasのインストールを行います. こちらのサイトを参考にインストールしてください. Blender内蔵Pythonへインストールする必要があるため, Pythonに慣れてる方もこのサイトを見た方がいいです. 

Blender内蔵Pythonにライブラリを追加する方法 | suemura's portfolio

 その後, きちんとインストールできたか確認します. 図5のように, Blenderテキストエディタ領域に

import os, bpy

import pandas as pd

と入力して, 赤枠で囲った実行ボタンを押します. 左下の緑枠で囲った領域に, 緑色のチェックボックスの後に"bpy.ops.text.run_script()"と表示されていれば成功です. 

f:id:tgkhtknk:20211218211440p:plain

図5 スクリプト実行

一方でエラーが発生した場合は, 図6のように赤いバツ印が表示されます. エラーメッセージの詳細はToggle System Consoleというのを開かないと見られません. 図7のようにBlender左上のWindowからToggle System Consoleをクリックしてください. 

f:id:tgkhtknk:20211218175458p:plain

図6 エラー発生時

f:id:tgkhtknk:20211218175527p:plain

図7 Toggle System Consoleの場所

f:id:tgkhtknk:20211218180407p:plain

図8 Toggle System Console

図8がToggle System Consoleです. 今回はBlender内蔵Pythonにインストールしていないsimplekmlをわざとimportさせようとしたため, simplekmlがないぞとメッセージが出ています.

クォータニオンのデータを用意する

図9のような時間間隔が同一のCSV形式のデータを用意します. 図9では, 見やすいようにエクセルで開いています. 1列目が実部, 2~4列目が虚部です. 行と列が逆だとPythonコードが読み取ってくれなくなります. 今回は時間間隔が0.001 sの1000 Hzのデータを用意しました. 

f:id:tgkhtknk:20211218181838p:plain

図9 CSVデータ

余談ですが, エクセルでデータを作成してCSV形式で保存する際には注意が必要です. 図10のように, CSV (コンマ区切り)をクリックしてください. 上の方にあるCSV UTF-8 (コンマ区切り)を選択して保存すると, Pythonコードが読み取ってくれなくなります.

f:id:tgkhtknk:20211218181918p:plain

図10 CSV形式での保存

Pythonコードを書き実行する

 図11が私が用いたコードです. 内容を解説します.

・5, 6行目でライブラリをimport

・8行目でCSVファイルがあるディレクトリを指定(バックスラッシュを二重にすることに注意)

・9行目でCSVファイルのファイル名を指定

・11~13行目で現在ある全てのオブジェクトを消去(消去しないと面倒が発生する可能性あり)

・15~17行目で, 原点に大きさ(1, 1, 3)の直方体を配置

・18行目でその直方体の角度表現をクォータニオンに設定(11~13行目で消去を行わないと, 作成した直方体の名称が Cube ではない可能性がある)

・20行目で現在アクティブなオブジェクト=Cubeをobjに設定

 

・22行目から1フレームごとに繰り返すfor文に入る

・今回は1000 Hzのクォータニオンデータを用いる. 20個に1つのデータを使用し, 50 Hzにする. 

・23行目でk+1フレーム目を指定

・24~27行目でCSVファイルから読み取ったデータをq0~q3に代入

・28行目でCubeを回転させ, 29行目でキーフレームを挿入する. 

・31行目では, old_typeに現在の編集エリアのタイプ(テキストエディタ)を代入

・32行目で編集エリアをグラフエディタに移動し, 33行目でキーフレーム間に補完をリニアに設定(今回は1フレームごとに設定しているので, 31~34行目はなくてもよい)

・34行目でテキストエディタに戻る

f:id:tgkhtknk:20211218192113p:plain

図11 コード

ディレクトリ, ファイル名, CSVデータのサンプリング周期と作成する動画のフレームレートにより適宜8, 9, 22, 24~27行目を書き換え, Pythonコードを実行します. ただし, Blenderを日本語化していると18行目でエラーを吐くことに注意してください. 対処法はある気がするのですが, このコードは英語でないと動きません.

 Scripting画面からLayout画面に戻ると, 図12のように直方体ができています. また, 赤枠で囲ったCubeの角度を表す部分が黄色になっています. これがキーフレームが挿入された状態です.

 さらに, 画面下の緑色で囲ったタイムラインにオレンジ色の四角形がたくさんあります. これは1つ1つがその時刻ごとにキーフレームが挿入されていることを表します. 

 今回用いたデータでは404フレーム目までキーフレームが挿入されましたが, デフォルトの設定ではタイムラインが250で最後になっています. そこで, 青枠で囲った250を404に変更します. 

f:id:tgkhtknk:20211218195453p:plain

図12 スクリプト実行後のLayout画面

⑦ロケットっぽい形のオブジェクトを入れる

 直方体がぐるぐる回ってもいまいちなので, ロケットっぽい形のオブジェクトを導入します. 今回は, 事前に作成しておいたSTLファイルをimortします. 図13のように, File→Import→Stl をクリックします.

f:id:tgkhtknk:20211218200411p:plain

図13 STLファイルのimoport

そうすると, 図14のように原点にimportしたオブジェクト(以下Rocketと呼ぶ)が配置されます. Rocketの角度が意図した初期姿勢と異なる場合は, 初期姿勢に変更してください. なお, 図12では404フレーム目でしたが, 図14では1フレーム目に移動しています. ここから, RocketがCubeと一緒に回転してくれるように設定を行います. 

f:id:tgkhtknk:20211218200905p:plain

図14 STLファイルのimport後

 まず, Cubeをクリックします. その後, 図15のようにCubeの角度と大きさを変更します. 角度は初期姿勢(Rocketと同じ姿勢)にします. RocketがCubeと一緒に回転するようにするための作業上の都合で一時的にするだけなので, キーフレームの挿入(iキーを押す)はしないでください.

 次に, CubeがRocketの中に収まるようにCubeの大きさを変更します. これは動画を作成するときに見栄えをよくするための作業です.

f:id:tgkhtknk:20211218201425p:plain

図15 Cubeの大きさと角度の変更

 次に, 親子関係を設定します. まずRocketをクリックします. そのまま, Shiftキーを押しながらCubeをクリックします. (Rocketの中に隠れてしまっていますが, あるはずのところをクリックすれば問題なくできます) 必ずRocketを先, Cubeを後にクリックします. その後, Ctrlキーをおしながらpを押すと, 図16のようになるのでObject (Keep Transform)をクリックします. こうすることでCubeが親, Rocketが子となり, RocketはCubeと一緒に回るようになります. 

f:id:tgkhtknk:20211218202139p:plain

図16 親子関係の設定

⑧フレームレートの設定

 今回はフレームレートが50 fps (50 Hz)になるようにCSVデータのサンプリングレートとPythonコードでのダウンサンプリングを定めたので, Blender上でも50 fpsに設定します. 図17のように, 画面右側にある赤枠で囲ったプリンターが画像を出しているアイコンをクリックします. その後, 緑色枠で囲った部分のデフォルトで24になっているFrame Rateを50に変更します. 

f:id:tgkhtknk:20211218203923p:plain

図17 フレームレートの設定

⑨映像を見てみる

 図18の赤枠で囲った, タイムラインの上部にある再生ボタンをクリックすれば, Rocketが回る様子を映像で見ることができます. ただし, リアルタイムに描画してるので50fpsで表示してくれるとは限りません.

 きちんと動画に出力する方法は下2つの記事を参考にしてください. 他にもググればいくらでも出てくるので説明しません. (記事終盤になり疲れてきたし) 

【Blender2.9】カメラの使い方と機能:レンダリングには必要技術! | Vtuberの解剖学

Blender2.8で【静止画】【動画】をレンダリングして保存する方法

f:id:tgkhtknk:20211218204558p:plain

図18 再生ボタン

⑩実際のロケットの動画と見比べてみる

この動画は, 2019年11月に打ち上げたC-43Jの動画と, それに搭載した基板のデータからBlenderで作成した動画の比較動画です. いい感じですね!!(最後の方ちょっとずれてるけど, ドリフト・基板とカメラ間の時刻誤差・撮影地点から見てロケットが移動しているの複合によるものかな)

youtu.be

 

STM32マイコンを用いて自作基板をつくろう

はじめに

 nucleoボードは, そこそこ高性能でかつ簡単に扱うことができ便利です. しかし, 小型化したい場合は, STM32マイコン単体を使う基板を自分で設計することになるでしょう. 本記事では, その場合に必要な周辺部品や, プログラムの書き込み方法について記します. 

 本記事では, 開発環境はCubeIDE, マイコンはSTM32F446REを用います. また, 基板設計ソフトはEagleを用います. なお, CubeIDEを用いてプログラムを書き, nucleoボードに書き込む方法は把握していることを前提とします. 

 なお, とりあえず動いてるからヨシ👉が含まれているのでご注意ください. 本記事の内容により不利益が生じても一切責任は負いません. 

 

①nucleoボードを使って試験する

nucleoボードに使いたいセンサなどをつなぎ, 試験しておきましょう. このときCubeIDE上で作成したiocファイル(設定ファイル)が自作基板の配線を決めるときの参考になります.

②基板を設計する

a. 電源関係の部品を配置する

 F446REの電源電圧は1.7~3.6Vです. ここでは3.3Vを用いることにします. レギュレータは, 例えばNJM2391DL1-33を使えばいいでしょう(秋月電子でも購入できます). データシートを見ながら, 適当にコンデンサダイオードを配置します. 下図のコンデンサの容量はテキトーです. 出力側にのみ電解コンデンサも配置しているのはなんとなくです.

f:id:tgkhtknk:20210725161758p:plain

 F446REの1番(VBAT), 19番(VDD), 32番(VDD), 48番(VDD), 64番(VDD)ピンを3.3Vに接続します. また, 18番(VSS), 31番(VSS), 47番(VSS), 63番(VSS)をGNDに接続します. また, 今回はAD変換などの機能は使わないとし, 12番(VSSA)はGNDに, 13番(VDDA)は3.3Vに接続します. 

 F446REのこれら3.3Vに接続したピンのそばに, バイパスコンデンサとしてセラミックコンデンサを配置します. 0.1μFを4つくらい(1番と64番, 13番と19番は近いので2つに1つ配置)配置しておけばたぶん大丈夫です. 

 

b. プログラム書き込み用の配線を行う

 プログラム書き込み用に, 次の6つをピンソケットに接続します. 

・3.3V 書き込み時にnucleoボードから電源供給できるようにするため

・GND nucleoボードとGNDを共通化し, きちんと書き込めるようにするため

・7番(NRST)

・46番(TMS)

・49番(TCK

・55番(SWO)プログラム書き込みのみなら必要ないが, デバッグ時に必要

また, 7番(NRST)は, チャタリング防止のために0.1μFのセラミックコンデンサを挟んでGNDに接続します. 

c. 水晶発振子の配線を行う

 内部の発振子を使う場合は必要ありません. 水晶発振子を使う場合は, 5番(RCC_OSC_IN), 6番(RCC_OSC_OUT)ピンに接続します. また, 適当なセラミックコンデンサと抵抗を水晶発振子に接続します. 

d. 動作確認用LEDの配線を行う

 LチカができるようにLEDをつけておきます. GPIO_OUTPUTに設定できるピンならどこでもよいので, 電流制限用抵抗を忘れないよう気を付け配線しましょう.

e. その他の必ず必要な周辺部品の配線を行う

 30番ピン(VCAP_1)は4.7μFのセラミックコンデンサを挟んでGNDに接続します. 60番ピン(BOOT0)は10kΩの抵抗を挟んでGNDに接続します.

f. 自分が使いたいセンサなどの配線を行う

nucleoボードで試験した使いたいセンサの配線をしましょう.

 

 下図が回路図の全体です. バイパスコンデンサは実際に配置するピンの近くではなく, 下にまとめて書いています. 

f:id:tgkhtknk:20210725161849p:plain

 

また, こちらが配線図です. もともと色々なセンサの載せていたのを取っ払って最低限必要な部品のみにしたものなので, 部品が窮屈に固まっているのは気にしないでください.

f:id:tgkhtknk:20210725162050p:plain

③プログラムを書く

a. iocファイルを編集する

 だいたいは①で使ったiocファイルで問題ないですが, いくつか確認が必要です.

・水晶発振子用のピン
5番ピンがRCC_OSC_IN, 6番ピンがRCC_OSC_OUTになっていることを確認する. 

f:id:tgkhtknk:20210725143155p:plain

 

・プログラム書き込み用のピン
46番ピンがTMS, 49番ピンがTCK, 55番ピンがSWOになっていることを確認する.

f:id:tgkhtknk:20210725144131p:plain

 

・クロック設定
 外付けした水晶発振子を用いるなら, クロック設定を変更する必要があります.

 まず, 左の赤枠部分の"input frequency"を用いる水晶発振子に合わせて変更します. 次に, 左の赤丸部分"HSE"をクリックします. "E"はExternalのEです. これをクリックすることで外部の水晶発振子を使えることになります. 

 次に, 右の赤丸部分"PLLCLK"をクリックします. ここ"System Clock Mux"にも"HSE"がありますが, これをクリックすると, クロックを逓倍して高速動作させることができなくなります. 

 最後に, 右側の赤枠"HCLK"にお好みのシステムクロックを入力します. ここでは折角なので最大の180 MHzを入力しました. (速くすると消費電力が増えるのでその辺と相談して決めましょう)入力すると, 分周と逓倍の部分が勝手にいい感じに自動で決定されます. 当然ながらTimer clocksが変わるので, タイマー関係の機能を使っている場合は気を付けます.
f:id:tgkhtknk:20210725111531p:plain

b. プログラムを書く

iocファイルからプログラムを自動生成してもらったら, 残りを自分で書きます.

④nucleoボードと自作基板をつなぐ

緑色で囲んだ部分のジャンパーピンを外す

 nucleoボードをST-LINKとして使用できるようにするため, 2つのジャンパーピンを外します. nucleoボードとして使うときにまた刺す必要があるので, なくさないように気を付けます.

配線をつなぐ

 ②bで作成した自作基板のピンソケットにつなぎます. オス-メスのジャンパワイヤが必要です. 黄色で囲んだ部分は6つありますが, 画像1番上の1つを除いた5つをつなぎます. 

・上から2番目:TCK

・上から3番目:GND

・上から4番目:TMS

・上から5番目:NRST

・上から6番目:SWO

デバッグを行わずプログラムを書き込むだけなら, SWOはつながなくていいです. 

 また, 画像の赤色で囲んだ部分は3.3Vの出力です. 自作基板に電池などをつないでいない場合は, ここを自作基板のピンソケットの3.3Vにつないで電源供給します. 

f:id:tgkhtknk:20210725003654p:plain

⑤nucleoボードとPCをつなぐ

USBケーブルでnucleoボードとPCをつなぎます. ④をする前につなぐとプログラムを書き込めなくなるので, 気を付けます.

⑥プログラムを書き込む

nucleoボードの場合と同様の手順で書き込めます. 

⑦補足

 STM32マイコンをはんだづけするときは, 温度調節機能付きのはんだごてを用いた方がよいでしょう. 例えばこういうの. ステーション型の方が使いやすいですが, あちらは高いので...

 自作基板を設計する前に, ブレッドボードで試験したいかもしれません. その場合, マイコンDIP化する必要があります. 32ピンのSTM32マイコン, 例えばF303K8の場合は, 秋月電子通商で変換基板が売られています. 通常の太さではなく細ピンヘッダを使う必要があるので気を付けてください. 

akizukidenshi.com

一方, 64ピンのSTM32マイコン, 例えばF446REの場合は厄介です. 秋月電子通商にもDIP化基板は売られていますが, 正方形にピンヘッダを刺す部分が並んでいて, ブレッドボードに刺せません. 代わりにDigikeyで見つけたこれを使っていますが, 1864円もします...

www.digikey.jp

小型学生ロケットにおいて、MPU9250のDMPによる姿勢角算出機能は使えるか?

 

はじめに

こんにちは。と-ご-かいはつかんきょ-です。

MPU9250は、加速度, 角速度, 地磁気がそれぞれ3軸搭載された安価なセンサです。扱いやすいDIP化キットが販売されていることもあり、人気が高いです。(もう生産中止してしばらく経ちますが...)

角速度を積分すれば角度が求まりますが、時間とともに誤差が蓄積します。一方で、加速度, 角速度, 地磁気の9軸の値を組み合わせれば、安価なセンサでもそれなりに使える姿勢角が取り出せます。ただ、これを実装するのは大変です。

しかし、MPU9250には大変便利な機能があります。それは、DMP(Digital Motion Processing)です。自分で相補フィルタやカルマンフィルタを実装しなくとも、いい感じに計算したクォータニオンを吐き出してくれます。

試した方の動画を見てみると、安定して姿勢角を求められるようです。

 

では、この便利な機能は、小型学生ロケットでも使えるでしょうか。結論を先に書いておくと、たぶん無理です。

ロケット向けに設計されていない

MPU9250はロケットに載せることを想定して開発されたセンサじゃありません。スマートフォンや「ドローン」に使うものです。

ですから、DMPのアルゴリズムは、スマートフォンや「ドローン」に適した設計がされているはずです。つまり、それらを使用する環境に合わせたモデル化がなされ、コードが書かれています。

スマートフォンも「ドローン」も、瞬間的に大きな加速度がかかることはありますが、概ね、加速度センサの値から鉛直方向を知ることができます。

一方、小型学生ロケットの動き方は異なります。打ち上げ前や着地後は、加速度センサの値から鉛直方向が分かるでしょう。しかし、エンジン燃焼中は数Gの加速度がかかりますし、燃焼終了後の弾道飛行中のセンサ値は0G付近を示します。

地磁気センサはどうでしょうか。ランチャーが鉄製の場合、その近くにいるときは地磁気センサの値を無視したいですが、そんな機能が実装されてるとは思えません。

DMPのアルゴリズムが想定すると思われる状況と、小型学生ロケットの環境が異なるので、使えない可能性が高いです。

ドキュメントどこ?

ここまで「たぶん」「はずです」「可能性が高い」など曖昧な書き方をしてきたのは、MPU9250のDMPの詳細が書かれたドキュメントが見つからないからです。

私が見つけきれてない可能性もありますが...

どのようなアルゴリズムで実装されているのか分からない以上、ロケットには使えません。もしかしたら、とても優れたアルゴリズムを採用しているのかもしれません。小型学生ロケットの環境下で、それぞれのセンサデータを使えるか的確に判別し、重み付けを変えながら演算してくれるかもしれません。

でも、ドキュメントがないなら知りようがありません。ロケット向けのセンサじゃないから、使えないだろうと判断するのが妥当です。

(ドキュメントの在りかを知っている方がいたら教えてください...)

結論

以上の事情から、MPU9250のDMPを小型学生ロケットで用いるのはたぶん無理です。センサフュージョンをしたいなら、自分で実装して、ロケットの状況に合わせて使うデータを切り替える必要があるでしょう。

便利な機能だけど、適材適所じゃないねという話でした。

地上を走行中のカンサットなら使えるのかな。

小型学生ロケットの地磁気センサデータの所見

 

はじめに

こんにちは。某大学の学生ロケットサークルで電装をしていた、と-ご-かいはつかんきょ-です。

今回は、以前試した地磁気センサのデータ処理結果について軽く書きます。「球面フィッティングの結果」以降が本題です。

加速度と地磁気による角度の補正

角速度を積分すると角度が得られます。しかし、それだけでは時間経過と共に誤差が蓄積するため、何らかの方法で補正する必要があります。

小型無人機では一般的に、加速度と地磁気を用いて補正します。詳細はこちらの記事が大変参考になります。

qiita.com

しかし、ロケットでは加速度を用いることは基本的にできません。加速度ベクトルがおおよそ鉛直方向を向いていないといけないので、打ち上げ前, パラシュート開放後で終端速度に達しているとき, 着地後にしか使えません。

なので、地磁気センサが重要です。地磁気ベクトル周りの誤差は修正できずに蓄積していくけど仕方ないね。

地磁気データの零点補正の方法

センサの特性, 温度, 周辺の物体などの影響で値がずれるので、姿勢の補正に地磁気データを用いる前に、零点補正をする必要があります。

この記事を参考にMATLABで実装しました。最小二乗法で球面フィッティングし、球の中心を求めます。中心の座標を差し引くことで零点補正をします。

www.slideshare.net

球面フィッティングの結果

ここから本題です。

このグラフが、以前サークルで打ち上げたロケットの、飛行中の地磁気データを用いて球面フィッティングを行った結果です。f:id:tgkhtknk:20201025205550p:plain

赤色が離床直前~離床1.7秒後までのデータ, 青色が離床1.7秒後~12秒後までのデータ, 虹色のメッシュが求めた球です。

離床前にロケットを固定するランチャーが鉄製なので、赤色のデータは球から離れています。一方、青色のデータは球にまとわり付くように並んでいて、ロケットがロールしている様子がはっきりと分かります。

地磁気のノルム

上の球面フィッティングの結果を用いて零点補正をし、地磁気のノルム(大きさ)の時間変化を求めました。その結果がこのグラフです。

f:id:tgkhtknk:20201025210546p:plain

誤差がなければ、センサの方向に関わらず一定のノルムになるはずです。

離床前は金属製ランチャーの近くにいるため、ノルムが大きいです。 離床直後は、ノルムが激しく変化しています。
その後、ノルムはだんだんと小さくなり, 離床1.5 秒後∼12 秒後は概ね一定のノルムで推移しています。

ランチャーから十分に離れた後の地磁気データは、姿勢の補正に使えそうです。

結論

2つのグラフから、最小二乗法を用いた球面フィッティングによる零点補正は適切に行えたと考えられます。

よって、機体が激しくロールすれば、事前にくるくる回して零点補正用のデータを取得しなくても、機体回収後の姿勢推定に地磁気データを用いることができると言えます。

意外と地磁気による姿勢の補正のハードルが低いことが分かったので、どしどし活用しよう!