如何使用 python dronekit «转到 left/right/forward/backward»?

How to do «go to left/right/forward/backward» with python dronekit?

我正在使用 APM 自动驾驶我的六轴飞行器并遵循 this tutorial. by looking at this 可用命令,我看不出如何命令无人机前往 left/right/forward/backward?

谁能帮我解决这个问题?

您需要创建一个 vehicle.message_factory.set_position_target_local_ned_encode。 它将需要 mavutil.mavlink.MAV_FRAME_BODY_NED 的帧。 您将所需的 x,y and/or z 速度(在 m/s 中)添加到消息中。

from pymavlink import mavutil
from dronekit import connect, VehicleMode, LocationGlobalRelative
import time

def send_body_ned_velocity(velocity_x, velocity_y, velocity_z, duration=0):
    msg = vehicle.message_factory.set_position_target_local_ned_encode(
        0,       # time_boot_ms (not used)
        0, 0,    # target system, target component
        mavutil.mavlink.MAV_FRAME_BODY_NED, # frame Needs to be MAV_FRAME_BODY_NED for forward/back left/right control.
        0b0000111111000111, # type_mask
        0, 0, 0, # x, y, z positions (not used)
        velocity_x, velocity_y, velocity_z, # m/s
        0, 0, 0, # x, y, z acceleration
        0, 0)
    for x in range(0,duration):
        vehicle.send_mavlink(msg)
        time.sleep(1)

connection_string = 'tcp:192.168.1.2:5760' # Edit to suit your needs.
takeoff_alt = 10
vehicle = connect(connection_string, wait_ready=True)
while not vehicle.is_armable:
    time.sleep(1)
vehicle.mode = VehicleMode("GUIDED")
vehicle.armed = True
while not vehicle.armed:
    print('Waiting for arming...')
    time.sleep(1)
vehicle.simple_takeoff(takeoff_alt) # Take off to target altitude
while True:
    print('Altitude: %d' %  self.vehicle.location.global_relative_frame.alt)
    if vehicle.location.global_relative_frame.alt >= takeoff_alt * 0.95:
        print('REACHED TARGET ALTITUDE')
        break
    time.sleep(1)

# This is the command to move the copter 5 m/s forward for 10 sec.
velocity_x = 0
velocity_y = 5
velocity_z = 0
duration = 10
send_body_ned_velocity(velocity_x, velocity_y, velocity_z, duration)

# backwards at 5 m/s for 10 sec.
velocity_x = 0
velocity_y = -5
velocity_z = 0
duration = 10
send_body_ned_velocity(velocity_x, velocity_y, velocity_z, duration)

vehicle.mode = VehicleMode("LAND")

玩得开心,当然,在编程和飞行无人机时要遵守严格的安全防护措施。手动模式覆盖是必须的!

Dronekit-python 具有在本地框架中控制无人机的重要 API。根据我的个人经验,我很难理解如何使用这些命令让我的无人机跟随局部形状,例如正方形或圆形。 另一种方法是使用 FlytOS drone APIs. If you see this sample python code on github 你可以看到命令无人机向左移动 x 米然后向前移动 y 米等是多么容易。Jon 的回答确实正确地显示了如何使用 dronekit 来实现你正在尝试做的事情,又是一个可能被复杂代码吓倒的初学者。

我遇到了同样的问题,我希望这个 link 有助于寻找文章 here

的 "controlling by specifying the vehicle’s velocity components" 部分