Взлет после посадки с помощью Dronekit

Я использую куб Pixhawk 2.1 на Arducopter v3.6.4 с Raspberry Pi 3 Model B, на котором запущены скрипты для дронов. Что я хочу сделать, так это взлететь, пойти в точку и приземлиться там, а через некоторое время взлететь и вернуться в исходную точку или в какую-то другую точку. Я попытался запустить его на SITL, но безуспешно.

Что я сделал, так это изменил режим с НАПРАВЛЯЕМЫЙ на ПОСАДКУ в наборе дронов, чтобы посадить дрон в точке, а затем я запустил функцию arm_and_takeoff(), но он просто отказывается включаться, как только двигатели разоружаются после приземления. Я мог только прервать сценарий, и если я снова запустил код, моторы включились как обычно.

Итак, что я хочу сделать, это -Рука и взлет -Летите к путевой точке 1 - Приземлитесь в точке 1 и оставайтесь там некоторое время -Рука и Взлет снова -Перейти к другой точке или вернуться домой

Но код работает только через 3-й шаг и после снятия с охраны моторы не включаются.

Я прочитал сообщение peterbarker https://github.com/peterbarker о том, что режим RTL останавливает это разоружение двигателей при приземлении, но я не могу заставить его работать на SITL. https://github.com/ArduPilot/ardupilot/pull/6914

from dronekit import connect, VehicleMode, LocationGlobal, LocationGlobalRelative, Command
from pymavlink import mavutil  # Needed for command message definitions
import time
import math

# Set up option parsing to get connection string
import argparse

parser = argparse.ArgumentParser(description='Control Copter and send commands in GUIDED mode ')
parser.add_argument('--connect',
                help = "Vehicle connection target string. If not specified, SITL automatically started and used.")
args = parser.parse_args()

connection_string = args.connect
sitl = None

# Start SITL if no connection string specified
if not connection_string:
    import dronekit_sitl

    sitl = dronekit_sitl.start_default()
    connection_string = sitl.connection_string()

# Connect to the Vehicle
print 'Connecting to vehicle on: %s' % connection_string
vehicle = connect(connection_string, wait_ready=True)


def arm_and_takeoff(aTargetAltitude):
"""
Arms vehicle and fly to aTargetAltitude.
"""

    print "Basic pre-arm checks"
    # Don't let the user try to arm until autopilot is ready
    while not vehicle.is_armable:
        print " Waiting for vehicle to initialise..."
        time.sleep(1)

    print "Arming motors"
    # Copter should arm in GUIDED mode
    vehicle.mode = VehicleMode("GUIDED")
    vehicle.armed = True

    while not vehicle.armed:
        print " Waiting for arming..."
        time.sleep(1)

    print "Taking off!"
    vehicle.simple_takeoff(aTargetAltitude)  # Take off to target altitude

    # Wait until the vehicle reaches a safe height before processing the goto (otherwise the command
#  after Vehicle.simple_takeoff will execute immediately).
    while True:
        print " Altitude: ", vehicle.location.global_relative_frame.alt
        if vehicle.location.global_relative_frame.alt >= aTargetAltitude * 0.95:  # Trigger just below target alt.
            print "Reached target altitude"
            break
        time.sleep(1)




def set_velocity_body(vehicle, vx, vy, vz):
""" Remember: vz is positive downward!!!
http://ardupilot.org/dev/docs/copter-commands-in-guided-mode.html

Bitmask to indicate which dimensions should be ignored by the vehicle
(a value of 0b0000000000000000 or 0b0000001000000000 indicates that
none of the setpoint dimensions should be ignored). Mapping:
bit 1: x,  bit 2: y,  bit 3: z,
bit 4: vx, bit 5: vy, bit 6: vz,
bit 7: ax, bit 8: ay, bit 9:


"""
    msg = vehicle.message_factory.set_position_target_local_ned_encode(
    0,
    0, 0,
    mavutil.mavlink.MAV_FRAME_BODY_NED,
    0b0000111111000111,  # -- BITMASK -> Consider only the velocities
    0, 0, 0,  # -- POSITION
    vx, vy, vz,  # -- VELOCITY
    0, 0, 0,  # -- ACCELERATIONS
    0, 0)
    vehicle.send_mavlink(msg)
    vehicle.flush()


def goto_location(waypoint):
    vehicle.simple_goto(waypoint)
    time.sleep(2)
    reached = 0
    while(not reached):
        time.sleep(1)
        a = vehicle.velocity
        if (abs(a[1])< 0.2 and abs(a[2])< 0.2 and abs(a[0])< 0.2):
            reached = 1
    print "Waypoint reached!"


def battery_check():
    if (vehicle.battery < 9.9):
        print ("Battery Low. Landing")
    print "Battery: %s" % vehicle.battery
        land()
    else:
        print "Battery: %s" % vehicle.battery

def land():
    print("Vehicle in LAND mode")
    vehicle.mode = VehicleMode("LAND")
    while not vehicle.location.global_relative_frame.alt==0:
        if vehicle.location.global_relative_frame.alt < 2:
            set_velocity_body(vehicle,0,0,0.1)
    vehicle.armed = False
    vehicle.close()

def temp_land():
    print("Vehicle in LAND mode")
    vehicle.mode = VehicleMode("LAND")
    while not vehicle.location.global_relative_frame.alt==0:
        if vehicle.location.global_relative_frame.alt < 2:
            set_velocity_body(vehicle,0,0,0.1)
        print ("Vehicle in AUTO mode")
    vehicle.mode = VehicleMode("AUTO")


def rtl():
    print("Vehicle Returning to LAND mode")
    vehicle.mode = VehicleMode("RTL")

def delay(sec):
        print "Hover for %s Seconds" % sec
        time.sleep(sec)



###################################################################################
################################ START CODE #######################################
###################################################################################

############# POINTS ###############
p1 = LocationGlobalRelative(24.830125, 67.097387, 15)


############# TAKE OFF#############
arm_and_takeoff(15)                                                                                                 # Vehicle takeoff
home = vehicle.location.global_frame                                                                                #HOME
print "Reached Target Altitude"
print "Altitude: ", vehicle.location.global_relative_frame.alt
print "Home Location: %s" % home
delay(1)
battery_check()

############# POINT 1 ##############
print "Going to Point 1"
goto_location(p1)
print "Reached Point 1"
print "Location: %s" % vehicle.location.global_frame
delay(1)
battery_check()

############### LAND ################
temp_land()

############ RETURN TO HOME ##########
print "Going to Home"
goto_location(home)
print "Reached Home"
print "Location: %s" % vehicle.location.global_frame
delay(1)
battery_check()


############# LAND #################    
rtl()                                                                                                               # Land vehicle once mission is over
vehicle.flush()
vehicle.close()
print "Exiting Script"


###################################################################################
################################# END CODE ########################################
###################################################################################

Можно ли как-то побороть эту проблему?

Спасибо.

С Уважением

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 738
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нашел способ побороть эту проблему. Пришлось снова подключить транспортное средство после приземления в коде, а также изменить его имя после приземления.

Если бы я переподключил его, не меняя переменную транспортного средства, он взлетел, но не приземлился во второй раз.

Я надеюсь, что есть другой способ сделать это, хотя.

Другие вопросы по теме