Дрон-кит Python не позволял менять режимы в симуляторе в воздухе

Всякий раз, когда я пытаюсь изменить режимы в воздухе, скрипт python для набора дронов продолжает оставлять коптер в режиме GUIDED. Мне важно, чтобы мой скрипт Python позволял моему дрону пролетать через определенное место и переключать его режим на LOITER в воздухе и оставаться в воздухе в течение определенного периода времени. Вот небольшой фрагмент моего скрипта:

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

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

Каждый раз, когда я запускаю свой скрипт, он выводит режимы транспортного средства как НАПРАВЛЯЕМЫЙ, а не МЕСТОПОДДЕРЖИВАЮЩИЙСЯ. Я не понимаю, почему нет.

Вот определение функции 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)

Я так понимаю, что simple_goto не может работать, если коптер не в режиме GUIDED. Но после того, как он достигает места назначения, функция сообщает ему о прерывании, и я предполагаю, что он больше не работает в simple_goto. Если кто-нибудь может помочь мне с объяснением, почему это происходит, потому что я не понимаю, что не так с моим кодом.

(Весь код может быть размещен по запросу)


person Shageenth Sandrakumar    schedule 21.02.2016    source источник


Ответы (3)


vehicle.mode = VehicleMode("LOITER")
print vehicle.mode

Эта часть не будет работать, потому что транспортному средству требуется некоторое время, чтобы изменить режимы, а затем подтвердить изменение режима.

person squilter    schedule 21.02.2016

это связано с тем, что mavlink не распознает rc, поэтому попробуйте ввести rc 3 1500 в mavlink, как только он покажет режим стабилизации с sitl. Тогда это сработает, если у вас есть отказоустойчивый rc, который исчезнет, ​​если вы введете значения.

person Poojita Sandrakumar    schedule 13.04.2016

Лучший способ узнать, когда режим действительно меняется, - это иметь «наблюдателя» (слушателя атрибутов). Вы можете обрабатывать события в «автомобиле», устанавливая обратный вызов. Так что просто добавьте наблюдателя к атрибуту «режим», чтобы вы знали, когда режим действительно изменился. Что-то вроде этого:

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)
person epinal    schedule 17.08.2016