9.2K Views
September 10, 26
スライド概要
■ドローンやロボットを自作することを通じて制御や関連技術の生涯勉強情報を提供■工学博士■防大航空宇宙→筑波大博士■陸自→対戦車誘導弾等の装備品開発→高専教員→大学教員■ロボットランサー優勝→マイクロマウスニューテクノロジー賞受賞■指導者としてつくばチャレンジバンナム賞→飛行ロボコンマルチコプタ部門1位等々■北海道函館出身
制御教育教材 StampFly Ecosystem の紹介 コーディングから飛行試験、データ取得まで 伊藤 恒平(金沢工業大学) 2026 年 9 月 10 日(木)大阪大学中之島センター + Zoom システム制御情報学会・計測自動制御学会 チュートリアル講座 2026 cb この資料は CC BY 4.0(クリエイティブ・コモンズ 表示 4.0 国際)で公開 https://creativecommons.org/licenses/by/4.0/deed.ja 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 1 / 160
講師紹介 伊藤 恒平 金沢工業大学 情報理工学部 ロボティクス学科 StampFly Ecosystem の開発者。専門はドローンの飛行制御工学 4+1 日ワークショップ(大学生向け、一般の方も参加可。講義・実習と精密 着陸競技会)で同じ教材を使用 ZEP エンジニアリング主催の講習会(2025 年 8 月、品川、2 日間) 高校教員向け DXH 講座(2026 年 7 月、操縦体験と書き込み実習) 学会チュートリアル(本日) オープニング 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 2 / 160
開発環境の導入(先出し): PC 側 未導入の方は Session 1 を聞きながら並行して。導入は CLI で行う(Windows のコ マンドプロンプトで書く) ① 前提ツール: Git と Python 3.12 を入れる(Windows は winget、macOS は brew、Linux は apt。コマンドはリポジトリ直下 README)。終わったら CMD を開き直す ② 取得と導入 git clone https :// github .com/M5Fly - kanazawa / stampfly_ecosystem .git cd stampfly_ecosystem install .bat macOS / Linux は ./install.sh。ESP-IDF を尋ねられたら 1 を選ぶ ③ 有効化と診断: 新しい CMD を開くたびに setup_env.bat(macOS / Linux は source setup_env.sh)、続けて sf doctor GUI 版インストーラは安定性未確認のため本講座では使わない オープニング 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 3 / 160
本日の進め方 講義とデモのハイブリッド 講師が実演しながら説明を進める。手元の環境構築でつまずいても、その場で全員 を待たせることはしない 手を動かしたい方は、講師と同じコマンドを一緒に打ってみてほしい 進度が合わなかった箇所は、録画と資料を使って帰宅後に復習できる 各セッションの進め方 地図(今どこにいるか)→ このセッションで伝えること → デモ → 理論とコードの対応表 → 復習 パス → チェックポイント オープニング 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 4 / 160
参加のしかたと資料 デモの 3 段階 見るだけ: 画面とスクリーンを見ているだけで流れがわかる 一緒に打つ: 持参の PC と StampFly でコマンドを再現する 帰宅後に再現: 会場では見るだけにして、録画と資料で後日試す 資料はすべて公開されている リポジトリ: https://github.com/M5Fly-kanazawa/stampfly_ecosystem ドキュメント: https://m5fly-kanazawa.github.io/stampfly_ecosystem/docs/ 本日の内容はオンデマンド配信でも後日視聴できる オープニング 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 5 / 160
今日の地図 設計 S1 教育 実装 S5 S2 · S3 StampFly Ecosystem は「設計 → 実 装 → 実験 → 解析 → 教育」を循環 させながら育ってきた。本日の 5 セッションはこの循環の上を進む S1 S2 解析 実験 S5 S4 S2・S3 は「実装」、S5 は「解析・教育」を担当 オープニング S3 S4 S5 10:05 – 11:00 11:00 – 12:00 (昼休み) 13:00 – 14:00 14:00 – 15:00 (休憩) 15:30 – 16:30 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 6 / 160
必要機材と安全ルール 持参いただくもの ノート PC、StampFly 実機とコントローラ(いずれも実習に参加する場合) 飛行時の安全ルール 飛んでいる機体からは距離を保つ 飛行は指定のエリアの中だけで行う 飛行の操作は必ず立って行う。座ったまま飛ばさない ARM は機体ボタンの単クリックまたはコントローラで行う。予期せず回転 したら即座に DISARM 機体の真上には顔や手を出さない オープニング 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 7 / 160
Session 1 StampFly Ecosystem の全体像と設計思想 10:05 – 11:00 SCI/SICE チュートリアル講座 2026
地図: 今ここ 設計 S1 教育 実装 S5 S2 · S3 解析 実験 S5 S4 Session 1: 全体像と設計思想 今日はこの循環を 5 つのセッションで 1 周する。まずは全体像と設計思想 から 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 9 / 160
StampFly Ecosystem とは何か: 目的・考え方・提供物 1 2 3 何のために: 制御なしには飛べないマルチコプタを教材にし、一 人の学習者が 1 機で「設計 → 実装 → 実験 → 解析」を自分の 手で一周できるようにする どういう考え方で: 一つのリポジトリ・4 階層の入口・同じコー ドとモデルで実機とシミュレータをつなぐ(5 つの設計の考 え方) 何を提供するか: 機体、ファームウェア、3 種類のシミュレー タ、sf CLI、そして 8 分野を通る教材。本日の実習 1〜9 はその 教材の一部 Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 10 / 160
目的: 制御がなければ飛べない マルチコプタは固定翼機のように滑空できず、ヘリコプタのようにオートローテー ションで降りることもできない。制御系が止まれば即座に墜落する 教材としての魅力 この性質は安全上の課題であると同時に、学習者が「制御がなければ飛べない」と いう事実を身をもって体験できる特性でもある。フィードバック制御の役割を直感 的に理解する入口になる Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 11 / 160
目的: 教材として使うには 4 つの障壁がある 制御なしには飛べないマルチコプタは制御教育の教材として魅力的だが、実際の教 育現場で使うには次の 4 つの障壁がある ブラックボックス問題: 市販の教育用ドローンは飛ぶが、制御ループの中身に 触れられない 理論と実装のギャップ: PID の数式は教科書で学べても、組込みのリアルタイ ム制御ループとして実装するには別のスキルが要る 体系的教材の不在: センサ取得から状態推定、制御、実験、データ解析までを 一貫して学べる教材が見当たらない 教育者の準備負担: カリキュラム設計・教材作成・ツール整備を一人の教育者 がすべて担うのは現実的でない Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 12 / 160
目的: 既存プラットフォームとの比較 既存のプラットフォームは、この 4 つの障壁のどれかが残る 制御ループアクセス 教材・カリキュラム シミュレータ統合 コスト コード規模 Crazyflie X 4 X 高 中 Tello EDU* — 4 — 低 — PX4 X 4 X 高 大 StampFly Eco. X X X 低 小 制御ループへのフルアクセスと体系的な教材・ツールの統合提供を両立させ、 ファームウェア全体を一人の学習者が読み通せる規模に抑えている点が異なる * Tello EDU は 2023 年末に販売終了(評価は筆者の定性的見解) Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 13 / 160
目的: StampFly Ecosystem が目指すもの 一人の学習者が、1 機の機体で、制御設計の循環を自分の 手で一周できるようにする 設計(モデルとゲイン)→ 実装(コード)→ 実験(実機と SILS)→ 解析(ログの可視化と同定) → 次の設計へ。対象は制御を学ぶ学生・研究者と教育者 障壁 ブラックボックス問題 理論と実装のギャップ 体系的教材の不在 教育者の準備負担 Session 1: 全体像と設計思想 Ecosystem の答え 制御ループからドライバまで全部を公開し、学習者が読み通せる規模に抑える 実機と同じコードをシミュレータでも動かし、数式と組込み実装を切れ目な く扱う センサ取得・状態推定・制御・実験・解析を 1 機で通る教材とツールを同梱 する 教材・実習コード・ビルドと書き込みの道具を一式で配り、準備を減らす 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 14 / 160
思想: 5 つの Ecosystem 設計の考え方 考え方 内容 一つのリポジトリ ファーム・シミュレータ・解析ツール・教材を一か所にまとめる。通 信仕様の定義は一つだけ置き、各実装はそこから作る ビルド・書込み・ログ取得・シミュレーションを一つのコマンド体系 で操作する 実習用 API からハードウェアの直接操作まで 4 つの入口を用意し、必 要な深さから入る 軽量 3D(VPython) ・高精度物理(Genesis) ・実ファーム実行(SILS) の 3 つを使い分け、同じ物理パラメータとゲインでつなぐ 制御ループからドライバまで全部を公開し、ブラックボックスを作ら ない sf CLI 4 階層アクセス シミュレータ統合 オープンソース Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 15 / 160
思想: 4 階層アクセス(必要な深さから入る) L0: 実習用 API ws::* 典型ユーザー: 初学者 setup() / loop_400Hz(dt)、30+ 関数で完結 L1: Topic API sf::api::* Topic を subscribe/publish、 IEstimator/IController 差替え L2: HAL Direct stampfly::*Wrapper 典型ユーザー: HW 学習者 必要な分だけ降りられる (各層は単独でも使える) 典型ユーザー: 推定・制御学習者 SPI / I2C を直接呼ぶ(Topic を介さない経路) L3: BSP Internal sf::internal::board 典型ユーザー: ファーム実装者 bus handle、起動順序を直接扱う Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 16 / 160
思想: 実機とシミュレータをつなぐ 3 原則 原則 Code Identity Parameter Identity Model Fidelity Session 1: 全体像と設計思想 内容 同じコードで動く。SILS は実機と同じファームウェアのソースを そのまま組み込んで動かす。推定や制御の式だけでなく、制御ルー プ全体が実機と同一 同じ設定値で動く。ゲインなどの調整値は SILS と実機が同じ一覧 から読む。片方で決めた値をそのまま他方へ持ち込める 正解は物理モデルから作る。SILS の「真値」は物理モデルで作る。 実機データが要るのは、初飛行のあとでモデルを現実に近づけると きだけ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 17 / 160
提供: エコシステムの地図 control/ 制御を設計 改善点を FB 設計を改善 PID パラメータ simulator/ firmware/ 仮想テスト 安全に検証 テレメトリ 実装して飛ばす tools/ protocol/ sf CLI 通信仕様 SSOT analysis/ データ解析 全体を支えるインフラ Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 18 / 160
提供: 機体 StampFly 項目 仕様 MCU ESP32-S3(M5StampS3) IMU BMI270(6 軸 400 Hz) 気圧 BMP280 磁力計 BMM150(3 軸) 測距 VL53L3CX ×2(Bottom / Front) 光学フロー PMW3901 電流電圧 INA3221 モータ コアレスモータ ×4 バッテリ 300 mAh 1S LiPo 質量 37 g(バッテリ含む) コントローラ M5Stack AtomS3 + Atom JoyStick (ESP-NOW) IMU(慣性計測装置)/ ESP-NOW(ESP32 の無線プロトコル)。前 方 ToF は未使用(高度推定は下方 ToF) Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 19 / 160
提供: 機体ファームウェア(vehicle) コンポーネント数 通信方式 タスク数 制御周期 状態推定 制御器 飛行モード 30(sf_* 命名, フラット構造) Pub-Sub トピック(直接呼び出し禁止) 16 400 Hz(IMU → 状態推定 → 制御) ESKF(誤差状態カルマンフィルタ) カスケード PID ACRO / STABILIZE / ALT_HOLD / POS_HOLD Pub-Sub(出版購読型のメッセージ配信) 実機検証 POS_HOLD(位置制御)は実機で検証済み。保持精度 ±6–7 cm Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 20 / 160
提供: 400 Hz 制御ループ ESP Timer 2500 µs IMU Task Read BMI270 Go! loop_400Hz (Your Code) hardware timer interrupt SPI read + bias correction data ready user_code.cpp runs here repeats every 2.5 ms = 400 Hz IMU 割込みを起点に、状態推定 → 制御 → アクチュエーションが 2.5 ms 周期で走 る。全コンポーネントが同じ周期を共有する Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 21 / 160
提供: シミュレータ — 役割の違う 3 つの実行環境 名前 役割 SILS ファームの開発と制御系の実装を、 MuJoCo (外部エンジ 机上である程度完了させる。飛ば ン、物理計算のみ)+ す前の検証と合否判定(実習 8 自作のモータ・センサ・ (2/2)) 風モデル 練習用。簡単で読みやすい Python 自作の 6 自由度モデル で、力学エンジン・3D 表示・セ ンサモデルなど「シミュレータの 作り方」を学ぶ(デモ①) 強化学習向けの選択肢として残し Genesis(外部の高精度 ている。今日は使わない エンジン) VPython 版 Genesis 版 物理モデル 動く制御コード 可視化 実機と同じ C++ フ ブ ラ ウ ザ GUI ァームそのもの (three.js の 3D とグラフ) Python に移植した 制御則 VPython のブラウ ザ 3D Python の制御則 Genesis の 3D なぜ 1 つでは足りないか 「実機のファームをそのまま動かして検証する」 「中身を読んで作り方を学ぶ」 「強化学習を回す」は 要求が違い、1 つの実装では両立しない。3 つは同じ物理パラメータ (stampfly_physical.yaml、sf params check で照合)を共有する Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 22 / 160
提供: SILS の仕組み — 実機のファームを PC で走らせる ファームは無改変: 実機に書き込む vehicle のソースを そのまま PC 向けにコンパイル(状態機械・フェイル セーフも含む) OS の代わり: 仮想時計で動く決定論的な疑似 RTOS と ESP-IDF 互換スタブ。同じ入力なら毎回同じ結果 制御対象: MuJoCo(6 自由度)+自作のモータ・セン サ・風モデル。400 Hz でファームと歩調を合わせる 試験の与え方: シナリオ .scn に操縦・外乱・故障を 時系列で書き、.expect で PASS / FAIL を自動判 定。CI で退行を検出 実習コードも同じ土俵: 参加者の user_code.cpp も同じ仕組みで飛ぶ(実習 8 (2/2)) できないこと: 複数タスクの競合、実際の WiFi / ESP-NOW の電波 Session 1: 全体像と設計思想 シナリオ .scn 操縦入力・外乱・故障の時系列 実機と同じファームウェア C++ (疑似 RTOS + 互換スタブの上) モータ指令 センサ値 制御対象: MuJoCo 6 自由度 + モータ・センサ・風モデル ログ + .expect で合否判定 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 23 / 160
提供: SILS を画面で触る(sf sils gui) ブラウザだけで完結: シナリオ作 成(外乱・故障などのイベントを 表で組む)→ 実行 → グラフ → 合否判定 PID ゲイン等 54 項目を画面で編 集。再ビルド不要(Parameter Identity) 使い方と実習は S5。今日は画面 を覚えるだけでよい 起動 pos_roll シナリオ実行直後。左: イベント列、右上: 3D 再生、右 1 2 sf sils build sf sils gui 下: グラフ(時刻カーソルが 3D と同期)、右上端: 合否 12/12 PASS Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 24 / 160
提供: 教材 — 1 機から学べる 8 分野 教材は 1 機から次の 8 分野を扱う。本日の実習 1〜9 は制御理論・センサ工学・ア クチュエータ・システム同定・状態推定を通る 分野 制御理論 飛行力学 センサ工学 状態推定 アクチュエータ システム同定 通信・IoT ソフトウェア工学 主な学習項目 PID, カスケード制御, FF/FB, アンチワインドアップ 6DoF 運動方程式, ホバー条件, NED/Body 座標変換 IMU, 気圧, 光学フロー, Allan 分散, ノイズ解析 相補フィルタ, ESKF, センサフュージョン PWM 制御, 推力モデル, プロペラ空力特性, ミキサ行列 周波数応答, パラメータ推定, モデル検証 ESP-NOW, WiFi テレメトリ, プロトコル設計 リアルタイムタスク, 組込み開発, OSS 開発 これらは独立した知識ではなく、1 台の機体の中で密接に関連し合っている。PID ゲインの設計には慣性モーメントやモータ応答特性の知識が要り、推定精度はセン サのノイズ特性に左右される Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 25 / 160
デモ①: シミュレータ操縦 見るだけ | 一緒に打つ | 帰宅後に再現 何を見るか sf sim run vpython を手元でも起動 VPython シミュレータが起動し、実機と同じ制 御アルゴリズムが動く HID ジョイスティック(Atom JoyStick)でそ のまま操縦できる 実機がなくても制御コードの挙動を 3D で確認 できる VPython シミュレータの画面(ボクセル地形を飛行中) Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 26 / 160
デモ②: 実機 POS_HOLD 飛行 見るだけ | 一緒に打つ | 帰宅後に再現 何を見るか ホバー中の位置保持精度(実測 ±6–7 cm) 手で軽く押すなどの外乱を与えたときの復帰動作 Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 27 / 160
デモ②の期待結果: 位置保持 pos_roll.scn(vehicle): 離陸 → ロール外乱 → POS_HOLD 係合 → 保持。係合後の水平ドリフト最大 0.39 m Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 28 / 160
デモ②の期待結果: 高度と姿勢 同じ飛行の高度と姿勢角の時系列。外乱直後の傾きが位置制御で戻る Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 29 / 160
復習パス コマンド sf sim run vpython sf sils gui — Session 1: 全体像と設計思想 あとで読む 対象 シミュレータ操縦 文書 docs/architecture/ simulation-policy.md SILS シナリオ実行・可 simulator/sils/gui/README.md 視化 4 階層アクセス firmware/vehicle/docs/ architecture.md §2 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 30 / 160
チェックポイント 確認事項 何のために: 制御なしに飛べない機体で設計の循環を一周する、と説明できる どういう考え方で: 一つのリポジトリ・4 階層の入口・同じコードとモデル、 と説明できる 何を提供するか: 機体・ファーム・3 種類のシミュレータ・sf CLI・教材を挙 げ、自分の入る層を 1 つ選べる 次のセッション S2: 開発環境のセットアップとセンサデータの取得(11:00 – 12:00) — 全体像を見た次は、実際に手を動かしてセンサの値を読む番 Session 1: 全体像と設計思想 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 31 / 160
Session 2 開発環境のセットアップ とセンサデータの取得 11:00 – 12:00 SCI/SICE チュートリアル講座 2026
地図: 今ここ 設計 S1 教育 実装 S5 S2 · S3 解析 実験 S5 S4 Session 2: 環境構築とセンサ S1 で見た全体像のうち、まず実装の入 口(環境構築とセンサ取得)から手を 動かす 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 33 / 160
環境を整え、2 つの関数を書き、センサの値を見る 1 2 3 ビルド環境は ESP-IDF と sf CLI が担う。導入も書き込みも sf CLI で行う 参加者が書くコードは setup() と loop_400Hz(dt) の 2 関数だ け。センサや HW の詳細は ws:: 名前空間が隠す センサデータの取得経路は 3 通りある。目的に応じて ws::print、sf telemetry、sf log wifi を使い分ける Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 34 / 160
OS による違いはここだけ OS インストール macOS / Linux ./install.sh Windows(CMD) install.bat 環境の有効化 source setup_env.sh setup_env.bat Windows は Git 同梱の CMD(コマンドプロンプト)でそのままファイル名を打つ。./ も source も付けない 書き込み時のシリアルポート名も違う sf flash vehicle -p /dev/ttyACM0(Linux)/-p /dev/cu.usbmodem*(macOS) /-p COM3(Windows) 違いはこの 2 点だけ。sf コマンド自体(sf build、sf lesson 等)とワークフ ローは 3 OS で完全に同一 Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 35 / 160
開発環境の導入: 機体とペアリング 書き込みは sf flash vehicle / sf flash controller で行う 本講座の操作はすべて sf CLI で行う コントローラのペアリング(初回のみ) 1 2 3 コントローラの LCD パネルボタンを押しながら電源を入れる StampFly 本体のボタンを 3 秒以上押し続け、ビープが鳴ったら離す(5 秒以上押し続けると システムリセット) 双方がビープしたらペアリング完了。以降は電源を入れるだけで自動再接続する Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 36 / 160
実習 1 (1/2): 環境確認とビルド 見るだけ | 一緒に打つ | 帰宅後に再現 手順 1 2 3 4 setup_env.bat(macOS / Linux は source setup_env.sh) sf doctor(ESP-IDF・Python・USB ドライバ・sf CLI 自体を診断) sf build vehicle(機体ファームをビルド。初回は数分かかる) sf flash vehicle -m(USB で書き込み、続けてモニタを開く。終了は Ctrl+]) 確認すること 書き込み直後に起動音が鳴り、LED が白(初期化中・静置)→ 緑常灯(準備完了)になる。モニタ に起動ログが流れる sf doctor が全て OK にならなくても心配は不要。このあとは「見るだけ」で参加し、復習パス (本セッション末尾)に沿って会場外で環境を整えてほしい Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 37 / 160
実習 1 (2/2): 機体の初期設定を一度に済ませる USB をつないだまま、モニ タ(CLI)で順に打つ 機体ごとに 1 回。N は講師が指定(1 / 6 / 11) sf monitor の CLI param reset param set wifi.mode 1 3 param set wifi.channel N 4 param save 5 reboot 1 2 続けてコントローラとペ アリング コントローラの LCD パネルボタンを押しな がら電源を入れ、機体のボタンを 3 秒以上押 し続ける。双方がビープしたら離す(5 秒以 上押し続けるとシステムリセット) 。以降は電 源投入だけで自動再接続 wifi.mode 1: 機体が自分の WiFi を出す (後半で使う) 。wifi.channel: 混信を避け る機体ごとのチャンネル。コントローラはペ アリング時に自動で合わせる Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 38 / 160
ツールチェーン ESP-IDF の上に sf CLI を重ねる idf.py を直接叩く代わりに、ビルド・書き込み・診断・ログ取得を統一したコマ ンド体系で提供する コマンド sf build [target] sf flash [target] -m sf monitor sf doctor 役割 ファームウェアビルド 書き込み(-m でモニタ付き) シリアルモニタ 環境診断 target には vehicle(機体)/ controller(送信機)を指定する。実習 1 で打っ た 4 コマンドがこの表の全てである Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 39 / 160
参加者が書くコードと作業の流れ 参加者が編集するファイルは user_code.cpp の 1 つだけ。本資料ではこれを「実習 コード」と呼ぶ 参加者が書く関数は 2 つだけ setup() — 起動時に 1 回 loop_400Hz(dt) — 400 Hz 毎 切替・編集・ビルド・書き込み sf lesson switch sci2026:N sf lesson edit sf lesson build sf lesson flash sf lesson monitor Session 2: 環境構築とセンサ 直して 再挑戦 sf lesson switch N レッスンへ切替 sf lesson edit user_code.cpp を書く sf lesson build ESP-IDF コンパイル sf lesson flash USB 書込 sf lesson monitor 波形/出力を確認 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 40 / 160
機体の軸定義 X (Forward) Roll Yaw Pitch Y (Right) Z (Down) BMI270 — 6 軸(3 軸ジャイロ + 3 軸加速度)400 Hz Body FRD(前方-右-下)座標系 | 機体の Body 座標系(前方-右-下)を先に決め、IMU の軸はそれに一致するように扱っている Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 41 / 160
IMU API と単位 関数 gyro_x/y/z() accel_x/y/z() 説明 単位 角速度(Roll/Pitch/Yaw) rad/s 加速度(X/Y/Z) m/s2 静止時の目安 ジャイロ ≈ 0、加速度 Z ≈ −9.81 m/s2 (重力に対する反力) Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 42 / 160
実習 2: IMU の値を見る 見るだけ | 一緒に打つ | 帰宅後に再現 手順 1 2 3 4 5 sf lesson switch sci2026:2 sf lesson edit で user_code.cpp を開き、次ページのコードを書いて保存 sf lesson build sf lesson flash sf lesson monitor(sf lesson flash 直後はそのまま開く) 確認: Teleplot の波形 VSCode 拡張 alexnesnes.teleplot 上で gyro_x/gyro_y の波形が動くこと 帰宅後に再現: 同じ手順(switch → edit → build → flash → monitor)をそのまま実行すればよい Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 43 / 160
データ取得経路① Teleplot
ws::print をそのままグラフにする
>変数名: 値 の形式で出力すると、VSCode 拡張機能 Teleplot がリアルタイムにグ
ラフ化する
user_code.cpp
static uint32_t tick = 0;
void loop_400Hz(float dt) {
3
if (tick ++ % 4 == 0) {
// 100 Hz decimation
4
ws:: print(">gyro_x :%.3f", ws:: gyro_x ());
5
ws:: print(">gyro_y :%.3f", ws:: gyro_y ());
6
}
7 }
1
2
VSCode 拡張 alexnesnes.teleplot を導入後、sf lesson monitor で接続(sf
lesson flash 直後はそのまま開く)
Session 2: 環境構築とセンサ
制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学)
44 / 160
実習 2: 傾けて確認 見るだけ | 一緒に打つ | 帰宅後に再現 何を見るか StampFly を手に持ち、前後左右に傾ける gyro_x/gyro_y が傾ける速さに応じて振れる 静止させると accel_z が −9.81 付近に戻る 前ページまでの sf lesson build && sf lesson flash 完了後、Teleplot 画面を見ながら 機体を傾ける Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 45 / 160
WiFi でつなぐ: 有線と無線の使い分け 飛行中は USB を挿せない USB ケーブルは機体と PC を物理的につなぐため、実際に飛ばしながらは使えない。その場でのゲ イン変更や飛行中のデータ取得には WiFi 接続が要る USB(有線) WiFi(無線) ビルド・書き込み X — 起動ログ確認(sf monitor) X — 50 Hz テレメトリのライブ表示 — X 飛行中の 400 Hz 全データ記録 — X パラメータの即時変更(飛行中も反映) — X システム同定・ゲイン設計 — X 右列は sf telemetry(UDP:5005)/ sf log wifi(UDP:8890)/ param set(WiFi 経由 の CLI,TCP:23)のいずれかを使う。次ページで接続方法を説明する Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 46 / 160
接続手順: 機体を WiFi 網に入れる 機体側: 実習 1 (2/2) の初期設定で済んでいる wifi.mode 1(機体が自分の WiFi を出す設定)は初期設定で保存済み。未設定の機体だけ、USB 接続のまま sf monitor の CLI で param set wifi.mode 1 → param save → reboot PC 側: 機体の WiFi に接続する 機体が StampFly-XXYY(MAC 末尾から自動生成の SSID)を出す。PC の WiFi 設定で選び,既定 パスワード stampfly を入力。IP は既定 192.168.10.1(DJI Tello 互換サブネット) 接続の確認: sf telemetry(受信できれば OK,IP 指定不要)。会場の WiFi ではなく機体自身が出す AP に繋ぐ (機体ごとに SSID が異なる) Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 47 / 160
データ取得経路② sf telemetry あとで読む コード変更なしでライブ表示 機体は状態推定値を常時 50 Hz で送信している。受信して表示するだけなら実習 コードの変更は不要 sf telemetry sf telemetry --web # ター ミ ナ ル 表 示 (既 定) # ブ ラ ウ ザ 表 示 ( UDP :5005 -> SSE ) 講義や複数人での画面共有には --web が見やすい。UDP:5005 を SSE(サーバーか らブラウザへの一方向配信)でブラウザへ届けている Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 48 / 160
データ取得経路③ ログ取得と可視化 あとで読む WiFi 経由で 400 Hz Data Stream を記録する sf log wifi は機体と同じ WiFi(SoftAP モードなら機体が出す AP)で 400 Hz の Data Stream を UDP 受信し、-o *.csv で 1 周期 1 行の CSV に保存する sf log wifi -d 30 -o flight .csv sf log viz flight .csv # 30 秒 キ ャ プ チ ャ -> Data Stream CSV 使い分けの目安 Teleplot = その場で波形を見る/ sf telemetry = コード変更なしで確認/ sf log wifi = 後で解析するためのデータ保存 Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 49 / 160
他のセンサ あとで読む IMU 以外のセンサも同じ考え方で読める。時間の都合で本セッションでは扱わない が、単独ビルド可能な例題として用意してある 例題 センサ firmware/vehicle/examples/05_read_tof VL53L3CX(ToF 距離センサ) firmware/vehicle/examples/06_read_baro BMP280(気圧センサ) 実習 1 と同じ sf CLI で単独ビルド・書き込みできる: sf build vehicle/examples/05_read_tof → sf flash vehicle/examples/05_read_tof -m Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 50 / 160
理論とコードの対応表 あとで読む 目的: 理論の各項目が実装のどこにあるか(関数・Data Stream 列・トピック)を後で引ける索引に する 理論 角速度 ω [rad/s]、Body FRD 並進加速度 a [m/s2 ] コード ws::gyro_x() ws::accel_x() Data Stream 列 gyro_x accel_x トピック sensor_imu sensor_imu 参加者が呼ぶ ws:: 関数は、内部で sensor_imu トピックを購読しているだけであ る(アクセス階層 L0(実習用 API)→ L1(Topic API)の対応) Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 51 / 160
復習パス コマンド あとで読む sf doctor / sf build vehicle / sf flash vehicle -m sf lesson switch sci2026:2 sf log wifi / sf log viz Session 2: 環境構築とセンサ 実習 実習 1(環境確認 とビルド) 文書 実習 2(IMU) firmware/vehicle/docs/ architecture.md §2 docs/guides/ flight-log-viz.md — docs/guides/ troubleshooting.md 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 52 / 160
チェックポイント 確認事項 sf doctor が通る setup()/loop_400Hz(dt) の 2 関数構造を説明できる ジャイロ・加速度をどれか 1 つの経路で確認できた 次のセッション S3: モータ制御とコントローラ入力の実装 — センサの次は、機体を 動かす側を作る Session 2: 環境構築とセンサ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 53 / 160
Session 3 モータ制御とコントローラ入力の実装 13:00 – 14:00 SCI/SICE チュートリアル講座 2026
地図: 今ここ 設計 S1 教育 実装 S5 S2 · S3 解析 実験 S5 S4 Session 3: モータとコントローラ S2 でセンサの値を読めるようになっ た。ここでは読んだ値を使って機体を 動かす側(モータ・コントローラ)を 作る 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 55 / 160
モータを回し、操縦し、それだけでは飛べないと知る 1 2 3 モータは PWM(パルス幅変調)の Duty 比で駆動する。4 基の 配置と回転方向はトルクバランスで決まっている コントローラのスティック値は ESP-NOW で 14 バイトの ControlPacket として届く ws::motor_mixer(T,R,P,Y) で手動ミキシングしても、フィー ドバックがない限り安定して飛べない。ここに次セッションの 動機がある Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 56 / 160
安全 モータを回す実習の注意 必ず机上で行う。回転中はモータに手を近づけない Duty は 0.15 以下に固定する。ファーム側では強制されないので数値を必ず 確認する ARM は機体ボタンの単クリックまたはコントローラで行う。コードの中で 自動 ARM しない 異常な振動・音・回転が起きたら即座に DISARM(機体ボタン再クリック) 止め方: 機体ボタンをもう一度クリック(DISARM) 。バッテリー駆動での確認を基 本とする Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 57 / 160
モータと PWM 0% T Duty Cycle 25% 50% LEDC(ESP32 のハードウェア PWM)でモータを駆動する Duty 0% = 停止、100% = 最大回転 API: ws::motor_set_duty(id, duty) id=1–4, duty=0.0–1.0 100% Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 58 / 160
モータ配置 FL FR M4 CW Front M1 CCW M2 CW ESP32 M3 CCW RL CW (clockwise) RR CCW (counter-clockwise) モータ ID: 1=FR(右前)、2=RR(右後)、3=RL(左後) 、4=FL(左前) 対角のモータが同じ方向に回転する。M1・M3 = CCW、M2・M4 = CW(反 トルクを打ち消す) Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 59 / 160
実習 3: Duty をハードコードして回す
見るだけ | 一緒に打つ | 帰宅後に再現
1
2
sf lesson switch
sci2026:3
sf lesson edit で右のコードに
して保存
3
4
5
user_code.cpp
void loop_400Hz(float dt) {
ws:: motor_set_duty (1, 0.10f);
3
ws:: motor_set_duty (2, 0.00f);
4
ws:: motor_set_duty (3, 0.00f);
5
ws:: motor_set_duty (4, 0.00f);
6 }
1
2
sf lesson build
sf lesson flash
機体ボタンを 1 回クリックして ARM
// FR
// RR
// RL
// FL
6
確認: FR モータだけが回る
注意: 配布される模範解答(--solution)は起動時に自動 ARM する。必ず机上に置いた状態で起
動すること(コードの中で自動 ARM しない)
Session 3: モータとコントローラ
制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学)
60 / 160
コントローラ OFF / ALT / POS HOLD Power SW Pitch l Roll ↔ STABILIZE / ACRO MODE 3 Throttle l Yaw ↔ Push: Flip Push: ARM (予定) M5 Button LCD 画面自体を押す(タップ) Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 61 / 160
ESP-NOW と ControlPacket Controller Wireless Left Stick Right Stick Pitch / Roll Throttle / Yaw ESP-NOW 2.4 GHz StampFly rc_throttle() rc_roll() 0.0 – 1.0 ±1.0 rc_pitch() rc_yaw() ±1.0 ±1.0 コントローラと StampFly は ESP-NOW で直接通信する。1 パケット ControlPacket は 14 バイト(throttle/roll/pitch/yaw + flags + checksum)を約 50 Hz(TDMA フレーム周期 20 ms)で送信する Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 62 / 160
TDMA で 30 機を同時に飛ばす TDMA(時分割多重アクセス、Time Division Multiple Access) 1 つの無線チャンネルを短い時間枠(スロット)に分割し、機体ごとに送信タイミングをずらして電 波の衝突を避ける方式 フレーム周期 20 ms、スロット幅 2 ms 1 チャンネルあたり最大 10 機 → 1 フレーム 10 スロット 非重複 3 チャンネル(1/6/11ch)で理論上 30 機 なぜ必要か スロットの割当 教室で複数の送信機が無調整のまま同時に電波を出すと衝 突し、機体が通信途絶と判断して自動着陸する タッチメニューで Device ID(0–9)を手動設定し NVS(不 揮発性メモリ)に保存(再起動後に反映)。ID=0 が 20 ms ご とにビーコンを送る「親機」、他はその受信時刻を基準に自分 のスロットのみで送信する。ペアリングでは自動割当されない Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 63 / 160
ペアリングとチャンネル ペアリング コントローラの M5 ボタン(LCD パネル)を押しながら電源 ON → StampFly のボタンを 3 秒以上 押し続け、両方のビープで離す(5 秒以上でシステムリセット)。次回以降は自動接続 チャンネル設定 教室内で複数機体が同時に飛ぶと混信する。チャンネルは実習 1 (2/2) の初期設定で param set wifi.channel N(1/6/11、講師が指定)として保存済み。実習コードの中では変更しない。コ ントローラはペアリング時に機体のチャンネルへ自動追従する 自分で購入したコントローラを使う場合 ご購入直後のコントローラには出荷時点のファームウェアが入っているが、本チュートリアルで使 う版とは異なる。最初に一度だけ、sf flash controller で書き込み直す必要がある Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 64 / 160
オープンループ制御 Controller −1.0 ∼ +1.0 Stick Scaling × gain 0.0 ∼ 1.0 Motor PWM duty StampFly Drone No Feedback! ws::rc_throttle/roll/pitch/yaw() ws::motor_mixer(T, R, P, Y) Session 3: モータとコントローラ スティック値の取得 4 モータへの配分 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 65 / 160
ミキサ行列 T M1 (FR) Roll M2 (RR) Pitch M3 (RL) Yaw M4 (FL) M1 = T + 0.25 3.7 (−R + P + Y ) M2 = T + 0.25 3.7 (−R − P − Y ) Pitch+ → 前傾 → 前 (M1,M4) 強 + 後 (M2,M3) 弱 Roll+ → 右傾 → 右 (M1,M2) 弱 + 左 (M3,M4) 強 意味 各式は「T/R/P/Y の指令を 4 モータの Duty にどう 配分するか」を表す。式ごとの符号がモータ配置 (motor_layout)と対応する + positive - - - − negative M3 = T + 0.25 3.7 (+R − P + Y ) 実機ファーム(sf_actuator)は τ /L,κ を使う物理 量ベースのミキサ。演習の ws::motor_mixer は共 M4 = T + 0.25 3.7 (+R + P − Y ) 通スケール(0.25/3.7)の簡易版 T は ws::rc_throttle() の正規化スティック値で [0, 1],R, P, Y は ws::rc_roll/pitch/yaw() で [−1, 1]。 ws::motor_set_duty は Duty を [0, 1] にクランプする Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 66 / 160
実習 4: スティックでモータを回す 見るだけ | 一緒に打つ | 帰宅後に再現 1 sf lesson switch sci2026:4 user_code.cpp 2 コントローラとペアリング 3 sf lesson edit で右のコードに して保存 4 5 6 sf lesson build sf lesson flash 確認: スティックで回転差が出る void loop_400Hz(float dt) { float t = ws:: rc_throttle (); 3 float r = ws:: rc_roll (); 4 float p = ws:: rc_pitch (); 5 float y = ws:: rc_yaw (); 6 ws:: motor_mixer(t, r, p, y); 7 } 1 2 これでは飛べない理由 モータの個体差,機体のミスアライメント(推力軸のずれ・重心ずれ) ,電池電圧の低下といった外乱に対して何の補正もか からないため,スティック指令どおりの回転を保てない Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 67 / 160
プラントの定義 本セッションで作った経路(ミキサ → モータ → 機体)が、そのまま制御対象(プ ラント)の入出力になる Duty プラント 角速度 ω 入力: ミキサが出す 4 つの Duty (ws::motor_mixer(T,R,P,Y) の R/P/Y トル ク指令に相当) 出力: ws::gyro_x/y/z() が返す角速度の実 測値 次セッションへ S4 の PID 制御器がこの間にフィードバックループを作り,出力を目標値に近づける。伝達関数とゲ イン Kp の設計が S4「フィードバック制御の基礎」の主題である Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 68 / 160
理論とコードの対応表 あとで読む ここまで登場した理論用語・API・通信・実装トピックの対応を一覧できるように まとめた早見表 理論 Duty 比 [0, 1] スティック指令 T , R, P, Y ミキシング Session 3: モータとコントローラ コード ws:: motor_set_duty(id,d) ws::rc_throttle() 等 ws:: motor_mixer(T,R,P,Y) 通信 — ControlPacket (14B) — トピック actuator_ motor command_ setpoint — 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 69 / 160
復習パス コマンド sf lesson switch sci2026:3 sf lesson switch sci2026:4 sf flash controller あとで読む 実習 実習 3 モータ制御 実習 4 コントローラ 入力 — 文書 firmware/vehicle/docs/ hardware_init.md protocol/spec/ (ControlPacket) docs/commands/ sf-flasher.md すべて sf lesson build → sf lesson flash で実機に反映する Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 70 / 160
チェックポイント 確認事項 Duty とモータ配置・回転方向の対応を説明できる ControlPacket がどの経路(ESP-NOW)でどれだけの頻度で届く か説明できる オープンループ制御が「なぜ飛べないか」を自分の言葉で説明で きる 次のセッション S4: フィードバック制御の基礎 — PID による姿勢安定化(14:00 – 15:00) Session 3: モータとコントローラ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 71 / 160
Session 4 フィードバック制御の基礎 — PID による姿勢安定化 14:00 – 15:00 SCI/SICE チュートリアル講座 2026
地図: 今ここ S2・S3 で組み上げた機体を、本セッションで は制御理論と突き合わせて飛ばす。 「設計 → 実 装」の次にくる「実験」のフェーズにあたる。 設計 S1 教育 実装 S5 S2 · S3 解析 実験 S5 S4 Session 4: PID 姿勢安定化 本セッションで扱うもの レート P 制御の初飛行 → プラントモデルに よる裏付け → PID 化 → 姿勢推定 → 周波数 同定による裏取り 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 73 / 160
勘の P 制御を、モデルと数値で説明できるようにする 1 2 3 まず勘で P 制御(Kp = 0.5)を飛ばし,次にモータ+機体のプラント伝達関数 Gp (s) = K /(s(τm s + 1)) を実測パラメータから導出して,その「勘」を数値で説明する I 項・D 項を追加して PID 化し(定常偏差とオーバーシュートの改善),ジャイロだけでは求 まらない長時間の姿勢を姿勢推定(相補フィルタ)で補う 最後に,周波数同定(チャープ励振 + ETFE)でモデルと実機の一致を裏取りし,仕様ベー スの自動チューニングにつなぐ 本セッションの立ち位置 ここまでのレッスンは動かすことが目的だった。ここからは,動いた結果をモデルと数値で説明で きるかを問う Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 74 / 160
フィードバック制御とは + Controller −1.0 ∼ +1.0 Stick Scaling × gain 0.0 ∼ 1.0 Motor PWM duty StampFly Drone r (t) Σ e(t) Controller Kp Plant Gp (s) ω(t) − No Feedback! 開ループ: 出力を測らない u Gcl (s) = Kp K τ m s 2 + s + Kp K 閉ループ: 出力を測って指令にフィードバック 開ループ: スティック指令をそのままモータへ送るだけ。外乱(風・機体の左右非対称)やモ デル誤差がそのまま出力に出る 閉ループ: 出力(角速度 ω )を測り,目標との誤差 e = r − ω をコントローラにフィードバッ クする。誤差が縮む方向に常に補正がかかる 右図に埋め込まれた式 Gcl (s) の中身は「閉ループ伝達関数と 2 次系パラメータ」で導出する。ここでは「誤差を測って戻す」 という構造だけを見る Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 75 / 160
内側ループと外側ループ + Target Rate r e Σ P Control Kp × e u Motor Mixer StampFly Drone angular rate response − Gyro Sensor feedback この図は内側ループ(レート制御): 目標角速度とジャイロ計測値の差を制御。ACRO はこの ループ単体で完結する 外側ループ(姿勢制御)は,この図の入力 Target Rate を作る側にもう 1 段乗る。目標姿勢角 と推定角の差から目標角速度を作り,STABILIZE 以上で有効になる(カスケード = ループの 入れ子) Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 76 / 160
実習 5: レート P 制御で初飛行 コード: 一緒に打つ | 飛行: 見るだけ(講師)| 帰宅後に再現 実装する内容(user_code.cpp の TODO) 誤差 = 目標角速度 − 実測角速度,出力 = Kp × 誤差 を Roll/Pitch/Yaw それぞれで計算し ws::motor_mixer(T,R,P,Y) に渡す。角速度目標は ws::set_rate_target(roll,pitch,yaw) で Data Stream に記録しておく(実習 7 のシステム同定で使う) 1 2 3 4 sf lesson switch sci2026:5 sf lesson edit で TODO を埋めて保存(ws::gyro_x/y/z(), ws::rc_roll/pitch/yaw()) sf lesson build(ここまで各自) 飛行は講師が完成コード(Kp = 0.5)で行う。スティック追従とわずかな振動を見る 帰宅後に sf lesson flash して自分の Kp で飛ばして再現する Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 77 / 160
実習 5 の振り返り: 実習コード user_code.cpp(実習 5) float Kp_rp =0.5f, Kp_yaw =2.0f, rmax =1.0f, ymax =5.0f; float re = ws:: rc_roll ()* rmax - ws:: gyro_x (); 3 float pe = ws:: rc_pitch ()* rmax - ws:: gyro_y (); 4 float ye = ws:: rc_yaw ()* ymax - ws:: gyro_z (); 5 ws:: motor_mixer(ws:: rc_throttle (), 6 Kp_rp*re , Kp_rp*pe , Kp_yaw*ye); 1 2 実習 5 では飛ばして安定するかどうかだけを見た。Kp = 0.5 は勘で決めた値である。この値がどれ くらい「良い」のかは,このあとプラントモデルで裏付ける Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 78 / 160
ステップ応答の読み方 あとで読む 目標値がステップ状に変化したときの応答波形 を読むための 3 つの用語。以降のフレームで繰 り返し使う ω [rad/s] Overshoot 用語の定義 Response 立ち上がり時間: 目標値の 10%→90%に 達するまでの時間 ±5% band Target 0 0.5 1.0 1.5 Rise Time Settling Time Session 4: PID 姿勢安定化 2.0 2.5 3.0 t [s] オーバーシュート: 目標値を超えて行き 過ぎる量(割合 [%] で表すことが多い) 整定時間: 応答が目標値の ±5% の帯 (図の緑の帯)に収まって以降出なくな るまでの時間 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 79 / 160
定常偏差 ess = d/(1 + Kp K ) の導出 あとで読む 問い: P 制御だけで一定の外乱 d (左右非対称・モデル誤差など)をどこまで抑えられるか。プラン トを直流ゲイン K の静的な系(積分器は考えない単純化)とみなし,d が出力に加わる場合を解く ブロック図(式)を解く e = r − y, y = Kp K e + d =⇒ ess = r −d 1 + Kp K 角速度を 0 に保つ場合(r = 0,レギュレータ),外乱 d の分が定常偏差として残る: |ess | = d/(1 + Kp K ) 読み取りと注意 Kp を大きくしても ess は 0 に近づくだけで,有限の Kp では 0 にならない。本セッションのプラン ト Gp (s) = K /(s(τm s + 1)) は積分器を含むため外乱の入り方で出方は変わるが,「P だけでは外乱 を原理的に消せない」という限界は同じである Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 80 / 160
P / I / D それぞれの役割 項 P 働き 現在の誤差に比例して出力 I 誤差の時間積分 D 誤差(または測定値)の変 化率 あとで読む 効果 応答の速さを決める。大きすぎると 振動 定常偏差を原理的にゼロにする。大き すぎるとオーバーシュート・ワインド アップ 行き過ぎを抑え,減衰を強める。大き すぎるとノイズを増幅 まとめ P 単独: 速いが定常偏差が残る → P+I: 定常偏差ゼロだが行き過ぎやすい → P+I+D: 速く・正確 で・よく減衰する Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 81 / 160
プラント伝達関数の導出 control input u Mixer + Motor Km τm s + 1 τ angular rate ω rigid-body rotation actuator dynamics Gp (s) = Body 1 I ·s K , s(τm s + 1) K= Km I ホバー近傍で線形化すると 2 ブロックに集約できる Mixer + Motor: duty → トルク,1 次遅れ Km /(τm s + 1) Body: トルク → 角速度,積分器 1/(I · s) 2 つを直列につなぐと Gp (s) = Session 4: PID 姿勢安定化 Km 1 K · = ,K = Km /I(図の下段の式と同じ) τm s + 1 Is s(τm s + 1) 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 82 / 160
実測パラメータ パラメータ 慣性モーメント トルクゲイン モータ時定数 プラントゲイン 記号 I Km τm K = Km /I Roll Pitch Yaw 9.16e-6 13.3e-6 20.4e-6 kg·m2 9.3e-4 9.3e-4 1.6e-4 N·m 0.02 s(共通,実測 0.0163 s) 102 70 8.0 rad/s2 注: この Km (duty→ トルク,N·m)はモータの逆起電力定数(back-EMF constant,V/(rad/s))と は別物(記号が同じだけ) 。物理的な由来は次の「あとで読む」フレームで導出する Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 83 / 160
τm と Km の物理的な意味 duty d Motor Kv τm s + 1 [rad/s] ωm PWM → motor speed linearize at hover: [N] Propeller 2 F = Ct ω m rotation → thrust Km , τm s + 1 [N·m] F Geometry ×4L or ×4κ τ differential thrust → torque Kf = 2Ct Kv ωm,h , Rigid Body 1 I ·s torque → angular rate Km = 4L · Kf [rad/s] ω duty 信号が角速度になるまでの 4 段階(モータ電気系 → プロ ペラ推力 → ミキサー幾何 → 機体慣性)。ホバー近傍で線形化 すると前フレームの 2 ブロックに集約できる 実効トルクゲイン Km モータ時定数 τm Jmp Rm τm = 2 Ke + Dm Rm Jmp Rm Ke Dm τm 1.375e-8 kg·m2 0.593 Ω 5.682e-4 V/(rad/s) 3.0e-7 0.0163 s≈0.02 s Session 4: PID 姿勢安定化 あとで読む dF Kf = , Km = dd hover 回転子慣性 巻線抵抗 逆起電力定数 実効減衰(空力) Kf L κ Km,rp Km,yaw 0.010 N/duty 0.023 m 4.10e-3 m 9.3e-4 N·m 1.6e-4 N·m ( 4LKf 4κKf Roll/Pitch Yaw ホバー点での傾き アーム長 トルク推力比(Yaw) Roll/Pitch Yaw 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 84 / 160
軸ごとにゲインが違う理由 あとで読む Roll/Pitch: 同じ Km ,でも I が違う Km,roll = Km,pitch = 9.3e-4 N·m だが Iyy (13.3e-6) > Ixx (9.16e-6) なので Kpitch (70) < Kroll (102), Pitch の方が遅い Yaw: そもそも Km 自体が小さい Roll/Pitch はプロペラの推力差をアーム長 L = 0.023 m で増幅してトルクに変える(Km = 4LKf )。 Yaw は隣り合うプロペラの回転反力トルク差しか使えず,その大きさはトルク推力比 κ = 4.10e-3 m でしか増幅されない(Km = 4κKf )。κ/L ≈ 0.18 と 1 桁近く小さいため,Km,yaw (1.6e-4) は Km,rp (9.3e-4) の約 1/6(比 0.17)。さらに Izz (20.4e-6) も最大なので,Yaw の K (8.0) は Roll/Pitch より 1 桁小さい つまり Yaw が遅いのは「センサや制御の問題」ではなく,機体のトルク発生原理そのもの(差動推 力 vs 反力トルク)に起因する Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 85 / 160
閉ループ伝達関数と 2 次系パラメータ P 制御の閉ループ伝達関数 ω 16% Gcl (s) = ζ = 0.5 ζ = 0.7 target Kp K (2 次系) τm s 2 + s + Kp K ζ = 1.0 固有振動数と減衰比 t r ωn = オーバーシュート量 ≈ e −πζ/ p Kp K , τm 1 ζ= p 2 Kp K τm (ζ = 0.5 → 16%,ζ = 0.7 → 5%)。ζ は「2 次系がどれだけ振 1−ζ 2 動的か」を 1 つの数値で表す —前のフレームの「ステップ応答の読み方」のオーバーシュートに直 結する Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 86 / 160
ζ から Kp を逆算する設計式 あとで読む 設計式 Kp = 1 4ζ 2 K τm 前フレームの ωn , ζ の式を Kp について解いたもの。実測パラメータ K , τm (「実測パラメータ」参 照)を代入すれば,狙った減衰比 ζ を実現する Kp が軸ごとに求まる ζ = 0.7 設計の Kp Roll(K = 102) Pitch(K = 70) Yaw(K = 8.0) 0.25 0.36 3.19 Yaw は K が Roll/Pitch より 1 桁小さい分,同じ ζ を狙うと Kp は逆に大きくなる。軸ごとの違いは 「実習 6 の振り返り」で 3 軸まとめて見る Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 87 / 160
開ループボード線図と位相余裕 |L(jω)| [dB] 60 40 Kp = 0.5 Kp = 0.25 0 開ループ伝達関数 1 = 50 τm −20 d 20 B/d ec L(s) = Kp · Gp (s) = ωgc = 40 −4 0 ωgc = 23 −20 dB /d ec Kp K s(τm s + 1) 位相余裕 PM −40 −60 ∠L(jω) [deg] あとで読む ωgc : |L(jωgc )| = 1 となる周波数(ゲイン交 差周波数) −90 −120 PM = 90° − arctan(τm ωgc ) −150 PM=65° PM=51° −180 100 101 102 ω [rad/s] 103 Kp を上げると ωgc が上がり,PM は下がる。P 制御だけでは応答速度と安定性がトレードオフの 関係にある Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 88 / 160
むだ時間と位相余裕の劣化 あとで読む |L| [dB] 前の「開ループボード線図」の L(s) に,むだ時間を加える 40 0 −40 −60 ∠L(jω) [deg] −90 |e −jωτd | = 1 gain unchanged No delay τd = 5 ms 制御ループのむだ時間 −120 51° −150 ∆PM=−11° 40° −180 −210 Unstable region −240 100 101 ω τd ≈ 5 ms(センサ処理 + 制御演算 + PWM 更新) Ldelay (s) = L(s) · e −τd s 102 [rad/s] Kp = 0.5(ωgc = 40) Kp = 0.25(ωgc = 23) モデル PM 51° 65° 実機 PM ≈40° ≈59° 60° 未達 ギリギリ 実用上 PM ≥ 60° が必要 モデル上は安定なゲインでも,むだ時間を足すと実機で振動することがある Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 89 / 160
実習 6: システムモデリング 見るだけ | 一緒に打つ | 帰宅後に再現 実装する内容(user_code.cpp の TODO) 設計式 Kp = 1/(4ζ 2 K τm ) を Roll/Pitch/Yaw それぞれで実装する(K_roll/K_pitch/K_yaw, tau_m は定義済み)。ζ = 0.7 → 0.5 → 1.0 の順に変えて飛行し,違いを体感する 1 2 3 4 5 sf lesson switch sci2026:6 sf lesson edit で Kp_roll/pitch/yaw を設計式で計算するコードを書いて保存 sf lesson build sf lesson flash 確認: ζ を変えた 3 種類の飛行の違いを見る 帰宅後に自分のコードで ζ を振って再現する Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 90 / 160
実習 6 の振り返り: 軸ごとに最適な Kp は違う あとで読む 実習 5 の Kp = 0.5 での ζ と,ζ を指定した設計の Kp を,3 軸まとめて比べる Roll Pitch Yaw K 102 70 8.0 Kp = 0.5 の ζ 0.50 0.60 1.77 ζ = 0.7 の Kp 0.25 0.36 3.19 ζ = 1.0 の Kp 0.12 0.18 1.56 読み取り 実習 5 の Kp = 0.5 は Roll で ζ = 0.50(やや振動的)。Yaw は同じ Kp = 0.5 で ζ = 1.77 と過減衰 (応答が遅すぎる)になる — K が軸ごとに 1 桁違うのだから,同じ Kp を 3 軸に使い回すこと自体 に無理がある。軸ごとに Kp を変えるべき理由がここにある Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 91 / 160
システム同定の考え方 control input u(t) Plant Gp (s) (unknown K , τm ) measured output y(t) Parameter Estimation K̂ , τ̂m compare with L6 theory 目的 入出力データ(制御入力 u(t),測定出力 y(t))からプラントのパラメータ(K ,τm )を推定する。 これまでのフレームで導いた理論モデルと,実機のフライトデータが一致するかを検証する Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 92 / 160
同定に使う入力と出力はログに記録されている あとで読む 記録した入力と出力から最小二乗フィットで K , τm を求 める Data Stream には 400 Hz で 4 モータの duty(入力)とジャイロ(出力)がそろって記録される。ミ キサを逆算すれば軸ごとの入力 u(t) が直接得られ,制御器が P でも PID でも同定できる: 1 u(t) = −dFR − dRR + dRL + dFL (ロール), y(t) = gyro(t) 4k 候補の K , τm でモデル出力 ŷ(t) をシミュレーションし,実測 y(t) との誤差が最小になる K , τm を 数値最適化で探す(最小二乗フィット): X 2 J(K , τm ) = ŷ(t) − y(t) t 閉ループで飛ばすのは,制御なしには飛べない機体を励振の間も安定に保つため。duty の無い古いログでは既知の Kp から u = Kp (rate_ref − gyro) を逆算する経路(--kp)に切り替わる Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 93 / 160
実習 7: システム同定(sf sysid fit) 見るだけ | 一緒に打つ | 帰宅後に再現 実装する内容(user_code.cpp の TODO) 実習 5 の P 制御コードに ws::set_rate_target(roll,pitch,yaw) を追加する(角速度目標を Data Stream に記録するだけで,制御自体には無関係) 1 2 3 4 5 6 sf lesson switch sci2026:7 sf lesson edit で Kp を設定し ws::set_rate_target を呼ぶコードにして保存 sf lesson build sf lesson flash 飛行しながら sf log wifi -o flight.csv sf sysid fit flight.csv --plot 確認: 同定結果 K , τm が実習 6 の理論値と数%の誤差で一致する。帰宅後に自分のフライトデータ で再現する。sf log wifi は WiFi 接続が前提(S2「接続手順: 機体を WiFi 網に入れる」) Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 94 / 160
同定結果と理論値の比較 出力例 sf sysid fit flight.csv --plot Roll K= 98.5 (ref :102.0 , err :3.4%) tau_m =0.019 R2 =0.94 3 Pitch K= 72.1 (ref: 70.0, err :3.0%) tau_m =0.021 R2 =0.91 1 2 軸 Roll Pitch K (同定) K (理論) τm (同定) τm (理論) R 2 98.5 102.0 0.019 s 0.020 s 0.94 72.1 70.0 0.021 s 0.020 s 0.91 理論値との誤差 3〜4% は,モデル簡略化(線形化・1 次遅れ近似)とむだ時間の影響で説明できる。 R 2 が 1 に近いほどモデルがデータをよく説明している Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 95 / 160
PID 制御器の 3 つの形式と本資料での呼び名 形式 並列形(独立ゲイン形) 伝達関数 C(s) = Kp + Ki /s + Kd s 理想形(ISA 標準形,非 干渉形) 直列形(干渉形) C(s) = Kp 1 + 1/(Ti s) + Td s パラメータ K p , Ki , Kd Kp , Ti , Td C(s) = Kp0 1 + 1/(Ti0 s) (1 + Td0 s) Kp0 , Ti0 , Td0 使われる場面 教科書の導入,実習 8 の実 習コード 市販の調節計,vehicle ファー ムウェア 古いアナログ調節計 並列形と理想形は同じ制御器の書き方の違いで,Ki = Kp /Ti ,Kd = Kp Td で換算できる。理想形は積分時間・微分時間と いう時間の単位で効きを表すので,時定数と比べながら調整しやすい 本資料での呼び名 s vehicle ファームウェアは理想形に不完全微分を加えた C(s) = Kp 1 + T1s + ηTTds+1 (パラメータ i d rate.<axis>.kp/ti/td),実習 8 の実習コードは並列形。以後この 2 つの名前で呼ぶ Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 96 / 160
PID 制御器の構成 P: Kp · e e(t) I: Kp Ti D: Kp · Z e dt Proportional Integral + + Σ u(t) + Td s ηTd s + 1 Incomplete Derivative 1 Td s C (s) = Kp 1 + + Ti s ηTd s + 1 P に加えて,積分(I)と不完全微分(D)を並列に足し合わせて制御出力 u(t) を作る。各記号 (Ti , Td , η )の意味は次のフレームで説明する Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 97 / 160
理想形のパラメータ Kp , Ti , Td , η パラメータ Kp 意味 比例ゲイン Ti 積分時間 [s] Td 微分時間 [s] η フィルタ係数 あとで読む 効果 大きいほど応答が速い,大きすぎると 振動 小さいほど積分が強く効き偏差が早く 消える 大きいほど微分が強く効き振動を抑 える 0.1 ∼ 0.2,大きいほどノイズに強い 理想形(ISA 標準形)のパラメータで,vehicle 実装の rate.<axis>.kp/ti/td がそのまま使う 形。積分・微分の「効き方」を時間の単位で直感的に調整できるのが利点 Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 98 / 160
並列形との対応と実習 8 の解答ゲイン 理想形 ↔ 並列形(独立ゲイン) Ki = Kp , Ti Kd = Kp · Td 逆に Ti = Kp Kd , Td = Ki Kp 実習 8 のコードは理想形ではなく,並列形の直接ゲイン (Kp , Ki , Kd ) を使う 軸 Roll Pitch Yaw Kp 0.25 0.36 2.0 Ki 0.3 0.3 0.5 Kd 0.005 0.005 0.01 Kp は Roll/Pitch が「ζ から Kp を逆算する設計式」の ζ = 0.7 設計値,Yaw のみ経験値。設計式に Kyaw = 8.0 を当てはめると ζ ≈ 0.88 に相当し,減衰をやや強めた設定になっている。不完全微分 フィルタと η は実習 8 では未使用(vehicle 実装が追加する改良点,次々フレーム参照) Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 99 / 160
実習 8 (1/2): PID 制御 コード: 一緒に打つ | 飛行: 見るだけ(講師)| 帰宅後に再現 実装する内容(user_code.cpp の TODO) 実習 5 の P 制御に I 項(integral += error*dt を ±0.5 でクランプ)と D 項 (Kd*(error-prev_error)/dt)を追加する。disarm 時は integral/prev_error を 0 に リセットする 1 2 3 4 sf lesson switch sci2026:8 sf lesson edit で軸ごとに I 項・D 項・アンチワインドアップを追加して保存 sf lesson build(ここまで各自。書いたコードは Session 5 の実習 8 (2/2) で SILS で 飛ばす) 飛行は講師が行う。実習 5(P のみ)と比べて定常偏差とオーバーシュートの変化を見る 実習 8 (2/2) まで別の実習へ切り替えない(切り替えると user_code.cpp が上書きされる。上 書き前に my_code/ へ自動退避)。帰宅後に自分のゲインで再現する Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 100 / 160
不完全微分と D-on-M 問題: 理想微分はノイズを 増幅 ジャイロのノイズを理想微分 de/dt が増幅し, モータに悪影響を与える高周波振動を生む あとで読む 解決: 不完全微分フィルタ D 項に 1 次のローパスを足した不完全微分 Td s を使う。η = 0.1 ∼ 0.2,大きいほど ηTd s + 1 ノイズに強い(位相遅れも増える) D-on-M(測定値の微分)pid.hpp の実装 微分は誤差ではなく測定値(ジャイロ)に掛ける。誤差を微分すると目標値が階段状に変わるたび にスパイク(微分キック)が乗る — レート目標は 12bit スティック由来で常に階段状。測定値から の微分経路は誤差微分と同一なので,目標値キックだけを取り除ける 実習 8 の D 項は理想微分(誤差の後退差分)のまま。不完全微分・D-on-M は vehicle 実装が追加す る改良点 Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 101 / 160
アンチワインドアップ: クランプ vs 条件付き積分 あとで読む 実習 8 実装: 積分クランプ vehicle 実装: 条件付き積分 I += e · dt I ← clamp(I, ±0.5) 出力がすでに飽和方向へ押されている間だけ積 分の更新を止める(pid.hpp) 。飽和中は積分が それ以上巻き上がらないため,誤差反転後すぐに 追従できる。ハードクランプは保険として残す 積分値そのものを上下限で切る。単純だが,出力 が飽和している間も積分は上限いっぱいまで巻 き上がり続け,誤差が反転するとゆっくり戻る → オーバーシュートの原因になる なぜこの違いが効くか: 単純クランプは「積分値の大きさ」だけを制限するのに対し,条件付き積分 は「今まさに悪化させる方向への積分更新」だけを止める。飽和中の巻き上がり量そのものを防げ る分,条件付き積分の方が一般に立ち上がりが速い Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 102 / 160
離散化: 双一次変換 あとで読む sf_controller_pid の実装(pid.hpp)は連続時間の伝達関数を双一次変換(Tustin, 2 s → dt · z−1 z+1 )で離散化する。実習 8 は後退差分 D と矩形積分(Tustin ではない) 積分項(台形則)と微分項(不完全微分,D-on-M) I[k] = I[k − 1] + α= 2ηTd , dt a= dt Kp e[k] + e[k − 1] Ti 2 α−1 , α+1 b= D[k] = a · D[k − 1] − b y[k] − y[k − 1] , 2Td (α + 1)dt d 項 = Kp · D[k] y[k] は測定値(D-on-M)。|a| < 1(α > 0 のとき)なのでこの再帰式は安定。積分・微分の両方を同 じ双一次変換で統一しているのが設計上のポイント(教科書の連続時間設計をそのまま離散実装に 落とせる) Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 103 / 160
ARM 遷移時のリセットとライブチューニング あとで読む 積分リセットのタイミング(vehicle 実装) 積分器は DISARM 中ずっとゼロなのではなく,ARM 遷移のたびにリセットされる。着地して DISARM し,次に ARM した瞬間に積分が空になり,前のフライトの偏差を引きずらない ライブチューニングでは積分状態を保持する param set での即時反映(ライブチューニング)は,飛行中に WiFi 経由で param set rate.roll.kp ... のようにゲインを送ると次の制御周期から即座に反映される(S2「WiFi 接 続」参照) 。ゲイン変更のたびに積分器をリセットすると,そのたびに機体がガクッと動いてしまう ため,ゲイン変更だけでは積分状態は保持する 実習 8 は disarm 中は毎ループ 0 に戻す実装なので,結果的に ARM 遷移リセットと同じ効果になる (ライブチューニングとの区別は生じない) Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 104 / 160
ジャイロドリフト問題 θ Gyro Z ジャイロは角速度 ω を測定,角度は積分 R θ = ω dt が必要 ω dt バイアスが蓄積し,ドリフトが増大する Drift 問題 True angle 0s 10s 20s Session 4: PID 姿勢安定化 30s 40s t ジャイロ単体では長時間の姿勢推定ができない。 STABILIZE 以上で姿勢角を目標にするには,角度 そのものの推定が要る 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 105 / 160
加速度センサからの傾き角の導出 あとで読む 静止時,加速度センサは重力の反力を測定する 姿勢行列 R (機体座標系 → NED 座標系,ZYX オイラー角)を使うと,機体座標系での加速度計測 値は [ax , ay , az ]T = R T [0, 0, −g]T = [ g sin θ, −g sin φ cos θ, −g cos φ cos θ ]T q (φ: ロール角,θ: ピッチ角,g: 重力加速度)。(−ay )/(−az ) = tan φ,ax / ay2 + az2 = tan θ より q φ = atan2(−ay , −az ), θ = atan2 ax , ay2 + az2 注: 静止または等速運動のときのみ有効(加速中は重力以外の成分が混入しノイズになる)。ヨー角 ψ はどの成分にも現れない(重力は鉛直方向の情報しか持たず,鉛直軸まわりの回転に対しては不 変なため) Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 106 / 160
相補フィルタ Low-pass Accel atan2 数式 1−α θ̂k = α(θ̂k−1 + ω∆t) + (1 − α)θaccel + Gyro ω ×∆t + α Σ High-pass + z −1 前回値 + Σ θ̂ α = 0.98(ジャイロ 98% + 加速度 2%) ジャイロ(短期は正確,長期はドリフト) と加速度(長期は安定,短期はノイズ) を 1 次のフィルタで混ぜて,互いの弱点 を補う StampFly の既定推定器は 15 状態 ESKF。相補フィルタは実習 9 で自作し,estimated_roll() (ESKF)と比較する教材 Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 107 / 160
実習 9: 姿勢推定(相補フィルタ) 見るだけ | 一緒に打つ | 帰宅後に再現 実装する内容(user_code.cpp の TODO) atan2f で加速度から角度を計算し(accel_roll = atan2f(ay,az) など),相補フィルタ θ̂k = α(θ̂k−1 + ω∆t) + (1 − α)θaccel(α = 0.98)を実装する。ws::estimated_roll()(機体既定の ESKF)と Teleplot で比較する 1 2 3 4 5 sf lesson switch sci2026:9 sf lesson edit で相補フィルタを実装して保存 sf lesson build sf lesson flash sf monitor + Teleplot で cf_roll と eskf_roll を比較 確認: 機体を手で傾け,両者が近い挙動をすることを見る。当日は実習 8 のコードを残すため切り 替えず講師の画面で見る。飛行しないので帰宅後に α を変えて安全に再現できる Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 108 / 160
相補フィルタと ESKF の比較 計算量 パラメータ数 相補フィルタ(実習 9 で 自作) 極小(掛け算・足し算のみ) 1(α) 推定対象 Roll/Pitch のみ 使用センサ ジャイロ+加速度 あとで読む ESKF(機体既定,15 状態) 中〜大(行列演算) プロセス/観測ノイズの共分 散行列 位置・速度・姿勢・センサバ イアス IMU・気圧・ToF・磁気・光学 フローの全種 STABILIZE 以上のモードでは,外側ループ(姿勢制御)の入力に ESKF の推定角を使う(相補フィ ルタではない) 。スティックは傾き角そのものを指令し,外側ループがそれを目標角速度に変換して 内側ループへ渡す( 「内側ループと外側ループ」参照)。相補フィルタは実習 9 でこの ESKF の妥当 性を自分の手で検証するための比較対象という位置づけ Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 109 / 160
周波数掃引同定の原理: チャープ励振と ETFE あとで読む 励振信号(対数チャープ 1→25 Hz,6 s) u(t) 0.4 0 −0.4 0 1 2 3 t 4 5 6 [s] ETFE(実測点)と一次遅れ・むだ時間モデルの当てはめ fit: Ĝ(jω) = b̂ e −jωL̂ /(jω(jω T̂ + 1)) measured (ETFE): Suy /Suu [dB] 10 |Ĝ(jω)| 20 −10 0 −20 −30 高域はコヒーレンス低下 (外乱の影響が相対的に増える) 101 102 ω [rad/s] sf sysid fit(実習 7)はステップ状の操縦入力に対する時間波形の最小二乗フィットだった。 ここでは励振信号を意図的に加え,その入出力からプラントの周波数応答を直接推定する。上段: 1→25 Hz へ滑らかに上げる励振信号(対数チャープ)を目標角速度に重畳。下段: 出力/入力のスペ クトル比(ETFE)を Welch 法で計算し,一次遅れ + むだ時間モデルを当てはめる Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 110 / 160
補足: Welch 法によるスペクトル推定 あとで読む なぜ区間平均が要るか 1 回の FFT で作る比 Y (jω)/U(jω) は雑音でばらつく。時系列を重なりのある区間に分けて各区間のスペクトルを平均し, 分散を下げる(Welch 法) 。sf sysid rate-fit の設定: 400 Hz の u, y を 1024 点(2.56 s)の区間,重なり 50 %,区間ごとに平均値を除いて Hann 窓を掛け FFT Suu = X |Uk |2 , Suy = k Suy Ĝ(jω) = (ETFE), Suu X k Yk Uk∗ , X |Yk |2 k |Suy |2 γ 2 (ω) = (コヒーレンス) Suu Syy Uk , Yk は k 番目の区間の FFT,∗ は複素共役 Session 4: PID 姿勢安定化 Syy = 分解能 ∆f = 400/1024 ≈ 0.39 Hz。区間を 長くすると分解能は上がるが区間数が減り ばらつく コヒーレンス γ 2 は 0〜1。1 に近いほど出 力が入力で線形に説明できる。低い帯域は フィットから外す(前ページ「高域はコ ヒーレンス低下」) フィット帯域は 0.8〜30 Hz(チャープの 範囲) 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 111 / 160
一次遅れ+むだ時間モデルへの当てはめ あとで読む 飛行時の PID 出力(トルク指令)u(t) を,ファームの離散 PID(pid.hpp の逐語再生)で目標値・ 計測値から復元し,計測値 y(t) との ETFE Ĝ(jω) = Suy /Suu を計算する フィットするモデルと目的関数 G(s) = b e −Ls s(Ts + 1) b: 有効慣性の逆数(≈ K ),T : モータ/プロペラの遅れ(≈ τm ),L: ループのむだ時間(「むだ時間 と位相余裕の劣化」の τd に対応)。対数振幅と折返し位相の残差を Nelder-Mead 法で最小化する: Xh 2 2 i ln |Ĝ(jω)| − ln |G(jω)| + ∠(Ĝ/G)(jω) ω 実習 7 の sf sysid fit は操縦入力に含まれる周波数成分だけで当てはめるが,こちらはチャー プで能動的に励振するため周波数帯域全体を 1 回の飛行でカバーできる Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 112 / 160
仕様ベースのゲイン設計: ωc と PM からの逆算 あとで読む 同定した (b, T , L) と,欲しい仕様(ゲイン交差周波数 ωc ,位相余裕 PM)から,ファームの PID 形 そのものを逆算する 手順 1 Ti をゲイン交差より十分低い周波数に置く: Ti = k/ωc (k ≈ 10) 2 Td は位相条件 ∠C(jωc ) + ∠G(jωc ) = −180° + PM を満たすように二分法で解く 3 Kp は振幅条件 |C(jωc )| · |G(jωc )| = 1 から決まる s C(s) = Kp 1 + T1i s + ηTTdds+1 (η = 0.125,vehicle 実装と同じ形)。得られたゲインでの実際の交差 周波数・位相余裕は数値的に再検証し(ボード線図を数値で追跡),仕様どおりか確認する Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 113 / 160
sf sysid rate-fit / rate-tune とは あとで読む 対象は vehicle ファームだけ(実習コードでは使わない) rate-fit は記録した目標 r と角速度 y から,vehicle ファームの PID(理想形+不完全微分)を そのゲインで再計算して入力 u を復元し,周波数領域(ETFE)で Gp (s) = b e −Ls /(s(Ts + 1)) に フィットする。PID の形もゲインも違う実習コードでは復元できない(実習コードは sf sysid fit で duty から同定) 3 つのコマンドの役割 rate-excite 飛行中の機体に同定用の励振信号を入れる(機体が動く唯一のコマンド) rate-fit 記録した CSV からプラント (b, T , L) を求める。机上で実行,機体に触 rate-tune らない ゲイン交差周波数 ωc と位相余裕 PM を満たす Kp /Ti /Td を逆算し, param set rate.roll.kp ... の形で出力。WiFi の CLI に打て ば飛行中も即時反映,param save で保存 Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 114 / 160
rate-excite → rate-fit → rate-tune の手順 あとで読む 手順(vehicle ファーム,WiFi 接続) sf log wifi -d 40 -o sysid01.csv sf sysid rate -excite --axis roll --takeoff --land 3 sf sysid rate -fit sysid01.csv --axis roll -o fit.json 4 sf sysid rate -tune --fit fit.json --wc 25 --pm 60 1 2 # 机上 # 机上 rate-excite で機体はどうなるか 1 行目を別ターミナルで先に開始してから 2 行目を打つ。機体は WiFi の API で POS_HOLD 離陸 (0.8 m)し,静止ホバー中にロール角速度目標へチャープ(既定 ±25 deg/s,5 s)を加算してから着 陸する。離陸前や着陸中は機体側が拒否する。スティックは中立のまま,機体は小さく揺れるだけ 使うとき: 広い場所で,ホバーが安定している vehicle ファームの機体に対して行う。実習コードで飛んでいる機体には使わ ない Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 115 / 160
機体内で完結する自動チューン: sf_autotune あとで読む rate-excite → rate-fit → rate-tune を機体が単独で行う ホバー中に,①ステップドサイン 9 点(2〜35 Hz)で励振し I/Q を蓄積 →② Gp (s) = b e −Ls /(s(Ts + 1)) にフィット → ③ゲイン交差周波数 ωc と位相余裕 PM の仕様で Kp /Ti /Td を設計し余裕を数値検証 →④ライブ適用(NVS には保存しない)。PC もログも不要 起動の 2 通り(vehicle ファーム) autotune roll 25 60 param set autotune.sched.axis 0 3 param set autotune.sched.delay 20 1 2 # 軸 wc=25 rad/s PM=60 deg ( ホ バ ー 中 ) # 地 上 で 設 定 し て 離 陸 -> FLYING 到 達 か ら # delay 秒 後 に ブ ザ ー が 鳴 り 自 動 実 行 引数は 軸・ωc [rad/s]・PM [deg](省略時 25/60,yaw の ωc は 18)。安全条件: フィット残差・余裕の誤差 ±5◦ ・パラ メータ範囲・ゲイン跳躍 [1/4, 4]× のどれかに掛かると旧ゲインのまま。採用するなら着陸後に確認飛行してから param save。2026-06 に実機で実行した実績あり(現在の既定ゲインはオリジナル機からの換算値) Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 116 / 160
デモ: 完成コードで飛行 デモの見方 見るだけ: スティック操作に角速度が追従する速さと行き過ぎを波形で見るだけで要点はつかめる。 一緒に打つ: 手元の flight.csv で sf sysid fit を試す。帰宅後に再現: 本日は見るだけにして, 後日実習 5〜9 を通しで動かす 手順 1 2 PID 化した実習コードで飛行し,sf log wifi でテレメトリ取得。ホバー中にロールのス ティックを短く切る sf log viz で角速度目標(rate_ref)と実測角速度を重ね,追従の速さと行き過ぎを定性 的に見る 3 正確なステップ入力は手動では入れられない。設計値(ζ = 0.7)との定量比較は次ページの SILS(ロールステップシナリオ)で行う Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 117 / 160
デモの期待結果: P と PID のステップ応答 SILS(MuJoCo)でロールステップ試験(ロール +0.3 を 0.5 s)を実行。目標 15.1 deg/s に対し実習 5(P)はピーク 17.9 deg/s と −2.4 deg/s のアンダーシュート,実習 8(PID)はピーク 13.2 deg/s で振動なし。角速度は真値ロール角の数値微分 Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 118 / 160
期待結果の再現手順 あとで読む 実習 5 の結果を再現する(実習 8 は sci2026:8 に置き換え) 1 2 sf lesson switch sci2026 :5 --solution sf lesson sils --scenario step S5「実習: 自分の PID を SILS で飛ばす」は,切替後に sf lesson sils を実行するだけでよい (ロールステップ試験は不要) Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 119 / 160
理論とコードの対応表 同じ概念を指す変数・パラメータが,実習コード/ vehicle 実装/ Data Stream の間でどう呼び名を 変えるかを一覧で確認する rate.roll.kp rate.roll.kp/.ti vehicle 実装 Data Stream — — rate.roll.kp·.td — 教科書表記 比例ゲイン Kp 積分ゲイン Ki 実習コード 微分ゲイン Kd float Kd 目標角速度 角速度計測値 アンチワイン ドアップ ARM 時リ セット target rate_sp_roll ws::gyro_x() state.angular_rate[0] float Kp float Ki (Ki = Kp /Ti ) (Kd = Kp Td ) 積分クランプ 条件付き積分 disarm 中 0 に PidController::reset() rate_ref_roll gyro_x — — レートループの Kp は,実習コードでは duty 空間の無次元値,vehicle 実装では物理トルク単位。数 値を単純比較できない点が「実習コードと vehicle 実装の違い」を最もよく表す Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 120 / 160
復習パス 各実習の理論的な裏付けは,本資料内の「あとで読む」フレームにまとめてある。実習そのものは全て sf lesson switch sci2026:N → sf lesson build → sf lesson flash で実機に反 映する(--solution で模範解答に切り替え可能) 実習 実習 5 レート P 制御 実習 6 システムモデリング 実習 7 システム同定 実習 8 PID 制御 実習 9 姿勢推定 本資料内の関連フレーム 「フィードバック制御とは」「ステップ応答の読み方」 「プラント伝達関数の導出」〜「むだ時間と位相余裕の 劣化」 「システム同定の考え方」〜「同定結果と理論値の比較」 「PID 制御器の構成」〜「ARM 遷移時の積分リセット」 「加速度センサからの傾き角の導出」〜「相補フィルタ と ESKF の比較」 帰宅後に複数回へ分けてやり直したい場合も,上表のフレームと sf lesson switch → sf lesson sils の組だけで実習 5〜9 を再現できる Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 121 / 160
チェックポイント 確認事項 Gp (s) = K /(s(τm s + 1)) と実測パラメータの対応を説明できる P 制御の限界と,I 項・D 項が何を補うかを説明できる 不完全微分・アンチワインドアップ・ARM 時リセットで実習コードと vehicle 実装がどう違 うか説明できる(持ち帰り資料「不完全微分と D-on-M」以降に詳しい) sf sysid fit の入出力と,理論値との比較の読み方を理解した チャープ励振 + ETFE による周波数同定の考え方を知っている(持ち帰り資料「周波数掃引 同定の原理」以降に詳しい) 次のセッション S5: シミュレータ・解析ツールの活用と発展的テーマ(15:30 – 16:30) — 飛ばして確かめた結果を、シミュレータと解析ツールで裏付ける Session 4: PID 姿勢安定化 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 122 / 160
Session 5 シミュレータ・解析ツー ルの活用と発展的テーマ 15:30 – 16:30 SCI/SICE チュートリアル講座 2026
地図: 今ここ S4 で飛ばした結果を,本セッションで はシミュレータと解析ツールで裏付け る。 「実験」の次にくる「解析」と「教 育」のフェーズにあたる。 設計 S1 教育 実装 S5 S2 · S3 本日の最後に扱うもの SILS の仕組みと使い方 → SILS 実習 → 解析 ツールと教育教材 → 研究・発展テーマ → 質疑 解析 実験 S5 S4 Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 124 / 160
飛ばさずに検証し、1 機から先へ広げる 1 2 3 SILS は実機のファームを無改変で PC 上で走らせ,ファームの 開発と制御系の実装を机上である程度完了させるための仕組み である 参加者が実装した推定器・制御器は,L1 Topic API 経由で既存の 実装と差し替えられる 実習 5/8 で書いた PID コードは,実機を飛ばす前に SILS で検 証してから持ち帰れる(本セッション後半で実習) 本セッションの立ち位置 S4 までは 1 機の StampFly を飛ばす話だった。ここからは,飛ばさずに検証する方 法と,1 機から先の広がりを扱う Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 125 / 160
SILS: 実機のファームをそのまま PC で走らせる Code Identity と Parameter Identity SILS(Software-in-the-Loop Simulation: 実ファームをホスト PC 上で物理シミュ レーションと閉ループ実行する検証手法)は,MuJoCo(非線形 6 自由度の物理エ ンジン)と実ファーム C++ そのものを,実機と同じソース・同じパラメータで走 らせる 状態機械・推定器・フェイルセーフを含むシステム全体の検証ベンチ 推定器を ESKF から相補フィルタに差し替えても,ベンチは無改変で同じ検 証ができる(アルゴリズムの中身に依存しない設計) シナリオファイル(.scn)と合格基準(.expect)の組で自動判定する。sf sils regression でまとめて実行できる Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 126 / 160
モデル一致の合否判定 Code Identity を使った検証 実機ログに使うのと同じ同定パイプラインを,SILS が生成したログにもそのまま 適用し,(b, L, T ) を実機同定値と比較する(sf sils sysid-gate) 指標 ステップ応答立ち上がり時定数 gyro RMS 許容差(判定条件) ±20% ±50% Yaw は反トルク零点を持ち,現行の 3 パラメータフィットでは表現しきれない。軸ごとの物理特性 に応じて,公称モデル 1 点比較と摂動族での検証を使い分ける Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 127 / 160
VPython と Genesis VPython Genesis 特徴 位置づけ 軽量。Python で書いた 6 自由度モデル・ シミュレータの作り方を学ぶ練習用。制 センサモデル・ブラウザ 3D 表示 御則は Python 実装で,実習コードは入 らない 高精度物理エンジン,2000 Hz 物理演算 強化学習向けの選択肢。標準インストー ルに含まれず sf setup genesis で 追加(GPU 必須)。今日は使わない コマンド 1 2 sf sim run vpython sf sim run genesis AtomS3 + Atom JoyStick を USB HID モードで使い,実機と同じ操縦感でシミュレータを飛ばせ る。自分の実習コードの動作確認は SILS(sf lesson sils)で行う Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 128 / 160
sf sils コマンド一覧 サブコマンド build run scenario regression gate sysid-gate gui 機能 SILS ホストベンチをビルド 閉ループを実行しバンドルを書き出す .scn シナリオを実行し合否判定 全 .scn/.expect を実行し,CI で合否判定する マイルストーンバンドルの合否確認 モデル一致の合否判定(前ページ) ブラウザ GUI(次ページ) ESP-IDF は関与しない。firmware ソースをシステム GCC で素の CMake から直接コンパイルし, ヘッドレスで実行する Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 129 / 160
sf sils gui ブラウザだけで完結する SILS 実験環境 シナリオ作成・パラメータ編集・実行・グラフ化・飛行アニメーションをすべて画 面で行える 起動 1 2 sf sils build sf sils gui イベント(rc/wind/fault/handle など)を表で組んでシナリオを作る PID ゲインや ESKF 設定など 54 項目をブラウザで編集,変更した項目だけ が反映される(再ビルド不要) three.js によるライブ 3D と Plotly のグラフが時刻カーソルで同期 Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 130 / 160
.scn と .expect の書き方 あとで読む .scn は入力の台本,.expect は合格条件。どちらも UTF-8 のテキストで,同じ名前で simulator/sils/scenarios/ に置く。GUI は .scn を保存できるが .expect を作る画面は無い(手書 き)。.expect が無ければ終了コードだけで判定 my_roll_step.scn(時刻は ms) 1 # t 2 0 3 + 4 + 5 + 6 + ch rc rc rc rc rc thr 2048 2048 3243 3176 3176 roll 2048 2048 2048 2600 2048 pitch yaw 2048 2048 2048 2048 2048 2048 2048 2048 2048 2048 arm 0 1 1 1 1 hold 4000 500 2000 1000 1500 rate 50 # calib 50 # ARM 50 # takeoff 50 # roll +8deg 50 # settle my_roll_step.expect(in は秒) 1 2 3 4 5 exit 0 log_contains any "Takeoff complete" metric tilt_max > 8.0 in 6.5 7.5 metric tilt_max < 6.0 in 8.7 9.0 metric duty_max < 0.9 in 6.5 9.0 sf sils scenario simulator/sils/scenarios/my_roll_step.scn --target vehicle で PASS/FAIL と実測値(tilt_max=11.1)が出る。しきい値は先に .expect 無しで走らせ,実測に余 裕を持たせて決める。+ は直前イベントの終了直後,rc の列は 12 bit 生値(中立 2048)。全文法と手順: simulator/sils/docs/scenario_tutorial.md Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 131 / 160
実習 8 (2/2): 自分の PID を SILS で飛ばす 見るだけ | 一緒に打つ | 帰宅後に再現 1 2 Session 4 の実習 8 (1/2) で書いた自分のコードのまま(切り替え不要)。書き切れなかった人 は解答に切り替える sf lesson sils を実行し,合否判定を確認する コマンド 1 sf lesson sils 解答で試す場合は先に sf lesson switch sci2026:8 --solution を打つ。合格基準 (.expect): 離陸(真値高度 > 0.1 m)と傾き 15◦ 未満(発散しない)。実測 alt_max ≈ 0.64 m,tilt_max 0◦ ,判定 PASS。注: 実習コードの SILS は sf Session 5: シミュレータと発展 lesson sils を使う(sf sils gui は vehicle 本体向け) 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 132 / 160
デモ: シミュレータを動かす デモの見方 見るだけ: 3D 上での挙動とグラフの対応を確認するだけで要点はつかめる。一緒に打つ: 手元でも sf sim run vpython を起動してみる。帰宅後に再現: 本日は見るだけにして,後日ジョイス ティックで操縦する 手順 1 sf sim run vpython でブラウザ 3D 操縦(内蔵の Python 制御則で飛ぶ。実習コードは 入らない) 2 sf sils gui でシナリオを 1 本実行し,判定結果(PASS/FAIL)を確認(実ファームがそ のまま動く) 3 同じシナリオでパラメータを変え,挙動の変化を見る Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 133 / 160
デモの期待結果: SILS シナリオ実行 stab_flight.scn(vehicle)の姿勢角と角速度。12 項目の合否判定をすべて満たす Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 134 / 160
解析ツール: sf log analyze / viz 取得したテレメトリをそのまま解析する sf log wifi で取得した CSV を,追加スクリプトなしで解析・可視化できる コマンド 1 2 sf log viz flight.csv sf log analyze flight.csv 詳しい手順は docs/guides/flight-log-viz.md。取得 → 可視化 → 解析の流れは S4 のシ ステム同定と同じログを使い回せる Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 135 / 160
センサノイズの評価: Allan 分散 あとで読む Allan 分散でわかること 静止センサの出力から Allan 偏差(Allan deviation)を計算すると,ホワイトノイズ と長時間のバイアス不安定性を分離して評価できる。ESKF の Q/R(プロセス/観 測ノイズ共分散)チューニングの基礎データになる コマンド 1 2 sf log wifi -d 60 -o static_noise.csv # 機 体 を 静 止 さ せ て 60 秒 取 得 sf sysid noise static_noise.csv --sensor gyro --static -only --plot --sensor は gyro/accel/baro/tof/all を選べるが,sf log wifi -o の CSV は gyro/accel のみ(baro/tof は現行ファームでは対象外。sf log capture は旧ファーム vehicle_old 専用)。トリム調整には sf trim analyze がある Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 136 / 160
研究利用の入口 (1/4): 自分のコードはどこに書くか 実習と同じ 4 手順で自分のプロジェクトを持つ 例題を複製した firmware/apps/<名前>/ が自分の場所。 main/learner_controller.cpp に制御則を書き,実習の switch → edit → build → flash と同じ順で動かす コマンド sf app sf app 3 sf app 4 sf app 1 2 new my_ctrl edit my_ctrl build my_ctrl flash my_ctrl -m # 例 題 10 _custom_controller を 複 製 # learner_controller.cpp が 開 く センサ値・推定値を読む研究なら --from 09_topic_api_hello(姿勢トピックを購読して表示する例題)。 sf app list で例題一覧。(2/4)〜(4/4) は,このプロジェクトの中で何が読めて何を差し替えられるかの説明 Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 137 / 160
研究利用の入口 (2/4): Topic API とは あとで読む Pub-Sub(発行/購読型のメッセージ配信) Topic<T>(sf_core)がコンポーネント間を疎結合につなぐ。発行側は publish(data),購 読側は latest() で最新値を読む トピック(sf:: 名前空間) 内容 sensor_imu IMU 生データ(400 Hz) estimate_state 推定した姿勢・位置・速度 command_setpoint パイロット/API の目標値 control_output 推力・トルク指令 学習者向け読み取り関数(sf::api::*,sf_api.hpp): imu_latest()/estimate_latest()/command_latest() など。Topic<T>::latest() をラップした読み取り専用の入口(書き込み側は未公開) Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 138 / 160
研究利用の入口 (3/4): 推定器・制御器を載せる あとで読む IEstimator/IController を実装する 既存の ESKF・PID と同じインターフェース(sf_estimator/sf_controller)を実装すれば 差し替えられる インターフェース IEstimator IController 主なメソッド predict(), update*(), getState(), reset() compute(), reset(), onModeChange() 差替え手順: 推定器は estimator.type パラメータで選ぶ(imu_task.cpp の createEstimator() を拡張して自作を足す) 。制御器は現状 PID の単一実装のみのため,control_task.cpp の static PidController controller; を自分のクラスに置き換える(コントローラ側にはまだファクトリが無い) Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 139 / 160
研究利用の入口 (4/4): サンプルプログラム あとで読む firmware/vehicle/examples/09_topic_api_hello 姿勢トピックを購読し,roll/pitch/yaw を 10 Hz でシリアル表示する最小例 抜粋(イメージ) sf:: StateEstimate est = sf::api:: estimate_latest (); auto rpy = sf:: math :: Quat(est.attitude [0], est.attitude [1], 3 est.attitude [2], est.attitude [3]). to_euler (); 4 printf("roll =%.1f pitch =%.1f yaw =%.1f\n", 5 rpy.x*180/ M_PI , rpy.y*180/ M_PI , rpy.z*180/ M_PI ); 1 2 自分の複製で試す: sf app new my_hello --from 09_topic_api_hello → sf app edit/build/flash my_hello 帰宅後に再現: firmware/vehicle/examples/09_topic_api_hello(リポジトリ直下から。 04_read_imu 等と同じく単独ビルド可能)を手元で試す Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 140 / 160
再現性の 3 原則 あとで読む S1 で見た開発の 3 原則を,再現性の観点から振り返る 原則 Code Identity Parameter Identity Model Fidelity 内容 SILS は実ファームと同じソースをそのままコンパイ ルして走る 同じパラメータで走らせる 実機飛行後にモデルをログで較正する(後追いの精度 向上) パラメータは param set/param save で NVS に保存する。自作の推定器・制御器 を試すときも,この 3 原則があるから「SILS で通った」が実機の挙動を意味する Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 141 / 160
発展テーマ: AI と強化学習 あとで読む AI コーディングエージェントの活用: 制御則の実装・デバッグやシミュレー ションログの解析を,AI コーディングエージェントを補助に進める流れが広 がりつつある。StampFly のような小型・低リスクな実験プラットフォーム は,その検証サイクルを高速に回す題材になりうる 強化学習と Sim-to-Real: シミュレータ上で学習した制御方策を実機に転移 する流れを教材化できれば,古典制御から学習型制御へカリキュラムの射程 が広がる。機体が小型・軽量で墜落時のリスクが小さいことは Sim-to-Real の 実機検証に向く Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 142 / 160
発展テーマ: 制御・推定・自律飛行 あとで読む MPC・適応制御: 今日扱った PID の先にある発展的な制御手法 ESKF・オートチューン: 15 状態 ESKF の実装,S4 の rate-fit/rate-tune と同 じ設計を機体内で行う sf_autotune 高度・位置ループ: レート/姿勢カスケードの外側に ALT_HOLD/POS_HOLD が乗る。外乱オブザーバ(altitude.dob.fc)もパラメータで opt-in できる Tello 互換 SDK と ROS 2: Python SDK(lib/stampfly)と sf takeoff な どの Tello 風コマンド(sf takeoff/land/hover/jump …)で自律飛行の入 口を用意している。ROS 2 との連携も発展的なテーマの一つである Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 143 / 160
教育・研究での再利用 自分の授業・研究室で使う には lesson_manifest.yaml の courses: に実習順序を追加できる(本 チュートリアルの sci2026 も同じ仕 あとで読む コミュニティへ 質問・不具合報告・開発への協力はリポジトリ の Issue で受け付けている https://github.com/M5Fly-kanazawa/ stampfly_ecosystem 組み) 本スライド一式は LaTeX(Beamer)ソー スごと公開されている SILS で実機なしの演習・採点も一部自動化 できる Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 144 / 160
理論とコードの対応表 概念 SILS(実ファーム+ MuJoCo) VPython シミュレータ 実装場所 Genesis シミュレータ simulator/genesis/ あとで読む コマンド simulator/sils/ sf sils scenario simulator/vpython/ sf sim run vpython sf sim run genesis sf params check control/models/ stampfly_physical.yaml 同定とモデル一致の合否判定 tools/sysid/, tools/ sf sysid fit / sf sils sysid-gate log_analyzer/ 推定インターフェース sf_estimator / sf_estimator_ — eskf 制御インターフェース sf_controller / — sf_controller_pid 物理パラメータの正本 3 つのシミュレータは同じ物理パラメータの正本(stampfly_physical.yaml)を参照し、sf params check で手動コピーの食い違いを検出する Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 145 / 160
復習パス コマンド sf sim run vpython sf sils gui sf log viz — Session 5: シミュレータと発展 扱う内容 VPython シミュレータ 文書 simulator/README.md simulator/sils/gui/ README.md ログ可視化 docs/guides/ flight-log-viz.md シミュレーション方針 docs/architecture/ simulation-policy.md SILS ブラウザ実験環境 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 146 / 160
質疑: 想定質問と回答 (1/2) Q1. モデル一致の判定で Yaw 軸だけ精度が悪化するのは なぜか ヨーだけ反トルク(角加速度に比例)が抗力トルクに重畳し,伝達関数に物理的な零点(LHP・位相リード,τz ≈ 45 ms)を 持つ。零点は励振帯域より低く,トルク権限もロール/ピッチの約 1/4 しかなく,3 パラメータ同定では零点を分離できず精 度が落ちる(コヒーレンス 0.44) 。対策はヨーの合否判定を分離し,κ実測+ 4 パラメータ化で基準を再導出すること。 Q2. 自作の制御器を載せるとき,安全機構はどこまで自 分で書く必要があるか 状態機械(ARM/DISARM・モード遷移) ,通信途絶/低電圧の検知と LANDING 移行,ミキサー出力(duty)の最終クラン プは,どの制御器でもファームウェア側が担う。自作側は IController 契約——reset()/onModeChange() の実装, 400 Hz 周期内の非ブロッキングな compute(),出力の妥当範囲維持——を守ればよい。 Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 147 / 160
質疑: 想定質問と回答 (2/2) Q3. ROS 2 と連携するにはどこから手を付ければよいか リポジトリの ros/ には ROS 2 ブリッジが既にあるが,これは旧世代ファーム(vehicle_old)の WebSocket テレメトリ・独自 UDP 制御プロトコル向けで,現行ファーム(vehicle)の UDP テレメ トリ・Tello 式コマンド API とは互換性がない。現実的な入口は,PC 側で現行の UDP テレメトリ (sf log wifi と同じ形式)を購読し,Tello 風コマンドを送る rclpy ノードを新規に書くこと (ファーム改修は不要) 。 質疑の時間は本セッション末の 15 分。時間内に扱いきれなかった質問は,リポジ トリの Issue で受け付けている Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 148 / 160
チェックポイント 確認事項 SILS・VPython・Genesis の役割の違いと,SILS の仕組みを説明できる sf sils gui でのシナリオ実行とパラメータ編集の流れを見た(または手元 で試した) L1 Topic API で自分の推定器・制御器を差し替える方法を理解した(詳しく は「研究利用の入口 (1/4)〜(4/4)」) 解析ツールの入口を把握した 本日はこれで終了 資料・録画は公開されている。持ち帰り資料(付録)で復習を続けら れる Session 5: シミュレータと発展 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 149 / 160
Session 付録 チートシートと復習パス 持ち帰り資料 SCI/SICE チュートリアル講座 2026
sf CLI チートシート (1/2) コマンド sf doctor sf build/flash/monitor sf telemetry sf cal gyro/accel/mag sf lesson sf trim analyze sf takeoff 等 付録: チートシート・復習パス 機能 環境診断(問題があればまず実行) ビルド・書き込み・シリアルモニタ 50 Hz テレメトリのライブ表示(--web でブラウザ) センサキャリブレーション 実習コードの管理(switch sci2026:N/build/flash,一覧は list --course sci2026) ホバーログから姿勢トリムを算出 Tello 風ミニコマンド(sf takeoff/land/hover/jump,個別のトップレベ ルコマンド) 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 151 / 160
sf CLI チートシート (2/2) コマンド sf log wifi sf log viz/analyze sf sim run vpython/genesis sf sils build/scenario/gui sf sysid fit sf sysid rate-fit/rate-tune sf sysid noise sf params check sf upgrade 機能 WiFi 経由で 400 Hz テレメトリ取得(capture は旧 ファーム専用) ログ可視化・解析 シミュレータ起動(S5) SILS ベンチ(S5) 閉ループ P 制御ログからプラント同定(実習 7) 閉ループ同定(ETFE + フィット)と仕様ベース PID 設計 (S4) 静止センサログから Allan 分散でノイズ特性を推定 物理パラメータ整合検査 最新版を pull し環境を再同期 sf --help の順序を基本に,授業で頻出する sf lesson を前に出している。全コマンドは lib/sfcli/commands/ に実装がある 付録: チートシート・復習パス 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 152 / 160
sf lesson と通常コマンドの対応 あとで読む sf lesson は実習を滞りなく進めるための近道で,正は通常コマンド。各コマンドは次を呼んでい るだけ sf lesson コマンド sf lesson switch sci2026:N [--solution] sf lesson edit sf lesson build sf lesson flash sf lesson monitor sf lesson sils sf lesson sils --scenario step 付録: チートシート・復習パス 実体 課題 N の student.cpp(solution.cpp)を実習 ファームウェアの user_code.cpp にコピー その user_code.cpp を開く sf build workshop sf flash workshop -m(--no-monitor で -m 無し) sf monitor workshop sf sils build --target workshop → sf sils scenario simulator/sils/scenarios/ workshop_acro.scn --target workshop 同上でシナリオは workshop_acro_step.scn 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 153 / 160
ws:: API チートシート (1/2) カテゴリ モータ制御 コントローラ入力 ボタン・モード LED 制御 関数 motor_set_duty(id,duty) [id 1–4, duty 0–1], motor_set_all(duty) [0–1], motor_stop_all(), motor_mixer(t,r,p,y) [t 0–1, r/p/y −1–1], arm(), disarm(), is_armed() rc_throttle() [0–1], rc_roll/pitch/yaw() [−1–1] rc_throttle_yaw_button(), rc_roll_pitch_button(), rc_stabilize_acro_mode(), rc_alt_mode(), rc_pos_mode()(すべて bool) led_color(r,g,b) [0–255], disable/enable_led_task(), is_led_task_disabled() 実習中は Duty ≤ 0.15 で運用する(安全上の運用ルール。ファーム側では強制されない) 付録: チートシート・復習パス 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 154 / 160
ws:: API チートシート (2/2) カテゴリ IMU センサ 環境・距離センサ 姿勢推定 制御目標のロギング ユーティリティ 関数 gyro_x/y/z() [rad/s], accel_x/y/z() [m/s2 ] baro_altitude/pressure() [m, Pa], mag_x/y/z() [µT], tof_bottom/front() [m], flow_vx/vy/quality() [m/s, 0–255] estimated_roll/pitch/yaw() [rad], estimated_altitude() [m] set_rate_target(r,p,y) [rad/s], set_angle_target(r,p) [rad](実習 7,Data Stream の rate_ref_*/angle_ref_* に記録, 制御には無関係) millis() [ms], battery_voltage() [V], print(fmt,...), set_channel(ch) [1, 6, 11] 実習用 API のヘッダ #include "workshop_api.hpp",全関数は ws:: 名前空間 付録: チートシート・復習パス 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 155 / 160
トラブルシューティング (1/2) 症状 StampFly の WiFi が 見つからない 接続しても通信でき ない 離陸しない 振動する シミュレータに自動 フォールバック 原因 電源が入っていない 対処 バッテリーを確認,電源を入れ直す IP アドレスが違う 192.168.10.1 を確認 キャリブレーション未 実施 PID ゲインが高すぎる WiFi 未接続 sf cal gyro を実行 ゲインを下げる(S4 参照) 意図的ならそのまま使用可 出典: docs/guides/troubleshooting.md 付録: チートシート・復習パス 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 156 / 160
トラブルシューティング (2/2) 症状 ビルドエラー(赤字 error:) 原因 打ち間違い(カンマ・ セミコロン抜け等) 書き込みポートの競 合・接触不良 モータが回らない ARM されていない, または USB 給電中 (安全のため ARM 拒否) 静止校正中に機体を動 かしてしまった sf lesson flash が失敗 起動 LED が緑になら ない 付録: チートシート・復習パス 対処 エラー 1 行目のファイル名・行番号を確認し 実習コードと見比べる 別のケーブル/ポートを試す。改善しなけれ ば機体の BOOT ボタンを押したまま USB を 挿し直し,書き込み専用モードで再実行する 機体ボタンをクリックして ARM 状態を確認 する。USB を外してバッテリー駆動になって いるか確認する 機体を静かに置き直し,緑点灯とビープ 3 回 (readyTone)を待つ 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 157 / 160
5 セッション復習パス (1/2) 扱う内容 文書 sf lesson switch sci2026:3 S3 sf lesson switch sci2026:4 (実習 4) (ControlPacket) 付録: チートシート・復習パス 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) S1 S1 コマンド sf sim run vpython シミュレータ操縦 sf sils gui SILS の体験 sf lesson switch sci2026:2 S2 sf log wifi/viz S2 S3 docs/commands/sf-sim.md simulator/sils/gui/ README.md IMU センサ(実習 2) firmware/vehicle/docs/ architecture.md §2 テレメトリ取得と可 docs/guides/ 視化 flight-log-viz.md モータ制御(実習 3) firmware/vehicle/docs/ hardware_init.md コントローラ入力 protocol/spec/ 158 / 160
5 セッション復習パス (2/2) コマンド sf lesson switch sci2026:8 S4 sf sysid fit S4 S5 sf sils gui S5 sf log viz 付録: チートシート・復習パス 扱う内容 PID 制御(実習 8) システム同定(実習 7) SILS ブラウザ実験 環境 ログ解析 文書 本資料 S4「PID 制御器の構成」〜 「ARM 遷移時の積分リセット」 本資料 S4「システム同定の考え方」 〜「同定結果と理論値の比較」 simulator/sils/gui/ README.md docs/guides/ flight-log-viz.md 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 159 / 160
持ち帰りのご案内 資料はすべて公開されている リポジトリ: https://github.com/M5Fly-kanazawa/stampfly_ecosystem ドキュメント: https://m5fly-kanazawa.github.io/stampfly_ecosystem/docs/ 本日の内容はオンデマンド配信でも後日視聴できる ご自身の StampFly で ノート PC と StampFly さえあれば,今日のデモは自宅・研究室でそのまま再現で きる。まずは sf doctor で環境を確認してから始めてほしい ご質問・不具合報告はリポジトリの Issue へ。開発に協力してくれる方も歓迎する 付録: チートシート・復習パス 制御教育教材 StampFly Ecosystem の紹介 | 伊藤 恒平(金沢工業大学) 160 / 160