-- Views
March 02, 26
スライド概要
■ドローンやロボットを自作することを通じて制御や関連技術の生涯勉強情報を提供■工学博士■防大航空宇宙→筑波大博士■陸自→対戦車誘導弾等の装備品開発→高専教員→大学教員■ロボットランサー優勝→マイクロマウスニューテクノロジー賞受賞■指導者としてつくばチャレンジバンナム賞→飛行ロボコンマルチコプタ部門1位等々■北海道函館出身
Lesson 0 環境セットアップ Environment Setup StampFly Workshop
ワークショップカリキュラム / Workshop Curriculum Day Day 1 Day 2 Day 3 Day 4 Day 5 AM Lesson 0–2 3–5 6–8 9 – 11 StampFly Workshop テーマ 環境セットアップ + モータ + コントローラ LED + IMU + 初フライト PID 制御 + テレメトリ + モデリング 姿勢推定 + Python SDK + 競技会準備 ホバリングタイム競技会 Lesson 0: 環境セットアップ 2 / 18
StampFly ハードウェア / Hardware 項目 MCU IMU 気圧 ToF 質量 通信 バッテリ StampFly Workshop 仕様 ESP32-S3 (M5Stamp S3) BMI270 (6 軸 400 Hz) BMP280 VL53L3CX 37 g(バッテリ含む) ESP-NOW + WiFi LiPo 1S 3.7 V Lesson 0: 環境セットアップ 3 / 18
エコシステム全体像 / Ecosystem Overview tools/ analysis/ 開発ツール データ解析 sf CLI Genesis 3D 物理 control/ 制御設計 PID, MPC, SIL protocol/ 通信仕様 StampFly Workshop control/ — 制御設計 Jupyter / Python simulator/ シミュレータ firmware/ 組込みコード firmware/ — 組込みコード simulator/ — 3D シミュレータ analysis/ — データ解析 tools/ — sf CLI ESP32-S3 / ESP-IDF / C++ protocol/ — 通信仕様 SSOT: YAML → コード自動生成 Lesson 0: 環境セットアップ 4 / 18
開発ツール sf CLI / Development Tool カテゴリ ビルド 診断 ログ シミュレータ キャリブレーション コマンド例 sf build / sf flash sf doctor / sf monitor sf log wifi / sf log viz sf sim run sf cal gyro/accel/mag 説明 ファームウェア開発 デバッグ テレメトリ取得・可視化 仮想環境で練習 センサ校正 ワークフロー sf lesson switch N → sf lesson build → sf lesson flash StampFly Workshop Lesson 0: 環境セットアップ 5 / 18
Windows 環境構築 (1/2) / Windows Setup 確認コマンド (CMD) git --version python --version 期待される結果 git version 2.x Python 3.10 以上 なければ winget install Git.Git winget install Python.Python.3.12 インストール手順(CMD で実行) 1. リポジトリをクローン 2. install.bat を実行(ESP-IDF + sfcli 自動インストール) 3. setup_env.bat で開発環境をアクティベート git clone https :// github .com /.../ stampfly - ecosystem .git cd stampfly - ecosystem install .bat setup_env .bat StampFly Workshop Lesson 0: 環境セットアップ 6 / 18
Windows 環境構築 (2/2) / Driver & Verification USB シリアルドライバ CH9102F ドライバをインストール(M5Stack 製品用) https://docs.m5stack.com/en/download 動作確認 sf doctor で環境診断 — すべて OK になれば完了 macOS / Linux ユーザー install.sh + setup_env.sh を使用してください StampFly Workshop Lesson 0: 環境セットアップ 7 / 18
今日のゴール / Today’s Goal 目標 ワークショップファームウェアをビルド・書き込み・動作確認する 1 sf lesson build でビルド 2 sf lesson flash で書き込み 3 シリアルモニタで "Hello StampFly!" を確認 StampFly Workshop Lesson 0: 環境セットアップ 8 / 18
開発フロー / Development Flow sf lesson switch N sf lesson build sf lesson flash Serial Monitor student.cpp → user_code.cpp ESP-IDF compile USB flash + monitor verify output modify code & rebuild StampFly Workshop Lesson 0: 環境セットアップ 9 / 18
sf CLI とは / What is sf CLI? StampFly 開発専用のコマンドラインツール ESP-IDF のコマンドをシンプルに実行できる コマンド sf doctor sf lesson build sf lesson flash sf lesson switch N sf monitor StampFly Workshop 説明 環境診断 ワークショップビルド 書き込み+モニタ レッスン切り替え シリアルモニタ Lesson 0: 環境セットアップ 10 / 18
ワークショップの構造 / Workshop Structure 学生が実装する関数は 2 つだけ! setup() — 起動時に 1 回呼ばれる loop_400Hz(dt) — 400Hz(2.5ms 毎)で呼ばれる ハードウェアの複雑さは ws:: 名前空間で隠蔽 FreeRTOS, SPI/I2C, センサーフュージョンを意識する必要なし StampFly Workshop Lesson 0: 環境セットアップ 11 / 18
ファームウェアの全体像 / Firmware Architecture student.cpp ← You are here! setup() / loop_400Hz() 皆さんのコードはここ! student.cpp を編集するだけ sensor read, filter, motor ws::gyro_x() と書くだけで SPI 通信→フィルタ→バイアス補正を 全部やってくれる ws:: API gyro_x(), motor_set_duty() Vehicle Components IMU, baro, motor driver xTaskCreate, xQueueSend 下のレイヤーはワークショップ中 意識する必要なし ESP-IDF / FreeRTOS Tasks, timers, queues SPI, I2C, GPIO Hardware ESP32-S3, BMI270, BMP280 StampFly Workshop Lesson 0: 環境セットアップ 12 / 18
400Hz ループの裏側 / Behind the 400Hz Loop ESP Timer 2500 µs IMU Task Read BMI270 Go! loop_400Hz (Your Code) hardware timer interrupt SPI read + bias correction data ready student.cpp runs here repeats every 2.5 ms = 400 Hz ポイント loop_400Hz(dt) は常に IMU データ更新後に呼ばれる— 学生はタイ マー管理不要、ただ関数を書くだけ! StampFly Workshop Lesson 0: 環境セットアップ 13 / 18
実習: Hello StampFly / Hands-on
1
# include "workshop_api.hpp"
2
void setup ()
{
5
ws:: print("Hello StampFly!");
6 }
3
4
7
void loop_400Hz(float dt)
{
10
// Nothing to do in Lesson 0
11 }
8
9
student.cpp
手順
1. sf lesson switch 0
2. 上のコードを student.cpp に書く
3. sf lesson build && sf lesson flash
StampFly Workshop
Lesson 0: 環境セットアップ
14 / 18
作業の進め方 / Workflow 1 ファイル構造 firmware/workshop/ ├── lessons/ │ ├── lesson_00/student.cpp │ ├── lesson_01/student.cpp │ └── ... └── main/ └── user_code.cpp ← 編集! sf lesson switch N テンプレートを user_code.cpp にコ ピー 2 user_code.cpp を編集 3 sf lesson build 4 sf lesson flash 注意 student.cpp はテンプレートなので直接編集しない! switch で何度でもリセットできる StampFly Workshop Lesson 0: 環境セットアップ 15 / 18
コントローラのセットアップ / Controller Setup コントローラのビルドと書き込み 1 コントローラを USB 接続 2 sf build controller 3 sf flash controller 確認 LCD に起動画面が表示されれば OK Lesson 2 でペアリングして使用する StampFly Workshop Lesson 0: 環境セットアップ 16 / 18
シミュレータで遊ぶ / Try the Simulator USB HID モードに切替 1 画面タッチでメニューを開く 2 Comm: を選択 3 USB HID に切替 → 自動再起動 操作 スロットル ロール / ピッチ ヨー 説明 上昇 傾き 回転 アクロモード(角速度制御)で飛行 コマンド sf sim run sf sim run -w ringworld 注意 終了後は Comm: を ESP-NOW に戻すこと(実機飛行用) StampFly Workshop Lesson 0: 環境セットアップ 17 / 18
チェックポイント / Checkpoint 確認事項 sf doctor がエラーなしで通る ビルドが成功し "Hello StampFly!" が表示される コントローラのビルド・書き込みが完了した シミュレータが起動し操縦を試した 次のレッスン Lesson 1: モータ制御 — モータを回してプロペラの動きを確認 StampFly Workshop Lesson 0: 環境セットアップ 18 / 18
Lesson 1 モータ制御 Motor Control StampFly Workshop
今日のゴール / Today’s Goal 目標 モータの番号と配置を理解し、PWM で個別制御する モータ番号 M1–M4 の位置を覚える ARM / DISARM の仕組みを理解する PWM デューティ比でモータ回転数を制御 StampFly Workshop Lesson 1: モータ制御 2/8
モータ配置 / Motor Layout FL FR M4 CCW Front M1 CW M2 CCW ESP32 M3 CW RL RR CW (clockwise) CCW (counter-clockwise) 対角のモータが同じ方向に回転(トルクバランス) M1(FR), M3(RL) = CW / M2(RR), M4(FL) = CCW StampFly Workshop Lesson 1: モータ制御 3/8
PWM とは / What is PWM? PWM Duty Cycle 0% T Duty Cycle 25% 50% Pulse Width Modulation (パルス幅変調) Duty 0% = 停止 Duty 100% = 最大回転 API: motor_set_duty(id, duty) id=1–4, duty=0.0–1.0 100% StampFly Workshop Lesson 1: モータ制御 4/8
ARM / DISARM とは / What is ARM? 安全スイッチ / Safety Switch ARM = モーター出力を有効化(回転可能になる) DISARM = モーター出力を無効化(強制停止) コードから arm() で ARM できる 重要 / Important arm() を呼ばないとモーターは回らない! setup() 内で最初に呼ぶこと StampFly Workshop Lesson 1: モータ制御 5/8
モータ制御 API 関数 arm() disarm() motor_set_duty(id, duty) motor_set_all(duty) motor_stop_all() 説明 モーター出力を有効化 モーター出力を無効化 個別モータ設定 全モータ一括 全モータ停止 引数 — — id=1–4, duty=0.0–1.0 duty=0.0–1.0 — 安全注意 / Safety duty は 0.15 以下で! 機体を手で押さえてテスト! StampFly Workshop Lesson 1: モータ制御 6/8
実習: モータを順番に回す / Hands-on
1
2
# include "workshop_api.hpp"
static uint32_t timer = 0;
3
void setup () {
ws:: print("Lesson 1: Motor Control");
6
ws::arm (); // Enable motor output
7 }
8 void loop_400Hz(float dt) {
9
timer ++;
10
// 800 ticks = 2 seconds at 400 Hz
11
int motor_id = (timer / 800) % 4 + 1;
12
ws:: motor_stop_all ();
13
ws:: motor_set_duty(motor_id , 0.1f);
14 }
4
5
student.cpp
StampFly Workshop
Lesson 1: モータ制御
7/8
チェックポイント / Checkpoint 確認事項 arm() なしではモータが回らないことを確認した M1 が FR(右前)のプロペラを回す M1→M2→M3→M4 の順に回転する 次のレッスン Lesson 2: コントローラ入力 — スティックでモータを操作 StampFly Workshop Lesson 1: モータ制御 8/8
Lesson 2 コントローラ入力 Controller Input StampFly Workshop
今日のゴール / Today’s Goal 目標: スティック値を変数に読み取り、演算でモータを個 別制御する ESP-NOW 無線通信の仕組みを理解 チャンネル設定で他の受講生との混信を回避 変数と四則演算でスティック → モータ Duty を計算 オープンループ手動操縦の限界を体感 StampFly Workshop Lesson 2: コントローラ入力 2 / 12
ESP-NOW 通信フロー / Communication Flow Controller → ESP-NOW → StampFly API Controller Throttle Yaw Left Stick StampFly Workshop Wireless Right Stick ESP-NOW 2.4 GHz Roll Pitch StampFly rc_throttle() rc_roll() rc_pitch() rc_yaw() 0.0 – 1.0 -1.0 – +1.0 -1.0 – +1.0 -1.0 – +1.0 Lesson 2: コントローラ入力 3 / 12
コントローラ各部 / Controller Layout (MODE 3) Alt Hold / Manual (予定) Power SW Pitch l Roll ↔ STABILIZE / ACRO MODE 3 Throttle l Yaw ↔ Push: Flip Push: ARM (予定) M5 Button (LCD) タップでペアリング等 StampFly Workshop Lesson 2: コントローラ入力 4 / 12
コントローラ API 関数 set_channel(ch) rc_throttle() rc_roll() rc_pitch() rc_yaw() is_armed() motor_set_duty(id, v) 説明 WiFi チャンネル設定 スロットル ロール ピッチ ヨー ARM 状態 モータ個別制御 StampFly Workshop Lesson 2: コントローラ入力 値域 1, 6, 11 0.0 – 1.0 -1.0 – +1.0 -1.0 – +1.0 -1.0 – +1.0 true / false id=1–4, v=0.0–1.0 5 / 12
ペアリング手順 / Pairing Step 操作 1 コントローラの M5 ボタンを押しながら電源 ON → LCD に “Pairing mode...” 表示 2 StampFly のボタンを 3 秒長押し → 青 LED 高速点滅 + ビープ音 3 ペアリング完了 → ビープ音が鳴り、次回から自動接続 注意 教室では一組ずつペアリングする(ブロードキャスト通信のた め近くの機体と干渉する可能性) うまくいかない場合: 両方を再起動して Step 1 からやり直す StampFly Workshop Lesson 2: コントローラ入力 6 / 12
チャンネル設定 / Channel Setting 教室で複数の StampFly を同時に飛ばすと、同じチャンネル同士で混 信が起きる。チャンネルを分けて回避する。 Ch 1 6 11 割り当て例 グループ A(緑) グループ B(黄) グループ C(赤) StampFly Workshop 設定方法 set_channel(ch) を setup() 内で 呼ぶ 機体とコントローラで同じ番号にする こと! Lesson 2: コントローラ入力 7 / 12
モータ配置とミキシング / Motor Layout & Mixing FL FR M4 CCW Front M1 CW M2 CCW ESP32 M3 CW RL CW (clockwise) StampFly Workshop Motor M1 FR M2 RR M3 RL M4 FL T + + + + Roll − − + + Pitch + − − + Yaw + − + − 直感的に理解する RR Pitch+ → 前傾 → 前 (M1,M4) 強 + 後 (M2,M3) 弱 Roll+ → 右傾 → 右 (M1,M2) 弱 + 左 (M3,M4) 強 CCW (counter-clockwise) Lesson 2: コントローラ入力 8 / 12
オープンループ制御 / Open-Loop Control Open-Loop Control Controller −1.0 ∼ +1.0 Stick Scaling × gain 0.0 ∼ 1.0 Motor PWM duty StampFly Drone No Feedback! 問題点 フィードバックがないため、外乱(風・重心ずれ)に対応できない! → Lesson 5–6 で PID 制御を導入して解決 StampFly Workshop Lesson 2: コントローラ入力 9 / 12
実習: 手動ミキシング (1/2) / Hands-on: Setup
1
2
# include "workshop_api.hpp"
static uint32_t tick = 0;
3
void setup () {
ws:: print("L2: Open -Loop Control");
6
ws::arm ();
// Enable motor output
7
ws:: set_channel (1);
// 1, 6, or 11
8 }
4
5
student.cpp — setup
チャンネル番号
講師が指定した番号(1 / 6 / 11)に書き換えること!
コントローラも同じチャンネルに設定する
StampFly Workshop
Lesson 2: コントローラ入力
10 / 12
実習: 手動ミキシング (2/2) / Hands-on: Loop
void loop_400Hz(float dt) {
tick ++;
3
float t = ws:: rc_throttle ();
4
float r = ws:: rc_roll () * 0.3f;
5
float p = ws:: rc_pitch () * 0.3f;
6
float y = ws:: rc_yaw ()
* 0.3f;
7
ws:: motor_set_duty (1, t - r + p + y); // FR
8
ws:: motor_set_duty (2, t - r - p - y); // RR
9
ws:: motor_set_duty (3, t + r - p + y); // RL
10
ws:: motor_set_duty (4, t + r + p - y); // FL
11
if (tick % 80 == 0)
12
ws:: print("T=%.2f R=%.2f P=%.2f Y=%.2f",
13
t, r, p, y);
14 }
1
2
student.cpp — loop
StampFly Workshop
Lesson 2: コントローラ入力
11 / 12