Copter: integrate AP_OAPathPlanner
This commit is contained in:
parent
aeb98c7555
commit
709c874d8b
@ -13,6 +13,7 @@
|
|||||||
//#define PROXIMITY_ENABLED DISABLED // disable proximity sensors
|
//#define PROXIMITY_ENABLED DISABLED // disable proximity sensors
|
||||||
//#define AC_RALLY DISABLED // disable rally points library (must also disable terrain which relies on rally)
|
//#define AC_RALLY DISABLED // disable rally points library (must also disable terrain which relies on rally)
|
||||||
//#define AC_AVOID_ENABLED DISABLED // disable stop-at-fence library
|
//#define AC_AVOID_ENABLED DISABLED // disable stop-at-fence library
|
||||||
|
//#define AC_OAPATHPLANNER_ENABLED DISABLED // disable path planning around obstacles
|
||||||
//#define AC_TERRAIN DISABLED // disable terrain library
|
//#define AC_TERRAIN DISABLED // disable terrain library
|
||||||
//#define PARACHUTE DISABLED // disable parachute release to save 1k of flash
|
//#define PARACHUTE DISABLED // disable parachute release to save 1k of flash
|
||||||
//#define NAV_GUIDED DISABLED // disable external navigation computer ability to control vehicle through MAV_CMD_NAV_GUIDED mission commands
|
//#define NAV_GUIDED DISABLED // disable external navigation computer ability to control vehicle through MAV_CMD_NAV_GUIDED mission commands
|
||||||
|
@ -55,7 +55,8 @@ bool AP_Arming_Copter::run_pre_arm_checks(bool display_failure)
|
|||||||
return fence_checks(display_failure)
|
return fence_checks(display_failure)
|
||||||
& parameter_checks(display_failure)
|
& parameter_checks(display_failure)
|
||||||
& motor_checks(display_failure)
|
& motor_checks(display_failure)
|
||||||
& pilot_throttle_checks(display_failure) &
|
& pilot_throttle_checks(display_failure)
|
||||||
|
& oa_checks(display_failure) &
|
||||||
AP_Arming::pre_arm_checks(display_failure);
|
AP_Arming::pre_arm_checks(display_failure);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -285,6 +286,25 @@ bool AP_Arming_Copter::pilot_throttle_checks(bool display_failure)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool AP_Arming_Copter::oa_checks(bool display_failure)
|
||||||
|
{
|
||||||
|
#if AC_OAPATHPLANNER_ENABLED == ENABLED
|
||||||
|
char failure_msg[50];
|
||||||
|
if (copter.g2.oa.pre_arm_check(failure_msg, ARRAY_SIZE(failure_msg))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// display failure
|
||||||
|
if (strlen(failure_msg) == 0) {
|
||||||
|
check_failed(ARMING_CHECK_NONE, display_failure, "%s", "Check Object Avoidance");
|
||||||
|
} else {
|
||||||
|
check_failed(ARMING_CHECK_NONE, display_failure, "%s", failure_msg);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
#else
|
||||||
|
return true;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
bool AP_Arming_Copter::rc_calibration_checks(bool display_failure)
|
bool AP_Arming_Copter::rc_calibration_checks(bool display_failure)
|
||||||
{
|
{
|
||||||
const RC_Channel *channels[] = {
|
const RC_Channel *channels[] = {
|
||||||
|
@ -45,6 +45,7 @@ protected:
|
|||||||
bool parameter_checks(bool display_failure);
|
bool parameter_checks(bool display_failure);
|
||||||
bool motor_checks(bool display_failure);
|
bool motor_checks(bool display_failure);
|
||||||
bool pilot_throttle_checks(bool display_failure);
|
bool pilot_throttle_checks(bool display_failure);
|
||||||
|
bool oa_checks(bool display_failure);
|
||||||
|
|
||||||
void set_pre_arm_check(bool b);
|
void set_pre_arm_check(bool b);
|
||||||
|
|
||||||
|
@ -97,6 +97,10 @@
|
|||||||
#if AC_AVOID_ENABLED == ENABLED
|
#if AC_AVOID_ENABLED == ENABLED
|
||||||
#include <AC_Avoidance/AC_Avoid.h>
|
#include <AC_Avoidance/AC_Avoid.h>
|
||||||
#endif
|
#endif
|
||||||
|
#if AC_OAPATHPLANNER_ENABLED == ENABLED
|
||||||
|
#include <AC_WPNav/AC_WPNav_OA.h>
|
||||||
|
#include <AC_Avoidance/AP_OAPathPlanner.h>
|
||||||
|
#endif
|
||||||
#if SPRAYER_ENABLED == ENABLED
|
#if SPRAYER_ENABLED == ENABLED
|
||||||
# include <AC_Sprayer/AC_Sprayer.h>
|
# include <AC_Sprayer/AC_Sprayer.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -270,12 +270,23 @@ bool GCS_MAVLINK_Copter::try_send_message(enum ap_message id)
|
|||||||
// unused
|
// unused
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_ADSB_VEHICLE:
|
case MSG_ADSB_VEHICLE: {
|
||||||
#if ADSB_ENABLED == ENABLED
|
#if ADSB_ENABLED == ENABLED
|
||||||
CHECK_PAYLOAD_SIZE(ADSB_VEHICLE);
|
CHECK_PAYLOAD_SIZE(ADSB_VEHICLE);
|
||||||
copter.adsb.send_adsb_vehicle(chan);
|
copter.adsb.send_adsb_vehicle(chan);
|
||||||
|
#endif
|
||||||
|
#if AC_OAPATHPLANNER_ENABLED == ENABLED
|
||||||
|
AP_OADatabase *oadb = AP_OADatabase::get_singleton();
|
||||||
|
if (oadb != nullptr) {
|
||||||
|
CHECK_PAYLOAD_SIZE(ADSB_VEHICLE);
|
||||||
|
uint16_t interval_ms = 0;
|
||||||
|
if (get_ap_message_interval(id, interval_ms)) {
|
||||||
|
oadb->send_adsb_vehicle(chan, interval_ms);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return GCS_MAVLINK::try_send_message(id);
|
return GCS_MAVLINK::try_send_message(id);
|
||||||
|
@ -926,6 +926,12 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = {
|
|||||||
// @User: Standard
|
// @User: Standard
|
||||||
AP_GROUPINFO("TUNE_MAX", 32, ParametersG2, tuning_max, 0),
|
AP_GROUPINFO("TUNE_MAX", 32, ParametersG2, tuning_max, 0),
|
||||||
|
|
||||||
|
#if AC_OAPATHPLANNER_ENABLED == ENABLED
|
||||||
|
// @Group: OA_
|
||||||
|
// @Path: ../libraries/AC_Avoidance/AP_OAPathPlanner.cpp
|
||||||
|
AP_SUBGROUPINFO(oa, "OA_", 33, ParametersG2, AP_OAPathPlanner),
|
||||||
|
#endif
|
||||||
|
|
||||||
AP_GROUPEND
|
AP_GROUPEND
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -596,6 +596,11 @@ public:
|
|||||||
|
|
||||||
AP_Float tuning_min;
|
AP_Float tuning_min;
|
||||||
AP_Float tuning_max;
|
AP_Float tuning_max;
|
||||||
|
|
||||||
|
#if AC_OAPATHPLANNER_ENABLED == ENABLED
|
||||||
|
// object avoidance path planning
|
||||||
|
AP_OAPathPlanner oa;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const AP_Param::Info var_info[];
|
extern const AP_Param::Info var_info[];
|
||||||
|
@ -677,6 +677,10 @@
|
|||||||
#define AC_AVOID_ENABLED ENABLED
|
#define AC_AVOID_ENABLED ENABLED
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef AC_OAPATHPLANNER_ENABLED
|
||||||
|
#define AC_OAPATHPLANNER_ENABLED !HAL_MINIMIZE_FEATURES
|
||||||
|
#endif
|
||||||
|
|
||||||
#if AC_AVOID_ENABLED && !PROXIMITY_ENABLED
|
#if AC_AVOID_ENABLED && !PROXIMITY_ENABLED
|
||||||
#error AC_Avoidance relies on PROXIMITY_ENABLED which is disabled
|
#error AC_Avoidance relies on PROXIMITY_ENABLED which is disabled
|
||||||
#endif
|
#endif
|
||||||
|
@ -36,10 +36,12 @@ public:
|
|||||||
virtual bool landing_gear_should_be_deployed() const { return false; }
|
virtual bool landing_gear_should_be_deployed() const { return false; }
|
||||||
virtual bool is_landing() const { return false; }
|
virtual bool is_landing() const { return false; }
|
||||||
|
|
||||||
|
// functions for reporting to GCS
|
||||||
virtual bool get_wp(Location &loc) { return false; };
|
virtual bool get_wp(Location &loc) { return false; };
|
||||||
virtual int32_t wp_bearing() const { return 0; }
|
virtual int32_t wp_bearing() const { return 0; }
|
||||||
virtual uint32_t wp_distance() const { return 0; }
|
virtual uint32_t wp_distance() const { return 0; }
|
||||||
virtual float crosstrack_error() const { return 0.0f;}
|
virtual float crosstrack_error() const { return 0.0f;}
|
||||||
|
|
||||||
void update_navigation();
|
void update_navigation();
|
||||||
|
|
||||||
int32_t get_alt_above_ground_cm(void);
|
int32_t get_alt_above_ground_cm(void);
|
||||||
@ -978,6 +980,9 @@ public:
|
|||||||
bool allows_arming(bool from_gcs) const override { return false; };
|
bool allows_arming(bool from_gcs) const override { return false; };
|
||||||
bool is_autopilot() const override { return true; }
|
bool is_autopilot() const override { return true; }
|
||||||
|
|
||||||
|
// for reporting to GCS
|
||||||
|
bool get_wp(Location &loc) override;
|
||||||
|
|
||||||
RTLState state() { return _state; }
|
RTLState state() { return _state; }
|
||||||
|
|
||||||
// this should probably not be exposed
|
// this should probably not be exposed
|
||||||
@ -993,6 +998,7 @@ protected:
|
|||||||
const char *name() const override { return "RTL"; }
|
const char *name() const override { return "RTL"; }
|
||||||
const char *name4() const override { return "RTL "; }
|
const char *name4() const override { return "RTL "; }
|
||||||
|
|
||||||
|
// for reporting to GCS
|
||||||
uint32_t wp_distance() const override;
|
uint32_t wp_distance() const override;
|
||||||
int32_t wp_bearing() const override;
|
int32_t wp_bearing() const override;
|
||||||
float crosstrack_error() const override { return wp_nav->crosstrack_error();}
|
float crosstrack_error() const override { return wp_nav->crosstrack_error();}
|
||||||
@ -1056,6 +1062,8 @@ protected:
|
|||||||
const char *name() const override { return "SMARTRTL"; }
|
const char *name() const override { return "SMARTRTL"; }
|
||||||
const char *name4() const override { return "SRTL"; }
|
const char *name4() const override { return "SRTL"; }
|
||||||
|
|
||||||
|
// for reporting to GCS
|
||||||
|
bool get_wp(Location &loc) override;
|
||||||
uint32_t wp_distance() const override;
|
uint32_t wp_distance() const override;
|
||||||
int32_t wp_bearing() const override;
|
int32_t wp_bearing() const override;
|
||||||
float crosstrack_error() const override { return wp_nav->crosstrack_error();}
|
float crosstrack_error() const override { return wp_nav->crosstrack_error();}
|
||||||
@ -1233,9 +1241,11 @@ protected:
|
|||||||
|
|
||||||
const char *name() const override { return "FOLLOW"; }
|
const char *name() const override { return "FOLLOW"; }
|
||||||
const char *name4() const override { return "FOLL"; }
|
const char *name4() const override { return "FOLL"; }
|
||||||
|
|
||||||
|
// for reporting to GCS
|
||||||
|
bool get_wp(Location &loc) override;
|
||||||
uint32_t wp_distance() const override;
|
uint32_t wp_distance() const override;
|
||||||
int32_t wp_bearing() const override;
|
int32_t wp_bearing() const override;
|
||||||
bool get_wp(Location &loc) override;
|
|
||||||
|
|
||||||
uint32_t last_log_ms; // system time of last time desired velocity was logging
|
uint32_t last_log_ms; // system time of last time desired velocity was logging
|
||||||
};
|
};
|
||||||
|
@ -607,7 +607,9 @@ bool ModeAuto::get_wp(Location& destination)
|
|||||||
case Auto_NavGuided:
|
case Auto_NavGuided:
|
||||||
return copter.mode_guided.get_wp(destination);
|
return copter.mode_guided.get_wp(destination);
|
||||||
case Auto_WP:
|
case Auto_WP:
|
||||||
return wp_nav->get_wp_destination(destination);
|
return wp_nav->get_oa_wp_destination(destination);
|
||||||
|
case Auto_RTL:
|
||||||
|
return copter.mode_rtl.get_wp(destination);
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -209,7 +209,7 @@ bool ModeGuided::get_wp(Location& destination)
|
|||||||
if (guided_mode != Guided_WP) {
|
if (guided_mode != Guided_WP) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return wp_nav->get_wp_destination(destination);
|
return wp_nav->get_oa_wp_destination(destination);
|
||||||
}
|
}
|
||||||
|
|
||||||
// sets guided mode's target from a Location object
|
// sets guided mode's target from a Location object
|
||||||
|
@ -496,6 +496,24 @@ void ModeRTL::compute_return_target()
|
|||||||
rtl_path.return_target.alt = MAX(rtl_path.return_target.alt, curr_alt);
|
rtl_path.return_target.alt = MAX(rtl_path.return_target.alt, curr_alt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ModeRTL::get_wp(Location& destination)
|
||||||
|
{
|
||||||
|
// provide target in states which use wp_nav
|
||||||
|
switch (_state) {
|
||||||
|
case RTL_Starting:
|
||||||
|
case RTL_InitialClimb:
|
||||||
|
case RTL_ReturnHome:
|
||||||
|
case RTL_LoiterAtHome:
|
||||||
|
case RTL_FinalDescent:
|
||||||
|
return wp_nav->get_oa_wp_destination(destination);
|
||||||
|
case RTL_Land:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we should never get here but just in case
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t ModeRTL::wp_distance() const
|
uint32_t ModeRTL::wp_distance() const
|
||||||
{
|
{
|
||||||
return wp_nav->get_wp_distance_to_destination();
|
return wp_nav->get_wp_distance_to_destination();
|
||||||
|
@ -149,6 +149,23 @@ void ModeSmartRTL::save_position()
|
|||||||
copter.g2.smart_rtl.update(copter.position_ok(), should_save_position);
|
copter.g2.smart_rtl.update(copter.position_ok(), should_save_position);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ModeSmartRTL::get_wp(Location& destination)
|
||||||
|
{
|
||||||
|
// provide target in states which use wp_nav
|
||||||
|
switch (smart_rtl_state) {
|
||||||
|
case SmartRTL_WaitForPathCleanup:
|
||||||
|
case SmartRTL_PathFollow:
|
||||||
|
case SmartRTL_PreLandPosition:
|
||||||
|
case SmartRTL_Descend:
|
||||||
|
return wp_nav->get_wp_destination(destination);
|
||||||
|
case SmartRTL_Land:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we should never get here but just in case
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
uint32_t ModeSmartRTL::wp_distance() const
|
uint32_t ModeSmartRTL::wp_distance() const
|
||||||
{
|
{
|
||||||
return wp_nav->get_wp_distance_to_destination();
|
return wp_nav->get_wp_distance_to_destination();
|
||||||
|
@ -148,6 +148,10 @@ void Copter::init_ardupilot()
|
|||||||
wp_nav->set_terrain(&terrain);
|
wp_nav->set_terrain(&terrain);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if AC_OAPATHPLANNER_ENABLED == ENABLED
|
||||||
|
g2.oa.init();
|
||||||
|
#endif
|
||||||
|
|
||||||
attitude_control->parameter_sanity_check();
|
attitude_control->parameter_sanity_check();
|
||||||
pos_control->set_dt(scheduler.get_loop_period_s());
|
pos_control->set_dt(scheduler.get_loop_period_s());
|
||||||
|
|
||||||
@ -549,7 +553,11 @@ void Copter::allocate_motors(void)
|
|||||||
}
|
}
|
||||||
AP_Param::load_object_from_eeprom(pos_control, pos_control->var_info);
|
AP_Param::load_object_from_eeprom(pos_control, pos_control->var_info);
|
||||||
|
|
||||||
|
#if AC_OAPATHPLANNER_ENABLED == ENABLED
|
||||||
|
wp_nav = new AC_WPNav_OA(inertial_nav, *ahrs_view, *pos_control, *attitude_control);
|
||||||
|
#else
|
||||||
wp_nav = new AC_WPNav(inertial_nav, *ahrs_view, *pos_control, *attitude_control);
|
wp_nav = new AC_WPNav(inertial_nav, *ahrs_view, *pos_control, *attitude_control);
|
||||||
|
#endif
|
||||||
if (wp_nav == nullptr) {
|
if (wp_nav == nullptr) {
|
||||||
AP_HAL::panic("Unable to allocate WPNav");
|
AP_HAL::panic("Unable to allocate WPNav");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user