ドローンエンジニア養成塾第21期

Applicationコース DAY 2

2026.6.20(Sat)

Copyright © Drone Japan All Rights Reserved.

全体スケジュール

アプリケーションコースは積極的に、実際に手を動かし実践する、がモットーです!
※時間の都合上多少変更がある場合があります。

日程 内容
Day1 6月6日 キックオフ, コース説明
Day2 6月20日 機体制御アプリケーション開発ワークショップ, pymavlink, DroneKit-Python
Day3 7月4日 コンパニオンコンピュータ概要&構成, MAVLink, SITL接続, MAVProxy, MAVLink-router
Day4 7月18日 フライトエクスペリエンス, チューニング, オートミッション, PullRequest基礎
Day5 7月25日 開発におけるセキュリティ, 実践ワークショップ
Copyright © Drone Japan All Rights Reserved.

Day2 目標

  • シミュレータ(SITL)
    • アプリケーションのテスト方法を理解する
    • Pymavlink, DroneKit-Python
      • アプリケーションの開発方法を理解する
Copyright © Drone Japan All Rights Reserved.

全体のイメージ

center 全体イメージの図。Air(ドローン)側のFCとコンパニオンコンピュータ(Raspberry Pi。DroneKit・Python・MAVProxy)と、Ground(GCS)側のPC(Mission Planner)・モバイル(DroneKit)を、MAVLinkでつなぐ

Copyright © Drone Japan All Rights Reserved.

アプリケーション編のスコープ

center 実機構成の図。抽象度の高低の軸に沿って、Air(ドローン)側のCCソフトウェア(DroneKit・pymavlink・MAVProxy・MAVLink-router)とCCハードウェア、FCソフトウェア(ArduPilot)、ドローンのハードウェアと、MAVLinkで結ばれたGround側のGCSソフトウェア・ハードウェア(DroneKit、Mission Planner)を示す。アプリ編のスコープであるCC部分を赤い破線で囲む

Copyright © Drone Japan All Rights Reserved.

アプリケーション編のスコープ

center シミュレータ構成の図。実機構成のFCとドローンの部分をSITLに置き換え、Windows 11上のUbuntu22.04 on WSL2で動かす。GCS側はAndroid Studio+エミュレータとMission Planner。吹き出しで「開発ツール、シミュレータを活用して実機に近い環境でアプリケーションの開発・テストを行う」と示す

Copyright © Drone Japan All Rights Reserved.

アプリケーション編の構成要素

center アプリケーション編の構成要素の図と表。構成要素(コンパニオンコンピュータ・MAVLink・シミュレータ・MAVProxy・MAVLink-router・DroneKit-Python・pymavlink)の説明表で、本日のスコープであるシミュレータ・DroneKit-Python・pymavlink を赤枠で示す

Copyright © Drone Japan All Rights Reserved.
Copyright © Drone Japan All Rights Reserved.
SITLの構成図。sim_vehicle.py で起動するArduPilotファームウェアSITLが、物理シミュレーション(RealFlight・X-Plane・JSBSim・ArduPilot Native Physics Simulator)、ジョイスティック、グラフィカル表示、Ground Control Software(MAVProxy・QGC・Mission Planner)とつながる

ドローン開発におけるシミュレータとは?

  • 実機搭載前にコードや設定を安全にテストするためのもの
  • FDM(飛行力学モデル)で機体の動きを物理シミュレーション
  • SITL のモーター出力 → FDM が機体状態に変換 → SITLへ返す(センサーの代わり)
  • 操作は ジョイスティック/専用コントローラー/GCS(MAVProxy・Mission Planner) から入力

https://ardupilot.org/dev/docs/simulation-2.html

Copyright © Drone Japan All Rights Reserved.

SITLシミュレータの種類

項目 Mission Planner SITL
(MP SITL)
sim_vehicle.py SITL
(WSL SITL)
BlueOS SITL
概要 ビルド済みSITLをダウンロードして利用。インストール後すぐに試せる。起動オプションは少ない。 ArduPilotソースコードを取得し、自分でビルドして実行する開発者向け環境。
起動オプションが豊富。
BlueOSが提供するビルド済みイメージをpullして利用。BlueOS実機に近い構成で動作。
起動オプションは少ない。
目的 フライトプラン作成、パラメータ設定の検証 フライトコード開発・検証、
外部シミュレータとの連携
BlueOS Extensionの開発・検証
操作方法 GUI中心 コマンド中心
※GCS接続も可
Web UI中心 ※ GCS接続も可
Copyright © Drone Japan All Rights Reserved.
SITLのポート構成図。ArduCopter/ArduPlaneのデスクトップ実行ファイル(elf)が、Serial1 TCP 5760でGCS(Mission Planner or MAVProxy)、Serial3 TCP 5763でMAVProxy、UDP 5501〜5503で物理シミュレーション(sim_multicopter.py / JSBSim)とFlightGear、UDP 14550で他のGCSへ接続する

SITLの起動方法と構成

初期ホームポジションを指定するオプション(ここではフライトエクスペリエンス会場を指定)

  • Ubuntu を起動して下記コマンドを実行する
sim_vehicle.py -v ArduCopter --map --console -L Kawachi
  • 下記のように表示されていたら正常に起動している状況
    • 右の図:SITLが使うポート(接続可能なポート)の構成
    • 次のスライドのログ:機体の初期化が完了し、現在のフライトモードが STABILIZE であること

https://ardupilot.org/dev/docs/sitl-simulator-software-in-the-loop.html

Copyright © Drone Japan All Rights Reserved.

SITLの起動ログ(正常に起動している例)

BUILD SUMMARY
Build directory: /mnt/c/dev/drone-engineer/ardupilot/build/sitl
Target          Text     Data    BSS     Total
bin/arducopter  3522367  158237  168424  3849028
Build commands will be stored in build/sitl/compile_commands.json
'build' finished successfully (55.942s)
SIM_VEHICLE: Using defaults from (/mnt/c/dev/drone-engineer/ardupilot/Tools/autotest/default_params/copter.parm)
SIM_VEHICLE: Run ArduCopter
SIM_VEHICLE: "/mnt/c/dev/drone-engineer/ardupilot/Tools/autotest/run_in_terminal_window.sh" "ArduCopter" "/mnt/c/dev/drone-engineer/ardupilot/build/sitl/bin/arducopter" "-S" "--model" "+" "--speedup" "1" "--defaults" "/mnt/c/dev/drone-engineer/ardupilot/Tools/autotest/default_params/copter.parm" "-I0"
SIM_VEHICLE: Run MavProxy
SIM_VEHICLE: "mavproxy.py" "--map" "--console" "--out" "127.0.0.1:14550" "--out" "127.0.0.1:14551" "--master" "tcp:127.0.0.1:5760" "--sitl" "127.0.0.1:5501"
RiTW: Starting ArduCopter : /mnt/c/dev/drone-engineer/ardupilot/build/sitl/bin/arducopter -S --model + --speedup 1 --defaults /mnt/c/dev/drone-engineer/ardupilot/Tools/autotest/default_params/copter.parm -I0
RiTW: Window access not found, logging to /tmp/ArduCopter.log
Connect tcp:127.0.0.1:5760 source_system=255
Loaded module console
Unable to access the X Display, is $DISPLAY set properly?
ERROR in command ['load', 'map']: map not ready
Log Directory:
Telemetry log: mav.tlog
Waiting for heartbeat from tcp:127.0.0.1:5760
MAV> STABILIZE> Init Gyro**
AP: EKF3 IMU0 tilt alignment complete
AP: EKF3 IMU1 tilt alignment complete
fence present
AP: EKF3 IMU0 MAG0 initial yaw alignment complete
AP: EKF3 IMU1 MAG0 initial yaw alignment complete
AP: ArduCopter V4.1.0 (ea559a56)
AP: Frame: QUAD/PLUS
Received 1298 parameters (ftp)
Saved 1298 parameters to mav.parm
AP: GPS 1: detected as u-blox at 230400 baud
STABILIZE>

最後に STABILIZE> が表示され、フライトモード STABILIZE で待機していれば正常に起動している。

Copyright © Drone Japan All Rights Reserved.

SITLで単純なテイクオフ(MAVProxyコマンド)

mode guided
rc 3 1000
arm throttle
takeoff 10
  • mode guided:GUIDEDモードに変更
  • rc 3 1000:スロットルを最小に(アームの前提)
  • arm throttle:アーム
  • takeoff 10:高度10mまで離陸
Copyright © Drone Japan All Rights Reserved.

SITL起動オプション(1/2)

オプション 例 引数の意味 説明
-v -v Copter 機体種別 Copter / Rover / Plane / Sub を選択
-f -f vectored フレーム名 Boat、QuadPlane等のフレーム指定
--console --console なし MAVProxyコンソール表示
--map --map なし 地図表示
-w -w なし EEPROM初期化(パラメータリセット)
--no-rebuild --no-rebuild なし ビルドを省略して起動
--out --out=udp:127.0.0.1:14550 MAVLink送信先 Mission PlannerやBlueOSへ接続
Copyright © Drone Japan All Rights Reserved.

SITL起動オプション(2/2)

オプション 例 引数の意味 説明
-L -L CMAC 登録済み地点名 locations.txtの地点を利用
--custom-location --custom-location=35.879129,140.339683,0,0 緯度,経度,高度,方位 任意地点を指定
-I -I1 インスタンス番号 複数機シミュレーション
--aircraft --aircraft=lesson01 保存名 ログや設定を別フォルダ保存
--add-param-file --add-param-file=boat.parm parmファイル 起動時に追加パラメータ適用
-A -A "--serial5=uart:/tmp/ttyV0" SITLへ渡す引数 ArduPilot本体へ直接引数を渡す

https://ardupilot.org/dev/docs/using-sitl-for-ardupilot-testing.html

Copyright © Drone Japan All Rights Reserved.

SITL(=MAVProxy)コマンド(1/2)

コマンド 例 引数の意味 説明
status status なし 機体状態表示
arm throttle arm throttle throttle = モータ出力を許可 アーム
disarm disarm なし ディスアーム
mode mode auto auto = AUTOモード フライトモード変更
takeoff takeoff 10 10 = 目標高度(m) 指定高度まで離陸
rc rc 4 1500 4 = RCチャンネル番号、1500 = PWM値 RC入力を模擬
gps gps なし GPS状態確認
Copyright © Drone Japan All Rights Reserved.

SITL(=MAVProxy)コマンド(2/2)

コマンド 例 引数の意味 説明
param show param show RTL_ALT RTL_ALT = パラメータ名 パラメータ参照
param set param set RTL_ALT 1500 RTL_ALT = パラメータ名、1500 = 設定値(cm) パラメータ変更
wp list wp list なし ミッション一覧表示
wp load wp load mission.txt mission.txt = ミッションファイル名 ミッション読込
module load module load messagerate messagerate = モジュール名 MAVProxyモジュール読込
messagerate status messagerate status status = レート表示 MAVLink送信レート確認

https://ardupilot.org/mavproxy/

<単純なテイクオフコマンド>
mode guided
rc 3 1000
arm throttle
takeoff 10

Copyright © Drone Japan All Rights Reserved.
SITLの利用イメージ。Mission Plannerの飛行画面、VS Codeとターミナル、3Dシミュレータで表示されたマルチコプターが並ぶ

SITLとGazeboの連携

Copyright © Drone Japan All Rights Reserved.

その他の3Dシミュレータ

Copyright © Drone Japan All Rights Reserved.
  • Webブラウザで下記URLを開いておく
  • VS Codeを起動し、WSL2/Ubuntu22.04にリモート接続して、 「/home/ardupilot/GitHub」 を開いておく
    ※ 開発環境構築手順書 でセットアップしたもの
  • mavgen.pyを使ってMAVLink Pythonソースコードを生成して開いておく
$ cd /home/ardupilot/GitHub/pymavlink/mavlink
$ mkdir -p generated
$ mavgen.py --lang=Python --wire-protocol=1.0 --output=generated/output_py.py message_definitions/v1.0/common.xml
Copyright © Drone Japan All Rights Reserved.

開発準備:シミュレータ環境

center 開発準備「シミュレータ環境(Workshop実施環境)」の構成図。Windows10/11上のVS Code(Remote)とMission Plannerが、Ubuntu22.04 on WSL2上のアプリケーション・WSL SITL(sim_vehicle.py)・MAVProxy(自動起動、UDP 14550)にSSH・TCP・UDPで接続する。右に手順:1. VS Code起動してWSLに接続、2. WSLでSITLを起動、3. Mission Plannerを起動してSITLにUDP接続(自動接続される)

Copyright © Drone Japan All Rights Reserved.
VS Codeのエクスプローラー。dronekit_scripts・mp_scripts・pymavlink_scripts などのフォルダがあり、pymavlink_scripts には pm00_connect_heartbeat.py〜pm50_motion_basics.py などのサンプルが並ぶ
VS Codeのエクスプローラー。workshop フォルダの配下に各期(18th〜21st)のフォルダがあり、21st の中に受講者ごとのフォルダが並ぶ

開発準備:フォルダ・ブランチ構成

  • 各自のワークフォルダ(droneschool/workshop/<term_no>/<name>)で作業をしてください。
  • サンプルコードを修正する場合もワークフォルダに保存してください。
  • ワークブランチ(<term_no>_<name>)で作業をしてください。
Copyright © Drone Japan All Rights Reserved.
アプリ実行の画面。左にMission Plannerの飛行画面、右にVS Codeでpymavlinkのスクリプトを開いて実行した結果が表示されている

開発準備:アプリ実行方法

  • アプリケーション実行方法
    • Pythonソースコードを編集する
    • 右上の「▷」ボタンをクリックして実行する
    • VS Codeのターミナルに表示される実行結果、またMPやMAVProxyから機体の挙動を確認する
    • 事前・事後条件を整えるために適宜MPやMAVProxyで機体操作を行う
Copyright © Drone Japan All Rights Reserved.

開発準備:機体の操作(MP / MAVProxy)

  • MPで単純なテイクオフ&自動航行
    1. アクションタブを開き、Guidedを選択して「モードをセット」押下
    2. 「Arm/Disarm」押下
    3. マップ上で右クリック > 離陸 > 高度(m)を入力して「OK」押下
    4. マップ上で右クリック > 「ここまで飛行」押下
  • MAVProxyで単純なテイクオフコマンド
mode guided
rc 3 1000
arm throttle
takeoff 10
Copyright © Drone Japan All Rights Reserved.
VS Codeのコード補完。master.mav.command_long_send( を入力中に補完候補が表示されている
VS Codeの引数ヒント。master.mav.command_long_send( の第1引数 master.target_system などが表示されている

開発準備:AIツール活用

  • お好きなツールを使っていただいて良いです。
  • 授業では無料枠がある VS Codeに組み込まれている GitHub Copilot を使います
    • コード補完

コード補完の提案が出るので問題なければTabを押して承諾


受け入れたコードが反映され、次の提案が表示される


利用イメージ(YouTube): https://youtu.be/_ysofqHRmio

Copyright © Drone Japan All Rights Reserved.

開発準備:AIツール活用

  • チャット

  • 使用状況

    • 無料枠は上限があり、月毎でリセットされます

VS Codeのチャット画面。GLOBAL_POSITION_INT メッセージを受信できているかの質問に、コードを示しながら回答している

GitHub Copilotの使用状況メニュー。コード補完34.8%、チャットメッセージ2%、Inline Suggestions(すべてのファイル・Python)の設定が表示されている

Copyright © Drone Japan All Rights Reserved.
ドローンの黒背景のシルエット画像
Mission Plannerの画面。姿勢表示と地図上の飛行ルート、操作ボタン

Workshopカバー範囲

  • GCSでできる機体管理
  • ①機体への接続
  • ②機体の設定・調整
  • パラメータ設定、キャリブレーション、
  • PIDチューニング、スイッチ割当など)
  • ③機体の操作
    • モード変更、アーム、ディスアーム、
    • 離陸、着陸(Land)、帰還(RTL)、
    • ミッション開始(Auto)、機体制御(座標)
  • ④機体の情報表示
  • 位置、高度、速度、角度、方角、
  • バッテリー電圧、電波強度、GPS捕捉数
  • ⑤自動航行
  • ミッション作成、書込み、読込み

GCS=Ground Control Station(地上局ソフトウェア)

Copyright © Drone Japan All Rights Reserved.
Copyright © Drone Japan All Rights Reserved.
  • MAVLinkプロトコルのPython実装
  • センサーデータを読み取って機体にコマンド送信などの処理をPythonで実装できる
  • 他言語用のソースコードジェネレータ、フライトログ分析などのツールが含まれる
  • MAVProxy、DroneKit-Pythonの下位モジュールとして使われている
  • MAVLink v1/v2、Python 2/3系をサポート
  • Pythonなのでどこでも動く(Windows,Mac,Linux,ラズパイなど)
  • 現在も開発は活発なのでオススメ!
Copyright © Drone Japan All Rights Reserved.
MAVLinkのロゴ
  • Micro Air Vehicle Communication Protocol
  • ID空間は255
  • V1とV2がある
    • V2は署名(SHA256)に対応してセキュア
  • 様々な言語で利用できる 参考URL:https://mavlink.io/en/#supported_languages
    • ジェネレータがある
    • V2と署名の対応はまだ限定的

https://mavlink.io/en/
https://mavlink.io/en/messages/common.html
https://github.com/ardupilot/mavlink

Copyright © Drone Japan All Rights Reserved.

MAVLinkメッセージフロー

center MAVLinkの通信シーケンス図。コプター(System ID 1, Component ID 1)とMission Planner(System ID 255, Component ID 1)の間で、ハートビート#0(1Hz)、REQUEST_DATA_STREAM #66 / MESSAGE_INTERVAL #244(3.7以上)とデータ送信、COMMAND_LONG #76 とACKをやり取りする

Copyright © Drone Japan All Rights Reserved.

Pymavlinkインストール方法

  • 環境構築手順書の手順が完了していれば、インストールされているので追加作業は不要

  • pip/pip3コマンドでインストールする場合(下記のいずれか)

$ pip install pymavlink 
$ pip3 install pymavlink
  • ソースコードからインストールする場合
$ git clone https://github.com/ArduPilot/pymavlink.git
$ cd pymavlink
$ git clone https://github.com/ArduPilot/mavlink.git
$ pip3 install --user .
Copyright © Drone Japan All Rights Reserved.

主要なAPI・モジュール

  • mavuti:l::ユーティリティ群
    • mavlink_connection::機体に接続してmavfileのインスタンスを返す
    • mavfile:接続基底クラス
      • arducopter_arm::モーターをアームする
      • set_mode::フライトモードを設定する
      • recv_match::特定の名前/値を持つメッセージを取得
      • mav::MAVLinkインスタンス。メッセージ作成・送信ができる
        • command_long_send::コマンドメッセージ送信
        • command_long_encode::コマンドメッセージ作成
        • <message name>_send::予め準備されたメッセージ送信
        • <message name>_encode::予め準備されたメッセージ作成
  • mavwp::ウェイポイント、ジオフェンスの保存/ロード
  • mavparm::MAVLinkパラメータセットの保存/ロード
  • mavextra::値とメッセージを変換するための便利関数
Copyright © Drone Japan All Rights Reserved.

機体への接続オプション

汎用的に定義されている。FCとシリアル接続する際に大事なオプション

device 接続文字列
baud ボーレート
source_system 接続元システムID
source_component 接続元コンポーネントID
autoreconnect 自動再接続
force_connect 強制接続
def mavlink_connection(device, baud=115200, source_system=255, source_component=0,
                       planner_format=None, write=False, append=False,
                       robust_parsing=True, notimestamps=False, input=True,
                       dialect=None, autoreconnect=False, zero_time_base=False,
                       retries=3, use_native=default_native, force_connected=False,
                       progress_callback=None, udp_timeout=0, **opts):
Copyright © Drone Japan All Rights Reserved.

機体への接続オプション:システムIDとコンポーネントID

接続元が機体内部(例:コンパニオンコンピュータ)の場合は同システム内の異なるコンポーネントとして、機体外部(例:GCS)の場合は異なるシステムとして接続する。

種別 system_id component_id
Flight Controller 1 1
Companion Computer 1 90
GCS 255 190
Copyright © Drone Japan All Rights Reserved.

機体への接続・ハートビート

from pymavlink import mavutil
import time

# 機体への接続
master: mavutil.mavfile = mavutil.mavlink_connection(
    device="127.0.0.1:14551",
    source_system=1, source_component=90)
master.wait_heartbeat()

# ターゲットシステムID、コンポーネントIDを表示
print('target_system: {}, target_component: {}'
      .format(master.target_system, master.target_component))

# HEARTBEATメッセージを1秒おきに送信
while True:
    master.mav.heartbeat_send(
        mavutil.mavlink.MAV_TYPE_ONBOARD_CONTROLLER,
        mavutil.mavlink.MAV_AUTOPILOT_GENERIC,
        0, 0, 0)
    time.sleep(1)

Mission PlannerのMavlink Inspector。Vehicle 1 と Vehicle 255 が表示され、Comp 90 の HEARTBEAT(1.0 Hz, #0)の中身(autopilot・base_mode・custom_mode・system_status・type など)を展開している

①Mission Plannerを開いて、Ctrl+F→Mavlink Inspector で起動
②Pythonスクリプトを実行
→ Comp 90が追加され、指定したIDで通信が確立できていることを確認

https://mavlink.io/en/messages/common.html#HEARTBEAT

Copyright © Drone Japan All Rights Reserved.

メッセージ送受信の基本

# 機体への接続
master: mavutil.mavfile = mavutil.mavlink_connection(
    "127.0.0.1:14551", source_system=1, source_component=90)
master.wait_heartbeat()

# メッセージ受信
recieved_msg = master.recv_match(type='HEARTBEAT', blocking=True)
print(recieved_msg)

# メッセージ直接送信
master.mav.heartbeat_send(
    mavutil.mavlink.MAV_TYPE_ONBOARD_CONTROLLER,
    mavutil.mavlink.MAV_AUTOPILOT_GENERIC,
    0, 0, 0)

# メッセージ作成して送信
to_send_msg = master.mav.heartbeat_encode(
    mavutil.mavlink.MAV_TYPE_ONBOARD_CONTROLLER,
    mavutil.mavlink.MAV_AUTOPILOT_GENERIC,
    0, 0, 0)
print(to_send_msg)
master.mav.send(to_send_msg)

送受信を行いたいメッセージの名前が含まれる関数、定数を使用する

Copyright © Drone Japan All Rights Reserved.

HEARTBEAT(#0)メッセージの定義

Field Name Type Values
type uint8_t MAV_TYPE
autopilot uint8_t MAV_AUTOPILOT
base_mode uint8_t MAV_MODE_FLAG
custom_mode uint32_t
system_status uint8_t MAV_STATE
mavlink_version uint8_t_mavlink_version

https://mavlink.io/en/messages/common.html#HEARTBEAT

Copyright © Drone Japan All Rights Reserved.

接続後のメッセージフロー

center コンポーネントIDを指定した通信シーケンス図。コプター(System ID 1, Component ID 1)とMission Planner(System ID 255, Component ID 190)の間で、ハートビート#0(1Hz)、データストリーム要求とデータ送信、COMMAND_LONG #76 とACKをやり取りする

Copyright © Drone Japan All Rights Reserved.

データストリームの指定

データストリーム指定の仕方によって受信メッセージ種類と頻度が変わることを確認
※ TCP接続が必要

# 機体への接続は省略

# 全てを10Hzで受信
master.mav.request_data_stream_send(
  master.target_system,    
  master.target_component, 
  0, 10, 1)

# GLOBAL_POSITION_INT(33)を 10Hzで受信
master.mav.command_long_send(
  master.target_system,   
  master.target_component,
  mavutil.mavlink.MAV_CMD_SET_MESSAGE_INTERVAL,
  0, 33, 100000, 0, 0, 0, 0, 0)

# メッセージを取得
while True:
    print(master.recv_match().to_dict())
    time.sleep(0.01)
Copyright © Drone Japan All Rights Reserved.

データストリームの指定:受信ログ

# メッセージレート変更:絞りなし、10Hz
{'mavpackettype': 'RAW_IMU', 'time_usec': 714659022, 'xacc': 0, 'yacc': 0, 'zac…
{'mavpackettype': 'HEARTBEAT', 'type': 6, 'autopilot': 8, 'base_mode': 0, 'cust…
{'mavpackettype': 'ATTITUDE', 'time_boot_ms': 714761, 'roll': 0.001222115708515…
{'mavpackettype': 'GLOBAL_POSITION_INT', 'time_boot_ms': 714761, 'lat': 3587912…
{'mavpackettype': 'SYS_STATUS', 'onboard_control_sensors_present': 1467087919, …
{'mavpackettype': 'POWER_STATUS', 'Vcc': 5000, 'Vservo': 0, 'flags': 0}
{'mavpackettype': 'MEMINFO', 'brkval': 0, 'freemem': 65535, 'freemem32': 131072…
{'mavpackettype': 'NAV_CONTROLLER_OUTPUT', 'nav_roll': 8.18658882053569e-05, 'n…
{'mavpackettype': 'MISSION_CURRENT', 'seq': 0, 'total': 0, 'mission_state': 1, …
{'mavpackettype': 'VFR_HUD', 'airspeed': 0.023730413988232613, 'groundspeed': 0…
# メッセージレート変更:GLOBAL_POSITION_INT(33)に絞って 10Hz
{'mavpackettype': 'GLOBAL_POSITION_INT', 'time_boot_ms': 934988, 'lat': 3587912…
{'mavpackettype': 'COMMAND_ACK', 'command': 511, 'progress': 0, 'result': 0, 'r…
{'mavpackettype': 'GLOBAL_POSITION_INT', 'time_boot_ms': 935088, 'lat': 3587912…
{'mavpackettype': 'GLOBAL_POSITION_INT', 'time_boot_ms': 935188, 'lat': 3587912…
{'mavpackettype': 'GLOBAL_POSITION_INT', 'time_boot_ms': 935289, 'lat': 3587912…
{'mavpackettype': 'HEARTBEAT', 'type': 6, 'autopilot': 8, 'base_mode': 0, 'cust…
{'mavpackettype': 'GLOBAL_POSITION_INT', 'time_boot_ms': 935588, 'lat': 3587912…

https://www.ardusub.com/developers/pymavlink.html#run-pymavlink-on-the-surface-computer

Copyright © Drone Japan All Rights Reserved.
Copyright © Drone Japan All Rights Reserved.

ARM/DISARM

pm01_message_dump.py

# 機体への接続は省略
# ARM
master.arducopter_arm()
master.motors_armed_wait()
print("ARMED")

time.sleep(10)

# DISARM
master.arducopter_disarm()
master.motors_disarmed_wait()
print("DISARMED")

https://mavlink.io/en/messages/common.html#MAV_CMD_COMPONENT_ARM_DISARM
https://www.ardusub.com/developers/pymavlink.html#armdisarm-the-vehicle

Copyright © Drone Japan All Rights Reserved.

フライトモード変更

# 機体への接続は省略

# 変更後モード
mode = 'LOITER’

# モードが有効かをチェック
if mode not in master.mode_mapping():
    print('Unknown mode : {}'.format(mode))
    print('Try:', list(master.mode_mapping().keys()))
    sys.exit(1)

# モードIDを取得
mode_id = master.mode_mapping()[mode]

https://mavlink.io/en/messages/common.html#MAV_CMD_DO_SET_MODE
https://www.ardusub.com/developers/pymavlink.html#change-flight-mode

Copyright © Drone Japan All Rights Reserved.

フライトモード変更(続き)

# モード変更リクエストを送信
master.mav.command_long_send(
    master.target_system, master.target_component,
    mavutil.mavlink.MAV_CMD_DO_SET_MODE, 0, 
    mavutil.mavlink.MAV_MODE_FLAG_CUSTOM_MODE_ENABLED, 
    mode_id, 0, 0, 0, 0, 0)
# master.set_mode(mode_id) # モードID指定を使ってもOK
# master.set_mode_loiter() # LOITER専用を使ってもOK

# モード変更の確認を行う
while True:
    if master.flightmode == mode:
        break
    master.recv_msg() 

print("変更後モード:", master.flightmode)

https://mavlink.io/en/messages/common.html#MAV_CMD_DO_SET_MODE
https://www.ardusub.com/developers/pymavlink.html#change-flight-mode

Copyright © Drone Japan All Rights Reserved.

テイクオフ

Copyright © Drone Japan All Rights Reserved.

テイクオフ処理手順

  • アーミングできるかチェック
  • フライトモードを「GUIDED」に設定
  • アーミング実行
  • アーミングが完了するまで待つ
  • テイクオフ実行
  • 目標高度に達するまで待つ
Copyright © Drone Japan All Rights Reserved.

テイクオフ コード

# 機体への接続は省略
# GUIDEDモード(4)に設定
master.set_mode(4)

# アーム
master.arducopter_arm()
master.motors_armed_wait()

# 目標高度
target_altitude = 3

# 離陸
master.mav.command_long_send(
    master.target_system, master.target_component,
    mavutil.mavlink.MAV_CMD_NAV_TAKEOFF,
    0, 0, 0, 0, 0, 0, 0, target_altitude)

https://mavlink.io/en/messages/common.html#MAV_CMD_NAV_TAKEOFF

Copyright © Drone Japan All Rights Reserved.

テイクオフ コード(続き)

# データストリームレート変更: GLOBAL_POSITION_INT(33)を10Hzで受信
master.mav.command_long_send(master.target_system, master.target_component,
    mavutil.mavlink.MAV_CMD_SET_MESSAGE_INTERVAL, 0, 33, 100000, 0, 0, 0, 0, 0)

# 目標高度への到達を確認
while True:
    # GLOBAL_POSITION_INT から相対高度を取得
    recieved_msg = master.recv_match(type='GLOBAL_POSITION_INT', blocking=True)
    current_altitude = recieved_msg.relative_alt / 1000
    print("高度: {}".format(current_altitude))

    if current_altitude >= target_altitude  0.95:
        print("目標高度に到達")
        break

    time.sleep(0.1)

https://mavlink.io/en/messages/common.html#GLOBAL_POSITION_INT

Copyright © Drone Japan All Rights Reserved.

機体のパラメータ

Copyright © Drone Japan All Rights Reserved.

機体の全パラメータ読み込み

# 機体への接続は省略
# 全パラメータ取得を要求
master.mav.param_request_list_send(
    master.target_system, master.target_component
)
while True:
    time.sleep(0.01)
    try:
        message = master.recv_match(type='PARAM_VALUE', blocking=True).to_dict()
        print('name: %s\tvalue: %d' % (message['param_id'],
                                       message['param_value']))
    except Exception as error:
        print(error)
        sys.exit(0)

https://www.ardusub.com/developers/pymavlink.html#read-all-parameters
https://mavlink.io/en/services/parameter.html

Copyright © Drone Japan All Rights Reserved.

ホームロケーション

Copyright © Drone Japan All Rights Reserved.

ホームロケーション

  • ホームロケーションを取得するにはHOME_POSITION#242 メッセージを受信する
  • HOME_POSITIONメッセージはアームのタイミングで受信できる
  • ホームロケーションはRTLの帰還先として利用される

https://mavlink.io/en/messages/common.html#HOME_POSITION

Copyright © Drone Japan All Rights Reserved.

ホームロケーション取得

# 機体への接続は省略

while True:
  # HOME_POSITIONメッセージを受信, アームのタイミングで受信できる
  msg = master.recv_match(type='HOME_POSITION', blocking=True)
  if msg is not None:
    # ホームロケーション情報を設定
    home_latitude = msg.latitude / 1.0e7
    home_longitude = msg.longitude / 1.0e7
    home_altitude = msg.altitude / 1000.0  # メートル単位に変換
    print(f"ホームロケーション:lat={home_latitude},lon={home_longitude},alt={home_altitude}")
        break  # ホームロケーションを取得したら終了

https://mavlink.io/en/messages/common.html#HOME_POSITION

Copyright © Drone Japan All Rights Reserved.

機体制御

Copyright © Drone Japan All Rights Reserved.

機体制御

  • 座標指定
    • 目標の緯度・経度を指定する
    • 速度を指定できる
  • 姿勢・位置制御
    • 姿勢制御
    • 位置(スピード)制御
Copyright © Drone Japan All Rights Reserved.

座標指定

  • SET_POSITION_TARGET_GLOBAL_INTメッセージを利用する。引数に移動先の緯度・経度・高度を渡す
  • 移動先の緯度・経度が分かっている場合には利用し易い
  • 実行後に他のコマンドの割り込みを受け付ける
  • 目標地点に到達したことを通知する処理がないため、現在地と目標地点の緯度・経度から距離を算出し到達を判定する
Copyright © Drone Japan All Rights Reserved.

座標指定 コード

# 機体への接続は省略
# GUIDEDモード(4)に設定
master.set_mode(4)

# 目標の緯度・経度、高度を設定
target_lat = 35.8787276
target_lon = 140.3388137
target_alt = 3

# SET_POSITION_TARGET_GLOBAL_INTメッセージを送信
master.mav.set_position_target_global_int_send(
    0, master.target_system, master.target_component,
    mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT_INT, # グローバル座標、相対高度
    0b0000111111111000, # X,Y,Zの位置・速度・加速度は使用、YAWの角度・角速度は未使用
    int(target_lat  1e7), int(target_lon  1e7), # 緯度・経度は10の7乗倍して整数化
    target_alt, 0, 0, 0, 0, 0, 0, 0, 0, 0
)

https://mavlink.io/en/messages/common.html#SET_POSITION_TARGET_GLOBAL_INT

Copyright © Drone Japan All Rights Reserved.

姿勢・位置制御

  • 細かく制御すればスムーズに移動できる
  • ターゲットを追従する際に使うと便利
  • 使用するコマンド
  • SET_ATTITUDE_TARGET#82
  • SET_POSITION_TARGET_LOCAL_NED#84
  • SET_POSITION_TARGET_GLOBAL_INT#86
Copyright © Drone Japan All Rights Reserved.

姿勢制御 コード

# 機体への接続は省略
# MAVLinkメッセージ生成
msg = master.mav.set_attitude_target_encode(
    0,       # ブートからの時間(今回は未使用)
    master.target_system, master.target_component, 
    0b00000111,  # マスク
    to_quaternion(20, -20, 0),  # クオータニオン角度(ロール,ピッチ,ヨー角度)
    0, 0, math.radians(0),  # ロール,ピッチ,ヨーレート
    0.5  # スラスト
)

# MAVLinkメッセージ送信
for x in range(0, 100):
    master.mav.send(msg)
    time.sleep(0.05)

to_quaternion関数は下記参考URLを参照
https://github.com/dronekit/dronekit-python/blob/master/examples/set_attitude_target/set_attitude_target.py#L87-L156

https://mavlink.io/en/messages/common.html#SET_ATTITUDE_TARGET

Copyright © Drone Japan All Rights Reserved.

姿勢制御 マスクの使い方

ビット位置 対応フィールド 意味
0 ロール角度(roll) 0: 制御, 1: 無視
1 ピッチ角度(pitch) 0: 制御, 1: 無視
2 ヨー角度(yaw) 0: 制御, 1: 無視
3 応答角速度制御 0: 制御, 1: 無視
4 ロール軸角速度(roll rate) 0: 制御, 1: 無視
5 ピッチ軸角速度(pitch rate) 0: 制御, 1: 無視
6 ヨー軸角速度(yaw rate) 0: 制御, 1: 無視
7 スロットル値(thrust) 0: 制御, 1: 無視

https://mavlink.io/en/messages/common.html#ATTITUDE_TARGET_TYPEMASK

Copyright © Drone Japan All Rights Reserved.

位置(スピード)制御 コード

# 機体への接続は省略
# MAVLinkメッセージ作成
msg = master.mav.set_position_target_local_ned_encode(
    0,          # ブートからの時間(今回は未使用)
    0, 0,       # ターゲットシステム、コンポーネント
    mavutil.mavlink.MAV_FRAME_LOCAL_NED,    # フレーム
    0b0000111111000111,  # タイプマスク 0:有効, 1:無効
    0, 0, 0,    # x, y, z位置(今回は未使用)
    2, -2, 1,   # x, y, z速度m/s
    0, 0, 0,    # x, y, z加速度(今回は未使用)
    0, 0)       # ヨー, ヨーレート

# MAVLinkメッセージ送信
for x in range(0, 20):
    master.mav.send(msg)
    time.sleep(0.1)

https://mavlink.io/en/messages/common.html#MAV_FRAME_BODY_NED

Copyright © Drone Japan All Rights Reserved.

コード 解説

    0b0000111111000111,                  # タイプマスク
    0, 0, 0,                             # x、y、z位置
    velocity_x, velocity_y, velocity_z,  # 速度 m/s
    0, 0, 0,                             # x、y、z加速度(未サポート)
    0, 0)                                # ヨー、ヨーレート
  • タイプマスク
    • 0:有効
    • 1:無効
    • ignoreフラグため順序は逆になる
  • ターゲットシステムを「0」にすると自動的に正しい値が設定される
  • コンポーネントは未サポート

https://github.com/ArduPilot/mavlink/blob/master/message_definitions/v1.0/common.xml#L2850-L2906

Copyright © Drone Japan All Rights Reserved.

NED 解説

  • NED:North East Down
  • フレーム(MAV_FRAME_)
    • フレームの種類によってx、y、z速度に指定した値の影響が変わる
    • MAV_FRAME_LOCAL_:ホームポジションを基準
    • MAV_FRAME_BODY_:機体の向きを基準
    • MAV_FRAME_GLOBAL_:WGS84を基準
  • 速度と方向の関係(FRAME_BODYの場合Xが機体前方方向)
    • X>0:北に移動
    • X<0:南に移動
    • Y>0:東に移動
    • Y<0:西に移動
    • Z<0:上昇
    • Z>0:下降

http://ardupilot.org/dev/docs/copter-commands-in-guided-mode.html#copter-commands-in-guided-mode-set-position-target-local-ned

Copyright © Drone Japan All Rights Reserved.

コマンド送信

  • MAVLinkのコマンドメッセージを送ることができる
  • 「master.mav.command_long_encode」関数を利用し送信する
  • MAV_CMD_DO_SET_SERVO、DO_CMD_DO_SET_ROI、MAV_CMD_DO_PARACHUTEなどのコマンド実行が可能

https://mavlink.io/en/messages/common.html#COMMAND_LONG

Copyright © Drone Japan All Rights Reserved.

コマンド送信 コード

# 機体への接続は省略
# ヨー制御コマンドメッセージを生成する場合
msg = master.mav.command_long_encode(
    master.target_system, master.target_component, # ターゲットシステム、コンポーネント
    mavutil.mavlink.MAV_CMD_CONDITION_YAW,  # コマンド
    0,
    180,    # 角度指定(degrees)
    0,      # スピード指定(deg/s)
    1,      # 方向 -1:反時計周り, 1:時計回り
    1,      # オフセット 1:相対, 0:絶対
    0, 0, 0)

master.wait_heartbeat()
# MAVLinkメッセージ送信
master.mav.send(msg)

https://mavlink.io/en/messages/common.html#COMMAND_LONG

https://ardupilot.org/copter/docs/common-mavlink-mission-command-messages-mav_cmd.html#mav-cmd-condition-yaw

Copyright © Drone Japan All Rights Reserved.

自動航行

Copyright © Drone Japan All Rights Reserved.

自動航行関連でできること

  • 機体からのミッションダウンロード
  • 機体へのミッションアップロード
  • ウェイポイント数の取得
  • 現在実行中のミッションの取得
  • 実行するミッションの指定
Copyright © Drone Japan All Rights Reserved.

ミッションのダウンロード

def download_mission(master):
    mission = []

    # ミッションアイテムの数を取得
    master.mav.mission_request_list_send(master.target_system, master.target_component)
    mission_count = master.recv_match(type='MISSION_COUNT', blocking=True).count

    # ミッションアイテムをダウンロード
    for i in range(mission_count):
        master.mav.mission_request_int_send(master.target_system, master.target_component, i)
        item = master.recv_match(type='MISSION_ITEM_INT', blocking=True)
        new_waypoint = mavutil.mavlink.MAVLink_mission_item_int_message(
            master.target_system,
            master.target_component,
            item.seq,
            item.frame, item.command, item.current, item.autocontinue,
            item.param1, item.param2, item.param3, item.param4,
            item.x, item.y, item.z,
        )
        mission.append(new_waypoint)

    return mission

https://mavlink.io/en/messages/common.html#MISSION_REQUEST_LIST
https://mavlink.io/en/messages/common.html#MISSION_COUNT
https://mavlink.io/en/messages/common.html#MISSION_REQUEST_INT
https://mavlink.io/en/messages/common.html#MISSION_ITEM_INT

Copyright © Drone Japan All Rights Reserved.

ミッションにウェイポイント追加

def add_waypoint(mission, lat, lon, alt):
    # 新しいウェイポイントを追加
    if mission:
        new_waypoint = mavutil.mavlink.MAVLink_mission_item_int_message(
            mission[0].target_system,
            mission[0].target_component,
            len(mission),
            mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT,
            mavutil.mavlink.MAV_CMD_NAV_WAYPOINT,
            0, 0, 0, 0, 0, 0,
            int(lat  1e7),
            int(lon  1e7),
            int(alt)
        )
        mission.append(new_waypoint)
    else:
        print("ミッションが空です。他のウェイポイントを追加する前に、初期のウェイポイントを追加してください。")

https://mavlink.io/en/messages/common.html#MAV_FRAME_GLOBAL_RELATIVE_ALT
https://mavlink.io/en/messages/common.html#MAV_CMD_NAV_WAYPOINT

Copyright © Drone Japan All Rights Reserved.

ミッションのアップロード

def upload_mission(master, mission):
    # ミッションをアップロード
    master.mav.mission_clear_all_send(
        master.target_system, master.target_component)
    master.mav.mission_count_send(
        master.target_system, master.target_component, len(mission))
    for i, item in enumerate(mission):
        master.mav.send(item)

    # アップロードしたミッションを機体に設定
    master.mav.mission_set_current_send(0, master.target_component, 0)
    master.mav.mission_request_list_send(
        master.target_system, master.target_component)

https://mavlink.io/en/messages/common.html#MISSION_CLEAR_ALL
https://mavlink.io/en/messages/common.html#MISSION_COUNT
https://mavlink.io/en/messages/common.html#MISSION_SET_CURRENT https://mavlink.io/en/messages/common.html#MISSION_REQUEST_LIST

Copyright © Drone Japan All Rights Reserved.

ミッションのアップロード

def upload_mission(master, mission):
    # ミッションをアップロード
    master.mav.mission_clear_all_send(
        master.target_system, master.target_component)
    master.mav.mission_count_send(
        master.target_system, master.target_component, len(mission))
    for i, item in enumerate(mission):
        master.mav.send(item)

    # アップロードしたミッションを機体に設定
    master.mav.mission_set_current_send(0, master.target_component, 0)
    master.mav.mission_request_list_send(
        master.target_system, master.target_component)

https://mavlink.io/en/messages/common.html#MISSION_CLEAR_ALL
https://mavlink.io/en/messages/common.html#MISSION_COUNT
https://mavlink.io/en/messages/common.html#MISSION_SET_CURRENT https://mavlink.io/en/messages/common.html#MISSION_REQUEST_LIST

Copyright © Drone Japan All Rights Reserved.

ミッションの実行

# 接続
master = mavutil.mavlink_connection(
    "127.0.0.1:14551", source_system=1, source_component=90)

# AUTOモードに変更
master.set_mode_apm(master.mode_mapping()['AUTO'])
  • プロポにてフライトモードを「AUTO」に切り替えるのと同様の操作
  • 別のモードに切り替えることでミッションを停止することができる
  • 停止後、ミッションを再開するかどうかは「MIS_RESTART」パラメーターで設定可能(0:続きから再開、1:最初からリスタート)

https://dronekit.netlify.app/guide/auto_mode.html

Copyright © Drone Japan All Rights Reserved.
Copyright © Drone Japan All Rights Reserved.
Copyright © Drone Japan All Rights Reserved.

全体イメージ再掲

center 全体イメージの図。Air側のFC・コンパニオンコンピュータ(DroneKit・Python・MAVProxy)と、Ground側のMission Planner(PC・モバイル、DroneKit Python・Java)をMAVLinkでつなぐ

Copyright © Drone Japan All Rights Reserved.
ドローンと送信機の写真。タブレットが取り付けられた送信機と、カメラを搭載したクアッドコプター

DroneKitとは?

3DR SOLO

Copyright © Drone Japan All Rights Reserved.

DroneKit-Pythonとは?

  • コンパニオンコンピューター、PCで動作するアプリをPythonを使って開発できる
  • Linux、Mac OS X、Windowsで動作可能
  • MAVLinkを使ってフライトコントローラーと通信を行う
  • 機体のステータス、パラメーター情報、ミッションの実行が可能
  • Apache v2ライセンス

https://github.com/dronekit/dronekit-python

Copyright © Drone Japan All Rights Reserved.

DroneKit-Python 更新状況

  • リリース最終バージョン
    • version:2.9.2, リリース日:2019/03/18
    • https://pypi.org/project/dronekit
    • GitHubのmasterブランチでは修正が進んでいる(最終更新日:2024/5/20)
    • PyPIにリリースされていない修正を反映させるためにはソースコードからインストールが必要
  • Python 2系/3系
Copyright © Drone Japan All Rights Reserved.

DroneKit-Python ソース

center DroneKit-PythonのGitHubリポジトリのStar数・Fork数が、2021年11月から2024年5月にかけて増加している様子を並べたスクリーンショット集

Copyright © Drone Japan All Rights Reserved.

APIの機能

  • 機体への接続(複数可能)
  • 機体のステート取得・設定
  • 機体のパラメーター取得・設定
  • ステート・パラメーター変更通知を非同期受信
  • 機体の飛行(GUIDEDモード)
  • 任意のメッセージを追加し、機体やその他ハードウェアの制御が可能(GUIDEDモード)
  • 自動航行用のウェイポイント生成
  • RCチャンネルの上書き
Copyright © Drone Japan All Rights Reserved.

DroneKit-Python インストール

  • 環境構築手順書の手順が完了していれば、インストールされているので追加作業は不要

  • pipコマンドをインストール
    sudo apt-get install python-pip python-dev

  • pipコマンドでDroneKitをインストール
    pip install dronekit

Copyright © Drone Japan All Rights Reserved.

機体への接続

Copyright © Drone Japan All Rights Reserved.

機体への接続

  • connect()関数で接続する
  • 接続が完了すると機体オブジェクトが返却される
    • 第1引数:接続文字列
    • wait_ready:パラメーター取得などが完了するまで待つかどうか
    • timeout:タイムアウト時間
  • connect関数を複数利用し、同時に複数の機体に接続できる
  • Pymavlink同様にsource_system/source_componentあり
from dronekit import connect

vehicle = connect(‘127.0.0.1:14551', wait_ready=True, timeout=60)

※↓パラメータなど必要なければFalse

https://dronekit.netlify.app/guide/connecting_vehicle.html

Copyright © Drone Japan All Rights Reserved.

connect接続文字列の種類

接続の種類 接続文字列
LinuxでのUSB接続 /dev/ttyUSB0
Linuxでのシリアル接続 /dev/ttyS0 (または /dev/ttyAMA0)
(ボーレートも設定する:baud=57600)
SITLへのUDP接続 127.0.0.1:14550
SITLへのTCP接続 tcp:127.0.0.1:5760
OSXでのUSB接続 /dev/cu.usbmodem1
WindowsでのUSB接続 com14
Windowsでのテレメトリー接続 com14
(ボーレートも設定する:baud=57600)
WSLからCOMポート接続 /dev/ttyS4
※数字はCOM番号と同じ

接続文字列は、MAVProxyの接続文字列と同じ仕様

https://dronekit.netlify.app/guide/connecting_vehicle.html

Copyright © Drone Japan All Rights Reserved.

機体の属性情報

Copyright © Drone Japan All Rights Reserved.

機体情報:Vehicleクラス

  • connectにて取得した機体オブジェクトVehicleを利用し、機体情報、パラーメーターの取得が可能
  • 機体の属性は基本的に読み取り専用。以下は書き込みも可能。
    home_location、gimbal、airspeed、groundspeed、mode、armed

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

属性書き込み

  • 機体オブジェクトの属性に直接値を設定する
# GUIDEDモード変更
vehicle.mode = VehicleMode(“GUIDED”)

# アーム
vehicle.armed = True

# グラウンドスピードを3.2m/sに設定
vehicle.groundspeed = 3.2

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

追加された便利関数

  • 値変更が成功するかどうかは保証されないため、変更されたかをチェックする必要がある。
# GUIDEDモードを設定
vehicle.mode = VehicleMode("GUIDED")
vehicle.wait_for_mode("GUIDED")

# アーミング
vehicle.armed = True
vehicle.arm()

# モードがGUIDEDになり、アーミングされるまで待つ
while not vehicle.mode.name == 'GUIDED' and not vehicle.armed:
	time.sleep(1)

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

テイクオフ

Copyright © Drone Japan All Rights Reserved.

テイクオフ処理手順

  • アーミングできるかチェック
  • フライトモードを「GUIDED」に設定
  • アーミング実行
  • アーミングが完了するまで待つ
  • テイクオフ実行
  • 目標高度に達するまで待つ

https://dronekit.netlify.app/guide/taking_off.html

Copyright © Drone Japan All Rights Reserved.

テイクオフコード

#離陸
try:
    vehicle.wait_for_armable()
    vehicle.wait_for_mode("GUIDED")
    vehicle.arm()
    time.sleep(1)
    vehicle.wait_simple_takeoff(100, timeout=20)
    # vehicle.wait_simple_takeoff(20,0.5,15) # 高さ誤差も指定する場合
 
except TimeoutError as takeoffError:
    print("Takeoff is timeout!!!")
    # フェールセーフコード

https://github.com/dronekit/dronekit-python/blob/master/CHANGELOG.md

Copyright © Drone Japan All Rights Reserved.

便利関数一覧

wait_for, ※汎用的、他の関数のベース
wait_for_armable,
arm,
disarm,
wait_for_mode,
wait_for_alt,
wait_simple_takeoff

https://github.com/dronekit/dronekit-python/blob/master/CHANGELOG.md

Copyright © Drone Japan All Rights Reserved.

属性変更通知 リスナー1

  • Listenerを利用し属性が変更された際に通知を受け取る
  • 通知を受けた際に実行するコールバック関数を定義する
  • コールバック関数の引数
    • self:Vehicleオブジェクト
    • attr_name:属性名(ワイルドカード「」も指定可能)
    • value:変更された値

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

属性変更通知 リスナー2

#コールバック関数、通知された値を表示する
def location_callback(self, attr_name, value):
	print("Location (Global): ", value)

#コールバック関数「location_callback」を「global_frame」変更通知用に登録する
vehicle.add_attribute_listener('location.global_frame', location_callback)

#コールバック関数が解除されるまでの10秒間「Location (Global):」が表示される
time.sleep(10)

#登録したコールバック関数を解除する
vehicle.remove_attribute_listener('location.global_frame', location_callback)

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

属性変更通知 デコレーター1

  • Pythonのデコレーター関数を利用する
    @vehicle.on_attribute('attr_name')

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

属性変更通知 デコレーター2

# vehicle.location.global_frameの変更通知を受け取る
@vehicle.on_attribute('location.global_frame')
def location_callback(self, attr_name, value):
    print("Location (Global):", value)

# 10秒間「Location (Global):」が表示される
time.sleep(10)

# 解除する方法はないのでCtrl+C で終了

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

リスナー vs デコレーター

  • 何が違う?
    • どちらも通知を受けますが、任意に停止できるか否かが違う。リスナーは停止できる。
  • どっちを使えばいいの?
    • 一時的にデータ通知が必要:リスナー
    • ずっとデータ通知が必要:デコレーター
    • 例)HEARTBEAT、STATUSTEXTなど

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

機体のパラメーター

Copyright © Drone Japan All Rights Reserved.

パラメーター

  • 機体と接続した際にvehicleオブジェクトのparametersに保持される
  • 読み書き可能
  • オブザーバーでの変更通知が可能
  • 機体からのメッセージを監視し、最新の状態が反映される
  • コプターで使用可能なパラメーターは下記を参照
  • https://ardupilot.org/copter/docs/parameters.html

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

パラメーター 読み書き

#パラメーターの参照
#print文で「Param:」を表示
print("Param: %s" % vehicle.parameters['RTL_ALT'])

#パラメーター更新
#RTL高度を100cmに設定
vehicle.parameters['RTL_ALT'] = 100

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

パラメーター 全表示

  • Parametersのイテレーターを利用し、順にパラメーターを参照する
#パラメーターの参照
#イテレーターにて順print文で「Key: Value」を表示
for key, value in vehicle.parameters.items():
	print("Key: %s Value:%s" % (key,  value))

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

パラメーター 変更通知 リスナー1

  • 機体の属性と同様にリスナーを利用する
  • Listenerに変更の通知を受けとるパラメーター名、コールバック関数を登録する
  • コールバック関数の引数
    • self:Parametersオブジェクト
    • attr_name:パラメーター名(ワイルドカード「」も指定可能)
    • value:パラメーター値

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

パラメーター 変更通知 リスナー2

#コールバック関数
def RTL_ALT_parameter_callback(self, attr_name, value):
	print("RTL_ALT:  %s" % value)

#コールバック関数「RTL_ALT_parameter_callback」を「RTL_ALT」変更通知用に登録する
vehicle.parameters.add_attribute_listener('RTL_ALT', RTL_ALT_parameter_callback)

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

パラメーター 変更通知 デコレーター1

  • Pythonのデコレーター関数を利用する
    @vehicle.parameters.on_attribute('param_name')
  • コールバック関数の引数
    • self:Parametersオブジェクト
    • attr_name:パラメーター名(ワイルドカード「」も指定可能)
    • value:パラメーター値

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

パラメーター 変更通知 デコレーター2

#RTL_ALTが変更された際に通知を受け取る
#デコレーターの設定
@vehicle.parameters.on_attribute('RTL_ALT')
def decorated_RTL_ALT_callback(self, attr_name, value):
	print("PARAMETER CALLBACK: %s changed to %s" % (attr_name, value))

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

ホームロケーション

Copyright © Drone Japan All Rights Reserved.

ホームロケーション

  • GPSの位置情報が取得できた際に設定される
  • RTLのローンチ場所として利用される
  • ホームロケーションを取得するにはcommandsをダウンロードする
    • home_locationはListen可能
  • ダウンロードする場合、完了後にvehicle.home_locationに設定される
    ※commandsダウンロード前はNoneになる

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

ホームロケーション取得

#vehicle.home_locationに値がセットされるまで
#dowloadを繰り返し実行する
while not vehicle.home_location:
	cmds = vehicle.commands
	cmds.download()
	cmds.wait_ready()

	if not vehicle.home_location:
		print("Waiting for home location …")

#ホームロケーションの取得完了
print("Home location: %s " % vehicle.home_location)

https://dronekit.netlify.app/guide/vehicle_state_and_parameters.html

Copyright © Drone Japan All Rights Reserved.

機体制御

Copyright © Drone Japan All Rights Reserved.

機体制御

  • 座標指定
    • 目標の緯度・経度を指定する
    • 速度を指定できる
  • 位置姿勢制御(MAVLinkコマンドで制御)
    • 姿勢制御
    • 位置(スピード)制御

https://dronekit.netlify.app/guide/copter/guided_mode.html

Copyright © Drone Japan All Rights Reserved.

座標指定

  • simple_goto関数を利用する。引数に移動先の緯度・経度を渡す
  • 移動先の緯度・経度が分かっている場合には利用し易い
  • 実行後に他のコマンドの割り込みを受け付ける
  • 目標地点に到達したことを通知する処理がないため、現在地と目標地点の緯度・経度から距離を算出し到達を判定する

https://dronekit.netlify.app/guide/copter/guided_mode.html

Copyright © Drone Japan All Rights Reserved.

座標指定 コード

#モードはGUIDED
vehicle.mode = VehicleMode("GUIDED")
#目標の緯度・経度、高度を設定する
aLocation = LocationGlobalRelative(-34.364114, 149.166022, 20)
#simple_gotoを実行する
vehicle.simple_goto(aLocation)
time.sleep(100)
  • 速度の指定が可能
    • Air speedを利用する:vehicle.airspeed
    • Ground speedを利用する:vehice.groundspeed
    • simple_goto関数の引数に指定する:
      simple_goto(aLocaion, groundspeed=10)

https://dronekit.netlify.app/guide/copter/guided_mode.html

Copyright © Drone Japan All Rights Reserved.

制御移動

  • 細かく制御すればスムーズに移動できる
  • ターゲットを追従する際に使うと便利
  • 使用するコマンド
  • SET_ATTITUDE_TARGET#82
  • SET_POSITION_TARGET_LOCAL_NED#84
  • SET_POSITION_TARGET_GLOBAL_INT#86
Copyright © Drone Japan All Rights Reserved.

姿勢制御 コード

#MAVLinkメッセージを生成する
msg = vehicle.message_factory.set_attitude_target_encode(
		0, 		    #ブートからの時間(今回は未使用)
		0, 0, 		    #ターゲットシステム、コンポーネント
		0b00000000 if False else 0b00000100, #ヨーレート
		to_quaternion(20.0, -20.0, 180.0),  # quaternion角度
		0, 0, math.radians(0), # Roll/Pitch/Yawレート
		0.5) #スラスト

#MAVLinkメッセージ送信
for x in range(0, 100):
	vehicle.send_mavlink(msg)
	time.sleep(0.1)

to_quaternion関数は下記参考URLを参照

https://github.com/dronekit/dronekit-python/blob/master/examples/set_attitude_target/set_attitude_target.py#L87-L156

Copyright © Drone Japan All Rights Reserved.

位置(スピード)制御 コード

#MAVLinkメッセージを生成する
msg = vehicle.message_factory.set_position_target_local_ned_encode(
		0, 		    #ブートからの時間(今回は未使用)
		0, 0, 		    #ターゲットシステム、コンポーネント
		mavutil.mavlink.MAV_FRAME_LOCAL_NED, #フレーム
		0b0000111111000111,  # タイプマスク、0:有効、1:無効
		0, 0, 0, 		    # x、y、z位置(今回は未使用)
		1.0, 1.0, -0.2, 	# 速度 m/s
		0, 0, 0, 	#x、y、z加速度(未サポート)
		0, 0) 	#ヨー、ヨーレート
#MAVLinkメッセージ送信
for x in range(0, 100):
	vehicle.send_mavlink(msg)
	time.sleep(1)

https://github.com/ArduPilot/mavlink/blob/master/message_definitions/v1.0/common.xml#L3804
https://mavlink.io/en/messages/common.html#MAV_FRAME_BODY_NED

Copyright © Drone Japan All Rights Reserved.

コード 解説

    0b0000111111000111,                  # タイプマスク
    0, 0, 0,                             # x、y、z位置
    velocity_x, velocity_y, velocity_z,  # 速度 m/s
    0, 0, 0,                             # x、y、z加速度(未サポート)
    0, 0)                                # ヨー、ヨーレート
  • タイプマスク
    • 0:有効
    • 1:無効
    • ignoreフラグため順序は逆になる
  • ターゲットシステムを「0」にすると自動的に正しい値が設定される
  • コンポーネントは未サポート

https://github.com/ArduPilot/mavlink/blob/master/message_definitions/v1.0/common.xml#L2850-L2906

Copyright © Drone Japan All Rights Reserved.

NED 解説

  • NED:North East Down
  • フレーム(MAV_FRAME_)
    • フレームの種類によってx、y、z速度に指定した値の影響が変わる
    • MAV_FRAME_LOCAL_:ホームポジションを基準
    • MAV_FRAME_BODY_:機体の向きを基準
    • MAV_FRAME_GLOBAL_:WGS84を基準
  • 速度と方向の関係(FRAME_BODYの場合Xが機体前方方向)
    • X>0:北に移動
    • X<0:南に移動
    • Y>0:東に移動
    • Y<0:西に移動
    • Z<0:上昇
    • Z>0:下降

http://ardupilot.org/dev/docs/copter-commands-in-guided-mode.html#copter-commands-in-guided-mode-set-position-target-local-ned

Copyright © Drone Japan All Rights Reserved.

command_long_encode

  • MAVLinkのコマンドメッセージを送ることができる
  • 「vehicle.message_factory.command_long_encode」関数を利用し送信する
  • MAV_CMD_DO_SET_SERVO、DO_CMD_DO_SET_ROI、MAV_CMD_DO_PARACHUTEなどコマンドの実行が可能

https://ardupilot.org/dev/docs/copter-commands-in-guided-mode.html#mav-cmds

Copyright © Drone Japan All Rights Reserved.

command_long_encode 例

#ヨー制御コマンドメッセージを生成する場合
msg = vehicle.message_factory.command_long_encode(
		0, 1, 		#ターゲットシステム、コンポーネント
		mavutil.mavlink.MAV_CMD_CONDITION_YAW, #コマンド
		0,
		90,		# param1 角度指定(degrees)
		0, 		# param2 スピード指定(deg/s)
		1, 		# param3 方向 -1:反時計周り、1:時計周り
		0, 		# param4 オフセット 1:相対、0:絶対
		0, 0,0) 		# CONDITION_YAWの場合param5〜7未使用

#MAVLinkメッセージ送信
vehicle.send_mavlink(msg)

https://dronekit.netlify.app/guide/copter/guided_mode.html
https://ardupilot.org/copter/docs/common-mavlink-mission-command-messages-mav_cmd.html#mav-cmd-condition-yaw

Copyright © Drone Japan All Rights Reserved.

自動航行

Copyright © Drone Japan All Rights Reserved.

自動航行関連でできること

  • 機体からのミッションダウンロード
  • 機体へのミッションアップロード
  • ウェイポイント数の取得
  • 現在実行中のミッションの取得
  • 実行するミッションの指定

https://dronekit.netlify.app/guide/auto_mode.html

Copyright © Drone Japan All Rights Reserved.

ミッションのダウンロード

#機体に接続
vehicle = connect('127.0.0.1:14550', wait_ready=True)
#コマンドオブジェクトの取得
cmds = vehicle.commands
#ダウンロード実行
cmds.download()
cmds.wait_ready()
  • ミッションのダウンロードは非同期で実施される
  • wait_readyで処理の完了を待つ

https://dronekit.netlify.app/guide/auto_mode.html

Copyright © Drone Japan All Rights Reserved.

現在ミッションのクリア

#機体に接続
vehicle = connect('127.0.0.1:14550', wait_ready=True)
#コマンドオブジェクトの取得
cmds = vehicle.commands
#クリア&アップロード
cmds.clear()
cmds.upload()

https://dronekit.netlify.app/guide/auto_mode.html

Copyright © Drone Japan All Rights Reserved.

ミッションの生成と追加

#機体に接続
vehicle = connect('127.0.0.1:14550', wait_ready=True)
#コマンドオブジェクトの取得
cmds = vehicle.commands
#ダウンロード実行
cmds.download()
cmds.wait_ready()
#コマンド定義(テイクオフのミッションを定義)
cmd=Command( 0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 0, 0, 0, 0, 0, 0, 10)
#コマンド追加
cmds.add(cmd)
#ミッションアップロード
cmds.upload()

https://dronekit.netlify.app/guide/auto_mode.html

Copyright © Drone Japan All Rights Reserved.

ミッションの変更1

#機体に接続
vehicle = connect('127.0.0.1:14550', wait_ready=True)

#コマンドオブジェクトの取得
cmds = vehicle.commands

#ダウンロード実行
cmds.download()
cmds.wait_ready()

#編集用に別のリストにミッションを保持
missionList=[]
for cmd in cmds:
	missionList.append(cmd)

https://dronekit.netlify.app/guide/auto_mode.html

Copyright © Drone Japan All Rights Reserved.

ミッションの変更2

#ミッションの編集
#ここでは、最初のミッションをテイクオフに変更
missionList[0].command=mavutil.mavlink.MAV_CMD_NAV_TAKEOFF

#現在のミッションをクリアする
cmds.clear()

#変更したミッションをアップロードする
for cmd in missionList:
    	cmds.add(cmd)
	cmds.upload()

https://dronekit.netlify.app/guide/auto_mode.html
https://ardupilot.org/copter/docs/common-mavlink-mission-command-messages-mav_cmd.html#mav-cmd-nav-takeoff

Copyright © Drone Japan All Rights Reserved.

ミッションの実行

#機体に接続
vehicle = connect('127.0.0.1:14550', wait_ready=True)

#コマンドオブジェクトの取得
vehicle.mode = VehicleMode("AUTO")
  • プロポにてフライトモードを「AUTO」に切り替えるのと同様の操作
  • 別のモードに切り替えることでミッションを停止することができる
  • 停止後、ミッションを再開するかどうかは「MIS_RESTART」パラメーターで設定可能(0:続きから再開、1:最初からリスタート)

https://dronekit.netlify.app/guide/auto_mode.html

Copyright © Drone Japan All Rights Reserved.

実行中ミッションの確認

  • vehicle.commands.nextを参照し、次実行するコマンドの順番が確認できる
  • nextに番号を指定することで、別のコマンドを実行できる(変更後、upload()を実行する必要はない)
#コマンドオブジェクトのnextを確認する
vehicle.commands.next = 3

https://dronekit.netlify.app/guide/auto_mode.html

Copyright © Drone Japan All Rights Reserved.

ミッション完了の通知

  • ミッションの完了を通知する仕組みがない
  • 確認する方法
    • commands.nextと_current_waypoint値で確認する
    • 機体の位置が目的の場所にあるかどうかで判定する
  • ミッション完了後、続けてミッションを行う場合は、一度AUTOモードを解除してから再度AUTOモードにする
    • 例えば「AUTO→GUIDED→AUTO」のようにする

https://dronekit.netlify.app/guide/auto_mode.html

Copyright © Drone Japan All Rights Reserved.

MAVLinkメッセージ

Copyright © Drone Japan All Rights Reserved.

MAVLinkメッセージリスナー

  • 機体の属性変更、パラメーター変更の通知と同様にMAVLinkのメッセージを受信した際に処理する
  • リスナー・デコレーターの仕組みを利用する

https://dronekit.netlify.app/guide/mavlink_messages.html

Copyright © Drone Japan All Rights Reserved.

MAVLinkメッセージデコレーター

#デコレーターを使ってリスナーと作成する
@vehicle.on_message('RANGEFINDER')
def listener(self, name, message):
	print('distance: %s' % message.distance)
	print('voltage: %s' % message.voltage)
  • ワイルドカードの指定も可能
    @vehicle.on_message('')

https://dronekit.netlify.app/guide/mavlink_messages.html

Copyright © Drone Japan All Rights Reserved.

MAVLinkメッセージリスナー

#リスナー用の関数
def listener(self, name, message):
	print('distance: %s' % message.distance)
	print('voltage: %s' % message.voltage)

#リスナーに登録する
vehicle.add_message_listener('RANGEFINDER', listener)

#不要になったら以下で削除
vehicle.remove_message_listener('RANGEFINDER', listener)
  • ワイルドカードの指定も可能

https://dronekit.netlify.app/guide/mavlink_messages.html

Copyright © Drone Japan All Rights Reserved.

MessageFactory

#DISTANCE_SENSORを送る関数
#関数は用意されていない場合、message_factoryを使おう!

<message id="132" name="DISTANCE_SENSOR">
↓
msg = vehicle.message_factory.distance_sensor_encode(
    0, 0, 0,
   120,  # cm
   0,      # Laser
   0, 0, 0
)
vehicle.send_mavlink(msg)

https://github.com/dronekit/dronekit-python/blob/master/dronekit/__init__.py#L2214

Copyright © Drone Japan All Rights Reserved.
DroneKit Cloudのフォーラムのスクリーンショット。トピック一覧が表示されている
DroneKit-PythonのGitHub Issues一覧のスクリーンショット(140 Open)。離陸時のばらつきやシリアルポート接続失敗などの質問が並ぶ

DroneKitで困ったら

Copyright © Drone Japan All Rights Reserved.
  • 結局どっち使えばいいの?
    • ご自身のユースケースに応じて選択してください
  • Pymavlink
    • 低レイヤで細かく制御したい場合
    • 性能要求がシビアな場合
    • 開発が活発なので、継続的に使用したい場合
  • DroneKit-Python
Copyright © Drone Japan All Rights Reserved.

宿題

Copyright © Drone Japan All Rights Reserved.

宿題1

  • 環境構築手順書を参照して環境をセットアップする
    • 期日:7/4(土)(Day3)
    • 使用する手順書
      • コンパニオンコンピュータ(BlueOS): blueos-dev-env-setup-guide.pdf
      • WSL Docker: wsl-docker-setup-guide.pdf
  • 質問・不明点、結果報告はFacebookグループにて積極的に共有をお願いします(Facebookが難しい場合はメールでも可)
Copyright © Drone Japan All Rights Reserved.

宿題2

  • 講義内容を踏まえて、フライトエクスペリエンスで飛行させるオリジナルアプリケーションを開発する
    • 期日:7/18(土)(Day4)
    • 任意としますが、チャレンジするといいことがあるかも…!?
    • コンパニオンコンピュータ(Day3講義内容)の使用も可能
    • シミュレータで動作確認済みであること
    • 講師機体を使用可能。その場合はGitHub経由でソースコードを事前連携すること
    • 自身の機体・PC(GCS)を使う場合は接続テスト済みであること
    • 過去の先輩のアプリフライトチャレンジは下記動画を参考にしてください
Copyright © Drone Japan All Rights Reserved.

Appendix.

Copyright © Drone Japan All Rights Reserved.

無断転載・コピーの禁止

  • 当資料に掲載されている全ての画像・文章・情報等は著作権により保護されております。
  • 著作権者の許可なくこの資料の内容の全て又は一部を複製・転載・流用・転売・複写等することを禁じます。
Copyright © Drone Japan All Rights Reserved.

src: slide 2

src: slide 3

src: slide 4

図内テキスト(抽出): コンパニオンコンピューター / フライトコントローラー / PC / モバイル / Air / Ground(GCS) / Python・Java / Python / MAVProxy / Mission Planner / MAVProxy

src: slide 5

図内テキスト(抽出): CC Software / CC Hardware / Drone Hardware / GCS Software / GCS Hardware / High / Low / abstraction / FC Software / FC Hardware / CC=Companion Computer, FC=Flight Controller / GCS Software / GCS Hardware / pymavlink / MAVProxy / Air(Drone) / Ground(GCS) / 実機構成 / MAVLink-router

src: slide 6

図内テキスト(抽出): CC Software / CC Hardware / Drone Hardware / GCS Software / GCS Hardware / High / Low / abstraction / FC Software / FC Hardware / CC=Companion Computer, FC=Flight Controller / GCS Software / GCS Hardware / pymavlink / Air(Drone) / Ground(GCS) / Windows 11 / Ubuntu22.04 on WSL2 / Android Studio + Emulator / SITL / シミュレータ構成 / 開発ツール、シミュレータを活用して実機に近い環境でアプリケーションの開発・テストを行います / MAVProxy / MAVLink-router

src: slide 7

図内テキスト(抽出): CC Software / CC Hardware / Drone Hardware / GCS Software / GCS Hardware / Air(Drone) / Ground(GCS) / High / Low / abstraction / FC Software / FC Hardware / GCS Software / GCS Hardware / CC=Companion Computer, FC=Flight Controller / pymavlink / MAVProxy / MAVLink-router / 本日のスコープ

src: slide 8

src: slide 9

density:auto

src: slide 10

src: slide 11

density:auto

src: slide 11 (ログ)

density:auto

src: slide 11 (続き)

src: slide 12

src: slide 12 (続き)

src: slide 13

src: slide 13 (続き)

density:auto

src: slide 14

src: slide 15

density:auto

src: slide 16

src: slide 17

図内テキスト(抽出): (Workshop実施環境) / Windows10/11 / Ubuntu22.04 on WSL2 / Mission Planner / WSL SITL (sim_vehicle.py) / VS Code / MAVProxy (自動起動) / Application / 5762 / 14550 / TCP / UDP / VS Code (Remote) / SSH / VS Code起動してWSLに接続 WSLでSITLを起動(sim_vehicle.pyを使用) Mission Plannerを起動してSITLにUDP接続 (自動接続される)

src: slide 18

src: slide 19

src: slide 19 (続き)

src: slide 20

density:auto

src: slide 21

src: slide 22

density:auto

src: slide 23

src: slide 24

src: slide 25

density:auto

src: slide 26

図内テキスト(抽出): コプター / Mission Planner / System ID: 1 Component ID:1 / System ID: 255 Component ID:1 / ハートビート#0 (1Hz) / コマンド送信 COMMAND_LONG (#76) / ACK / REQUEST_DATA_STREAM#66 MESSAGE_INTERVAL#244 ※3.7以上 / データ送信 / https://ardupilot.org/dev/docs/copter-commands-in-guided-mode.html#copter-commands-in-guided-mode

src: slide 27

src: slide 28

density:auto

src: slide 29

src: slide 29 (続き)

src: slide 30

density:auto

src: slide 31

density:auto

src: slide 31 (続き)

src: slide 32

図内テキスト(抽出): コプター / Mission Planner / System ID: 1 Component ID:1 / System ID: 255 Component ID:190 / ハートビート#0 (1Hz) / コマンド送信 COMMAND_LONG (#76) / ACK / REQUEST_DATA_STREAM#66 MESSAGE_INTERVAL#244 ※3.7以上 / データ送信 / https://ardupilot.org/dev/docs/copter-commands-in-guided-mode.html#copter-commands-in-guided-mode

src: slide 33

density:auto

src: slide 33 (続き)

density:auto

src: slide 34

src: slide 35

src: slide 36

src: slide 37

density:auto

src: slide 38

src: slide 39

src: slide 40

src: slide 41

src: slide 42

src: slide 43

src: slide 44

src: slide 45

src: slide 46

src: slide 47

src: slide 48

src: slide 49

src: slide 50

src: slide 51

src: slide 52

density:auto

src: slide 53

src: slide 54

src: slide 55

density:auto

src: slide 56

density:auto

src: slide 57

src: slide 58

density:auto

▼5期補足 離陸後、動き始めるまではyaw command は無視される After taking off, yaw commands are ignored until the first “movement” command has been received. If you need to yaw immediately following takeoff then send a command to “move” to your current position.

src: slide 59

src: slide 60

src: slide 61

density:auto

src: slide 62

density:auto

src: slide 63

density:auto

src: slide 64

density:auto

src: slide 65

src: slide 66

density:auto

src: slide 67

src: slide 68

図内テキスト(抽出): コンパニオンコンピューター / フライトコントローラー / PC / モバイル / Air / Ground(GCS) / Python・Java / Python / MAVProxy / Mission Planner / MAVProxy

src: slide 69

density:auto

src: slide 70

src: slide 71

src: slide 72

図内テキスト(抽出): GitHubで公開されている https://github.com/dronekit/dronekit-python Star, Fork共に増加している

src: slide 73

src: slide 74

density:auto

2018/06/04 ※Anacondaの場合省略可能 追加

src: slide 75

src: slide 76

density:auto

src: slide 77

density:auto

▼5期修正 Linuxでのシリアル接続に「/dev/ttyS0」を追加。(RaspberryPi3以降など)

src: slide 78

src: slide 79

src: slide 80

src: slide 81

▼5期修正 vehicle.armd → vehicle.armed

src: slide 82

src: slide 83

src: slide 84

src: slide 85

src: slide 86

src: slide 87

src: slide 88

src: slide 89

▼5期修正 @vehicle 行末の: を、 def rangefinder_callback の行末に移動

src: slide 90

src: slide 91

src: slide 92

src: slide 93

src: slide 94

src: slide 95

src: slide 96

src: slide 97

src: slide 98

src: slide 99

src: slide 100

src: slide 101

src: slide 102

src: slide 103

src: slide 104

src: slide 105

density:auto

src: slide 106

src: slide 107

density:auto

src: slide 108

density:auto

src: slide 109

density:auto

src: slide 110

density:auto

src: slide 111

src: slide 112

▼5期補足 離陸後、動き始めるまではyaw command は無視される After taking off, yaw commands are ignored until the first “movement” command has been received. If you need to yaw immediately following takeoff then send a command to “move” to your current position.

src: slide 113

src: slide 114

src: slide 115

src: slide 116

src: slide 117

src: slide 118

src: slide 119

src: slide 120

src: slide 121

src: slide 122

src: slide 123

src: slide 124

src: slide 125

src: slide 126

src: slide 127

src: slide 128

density:auto

src: slide 129

density:auto

src: slide 130

src: slide 131

src: slide 132

src: slide 133

src: slide 134