ヘリコプターは異なります。 単一の標準はありません。 ヘリコプターの心臓部には、センサーからのデータを蓄積し、安定化と宇宙での位置を制御するフライトコントローラーがあります。 リモートコントロールから制御することにより、コマンドをフライトコントローラーに送信します。その結果、エンジン速度が変化し、空中を移動できるようになります。 より高度なヘリコプターでは、リモートコントロールに加えて、地上局(地上局)から制御できます。 フライトコントローラーに直接接続してオンボードミニコンピューターを使用すると、ハンドヘルドリモートコントロールと地上局の利点が組み合わされ、フライトが自動化され、外の世界と対話できます。
私のプロジェクトには、拡張性のある既製のプラットフォームが必要でした。 同時に、すべてが箱から出して動作することを望みます。 飛行中のデータを直接処理するオンボードミニコンピューターを含む500〜600グラムの貨物を持ち上げる必要があります。 そしてもちろん、価格は合理的な範囲内でなければなりません。 当時、 Soloが登場しました。Pixhawk2の3DRからの新しいモデルで、「フルミンスミート 」に加えて、Linuxを実行するミニコンピューター、WiFi接続、フライトコントローラーとオンボードコンピューターに直接接続する機能がインストールされていました。 最大700グラムの積載量。 一般的に、何が必要で、しばらくして彼は私と一緒にいました。
DJIおよび自己組織化について
既製のプラットフォームは、DJIとmavlinkに分けることができます。 昨年、DJIはMatrice 100のオンボードSDKをリリースしましたが、価格は非常に高いです。 DJI製品でのもう1つの非常に議論のある点は、Apple Storeなどのアプリケーションの登録です。 産業用アプリケーションでは、これはプラットフォームバインディングだけでなく、重大な制限でもあります。
Phantomでは、サードパーティのソフトウェアとハードウェアの公式サポートは提供されていません。 モバイルSDKはカウントされません、なぜなら 私の仕事に合わない。
同時に、mavlinkは多数の利用可能なフライトコントローラーでサポートされており、タスク用のプラットフォームを組み立てるだけでなく、コード全体を書き換えずに別のコントローラーに切り替える機会もあります。
個々の部品からヘリコプターを組み立てるのは今や高価になりすぎており、ヘリコプター市場での競争は非常に激しく、工場モデルの価格は急速に低下しています。 完成したモデルを必要なレベルに改善することは、すべてをゼロから組み立てるよりも安価で高速です。
Phantomでは、サードパーティのソフトウェアとハードウェアの公式サポートは提供されていません。 モバイルSDKはカウントされません、なぜなら 私の仕事に合わない。
同時に、mavlinkは多数の利用可能なフライトコントローラーでサポートされており、タスク用のプラットフォームを組み立てるだけでなく、コード全体を書き換えずに別のコントローラーに切り替える機会もあります。
個々の部品からヘリコプターを組み立てるのは今や高価になりすぎており、ヘリコプター市場での競争は非常に激しく、工場モデルの価格は急速に低下しています。 完成したモデルを必要なレベルに改善することは、すべてをゼロから組み立てるよりも安価で高速です。
オンにすると、コントローラーはWiFiネットワークを作成し、ヘリコプターは10.1.1.10で使用可能になり、コントローラーは10.1.1.1になります。 どちらの場合も、sshアクセスがあります。
ssh root@10.1.1.10
TjSDBkAuパスワード
内部では、ARM Cortex A9 / Freescale i.MX6上のYocto Project 1.5.1に基づいたLinuxが使用されます。 システムは8Gb microSDカードによって削減され、そのうち7.2Gbはフライトログのセクションを占有します。 デフォルトでは、OSおよびコードの最小値。 システム内の何かを変更する場合は、必ずバックアップしてください。 これを行うには、エンジンを取り外し、ケースを開いてメインボードを入手する必要があります。 この場合、microSDのパーティションのサイズを変更するか、最初にddresqueを介してデータをコピーし、ext3パーティションのサイズを変更した後、カードをより大きなものに交換する必要があります。
Soloの下部には、imx6およびPixhawkにアクセスするための出力USB、 UAVCAN 、 UARTを経由するコネクタがあります。 追加の結論は、Pixhawkの下を含め、ボードから入手できますが、はんだごてを拾う必要があります。 たとえば、USBケーブルはサードパーティのデバイスを接続するために使用され、OTGホストモードで動作し、ジャンパーが閉じられたときに外部デバイスを接続し、外部コンピューターに接続されたときにデバイスとして接続します。 はんだごてを気にしたくない人のために、彼らはほとんどの結論がすでにそこにあるアクセサリーブレイクアウトボードを開発しました、対応するコネクタを使用するだけです。
干渉がない場合、コントローラーからヘリコプターへの信号は500メートルを超え、仕様に従って800に達するため、WiFiネットワーク経由でラップトップからオンラインで制御できます。 天気の良い日には、ヘリコプターは最大300〜400メートルの距離で観測され、それがさらにポイントになり、手動制御はFPVまたは自動化を使用した場合にのみ利用できます。 距離が長く困難な場合は、Soloで直接制御スクリプトを実行して、通信と可視性の問題を解消することをお勧めします。 デフォルトでは、スクリプトはsftp、rsync、およびsoloユーティリティを介してダウンロードできます。 スクリプトにvirtualenvを使用することを強くお勧めします。そうしないと、パッケージバージョンがシステムバージョンと競合する可能性があります。
Mavlink (Micro Air Vehicle Communication Protocol)は、APM / Pixhawk、MultiWii、Navioなど、ほとんどのオープンフライトコントローラーがサポートするオープンな通信プロトコルです。 mavlinkを使用すると、制御コマンドの送信、ミッションの設定、テレメトリの受信ができます。 創業以来、彼らはマイクロ航空(ヘリコプター、飛行機)だけでなく、マイクロカー、ボート、さらには潜水艦の制御にも使用され始めました。 使用する車両とコントローラーの種類に応じて、機能はわずかに異なります。
Pythonの場合、mavlinkプロトコルはpymavlinkモジュールに実装されています。 直接使用するのはあまり快適ではなく、 DroneKitはそのラッパーを部分的に実装しました。 部分的には、実際には、すべてが行われているわけではなく、mavlinkを常に参照する必要があるためです。 mavlinkの未実現の機能は、フライトコントローラーにあります。 1つまたは別の機能の存在をチェックおよびテストする必要があります。 一部のコマンドとモードは、実装されないだけでなく、他とは異なる名前を持つことができます。 したがって、特定のコントローラー用に開発し、将来のサポートを確認することをお勧めします。
ソロは十分に大きく、モーター間は46 cmで、ネジはさらに大きくなります。 小さな部屋では、実行しない方が良いでしょう。 GPSを使用した屋内ナビゲーションは機能しないため、通りに進みます。 フライトの前に、ヘリコプターの現在のパラメーターを見てみましょう。
#!/usr/bin/python #-*- coding: utf-8 -*- from dronekit import connect # # DroneKit. vehicle = connect('udpin:0.0.0.0:14550', wait_ready=True) # print "Vehicle state:" # , , . # , . print " Global Location: %s" % vehicle.location.global_frame print " Global Location (relative altitude): %s" % vehicle.location.global_relative_frame print " Local Location: %s" % vehicle.location.local_frame # pitch, yaw, roll print " Attitude: %s" % vehicle.attitude # , print " Battery: %s" % vehicle.battery # . print " Last Heartbeat: %s" % vehicle.last_heartbeat # , print " Heading: %s" % vehicle.heading # print " Groundspeed: %s" % vehicle.groundspeed # print " Airspeed: %s" % vehicle.airspeed # print " Is Armable?: %s" % vehicle.is_armable # print " Armed: %s" % vehicle.armed # print " Mode: %s" % vehicle.mode.name vehicle.close() print "Done."
モードは、事前定義されたアクションと利用可能な機能のセットです。 ALT_HOLDでは、プリセットの高さが保存され、移動機能が使用可能になり、AUTOがミッションを起動し、LANDがヘリコプターを着陸させ、モーターをオフにします。 開始する前にGPSとGPSロックが必要なモードもあれば、それなしで機能するモードもあります。 必要に応じて、独自のモードを作成し、必要な動作をプログラムできます。
離陸する時が来ました:
#!/usr/bin/python #-*- coding: utf-8 -*- import time from dronekit import connect, VehicleMode, LocationGlobalRelative # vehicle = connect('unpin:10.1.1.10:14550', wait_ready=True) def arm_and_takeoff(aTargetAltitude): """ aTargetAltitude """ print " " while not vehicle.is_armable: print " ..." time.sleep(1) print " " # GUIDED vehicle.mode = VehicleMode("GUIDED") # vehicle.armed = True # . # , . while not vehicle.armed: print " ..." time.sleep(1) print "!" # vehicle.simple_takeoff(aTargetAltitude) # # … . while True: print " : ", vehicle.location.global_relative_frame.alt # , if vehicle.location.global_relative_frame.alt>=aTargetAltitude*0.95: print " %d " % vehicle.location.global_relative_frame.alt break time.sleep(1) print " " # 20 arm_and_takeoff(20)
接続後、すべてのプリフライトチェックが完了し、vehicle.is_armableがTrueになるまで待機します。 次に、ガイドモードに切り替えます。このモードでは、ヘリコプターが「詳細な指示」を待つポイントに順番に設定できます。 0.95の係数は必要ありませんが、センサーの精度は理想的ではないため、これを考慮する必要があります。 一方、慣性があり、飛行中の速度が均一ではないため、これにより時間を無駄にしないことができます。 最後のセンチメートルは数秒余分にかかり、バッテリーはすぐに使い果たされ、±1メートルの高さは重要ではありません。
# a_location = LocationGlobalRelative(-27.114346, -109.357912, 20) # vehicle.simple_goto(a_location)
座標を自分のものに変更することを忘れないでください! 突然忘れた場合は、リモコンの[一時停止]ボタンを使用するか、両方のスティックを右上隅に持ち上げて、Soloコントロールをつかむことができます。 最後の手段として、タブレットを接続してgpsからデータを受信し、機内で通信用の電話番号を検討できることを願っています。
飛行中、速度などのいくつかのパラメーターを制御できます。
# , / vehicle.groundspeed = 7.5
この場合、所定の目標を達成するための通知メカニズムはありません... UDPを介してmavlink接続を行ったことを覚えていますか? 私たちのメッセージはどこにも行くことができません。これは、特に長距離の場合に起こることがあります。
速度と距離を知り、到着時間を計算し、タイマーを設定することは問題ではありません。 理想的には、これは機能します。 ヘリコプターの場合、風、向かい風、追い風、横向きは、独自の調整を行います。 「地面に落ち着いた」ということは、30〜50〜100メートルに風がないことを意味するものではないため、線形計算は非常に近似したものになります。
気象条件
風は確かに最も明白な要因の1つですが、すべての環境変数が飛行に影響します。 たとえば、エンジンの推力は空気の圧力と温度に依存します。 低い圧力と高い温度はトラクションを減らします。 -10〜20°C未満の温度は、バッテリー、光学部品、および電子機器に非常に悪影響を及ぼす。
より正確な方法は、もちろんGPS / Glonass / Gallileo / Beidouで位置を確認することです。 使用するチップとその設定に応じて、チェックは1秒間に1〜10回を超えることはなく、時には間隔が長くなることもあります。 さらに、位置の精度はプラスまたはマイナスの数メートルになります。
def is_arrived(lat, lon, alt, precision=0.3): # veh_loc = vehicle.location.global_relative_frame # diff_lat_m = (lat - veh_loc.lat) * 1.113195e5 diff_lon_m = (lon - veh_loc.lon) * 1.113195e5 diff_alt_m = alt - veh_loc.alt # dist_xyz = math.sqrt(diff_lat_m**2 + diff_lon_m**2 + diff_alt_m**2) if dist_xyz < precision: print " " return True else: print " " return False # while not is_arrived(lat, lon, alt): # 3 time.sleep(3) # - time.sleep(10)
設定点に達したら、家に帰ります。 同様に、座標を設定し、LANDモードを使用して到着時に着陸するのは難しい方法です。 実際には、開始時には、フライトの全期間にわたって初期位置のデータが保存され、帰宅するためにRTL(Return To Launch)モードがあります。 RTLでは、ヘリコプターは最初に「戻り高さ」RTL_ALTまで上昇します。これにより、木や高地のオブジェクトとの衝突の可能性がなくなり、ヘリコプターが出発点に戻り、自動的にデバイスが着陸し、モーターがオフになります。
print "" vehicle.mode = VehicleMode("RTL")
しばらくして、ヘリコプターが到着し、着陸した後、喜んで到着について見ました。 あなたは息を吐くことができます...すべてが順調です! ビデオの結果:
ターミナルでの結果
>>> APM:ヘリコプターV3.4-dev(6358876f)
>>>フレーム:QUAD
プリフライトチェック
エンジンを始動する
私たちはモーターを待っています...
>>>アーミングモーター
>>> APMの初期化
離陸!
現在の高さ:0.01
現在の高さ:0.01
現在の高さ:0.15
現在の高さ:1.78
現在の高さ:3.69
現在の高さ:5.79
現在の高さ:8.0
現在の高さ:10.26
現在の高さ:12.52
現在の高さ:15.37
現在の高さ:17.57
現在の高さ:19.12
登り19メートル
所定の高さに達した
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
その場所に到着
戻ってくる
>>>フレーム:QUAD
プリフライトチェック
エンジンを始動する
私たちはモーターを待っています...
>>>アーミングモーター
>>> APMの初期化
離陸!
現在の高さ:0.01
現在の高さ:0.01
現在の高さ:0.15
現在の高さ:1.78
現在の高さ:3.69
現在の高さ:5.79
現在の高さ:8.0
現在の高さ:10.26
現在の高さ:12.52
現在の高さ:15.37
現在の高さ:17.57
現在の高さ:19.12
登り19メートル
所定の高さに達した
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
まだ飛行していない
その場所に到着
戻ってくる
問題は、飛行、飛行、または間違った方向への飛行ができないことです。 間違いは高価です。 そして、これはヘリコプターであるだけでなく、負荷でもあります。 純粋なソフトウェアエラーと機器の問題に加えて、メンテナンスにも問題があります。 たとえば、離陸/着陸のために平らで清潔なプラットフォームを用意することが望ましいです。片足で石の上に座って、転がすことができます。 離陸したとしても、たとえば波に揺れるヨットから離陸する必要がある場合など、特定の問題が発生します。
それはクラッシュやその他のトラブルからそれほど苦痛ではありません。SITL (Software in the Loop)でスクリプトをテストします。 SITLは、いくつかの気象条件、地形機能、GPSの誤作動、信号損失などを含むさまざまな状況を解決できるフライトシミュレータです。 SITLは常に正しく動作するとは限りませんが、全体的には悪くありません。 いずれにしても、完全なテストを置き換えることはできません。 3Dでの視覚化には、SITLとFlightGearまたはjMAVSimの組み合わせが使用されます。
離陸し、ポイントに印を付けて戻ります-それは簡単です。 多くの便利な機能は、ミッション、半径に沿って飛行、オブジェクトを追跡、典型的な機器を制御するためにすでに実装されています:カメラとサスペンション。 ただし、ヘリコプターは「盲目的に」飛行し、状況を確認せず、分析しません。 RTLのように最大パラメーターを設定するか、さまざまなセンサー、カメラ、計算用の追加機器を使用して、最終的に独自のセンサーと状況評価システムを作成する必要があります。 そのため、少なくとも電子工学、ロボット工学、レベルマッチング、データ転送プロトコル、センサーの一般的な考え方を持つことが望ましいです。 このトピックを掘り下げる場合、これらすべてが何らかの形で必要になります。