Mission Rejected: landing pattern required

Hello all,
I am running
Plane, PX4 1.10.0 in the Gazebo sim

I am trying to get the plane to take off using this code in python. I got it to work with PX4 1.9.2 but now that I have updated to PX4 1.10 I get “Mission Rejected: landing pattern required”

Is there a simple way to omit this requirement? I dont care about the landing part, I just want to fly and let gravity do the rest in the sim.:smile:

‘’’
@File DroneKitPX4.py

Example usage of DroneKit with PX4

@author Sander Smeets sander@droneslab.com

Code partly based on DroneKit © Copyright 2015-2016, 3D Robotics.

################################################################################################

Import DroneKit-Python

from dronekit import connect, Command, LocationGlobal
from pymavlink import mavutil
import time, sys, argparse, math

################################################################################################

Settings

################################################################################################

connection_string = ‘127.0.0.1:14540’
#connection_string = ‘/dev/ttyUSB0’
#MAV_MODE_AUTO = mavutil.PX4_CUSTOM_MAIN_MODE_ALTCTL
MAV_MODE_AUTO = 1
#https://github.com/PX4/Firmware/blob/master/Tools/mavlink_px4.py

Parse connection argument

parser = argparse.ArgumentParser()
parser.add_argument("-c", “–connect”, help=“connection string”)
args = parser.parse_args()

if args.connect:
connection_string = args.connect

################################################################################################

Init

################################################################################################

Connect to the Vehicle

print “Connecting”
vehicle = connect(connection_string, wait_ready=False, baud=921600)

def PX4setMode(mavMode):
confirmation = 0
mode = 1
custom_mode = mavMode
custom_submodule = 0
vehicle._master.mav.command_long_send(vehicle._master.target_system, vehicle._master.target_component,
mavutil.mavlink.MAV_CMD_DO_SET_MODE,
confirmation,
mode,
custom_mode,
custom_submodule, 0, 0, 0, 0)

def get_location_offset_meters(original_location, dNorth, dEast, alt):
“”"
Returns a LocationGlobal object containing the latitude/longitude dNorth and dEast metres from the
specified original_location. The returned Location adds the entered alt value to the altitude of the original_location.
The function is useful when you want to move the vehicle around specifying locations relative to
the current vehicle position.
The algorithm is relatively accurate over small distances (10m within 1km) except close to the poles.
For more information see:
http://gis.stackexchange.com/questions/2951/algorithm-for-offsetting-a-latitude-longitude-by-some-amount-of-meters
“”"
earth_radius=6378137.0 #Radius of “spherical” earth
#Coordinate offsets in radians
dLat = dNorth/earth_radius
dLon = dEast/(earth_radiusmath.cos(math.pioriginal_location.lat/180))

#New position in decimal degrees
newlat = original_location.lat + (dLat * 180/math.pi)
newlon = original_location.lon + (dLon * 180/math.pi)
return LocationGlobal(newlat, newlon,original_location.alt+alt)

################################################################################################

Listeners

################################################################################################

home_position_set = False

#Create a message listener for home position fix
@vehicle.on_message(‘HOME_POSITION’)
def listener(self, name, home_position):
global home_position_set
home_position_set = True

################################################################################################

Start mission example

################################################################################################

wait for a home position lock

##while not home_position_set:

print “Waiting for home position…”

time.sleep(1)

Display basic vehicle state

print " Type: %s" % vehicle._vehicle_type
print " Armed: %s" % vehicle.armed
print " System status: %s" % vehicle.system_status.state
print " GPS: %s" % vehicle.gps_0
print " Alt: %s" % vehicle.location.global_relative_frame.alt

vehicle.armd = True

Change to AUTO mode

PX4setMode(MAV_MODE_AUTO)
time.sleep(1)
print " Mode: %s" % vehicle.mode

Load commands

cmds = vehicle.commands
cmds.clear()

home = vehicle.location.global_relative_frame

takeoff to 10 meters

wp = get_location_offset_meters(home, 0, 200, 300);
cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmd = Command(0, 0, 0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_TAKEOFF, 0, 0, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmds.add(cmd)

move 10 meters north

wp = get_location_offset_meters(wp, 100, 0, 0);
cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmds.add(cmd)

move 10 meters east

wp = get_location_offset_meters(wp, 0, 100, 0);
cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmds.add(cmd)

move 10 meters south

wp = get_location_offset_meters(wp, -100, 0, 0);
cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmds.add(cmd)

move 10 meters west

wp = get_location_offset_meters(wp, 0, -100, 0);
cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, mavutil.mavlink.MAV_CMD_NAV_WAYPOINT, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmds.add(cmd)

land

#wp = get_location_offset_meters(home, -891, 0, 0);
#cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, #mavutil.mavlink.MAV_CMD_NAV_LAND, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
#cmd = Command(0,0,0, mavutil.mavlink.MAV_FRAME_GLOBAL_RELATIVE_ALT, #mavutil.mavlink.MAV_CMD_NAV_LAND, 0, 1, 0, 0, 0, 0, wp.lat, wp.lon, wp.alt)
cmds.add(cmd)

Upload mission

cmds.upload()
time.sleep(2)

Arm vehicle

vehicle.armed = True

monitor mission execution

nextwaypoint = vehicle.commands.next
while nextwaypoint < len(vehicle.commands):
if vehicle.commands.next > nextwaypoint:
display_seq = vehicle.commands.next+1
print “Moving to waypoint %s” % display_seq
nextwaypoint = vehicle.commands.next
time.sleep(1)

wait for the vehicle to land

while vehicle.commands.next > 0:
time.sleep(1)

Disarm vehicle

vehicle.armed = False
time.sleep(1)

#Close vehicle object before exiting script
vehicle.close()
time.sleep(1)
‘’’

I’m going to tag @sfuhrer here. Hopefully he can help.

@Brian_Duvall I think you could get rid of the "Mission Rejected: landing pattern required” by setting the RTL_TYPE param to 0.

1 Like

Thanks for the reply! This worked I set RTL_TYPE to return home via direct path. I assume that is zero. It was set to return home using landing pattern.

Thanks!

For fixed wing vehicles, RTL_TYPE is defaulted to 1 (return home using landing pattern). This is because this is the safest default option for fixed wing vehicles. In order for this RTL_TYPE to function it requires a landing pattern in the mission which is why you get the warning message.