Dropbox

FPVTracside Mac版の問題点(2026/07/30現在)

FPVTrackside Mac版(v2.77.1.877)で確認している問題点は二つあります。使用方法によっては致命的とも言えます。併せて回避策も示しておきます。問題が整理でき、あるいはコードフィックスの目処がつけば開発者にフィードバックする予定です。将来のバージョンでは問題が解決するものと思います。

[ ディレクトリ問題 ]
FPVTracksideの様々なデータはWindowsにおいてはユーザーの”AppData\Local\FPVTrackside\”下に集約されています。
macOS版でも”~/Documents/FPVTrackside”(ユーザーの書類フォルダー)と言うフォルダーが作成され、そこにデータを置くような設計になっているようです。ところがいくつかのデータはアプリケーションバンドル内のMacOS下を参照しています。


アプリレーションバンドルの中身はアプリケーションファイルを右クリックして「パッケージ内容の表示」で開くことが出来ます。

どのデータがアプリケーションバンドル内を参照しているのかは、追いきれていませんが、以下の二つは確実です。

< events >

レースイベントの全てに関わるデータがアプリケーション内のMacOS/eventsに保管されます。レースの実施にはおそらく大きな問題はありません。問題となるのはFPVTracksideを更新、あるいは同じバージョンであっても再インストールを行うとデータが失われてしまうことです。
もしデータを失いたくない場合は自力でeventsディレクトリーをどこかに保存しておく必要があります。

< pilots >
pilotsフォルダーはパイロットの写真や動画を保存する場所です。FPVTracksideは最初の起動時にpilotsフォルダーを作成します。実際に”~/Documents/FPVTrackside/pilots”を作成しています。ところがFPVTracksideがpilotsフォルダーの操作を行う時にはアプリケーションバンドル内のMacOS/pilotsを参照します。しかしこのフォルダーは作成されていません。そのため様々な問題が発生します。

とりあえずMacOS下に自分でpilotsフォルダーを作成すればパイロットの写真機能を使用することは出来ます。

[ macOSの濁点問題 ]
ファィル名に濁点と半濁点が含まれていると発生する問題です。NFC/NFD問題とも言います。簡単に説明します。NFDとNFCと言う異なる文字表現があります。NFDでは濁点などを独立した文字としてあつかいます。NFCは濁点付きの一つの文字として表します。例えば「が」はNFDでは2文字、NFCでは1文字になります。日本語だけではなく西欧の文字列にもわずかですが同様の文字が存在するそうです。

macOSではファイル名をNFDで作成します。ところが一般的にプログラム内部ではNFCを期待しています。macOSでプログラムが濁点の含まれるファイル名を単純に読み込むと濁点が独立した文字(NFD)になってしまいます。それをそのまま画面に表示すると濁点、半濁点がやや離れたところに表示される奇妙な状態になります。また、プログラム内部でNFCで管理されている文字列とファイルシステムから得られたNFD文字列は一致しないため、意味としては同じだったはずのものが別のものになってしまいます。macOSの仕様が何故このようになっているのか理解に苦しむところでもあります。

FPVTracsideにおいてはパイロット名と上記のpilotsフォルダーに保管したパイロットの写真の間でこの問題が発生します。

シナリオは幾つかありますが、ここではmars.fpv@YAMAGATAさんFPVパイロット一覧のデータを使ってテストしてみます。
– FPVTrackside用ZIPをダウンロードします。
– ZIPを展開した中にあるアイコンファイル(拡張子png)を上の方で作成したアプリケーション内のMacOS/pilotsフォルダーにコピーします。
– FPVTracksideを起動しイベント画面でパイロットのインポートを行います。

「プロフィール画像ファイルからインポート」を行います。
– これで先にコピーした画像ファイル名をパイロットの名前として使用できるようになります。

パイロットの写真があればパイロット名リストが簡単にインポート出来るとても便利な機能です。が、コザックとドローン部長だけちょっと名前が見づらいです。これはWTW四国のメンバーであることが原因ではありません。これこそがNFD問題です。ちなみにmacOSのファインダー上では普通に見えます。
– 名前が見づらくても良いのであればこのままでも動きます。

やはりカッコよくないです。それにパイロット名を別の方法でインポートしてあった場合にはパイロット名が一致しなくなります。

本来の解決策はFPVTrascksideの中でNFDからNFCに変換する”nfc normalization”と言う処理を行うことです。それが実現されるまでの間はファイルシステム上でnfc化することも可能です。ただし古いHFS+ファイルシステムだとうまく行かないようです。

nfc化を行うnfd2nfcと言うPythonスクリプトを作りました。

これを使うとファイルシステム上でnfc化することが出来ます。


インポートをやり直しました。やはり、こちらの方が良いでしょう。

FPVTrackside Mac版を使ってみよう

FPVTrackSide Mac版でやっとArUcoが動くようになりました。

ArUcoとはTinyViewPlusでお馴染みのARマーカーのことです。zubon2003さんがFPTracksideのレースタイミングとして組み込みを行い、Windows版ではv2.75.0から使えます。しかしMac版はなかなか動きませんでした。私の手元でMacでも何とか動くようにし、それをzubon2003に手伝ってもらい開発者にフィードバックしたものが、かなりの時間を経てやっと(ちゃんと動くものが)リリースされました。

https://fpvtrackside.com/download
私がテストしたのは”FPVTrackside 2.77.1.877.dmg”です。

ただし、Mac版にはまだ別の問題があります。これについては次の記事「FPVTracside Mac版の問題点(2026/07/30現在)」に書きました。とりあえず、FPVTrackside初心者の私がARマーカーでタイムが測れると確認した道のりを書いておきます。

[ インストール ]
導入は一般的なmacOSのアプリケーションと同じです。dmgファイルを開き、FPVTracksideのアイコンをApplicationsにコピーします。
ひとつ前のバージョンくらいからは正しく署名がなされていますのでxattrのおまじないは必要ありません。最初の起動時には下のポップアップが出ますので「開く」をクリックします。

最初の画面です。

[ チャネルの設定 ]

Channel Settingsを開くと何かしらチャネルが設定されているので不要なものをRemoveして必要なものをAddします。

[ ビデオ入力 ]

Video Settingsを開き、映像入力をAddします。私の場合はUSB3 Videoと言うHDMI/USB-C変換器を追加しました。


Video Modeはそれなりに適切なものを選択します。私の使ったビデオ入力は4チャネルを一つのHDMIに集約したものなのでChannel Splitsを”2 x 2″にしました。あらかじめチャネルを設定していたので自動的に各画像とチャネルは自動的に一致しました。もし違う場合は画像の上で右クリックすると変更出来ます。

[ ArUcoを設定する ]

Timing Settingsを開きAddメニューから”ArUco (Video Marker)を選択します。


Marker IDsに必要なものを指定します。マーカーのIDが分からない場合、とりあえずのテストならば”0,1,2,3″でだいたい大丈夫でしょう。

[ イベントの作成 ]

最初の画面でContinueを押します。


規定値のEvent設定が開きます。とりあえずテストなので、そのままOpenしました。

[ パイロットの追加 ]

左の方の空いているところで右クリックをしてAdd Pilotで名前を入れます。とりあえずは英字のパイロット名にしてください。

[ ラウンド ]

上の方にあるRoundsをクリックするとラウンドが開きます。ラウンドの内部で右クリックしてAdd Raceを行います。

[ レース ]

レースのチャネル部分に左のパイロットをドロップします。Race 1-1などと表示されている部分をクリックするとレース画面になります。そして右下のStartをクリックしてレースを開始します。


マーカーを見せるとちゃんとゴールゲートとして認識されました。マーカーの写真はいつもYuzuiroさんのブログを無断使用させていただいています m(_ _)m

[ 日本語 ]
テスト優先で最後になってしまいましたが日本語にすることもできます。

右上にある3本線のアイコンをクリックしてメニューからApplication Settingsを開きます。一番上のLanguageでJapaneseを選択しOKを押します。ポップアップメニューからFPVTrackseideのリスタートを行います。

タイニー用アンテナのSWR測定

VTXアンテナのSWRを測定してみる」の続きです。
UFLコネクターへの変換アダプターが入手出来たの手持ちのタイニーで使用しているアンテナをLite VNA 64で測定してみました。アダプター自体の影響も大きいかも知れないので数値の信憑性はなんとも言えません。

それぞれ一つのアンテナしかテストしていないので、もしかするとハズレの個体を測定している可能性もあります。

BETAFPVのMatrix 1S G4 5IN1 V2に付属していたアンテナです。新品です。5.85GHz以下ではSWR 2.0以下なのでまあまあな感じ。

BETAFPVのちょっと前のAirに付属していたアンテナです。機体から外したもの。先っぽ触るとビリッとする感じのあるやつです。上のものよりちょっと悪いです。

HummingBird V3 AIO(やや古い)付属のアンテナです。新品。今ひとつ。

HummingBird V3.1 RaceSpecから取り外したもの。接触の問題かも知れないけどかなり大きなSWRを示している。ちょっと使いたくないレベル。

タイニーのアンテナだし良い数値を期待するのは無理かも、以上。で、終わりにしようと思っていました。大事なやつを忘れていました。

最後にTBS Unity Pro32 Nanoに付属しているアンテナ。新品。めちゃくちゃ良い数値です。完全にSWR 1.5以下です。TBS流石としか言いようがない。

VTXアンテナのSWRを測定してみる

タイニー用アンテナのSWR測定」も行っています。

部長のところからやってきたLiteVNA 64を押入れの奥から引っ張り出してきました。コンパクトな機器ですが6GHzまで対応している多機能なネットワークアナライザーです。私がこれを持っている理由はただ一つでSWRの計測です。

SWRは日本語では定在波比と言います。日本語になっても全く意味が想像出来ませんね。ざっくり言うと、電波を発射しようとアンテナに電力を送り出した時に、少しだけ電力が逆流してきます(透明なガラスに光を当てると少しだけ反射するかのようなイメージ)。それを数値化したものがSWRです。

理想的な数値は1.0でアンテナに送った電力が全てアンテナで消費されることを示します(SWRでは電波になったのかどうかは分からないです。もしかするとアンテナの近くで熱になっているのかもしれない)。一般的に言えば1.5以下なら合格。2.0以下ならまあまあ大丈夫と言う感じです。もし2.0だと11.1%の電力が戻ってきています。戻ってきた電力はVTXの中で熱に変わると思われます。あまりにSWRが大きいと最悪な場合ではVTXを壊すこともあるかもしれません。と言うことでSWRは小さい方が望ましいです。

[ LiteVNAの設定 ]
概ねOscar Liangさんの「How to Measure Antenna SWR with LiteVNA: A Comprehensive Guide」に従いました。キャリブレーションに関しては「Tinyネットアナ入門 LiteVNA 64のキャリブレーション」も参考になります。細かい操作方法は公式のドキュメントを読みました。

[ 測定してみた ]

手持ちの5.8GHzアンテナでSMAコネクターの付いたものを測定してみました。優秀なものから順に紹介します。

古いTBS(Team-BalckSheep)のStubです。かなり優秀です。どのアンテナにも言えますが個体によって少し違いますが、平均的なSWR値は変わりません。

黄色の線がSWR値のグラフです。横軸が周波数で5.6GHzから6GHzになっています。縦軸がSWRで右側にSWRの数値が表示されています。緑色の線はインピーダンスを表す何か(^^)です。

TBS Triumph、TBS流石としか言いようがない。

TBS TriumphにL字型のコネクターを追加したもの。少し特性が悪くなりますが問題はないレベル。L字型コネクターも他のものと交換して試すべきだったかもしれないです。

EMAX Pagoda-2のとても古いもの。クラッシュしてボロボロだけど数値は良い。

EMAX Pagoda-3Bもまあまあ悪くない。特に日本で使用される周波数では1.5以下になっている。

ところが同じEMAX Pagoda-3Bでも使い古してコネクターが変色している(それが原因か元々の個体差かは不明だけど)はやや悪い。

ImmersionRCのパッチアンテナ。定評がある人気のパッチ、さすがに良い感じです。硬くて外せなかったのでL字コネクターを付けた状態での測定です。

FOXEER ORERO、優秀です。これも斜めにするコネクターを付けた状態です。確かSAITOさんがWorld Games 2022へ参加するときのクラウドファンディングに協力した時の返礼品で、全くの未使用。

優秀な謎アンテナ。どこから来たものか不明。

ここからは即ゴミ箱行きシリーズ

EMAX Nano、これは小さいのが魅力で購入したもののあまりに電波が悪くてすぐに使わなくなったものです。完全に数値に表れていますね。

RUSH Cherry、期待を裏切られた感大きい。とても綺麗な作りで値段もそこそこ高かった気がする。長さ違いで2本ありますが、どちらも同じくらいの成績。

無課金おじさん、bb-tuneでPIDチューンを試す

無課金おじさんBetaflight-MCPを使う」の続きです。

Betaflight-MCPはAIとBetaflight Configuratorを接続する仕組みでした。そのBetaflight-MCPに同梱されているbb-tune-dekstop.zipはPIDチューニングするためのスキルです。その中身はログファイルを解析するPythonのプログラムとAIに対してチューニング手法を指示するための文章です。

opencodeに対してこのスキルを使えるようにしてと頼んでみました。


一見、ちゃんと出来たように見えましたが、opencodeを再立ち上げするとスキルの定義でエラーが発生しました。

導入ディレクトリー下の”.opencode/opencode.jsonc”というファイルの単純な書き間違いでした。この辺りはローカルLLMの能力の限界によるものです。もう一度頼んだりすれば直るでしょうが、簡単なことなので手で直しました。
正しい内容を下に書いておきます。

{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "betaflight": {
      "type": "local",
      "command": ["node", "server/server.js"]
    }
  },
  "skills": {
    "paths": [".opencode/skills/bb-tune"]
  }
}

実際にドローンを接続してBlackBoxログを解析してみるとことにします。そのままでも大丈夫ですが、私はblackbox_decodeというプログラムを持っていましたので、それを使うようにSKILL.mdを少しだけ修正しました。

準備したのはわざとPIDを狂わせた65機を飛行させたものです。step responseを見ると次のような感じです。

このドローンをBetaflight-MCPに接続してopencodeでログの解析をお願いしました。自動的にログがダウンロードされ解析が始まりました。これはなかなか新しいです。


解析結果に基づいて対策が提案されます。このまま進めると提案されたPID値を機体に書き込んで、飛行テストに進むという流れです。

実際は全てのPIDを低くしたのですが、step responseを見ると分かるようにyawがかなり悪い状態です。そこはちゃんと指摘されましたが、推奨されたのはより小さなPI値でした。これは方向性が明らかに違うので、ここまでにしました。もしかするとClaude Desktopで行えば多少違うかもしれませんが、基本的にはSKILL.mdに記述された内容に従っているのだと思います。

自分でチューニングの評価をしながらSKILL.mdを更新していく仕組みが作れれば、基本的な枠組みはこのままで進化していく可能性もあります。

無課金おじさんBetaflight-MCPを使う


生成AIとBetaflight Configuratorを接続する仕組みです。FPV界で知らぬ人がいないYukiFPVによるものです。自然言語で話しかけるとMCP接続されたBetaflight Configuratorを通して機体からデータを取得、あるいは設定出来るのものです。

まだ効果的な使用目的を思いついてはいませんが、大きな可能性を感じます。

Cluade Dekstopを使う場合は添付されている手順に従えば、ほぼ迷うところはありません。私も最初はClaude Desktopで試しました。ただし無料枠が少ないことで有名なCluadeですのであまり大胆に試せません。

ということで無課金で使ってみました。私はMac mini上で常時ローカルLLM(現在はqwen3.6-35b-a3b)を稼働していますので、それを利用してみようということです。選択肢は色々とあります。最初はVScode+CLINEでやってみましたが、操作性が悪い。またCodex CLIは何故かうまく動かず。

結局のところ何時もコーディングで使用しているOpenCodeというフリーのエージェントに落ち着きました。

設定もローカルLLMに任せましたので、ごくごく簡単でした。
ディレクトリーを作成し、そこにbetaflight-mcp.mcpbをおきます。そのディレトクリー上でopencode開き下のようにお願いしただけです。

MCPを組み込んだBetaflight Appを立ち上げ機体に接続し、PID設定値を読み出してみました。

ローカルLLMでも問題なく使用できました。何か面白い使い方を探究してみたいと思います。

付属されているPIDチューニング用のスキルも試しています。これに関してはまた別途書きたいと思います。

LED設定まとめ 2026.07

タイニーレース4波対応LED設定のリンク集です。

[ VTXチャネルとLEDの色設定を行うLuaスクリプト ]
VTXチャネルとLEDの設定は独立したものとして構成したものを送信機のLuaスクリプトで一回の操作で行うものです。
Led4Vtx.lua v1.3
LEDの色とVTXチャネルを同時に設定するLuaスクリプト

[ VTXチャネル設定で自動的にLEDの色を設定する ]
4波で使用するチャネルの組み合わせによっては、この手法が使えます。
LED色のVTXチャネル連動、4波版

[ 送信機のS1/S2ポットでLEDの色を変更する ]
S1を回して連続的、あるいは段階的にLEDの色を変更する方法
S1ポッドでLEDを決まった色にする設定
4波対応-プロポのポット(S1, S2)でLED色を変更する

[ プリセット ]
Betaflight Configuratorのプリセットを用いてLED設定を行う方法
BetaflighのLED設定を行うプリセットを作りました

[ ハードウェアとファームウェアのビルド ]
FPVドローンのLED実装、ハードウェアとBetaflightのビルド

[ OSDメニューでLEDの色を変更する ]
レースモードプロファイルを使用する方法
OSD menuでLEDの色を変更する

Led4Vtx.lua v1.3

LEDの色とVTXチャネルを同時に設定するLuaスクリプト」をいくつか改良しました。おそらく、これで完成版です。

[ 改良点 ]
v1.1
大きな画面を持つ送信機(T15以上)ではボタンを大きくした

v1.2
切り替えを素早く繰り返すとVTXチャネルとLEDの色の組み合わせがズレる(LED変更がミスる)ことの修正

v1.3
現在のVTXチャネル設定(ELRS TXモジュールに保管されている)を取得して画面右上に表示するようにした。

LED色のVTXチャネル連動、4波版

現在タイニードローンのレースや練習会で使用されている4波のチャネルにはいくつかの組み合わせがあります。中には3波の頃に行っていたVTXチャネル連動のLEDの色変更が使える組み合わせもあります。下の動画のようにVXTXチャネルを何等かの方法で設定するだけでBetaflightが対応する色を自動的に設定してくれるというものです。

[ 実際に使用されている4波の組み合わせ例 ]

1. (E2)5685[LED2], (A8)5725[LED3], (A5)5785[LED4], (A4)5805[LED6]
2. (E1)5705[LED2], (A8)5725[LED3], (A5)5785[LED4], (F5)5820[LED6]
3. (E2)5685[LED2], (E1)5705[LED2], (F3)5780[LED4], (F5)5820[LED6]

この表記は私の https://github.com/nkozawa/IMDAvoider3 で使用しているものです。チャネルと周波数は説明の必要がないと思います。それに続くLED2などと書かれているのがこの説明のキーポイントです。これはLEDストリップ画面にあるラーパレットの番号です。

この画面の数値の部分です。周波数とパレットの番号の関連付けはRacebandを基準にBetaflightの内部で固定的に決められています。詳しくはSetting LED color to the VTx Frequencyをご覧ください。

4波の組み合せ例に戻ると、例の1と2は、LED2,LED3,LED4,LED6と別々のパレットが使われます。反して、例3ではLED2が2回現れます。
< 例1と例2 > チャネル毎に違うパレットが選ばれるためVTXチャネルによるLEDの色変更が可能です。
< 例3 > E2とE1が同じパレットを使用するため、ここで紹介する設定は使用出来ません。VTXチャネルとLEDの色を個別に設定しないといけません。別々の設定をスクリプトで一度に行おうという試みについては「LEDの色とVTXチャネルを同時に設定するLuaスクリプト」をご覧ください。

[ 設定 ]
ここからが本編です。VTXチャネルの組み合わせを全部調べた訳ではありませんが、おそらくLEDカラーパレット2, 3, 4, 6でほぼ網羅出来ると思います。以下、このパレットを使用する設定です。


LEDストリップ画面で設定する場合は上のようになります。カラーパレットの2, 3, 4, 6番の設定は以下の通りです。

パレット番号 H S V
2 Red 0 0 255
3 Green 120 0 255
4 Blue 240 0 255
6 Yellow 60 0 255

プリセットも用意しました。

CLI用のコマンドは以下の通りです。

#--- Set up status mode ---

feature LED_STRIP
set ledstrip_profile = STATUS

# --- Set LED ---

# led
led 0 0,0::CV:14
led 1 1,0::CV:14
led 2 2,0::CV:14
led 3 3,0::CV:14
led 4 4,0::CV:14
led 5 5,0::CV:14
led 6 6,0::CV:14
led 7 7,0::CV:14
led 8 8,0::CV:14
led 9 9,0::CV:14
led 10 10,0::CV:14
led 11 11,0::CV:14
led 12 12,0::CV:14
led 13 13,0::CV:14
led 14 14,0::CV:14
led 15 15,0::CV:14
led 16 0,1::CV:14
led 17 1,1::CV:14
led 18 2,1::CV:14
led 19 3,1::CV:14
led 20 4,1::CV:14
led 21 5,1::CV:14
led 22 6,1::CV:14
led 23 7,1::CV:14
led 24 8,1::CV:14
led 25 9,1::CV:14
led 26 10,1::CV:14
led 27 11,1::CV:14
led 28 12,1::CV:14
led 29 13,1::CV:14
led 30 14,1::CV:14
led 31 15,1::CV:14
led 32 0,2::CV:14
led 33 1,2::CV:14
led 34 2,2::CV:14
led 35 3,2::CV:14
led 36 4,2::CV:14
led 37 5,2::CV:14
led 38 6,2::CV:14
led 39 7,2::CV:14
led 40 8,2::CV:14
led 41 9,2::CV:14
led 42 10,2::CV:14
led 43 11,2::CV:14
led 44 12,2::CV:14
led 45 13,2::CV:14
led 46 14,2::CV:14
led 47 15,2::CV:14
led 48 0,3::CV:14
led 49 1,3::CV:14
led 50 2,3::CV:14
led 51 3,3::CV:14
led 52 4,3::CV:14
led 53 5,3::CV:14
led 54 6,3::CV:14
led 55 7,3::CV:14
led 56 8,3::CV:14
led 57 9,3::CV:14
led 58 10,3::CV:14
led 59 11,3::CV:14
led 60 12,3::CV:14
led 61 13,3::CV:14
led 62 14,3::CV:14
led 63 15,3::CV:14

# color
color 2 0,0,255
color 3 120,0,255
color 4 240,0,255
color 6 60,0,255

macOSでBlackboxログファイルのコピーを少しだけ便利にする方法

macOSでBlackboxログファイルは普通にコピー出来ますが、そのあとでファイル名を変更をするためにはまずロックを外さなければなりません。これが何気に面倒です。そこでコピーしたあとで自動的にロックを外す仕組みを作りました。

[ 手順 ]
– 下にあるスクリプトをbblcopy.scptという名前でどこかに保管します。
– ドローンを接続してBetaflight Configurator/blackboxで「大容量ストレージモードを有効化」を行います。
– Finderからbblcopy.scptをダブルクリックするとスクリプトエディターが立ち上がります。
– スクリプト/実行
– コピー元であるドローンのログが表示されますのでコピーしたいものを選択します(複数可)。
– 次のダイアログでコピー先を選択。
以上でログファイルがコピーされロックも外れます。すぐにファィル名の変更が可能です。

[ メニューバーからスクリプトを起動する ]
まず、bblcopy.scptを所定の場所にコピーする。私は以下の手順をとりました。

mkdir ~/Library/Scripts
cp bblcopy.scpt ~/Library/Scripts

Finderから行う場合は、移動メニューを出してOptionを押すとメニューにライブラリが現れるのでそこで作業します。

そして、スクリプトエディタを立ち上げて設定を開き「メニューバーにスクリプトメニューを表示」にチェックを入れます。


こんな感じで何時でもサクッと起動できるようになります。

[ 補足 ]
コピー先を覚えておくために~/Library/Application Support/bblcopy/にファイルを作っています。

# bblcopy.scpt — Blackbox log コピー用 AppleScript

property lastDestPath : ""

on run
    set prefsFolder to (POSIX path of (path to home folder)) & "Library/Application Support/bblcopy/"
    set prefsFile to prefsFolder & "last_dest.txt"
    do shell script "mkdir -p " & quoted form of prefsFolder

    try
        set savedPath to (do shell script "cat " & quoted form of prefsFile)
        if savedPath ≠ "" and (do shell script "test -d " & quoted form of savedPath & " && echo yes || echo no") = "yes" then
            set lastDestPath to savedPath
        end if
    end try

    if lastDestPath = "" then
        set lastDestPath to POSIX path of (path to desktop folder)
    end if

    set volumeMounted to (do shell script "test -d /Volumes/BETAFLT && echo yes || echo no") = "yes"
    if not volumeMounted then
        display dialog "/Volumes/BETAFLT がマウントされていません。Betaflight Configuratorから大容量ストレージモードを有効にして下さい。" ¬
            with title "ボリュームが見つかりません" ¬
            buttons {"OK"} default button "OK" ¬
            with icon caution
        return
    end if

    set srcFiles to choose file ¬
        with prompt "コピー元ファイルを選択(複数可)" ¬
        default location (POSIX file "/Volumes/BETAFLT/") ¬
        multiple selections allowed true

    if srcFiles = {} then return

    set destFolder to choose folder ¬
        with prompt "コピー先フォルダーを選択" ¬
        default location (POSIX file lastDestPath)

    set lastDestPath to POSIX path of destFolder
    do shell script "echo " & quoted form of lastDestPath & " > " & quoted form of prefsFile

    set destPOSIX to POSIX path of destFolder
    set copiedCount to 0
    set skippedCount to 0
    set overwriteAll to false

    repeat with f in srcFiles
        set srcPOSIX to POSIX path of f
        set baseName to (do shell script "basename " & quoted form of srcPOSIX)
        set destPath to destPOSIX & baseName
        set fileExists to (do shell script "test -e " & quoted form of destPath & " && echo yes || echo no") = "yes"

        set doCopy to true
        if fileExists and not overwriteAll then
            display dialog (baseName & " は既にコピー先に存在します。上書きしますか?") ¬
                with title "同名ファイルの確認" ¬
                buttons {"スキップ", "すべて上書き", "上書き"} ¬
                default button "上書き"
            set theButton to button returned of result
            if theButton = "スキップ" then
                set doCopy to false
            else if theButton = "すべて上書き" then
                set overwriteAll to true
            end if
        end if

        if doCopy then
            do shell script "cp -f " & quoted form of srcPOSIX & " " & quoted form of destPath
            do shell script "chflags nouchg " & quoted form of destPath
            set copiedCount to copiedCount + 1
        else
            set skippedCount to skippedCount + 1
        end if
    end repeat

    set resultMessage to (copiedCount as text) & " 件のファイルをコピーしました"
    if skippedCount > 0 then
        set resultMessage to resultMessage & "(" & (skippedCount as text) & " 件スキップ)"
    end if

    display notification resultMessage ¬
        with title "Blackbox Log コピー完了" ¬
        subtitle destPOSIX

    display dialog (resultMessage & "。" & return & return & destPOSIX) ¬
        with title "コピー完了" ¬
        buttons {"OK"} default button "OK"
end run