Drone-kit Python 不允许我在空中更改模拟器中的模式
Drone-kit Python would not let me change modes in the simulator while in air
每当我尝试在空中改变模式时,drone-kit python 脚本继续让直升机处于 GUIDED 模式。我必须让我的 python 脚本允许我的无人机飞过某个位置并将其模式切换到空中 LOITER 并在空中停留一段时间。
这是我的一小段脚本:
print "Going towards location"
goto(5,3)
vehicle.mode = VehicleMode("LOITER")
print vehicle.mode
time.sleep(70)
每次我 运行 我的脚本时,它都会将车辆模式输出为 GUIDED 而不是 LOITER。
我不明白为什么不。
这是 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 不能 运行。但在它到达目的地后,该函数告诉它中断,我假设它不再是 运行s in simple_goto。如果有人能帮我解释为什么会这样,因为我不明白我的代码有什么问题。
(可根据要求发布完整代码)
vehicle.mode = VehicleMode("LOITER")
print vehicle.mode
这部分将不起作用,因为车辆需要一点时间来更改模式,然后确认模式更改。
这与 mavlink 无法识别 rc 有关,因此一旦它显示稳定模式,请尝试在 mavlink 中输入 rc 3 1500。然后它会工作你有一个 rc 故障安全存在,如果你输入值,它会消失。
了解模式何时真正改变的最好方法是使用 'observer'(属性侦听器)。您可以在 'vehicle' 设置回调中处理事件。所以只需在 '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)
每当我尝试在空中改变模式时,drone-kit python 脚本继续让直升机处于 GUIDED 模式。我必须让我的 python 脚本允许我的无人机飞过某个位置并将其模式切换到空中 LOITER 并在空中停留一段时间。 这是我的一小段脚本:
print "Going towards location"
goto(5,3)
vehicle.mode = VehicleMode("LOITER")
print vehicle.mode
time.sleep(70)
每次我 运行 我的脚本时,它都会将车辆模式输出为 GUIDED 而不是 LOITER。 我不明白为什么不。
这是 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 不能 运行。但在它到达目的地后,该函数告诉它中断,我假设它不再是 运行s in simple_goto。如果有人能帮我解释为什么会这样,因为我不明白我的代码有什么问题。
(可根据要求发布完整代码)
vehicle.mode = VehicleMode("LOITER")
print vehicle.mode
这部分将不起作用,因为车辆需要一点时间来更改模式,然后确认模式更改。
这与 mavlink 无法识别 rc 有关,因此一旦它显示稳定模式,请尝试在 mavlink 中输入 rc 3 1500。然后它会工作你有一个 rc 故障安全存在,如果你输入值,它会消失。
了解模式何时真正改变的最好方法是使用 'observer'(属性侦听器)。您可以在 'vehicle' 设置回调中处理事件。所以只需在 '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)