ドローン シミュレーターを公開しました

ブラウザ上で動作するWebフライトシミュレーター

を作ってみました。

インストール不要で、ドローンとRC飛行機のフライト練習がPCだけで行えます。USB接続のプロポにも対応しています。

▼ 公開ページ
https://navsys.net/simulator/


【ドローン・シミュレーター】
モーターごとの推力と反トルクを再現した本格的なアクロ飛行モデルです。FPV用、小型、中型、大型の機体を選択でき、さらに中型・大型は4発/6発を選択可能です。

    【RC飛行機・シミュレーター】
    上反角による安定性を持つ高翼トレーナー機を再現。失速迎角(約14°)や地面効果、接地判定を実装し、離陸から着陸までの基本操作を習得できます。

    【主な特徴】
    ・Gamepad API対応:お手持ちのUSBプロポをそのまま使用可能(モード1/2切替、軸反転対応)
    ・3つの視点:迫力のFPV、練習しやすい追尾、実機に近い目視視点(1.6m)
    ・簡単操作:Rキーで即時リセット、キーボードのみでも操作可能

    無料でご利用いただけますので、ドローンの操縦練習や、実機フライト前のイメージトレーニングにぜひご活用ください。

    Why Not Arm? – スマホで現場プレチェック β版を公開しました

    ArduPilot機で、MAVLink経由のテレメトリ通信を使って「なぜ Arming できないのか」を

    ・現場で確認したい
    ・コンパス校正をその場で素早く済ませたい
    ・PCを開かずに機体の状態をさっと見たい

    そんな場面向けに、スマートフォンから使える現場向けWebアプリ

    「Why Not Arm? – スマホで現場プレチェック」

    を、ひとまず β版として公開してみます。

    このアプリは、スマートフォンに接続したテレメトリ通信機を介して機体と通信し、飛行前チェックやコンパス校正などを行うためのものです。

    ※ スマートフォン単体で機体と直接通信するものではありません。

    ブラウザ上で動作するため、アプリのインストールは不要です。

    現時点では、Arming できない理由の確認やコンパス校正など、現場で最低限ほしい機能を中心に載せています。

    利用方法としては、スマートフォンに対応したテレメトリ通信機を使用する方法のほか、USBケーブルでフライトコントローラーに直接接続して利用することもできます。

    ※ 弊社テレメトリ通信機 MM-LINK を使用して動作確認を行っています。

    また、MAVLink プロトコルを利用しているため、他の通信機器や接続構成でも動作する可能性はありますが、すべての環境での動作を保証するものではありません。

    対応環境は Android + Google Chrome(最新版) です。

    iPhone / iPad / iOS / iPadOS 端末では、ブラウザの通信機能制限により利用できません。

    また、Android 端末でも機種やOSバージョン、接続環境によっては正常に動作しない場合があります。
    Why Not Arm? は現場での簡易確認用ツールです。

    詳細な設定や本格的な調整は、Mission Planner や QGroundControl(QGC)で行ってください。

    動作確認には、弊社テレメトリ通信機 MM-LINK を使用しています。

    Why Not Arm? – スマホで現場プレチェック
    https://navsys.net/mav/

    テレメトリ通信機 MM-LINK
    https://m2-lab.net/mm-link/

    まだ試作・検証段階のため、実装やUIに荒い部分はありますが、まずは使える形として公開してみます。
    本ツールは無料公開のため、一部ページに広告が表示される場合があります。
    不具合や改善点、動作報告などあれば歓迎です。

    小型テレメトリ通信ユニットの販売開始

    以前ご紹介した「RC/ドローン向け 小型テレメトリ通信ユニット」について、現在販売のご案内を開始しています。
    BOOTHでの販売開始に向けて準備を進めていますが、販売開始前でもお問い合わせフォームからご連絡いただければ、受注生産にて個別対応いたします。

    本製品は、RC機体やドローンにおけるテレメトリ通信や、各種機器の無線中継用途を想定した、独自ファームウェア採用の国内開発システムです。
    配線の制約を減らしながら、通信の安定性と切断時の復帰しやすさを重視して設計しています。

    また、ラジコン飛行機に搭載した実フライトテストでは、上空の見通しが良い直線環境において、実測で約500〜600mのテレメトリ通信を確認しています。
    ※通信距離は周囲の電波環境や障害物、天候等の影響により変動します。

    導入検討や仕様に関するご相談、ご購入希望、お見積のご依頼も受け付けております。
    ご興味のある方はお気軽にお問い合わせください。

    製品の詳細はこちら

    JLCPCBに初めてプリントを依頼してみた

    JLCPCBに初めてケースの製作を依頼してみました。
    で、先ほど届きました。
    7/26に依頼して8/3に到着なので約1週間でした。

    今回は、精度や価格の面で、自分で出力するより良いかどうかを確認したくて依頼してみました。

    光造形ということもあって、表面は全体的にツルツルしていて、見た目はきれいでした。
    積層痕も強く目立つ感じではなく、仕上がりの印象は良かったです。

    ただ、今回届いたパーツのうち、ふた側には反りが見られました。
    酷暑なので、輸送時の熱でやられたのか、出力段階でのものなのかはわかりませんが。

    MMスイッチ用のケースも頼んでみたのですが、こちらは明らかに出力時の問題ではないかと感じました。
    使えなくはないのですが、形状の歪みは少し気になるところです。

    今回はクーポンが使えて、全部(送料込)で465円でした。
    自前のFDM出力と比べると、光造形だけあって表面のきれいさはかなり良いと感じましたが、反りのような気になる点もあり、精度面についてはもう少し見ていきたいところです。
    とはいえ、この価格で比較材料を得られたのは十分な収穫でした。

    上:光造形
    下:FDM

    テレメトリ通信ユニットの試作開発

    現在、テレメトリ通信ユニットの開発を進めています。

    現在は試作段階にあり、動作検証を中心とした各種調整を行っています。

    試作機による評価では、500m以上での通信を確認しており、現在はデータパケットの最適化とエラー検知アルゴリズムの実装に注力しています。

    特に、遅延を抑えつつ安定した通信を実現することを目標として、引き続き検証を進めています。

    今後は、実環境での評価を継続しながら、筐体設計や構成の見直しも含めて製品化に向けた検討を進めてまいります。

    なお、通信距離や仕様は使用環境・搭載条件等により変動する場合があります。

    ArduPilot Lua エディタ v1.0 リリース

    ArduPilot搭載機向けのLuaスクリプト開発ツールをリリースしました。

    Mission Plannerなしで、直接フライトコントローラーにLuaスクリプトをアップロード・編集・削除できます。

    主な機能

    • Luaスクリプトのアップロード&機体再起動
    • 機体上のファイルをエディタで直接編集
    • ファイル一覧表示・削除
    • Lua設定パラメータの確認・修正
    • 自動再接続対応

    動作環境・接続方法

    • USB シリアル接続(ボーレート 115200)
    • ArduPilot搭載機(PixHawk4、PixHawk6C、cubeBlack、cubeOrange 動作確認済み)

    現バージョンの制限事項

    • USB接続のみ対応(無線接続は次バージョンで対応予定)
    • ボーレートは115200固定 ※ 無線のボーレートが115200なら動作するかも

    注意事項

    • フライトコントローラーにSDカードが挿入されている必要があります
    • 接続に失敗する場合は、数回接続ボタンを押してみてください

    今後のアップデート予定

    • 無線接続(UDP/TCP)対応
    • ボーレート選択機能

    EXE単体で動作するため、インストール不要です。

    下記よりダウンロードし、ZIPを解凍後、lua_dev_tool.exe を実行してください。

    ダウンロード (lua_dev_tool_v1.0.zip)

    PHPフレームワーク「PoiPHP」を作りました

    「余計な機能はポイ捨てジャーマン」

    気軽に使える PHP フレームワークを作りました。

    「ちいたん」という PHP フレームワークを愛用していたのですが、開発が終了して幾年月。
    そこで、ちいたんの使い心地を参考に自分で作ったのが PoiPHP です。

    余計なものはポイ。
    必要なところだけ、シンプルにまとめたのが PoiPHP です。

    ・ファイルを置けば画面になる

    ・必要な時だけ Model を使う

    ・生 PHP の感覚で書ける

    ・ルールは最小限

    “軽くて、迷わない”
    そんなフレームワークです。
    よかったら、気楽に触ってみてください。

    👉 PoiPHP 公式サイトはこちら
    👉 GitHub でソースを見る

    ※ちなみに、なつぽい選手とは何の関係もありません。

    ブラウザからドローンにアクセス?Web Serial APIでPixhawkと繋いでみた

    はじめに
    ドローンや無人移動体のフライトコントローラーとして世界中で使われている「Pixhawk」。
    通常、そのデータを確認するには専用ソフト(Mission PlannerやQGroundControl)をPCにインストールします。

    しかし最近、「ブラウザ(ChromeやEdge)から直接シリアル通信ができる」というWeb Serial APIの存在を知り、ふと思いました。

    「これを使えば、ブラウザだけでPixhawkの中身が覗けるんじゃね?」

    今回はその検証の第1弾として、インストール不要・ブラウザのみでPixhawkの生データを受信するところまでを実践してみます。


    Web Serial APIとは
    ひとことで言えば、「OSの壁を越えて、ブラウザからハードウェアを直接制御できる技術」です。
    これまではセキュリティの観点からブラウザがPCのハードウェアに直接触れることは制限されてきましたが、このAPIの登場により、WebアプリからArduinoやPixhawkといったデバイスを制御することが可能になりました。


    実装:最小限のコードで繋いでみる
    まずは、Pixhawkから送られてくる「生データ」を表示するための、シンプルなHTMLとJavaScriptを準備しました。

    実装のポイント
    1.ボーレートの設定: PixhawkのUSBポートは通常 115200 で通信しています。
    2.バイナリの可視化: Pixhawkはデータをバイナリ(数値の列)で送ってくるため、JavaScriptで16進数の文字列に変換して表示させています。


    
    
    <!DOCTYPE html>
    <html lang="ja">
    <head>
        <meta charset="UTF-8">
        <title>Pixhawk Web Serial Connect</title>
        <style>
            body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: #f4f4f9; padding: 30px; }
            .card { background: white; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); padding: 20px; max-width: 800px; margin: auto; }
            h1 { color: #333; font-size: 1.5rem; }
            .controls { margin: 20px 0; display: flex; gap: 10px; align-items: center; }
            button { padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; font-weight: bold; transition: 0.3s; }
    
            /* 接続ボタンのスタイル */
            .btn-primary { background: #007bff; color: white; }
            .btn-primary:hover { background: #0056b3; }
    
            /* 切断ボタンのスタイル */
            .btn-danger { background: #dc3545; color: white; }
            .btn-danger:hover { background: #a71d2a; }
    
            #clearBtn { background: #6c757d; color: white; }
            .status { font-weight: bold; margin-left: 10px; }
            .status.connected { color: #28a745; }
            .status.disconnected { color: #dc3545; }
            #console { background: #1e1e1e; color: #00ff00; padding: 15px; height: 400px; 
                       overflow-y: scroll; font-family: 'Consolas', monospace; font-size: 13px; border-radius: 4px; }
            .info { font-size: 0.9rem; color: #666; margin-top: 10px; }
        </style>
    </head>
    <body>
    
    <div class="card">
        <h1>Pixhawk 接続テスト (Web Serial API)</h1>
    
        <div class="controls">
            <button id="connectBtn" class="btn-primary">Pixhawkに接続</button>
            <button id="clearBtn">表示をクリア</button>
            <span id="statusLabel" class="status disconnected">未接続</span>
        </div>
    
        <div id="consoleText">受信待機中...</div>
        <div id="console"></div>
    
        <div class="info">
            ※PixhawkをUSBで繋ぎ、Mission Planner等を閉じてから「接続」を押してください。<br>
            ※115200bpsで通信を開始します。
        </div>
    </div>
    
    <script>
        const connectBtn = document.getElementById('connectBtn');
        const clearBtn = document.getElementById('clearBtn');
        const consoleDiv = document.getElementById('console');
        const statusLabel = document.getElementById('statusLabel');
    
        let port;
        let reader;
        let keepReading = true;
    
        // ボタン1つで接続と切断を切り替える
        connectBtn.addEventListener('click', async () => {
            if (port) {
                // 切断処理
                keepReading = false;
                if (reader) await reader.cancel();
                await port.close();
                port = null;
    
                // UIを元に戻す
                statusLabel.innerText = "未接続";
                statusLabel.className = "status disconnected";
                connectBtn.innerText = "Pixhawkに接続";
                connectBtn.className = "btn-primary";
                return;
            }
    
            try {
                port = await navigator.serial.requestPort();
                await port.open({ baudRate: 115200 });
                statusLabel.innerText = "接続済み";
                statusLabel.className = "status connected";
                connectBtn.innerText = "切断する";
                connectBtn.className = "btn-danger";
    
                keepReading = true;
                readLoop(); 
            } catch (err) {
                console.error(err);
                alert("接続に失敗しました: " + err.message);
            }
        });
    
        async function readLoop() {
            while (port && port.readable && keepReading) {
                reader = port.readable.getReader();
                try {
                    while (true) {
                        const { value, done } = await reader.read();
                        if (done) break;
    
                        const hexString = Array.from(value)
                            .map(b => b.toString(16).padStart(2, '0').toUpperCase())
                            .join(' ');
    
                        const span = document.createElement('div');
                        span.textContent = `[${new Date().toLocaleTimeString()}] ${hexString}`;
                        consoleDiv.appendChild(span);
    
                        if (consoleDiv.childNodes.length > 100) {
                            consoleDiv.removeChild(consoleDiv.firstChild);
                        }
                        consoleDiv.scrollTop = consoleDiv.scrollHeight;
                    }
                } catch (err) {
                    console.error("読み取りエラー:", err);
                } finally {
                    reader.releaseLock();
                }
            }
        }
    
        clearBtn.addEventListener('click', () => {
            consoleDiv.innerHTML = '';
        });
    </script>
    
    </body>
    </html>
    
    

    動作確認:ブラウザに流れる「生データ」
    PixhawkをUSBでPCに繋ぎ、作成したページで「接続」ボタンを押すと……。

    出ました!
    黒いコンソール画面に、16進数の数字がザーッと流れ始めました。
    この中には、機体の傾き、高度、GPSの状態といったあらゆる情報が詰まっています。

    よく見るとデータの先頭に FD という文字が混ざっているのがわかります。これは MAVLink v2 という通信プロトコルの開始合図。ブラウザが正しくPixhawkの信号を捉えている証拠です。


    まとめ
    専用ソフトを一切立ち上げることなく、「ただWebページを開くだけ」でPixhawkとの通信に成功しました。
    「ブラウザだけで動く」ということは、OSを問わず、URLを共有するだけで誰でも同じ解析ツールが使えるようになるということです。

    注意点
    1.ブラウザの制限(Safariは未対応)
      ここが一番のポイントです。Mac標準の Safariは、Web Serial APIをサポートしていません。Macユーザーには「ChromeかEdgeを使ってください」と伝える必要があります。

    2.ドライバー不要だが「認識名」が違う
      Windowsでは「COM3」のように表示されますが、Macでは /dev/cu.usbmodem… のような名前で認識されます。Web Serial APIの選択ダイアログにはちゃんと出てくるので、それを選択すればOKです。

    ブラウザOS (Windows/Mac/Linux)対応状況
    Google ChromeWindows / MacOK
    Microsoft EdgeWindows / MacOK
    FirefoxWindows / MacNG (非対応)
    SafariMacNG (非対応)