2

空中でモードを変更しようとすると、ドローン キットの Python スクリプトが引き続きヘリコプターを GUIDED モードのままにします。pythonスクリプトで、ドローンが特定の場所を飛行し、そのモードを空中でLOITERに切り替えて、一定時間空中に留まることができるようにする必要があります。ここに私のスクリプトの小さな部分があります:

    print "Going towards location"
    goto(5,3)

    vehicle.mode = VehicleMode("LOITER")
    print vehicle.mode
    time.sleep(70)

スクリプトを実行するたびに、車両モードが LOITER ではなく GUIDED として出力されます。理由がわかりません。

goto python関数の定義は次のとおりです

    def goto(dNorth, dEast, gotoFunction=vehicle.simple_goto):
        currentLocation=vehicle.location.global_relative_frame
        targetLocation=get_location_metres(currentLocation, dNorth, dEast)
        targetDistance=get_distance_metres(currentLocation, targetLocation)
        gotoFunction(targetLocation)

        while (vehicle.mode.name=="GUIDED") and (get_distance_metres(vehicle.home_location,vehicle.location.global_frame)<radius) and (vehicle.location.global_relative_frame.alt<alt_limit): 
     #Stop action if we are no longer in guided mode or outside radius.
          remainingDistance=get_distance_metres(vehicle.location.global_frame, targetLocation)
    print "Distance to target: ", remainingDistance 
            if remainingDistance<=targetDistance*0.1: #Just below target, in case of undershoot.
            print "Reached target"
            break
    time.sleep(2)

ヘリコプターが GUIDED モードでない場合、simple_goto を実行できないことを理解しています。しかし、目的地に到達した後、関数は中断するように指示し、simple_goto で実行されなくなったと思います。自分のコードの何が問題なのか理解できないので、なぜこれが起こっているのかを説明してくれる人がいれば。

(リクエストに応じてコード全体を掲載できます)

4

3 に答える 3

0

モードが実際にいつ変更されるかを知る最善の方法は、「オブザーバー」(属性リスナー) を使用することです。コールバックを設定する「vehicle」でイベントを処理できます。したがって、「モード」属性にオブザーバーを追加するだけで、モードが実際にいつ変更されるかがわかります。このようなもの:

class Solo(Vehicle):
"""
Solo class that inherit from dronekit.Vehicle
"""

def __init__(self, *args):
    super(Solo, self).__init__(*args)      

    # Observers
    self.add_attribute_listener('mode', self.mode_callback)   

def mode_callback(self, *args):
    # Do whatever you need when the mode changed here
    Printer.message("MODE changed to %s" % self.mode.name)
于 2016-08-17T16:44:03.933 に答える
0
vehicle.mode = VehicleMode("LOITER")
print vehicle.mode

車両がモードを変更してからモード変更を確認するのに少し時間がかかるため、この部分は機能しません。

于 2016-02-21T13:12:34.577 に答える