Drone-kit Python не позволил бы мне менять режимы в симуляторе во время полета
Всякий раз, когда я пытаюсь изменить режимы в воздухе, скрипт python drone-kit продолжает оставлять коптер в режиме 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. Если кто-нибудь может помочь мне объяснить, почему это происходит, потому что я не понимаю, что не так с моим кодом.
(Весь код может быть размещен по запросу)
3 ответа
vehicle.mode = VehicleMode("LOITER")
print vehicle.mode
Эта часть не будет работать, потому что автомобилю требуется немного времени, чтобы сменить режим и затем подтвердить изменение режима.
Это связано с тем, что mavlink не распознает rc, поэтому попробуйте ввести rc 3 1500 в mavlink, когда он покажет режим в режиме стабилизации из sitl. Тогда это сработает, если у вас есть отказоустойчивый rc, который исчезнет, если вы введете значения.
Лучший способ узнать, когда режим действительно изменяется, это иметь "наблюдателя" (атрибут слушателя). Вы можете обрабатывать события в "транспортном средстве", устанавливая обратный вызов. Так что просто добавьте наблюдателя в атрибут 'mode', чтобы вы знали, когда режим действительно изменился. Что-то вроде этого:
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)