🎵

Luaでドローンを鳴かせてみた(ArduPilot入門)

に公開

私たちは、ドローンやロボティクス技術を活用して、社会のさまざまな課題に取り組んでいます。
点検、測量、物流、災害対応などの現場では人手不足や安全性が求められています。
その中で、機体をより柔軟かつスマートに制御する技術の重要性が高まっています。

本記事では、オープンソースの自律飛行制御ソフトウェア「ArduPilot」にLuaスクリプトを組み込むことで、
ドローンが自身の傾きを検知してブザーを鳴らす、というシンプルかつ実践的なカスタマイズ方法を紹介します。

初心者でも取り組める構成にしており、特別なセンサや外部電源も不要です。
手元のフライトコントローラ(FC)とPC、MissionPlannerがあればすぐに試せます。

今回の内容が、ドローンやロボット開発を進めるうえでのアイデアのきっかけになれば嬉しいです!

🧠 ArduPilotとは?

ArduPilotのロゴ

ソース: https://github.com/ArduPilot/ardupilot_wiki/blob/master/logos/Ardu - logos.ai

従来のラジコン飛行機では、操縦者が送信機でスティック操作を行い、機体に載っている受信機がその信号を受け取り、操縦面のサーボモーターやプロペラのモーターなどのアクチュエータを動かします。
しかし、現代のドローン(空中の無人機)は、自律的に飛行します。ウェイポイントに従って移動したり、高度を調整したり、姿勢を自動で安定させます。
もちろん操縦者が手動で操作することも可能ですが、必須ではありません。

これは、オートパイロット(自動操縦ソフトウェア)を実行するフライトコントローラ(FC)ハードウェアが機体に搭載されていることで実現されています。
FCはGPS、加速度計、ジャイロなどのセンサデータを読み取り、それに基づいてアクチュエータを制御します。

機体の設定や監視は、GCS (Ground Control Software / 地上局ソフトウェア) を使って行います。

ArduPilotは、ホビーユーザー、研究者、産業分野で広く使われているオープンソースのオートパイロットソフトウェアです。
飛行機、マルチコプター、ローバー、ボートなど、さまざまな無人機に対応しています。

ArduPilotはLuaスクリプトをサポートしており、C++のソースコードを触らずに簡単にドローンの動作がカスタマイズ可能です!

📦 用意するもの

必須:

  • フライトコントローラ(FC)例:Pixhawk, Matek H743
  • USBケーブル
  • MissionPlanner(GCSソフト / Windows専用)が動作するPC

💡 Luaスクリプトを使うには1MB以上のSRAMを持つFCが推奨です。(H743チップを搭載したボードなど)
Matek H743 SLIM
ソース: https://www.mateksys.com/?portfolio=h743-slim

コマンドラインベースのMAVProxyなどもありますが、本記事ではUIがわかりやすいMissionPlannerを使います。

任意(あると便利):

  • ブザー(FCのブザーかAUXポートに接続)

🛠 MissionPlannerのセットアップとFCへのファームウェア書き込み

  1. こちら からMissionPlannerをダウンロード
  2. 推奨されるドライバも含めてインストール
  3. MissionPlannerを起動

ファームウェアの書き込み手順:

ファームウェアの書き込み手順

  • メニューから 初期設定 > ファームウェアインストール に進む
  • FCをUSBで接続
  • 機体タイプ(例:Copter)を選択
  • ボードタイプ(例:Pixhawk 2.4.8はfmuv3)を選択
  • Upload Firmwareをクリック
  • 必要に応じてUSBを抜き差しして再接続

💡 MissionPlannerは正しく接続すればCOMポートを自動認識します。
認識しない場合は、デバイスマネージャーでCOMポートとドライバを確認してください。

詳しくはArduPilotの公式ドキュメントの初期セットアップページを参照してください。

🔌 フライトコントローラへ接続

  • MissionPlanner右上のCOMポートを選択して 接続 をクリック
  • フライト・データ タブでセンサデータがリアルタイム表示されます
  • FCを傾けて、姿勢表示が変わることを確認してください

🐣 Luaスクリプト初歩:Hello World

Lua Scriptsの公式ドキュメントを確認すると、よく使う関数や例がまとまっています。
完全な関数リストはこちら、例のスクリプトはこちらから見られます。

基本の"Hello, world"スクリプトは、GCSのコンソールにメッセージを送信します。
gcs:send_text(severity, text) メソッドは2つの引数を取ります。最初の引数はメッセージの重要度(severity)で、2つ目は送信する文字列です。

gcs:send_text(0, "hello, world")

ただしこれは起動時に一度だけ実行されるため、見逃しやすいです。
以下のようにループさせると、1秒ごとに出力されます:

local function update()
    gcs:send_text(0, "hello, world")
    return update, 1000  -- 1000msごとに実行
end

return update()

📤 Luaスクリプトのアップロード

Luaスクリプトのアップロード

ArduPilotは /APM/scripts/ ディレクトリにあるLuaスクリプトを自動で読み込みます(MAVFTPというプロトコルを使用)。

  1. 設定/調整 > MAVFTP に移動
  2. /APM/scripts/ ディレクトリを開く
  3. 右ペインを右クリック → Upload を選択し .lua ファイルをアップロード
  4. FCを再起動(USBを抜き差し)
  5. 再接続すると、フライト・データ タブで hello, world が毎秒表示されるはずです
  6. また、フライト・データ > メッセージ タブでもメッセージのログを確認できます

🧩 動作しない場合:

  • フライト・データ > メッセージ タブでログを確認。MAVFtpの初期化に失敗している場合、メモリ不足の可能性があります
  • フライト・データ > ステータス タブで freemem(空きメモリ)を確認してください。MAVFTPには約12KBの空きメモリが必要です
  • スクリプトに構文エラーがあると実行されません
  • エラーを修正 → 再アップロード → FC再起動 を行ってください

🔊 Luaスクリプト:ロール角に応じてブザーの音を変える

このスクリプトでは、機体の傾き(ロール角)に応じて、異なる音程のブザーを鳴らします。
センサはFCに内蔵されているため、外部センサや電源は不要です。

🎵 概要:

  • スクリプトは3秒ごとに実行されます
  • ahrs:get_roll() でロール角を取得
  • 傾きに応じて音階を選び、
  • notify:play_tune(tune) で音を再生

ロール角の確認

  • フライト・データ > クイック タブに進み、どれかの値をダブルクリックして roll を表示
  • ロール角は -180°〜180° の範囲をとり、正の値は右に傾いていることを意味します
  • ahrs:get_roll() メソッドの戻り値はラジアン単位なので、度数法(°)に変換する必要があります

ブザーの音再生

  • notify:play_tune(tune) は、音程を表す文字列を引数に取ります
  • 対応する音階の文字列は オンライン音階テスター で試聴可能
  • 例:C4音は "MFT120L8 04 C"

コード

local function update()
    local roll = ahrs:get_roll() * (180 / math.pi)  -- 度数に変換
    local abs_roll = math.abs(roll)                 -- 絶対値(左右の傾き区別なし)
    local note

    if abs_roll <= 30 then
        note = "04 C"
    elseif abs_roll <= 60 then
        note = "04 E"
    elseif abs_roll <= 90 then
        note = "04 G"
    else
        note = "05 C"
    end

    notify:play_tune(string.format("MFT120L8 %s", note))  -- 文字列にフォーマット
    gcs:send_text(4, string.format("Roll: %.1f°, Note: %s", roll, note))

    return update, 3000  -- 3秒ごとに実行
end

return update()

FCにこのスクリプトをアップロードして再起動すれば、3秒ごとにFCの傾きによって音程が変わるはずです。
また、フライト・データ > メッセージ タブでログが表示され、送ったメッセージも確認できます。

🎉 まとめ

この記事では、以下の内容を紹介しました:

  • ArduPilotファームウェアのFCハードウェアへの書き込み、およびGCS (MissionPlanner)による接続
  • 基本的なLuaスクリプトの記述とアップロード方法
  • センサ(ロール角)の取得方法
  • ドローン側のアクチュエータ(ブザー)への出力
  • 地上側のGCSのログメッセージへの出力

Luaスクリプトを使って、ドローンの動作を自由にカスタマイズするための第一歩として最適な内容です。

🧪 次のステップ

さらに応用したい方は、以下のアイデアにもトライしてみてください:

  • 💡 センサ入力に応じてLEDを点滅させる
  • 📉 振動が大きくなったら警告ログを出す
  • 🔁 vehicle:set_mode() を使って自動で飛行モードを変更
  • 🏠 特定の条件でReturn-to-Launch(自動帰還)をトリガー

Luaを活用することで、より柔軟でスマートな制御が可能になります。
今後もドローンやロボットの活用や自動化に役立つ技術情報を発信していきますので、ぜひチェックしてみてください!

▼ 転職を検討中の方、お気軽にご連絡ください!カジュアル面談から可能です。
ファーストループテクノロジー株式会社| 採用情報 コチラ

ファーストループテクノロジー株式会社(FLT)の採用情報です。エンジニア・デザイナー・プロダクトマネージャー、セールス、コーポレート等、未来を創る仲間を募集中です!
▼ 取材などメディア関係者の方は会社HPよりお問い合わせください
お問合せフォームは コチラ
▼ 当社のnoteもぜひご覧ください!
コチラ

ファーストループテクノロジー株式会社

Discussion