Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

BdotモードでMTQがまったく出力されない場合がある #312

Closed
suzuki-toshihir0 opened this issue May 21, 2024 · 4 comments
Closed
Assignees
Labels
🐟 patch Patch Update 🚀 priority::high priority high

Comments

@suzuki-toshihir0
Copy link
Member

suzuki-toshihir0 commented May 21, 2024

詳細

Bdotモードのタスクリストの組み方・磁気排他制御タイマーの状態によってはMTQが全く出力されないケースがあることが判明した。

前提

Bdotモードの現状のタスクリストは以下である:

void BCL_load_bdot_mode(void)
{
// CDH必須アプリ
BCL_tool_register_combine(0, BC_AC_CDH_UPDATE); // 23step以上
// AOCS必須アプリ
BCL_tool_register_combine(25, BC_AC_BASIC_SENSOR_UPDATE); // 7step以上
BCL_tool_register_app (35, AR_APP_AOCS_MM_BDOT); // 1step以上
// Bdotアプリ
BCL_tool_register_combine(40, BC_AC_MTQ_UPDATE); // 1step以上, MTQ駆動時間カウンタを20 [Hz]周期にするため入れている
BCL_tool_register_combine(45, BC_AC_RM3100_UPDATE); // 4step以上
BCL_tool_register_app (60, AR_APP_GYRO_SELECTOR); // 1step以上
BCL_tool_register_app (80, AR_APP_BDOT); // 1step以上
BCL_tool_register_combine(90, BC_AC_MTQ_UPDATE); // 1step以上
// 基本使わないがユーザーが使いたい時に使えるように入れておく
BCL_tool_register_combine(92, BC_AC_OEM7600_UPDATE); // 1step以上
}

現状の仕様と実装

磁気制御がタスクリストに沿ってどのように実行されるかを理解するためには、各アプリの仕様と実装を正しく理解しておく必要がある。

  • 磁気排他制御タイマー:stateが OBSERVE (磁気センサを使った磁場観測とそれに伴う磁場推定・出力目標値計算に使って良い時間枠)--> CONTROL (計算した出力目標値を使ってMTQを出力するのに使って良い時間) --> STANDBY (消磁待ちに使って良い時間)と順番に切り替わる。磁気排他制御タイマーは他のオブジェクトのGetter / Setterを叩いて操作することはせず、他のアプリが磁気排他制御タイマーのstateを見ることによって排他制御を実現する。
  • 磁気センサDI:DIが呼ばれるたびに、磁気計測値が磁気センサドライバ構造体のメンバに保存される。
  • 磁気センサフィルタ:磁気排他制御タイマーが OBSERVE のときに限り、スパイクフィルタ(とLPF)を実行してAOCS managerの磁場ベクトル推定値に値をpushする。
  • Bdotアプリ:AOCS managerの磁場ベクトル推定値の直近2回の値を自身のメンバに保持する。その2回の値から磁場ベクトルを微分し、AOCS managerの目標出力磁気モーメントに値をpushする。
  • MTQコントローラー:磁気排他制御タイマーのstateが OBSERVE のとき、AOCS managerの目標出力磁気モーメントを読み、3個のMTQに対してそれぞれが何秒間出力すればその磁気モーメントを実現できるかを計算する。続いて、stateが CONTROL のとき、MTQ DIに磁気モーメント出力指令をする。
  • MTQ DI:ただのGPIO制御のラッパーであり、MTQコントローラーから指示されたらGPIOポートから電流を流す。

MTQが出力されるケース

ノミナルケースである磁気センサにRM3100を使う場合は、それぞれの状態量が時間に沿って以下のように変化していくため、MTQが正しく出力される。

image

MTQが出力されないケース

RM3100を使っているがstate timerのアップデートタイミングが50msズレている場合・MPU9250を使っている場合は、それぞれの状態量が時間に沿って以下のように変化していくため、MTQが出力されなくなってしまう。

  • RM3100を使っているが、step == 90のときに magnetic_exclusive_control_timer->state_timer_ms が50となるケース

image

  • MPU9250を使っていて、step == 40のときに magnetic_exclusive_control_timer->state_timer_ms が0となるケース

image

  • MPU9250を使っていて、step == 90のときに magnetic_exclusive_control_timer->state_timer_ms が50となるケース

image

close条件

一旦は、タイミング関連のパラメータを調整して上記の問題が解決したら

備考

なにかあれば

@suzuki-toshihir0 suzuki-toshihir0 added 🚀 priority::high priority high 🐟 patch Patch Update labels May 21, 2024
@suzuki-toshihir0 suzuki-toshihir0 self-assigned this May 21, 2024
@seki-hiro
Copy link
Member

@suzuki-toshihir0
「タイミング関連のパラメータの調整」にstepの変更も含まれるでしょうか?

#307 でのアプリタイムの調整と干渉しないかを心配しています。

@suzuki-toshihir0
Copy link
Member Author

suzuki-toshihir0 commented May 21, 2024

@seki-hiro いえ、タスクリストの変更がないように対処します。具体的な対処は次の2点になる予定です。

  1. 以下の observe_duration を200に設定する

magnetic_exclusive_control_timer_.config.observe_duration_ms = 100;
magnetic_exclusive_control_timer_.config.control_duration_ms = 800;
magnetic_exclusive_control_timer_.config.standby_duration_ms = 100;

  1. (これまでの衛星と制御系の挙動をあわせるため)以下を1000に設定する

const uint32_t ATTITUDE_CONTROL_PARAMETERS_bdot_minimum_time_derivative_step_ms = 100;

@seki-hiro
Copy link
Member

干渉しないということでよかったです。ありがとうございます。

@conjikidow
Copy link
Member

#313 で対応したのでcloseする

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
🐟 patch Patch Update 🚀 priority::high priority high
Projects
None yet
Development

No branches or pull requests

3 participants