mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-02-21 07:13:56 -04:00
Rover: add SmartRTL mode
called at 3hz from scheduler
This commit is contained in:
parent
86ce3f2b32
commit
e38cefea8a
@ -72,6 +72,7 @@ const AP_Scheduler::Task Rover::scheduler_tasks[] = {
|
|||||||
SCHED_TASK(update_trigger, 50, 600),
|
SCHED_TASK(update_trigger, 50, 600),
|
||||||
SCHED_TASK(gcs_failsafe_check, 10, 600),
|
SCHED_TASK(gcs_failsafe_check, 10, 600),
|
||||||
SCHED_TASK(compass_accumulate, 50, 900),
|
SCHED_TASK(compass_accumulate, 50, 900),
|
||||||
|
SCHED_TASK(smart_rtl_update, 3, 100),
|
||||||
SCHED_TASK(update_notify, 50, 300),
|
SCHED_TASK(update_notify, 50, 300),
|
||||||
SCHED_TASK(one_second_loop, 1, 3000),
|
SCHED_TASK(one_second_loop, 1, 3000),
|
||||||
SCHED_TASK(compass_cal_update, 50, 100),
|
SCHED_TASK(compass_cal_update, 50, 100),
|
||||||
|
@ -241,7 +241,7 @@ const AP_Param::Info Rover::var_info[] = {
|
|||||||
|
|
||||||
// @Param: MODE1
|
// @Param: MODE1
|
||||||
// @DisplayName: Mode1
|
// @DisplayName: Mode1
|
||||||
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,15:Guided
|
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,12:SmartRTL,15:Guided
|
||||||
// @User: Standard
|
// @User: Standard
|
||||||
// @Description: Driving mode for switch position 1 (910 to 1230 and above 2049)
|
// @Description: Driving mode for switch position 1 (910 to 1230 and above 2049)
|
||||||
GSCALAR(mode1, "MODE1", MANUAL),
|
GSCALAR(mode1, "MODE1", MANUAL),
|
||||||
@ -249,35 +249,35 @@ const AP_Param::Info Rover::var_info[] = {
|
|||||||
// @Param: MODE2
|
// @Param: MODE2
|
||||||
// @DisplayName: Mode2
|
// @DisplayName: Mode2
|
||||||
// @Description: Driving mode for switch position 2 (1231 to 1360)
|
// @Description: Driving mode for switch position 2 (1231 to 1360)
|
||||||
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,15:Guided
|
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,12:SmartRTL,15:Guided
|
||||||
// @User: Standard
|
// @User: Standard
|
||||||
GSCALAR(mode2, "MODE2", MANUAL),
|
GSCALAR(mode2, "MODE2", MANUAL),
|
||||||
|
|
||||||
// @Param: MODE3
|
// @Param: MODE3
|
||||||
// @DisplayName: Mode3
|
// @DisplayName: Mode3
|
||||||
// @Description: Driving mode for switch position 3 (1361 to 1490)
|
// @Description: Driving mode for switch position 3 (1361 to 1490)
|
||||||
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,15:Guided
|
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,12:SmartRTL,15:Guided
|
||||||
// @User: Standard
|
// @User: Standard
|
||||||
GSCALAR(mode3, "MODE3", MANUAL),
|
GSCALAR(mode3, "MODE3", MANUAL),
|
||||||
|
|
||||||
// @Param: MODE4
|
// @Param: MODE4
|
||||||
// @DisplayName: Mode4
|
// @DisplayName: Mode4
|
||||||
// @Description: Driving mode for switch position 4 (1491 to 1620)
|
// @Description: Driving mode for switch position 4 (1491 to 1620)
|
||||||
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,15:Guided
|
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,12:SmartRTL,15:Guided
|
||||||
// @User: Standard
|
// @User: Standard
|
||||||
GSCALAR(mode4, "MODE4", MANUAL),
|
GSCALAR(mode4, "MODE4", MANUAL),
|
||||||
|
|
||||||
// @Param: MODE5
|
// @Param: MODE5
|
||||||
// @DisplayName: Mode5
|
// @DisplayName: Mode5
|
||||||
// @Description: Driving mode for switch position 5 (1621 to 1749)
|
// @Description: Driving mode for switch position 5 (1621 to 1749)
|
||||||
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,15:Guided
|
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,12:SmartRTL,15:Guided
|
||||||
// @User: Standard
|
// @User: Standard
|
||||||
GSCALAR(mode5, "MODE5", MANUAL),
|
GSCALAR(mode5, "MODE5", MANUAL),
|
||||||
|
|
||||||
// @Param: MODE6
|
// @Param: MODE6
|
||||||
// @DisplayName: Mode6
|
// @DisplayName: Mode6
|
||||||
// @Description: Driving mode for switch position 6 (1750 to 2049)
|
// @Description: Driving mode for switch position 6 (1750 to 2049)
|
||||||
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,15:Guided
|
// @Values: 0:Manual,1:Acro,3:Steering,4:Hold,10:Auto,11:RTL,12:SmartRTL,15:Guided
|
||||||
// @User: Standard
|
// @User: Standard
|
||||||
GSCALAR(mode6, "MODE6", MANUAL),
|
GSCALAR(mode6, "MODE6", MANUAL),
|
||||||
|
|
||||||
@ -513,6 +513,10 @@ const AP_Param::GroupInfo ParametersG2::var_info[] = {
|
|||||||
// @User: Standard
|
// @User: Standard
|
||||||
AP_GROUPINFO("ACRO_TURN_RATE", 12, ParametersG2, acro_turn_rate, 180.0f),
|
AP_GROUPINFO("ACRO_TURN_RATE", 12, ParametersG2, acro_turn_rate, 180.0f),
|
||||||
|
|
||||||
|
// @Group: SRTL_
|
||||||
|
// @Path: ../libraries/AP_SmartRTL/AP_SmartRTL.cpp
|
||||||
|
AP_SUBGROUPINFO(smart_rtl, "SRTL_", 13, ParametersG2, AP_SmartRTL),
|
||||||
|
|
||||||
AP_GROUPEND
|
AP_GROUPEND
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -524,7 +528,8 @@ ParametersG2::ParametersG2(void)
|
|||||||
#endif
|
#endif
|
||||||
beacon(rover.serial_manager),
|
beacon(rover.serial_manager),
|
||||||
motors(rover.ServoRelayEvents),
|
motors(rover.ServoRelayEvents),
|
||||||
attitude_control(rover.ahrs)
|
attitude_control(rover.ahrs),
|
||||||
|
smart_rtl(rover.ahrs)
|
||||||
{
|
{
|
||||||
AP_Param::setup_object_defaults(this, var_info);
|
AP_Param::setup_object_defaults(this, var_info);
|
||||||
}
|
}
|
||||||
|
@ -319,6 +319,9 @@ public:
|
|||||||
|
|
||||||
// acro mode turn rate maximum
|
// acro mode turn rate maximum
|
||||||
AP_Float acro_turn_rate;
|
AP_Float acro_turn_rate;
|
||||||
|
|
||||||
|
// Safe RTL library
|
||||||
|
AP_SmartRTL smart_rtl;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const AP_Param::Info var_info[];
|
extern const AP_Param::Info var_info[];
|
||||||
|
@ -67,6 +67,7 @@
|
|||||||
#include <AP_VisualOdom/AP_VisualOdom.h>
|
#include <AP_VisualOdom/AP_VisualOdom.h>
|
||||||
#include <AP_WheelEncoder/AP_WheelEncoder.h>
|
#include <AP_WheelEncoder/AP_WheelEncoder.h>
|
||||||
#include <APM_Control/AR_AttitudeControl.h>
|
#include <APM_Control/AR_AttitudeControl.h>
|
||||||
|
#include <AP_SmartRTL/AP_SmartRTL.h>
|
||||||
#include <DataFlash/DataFlash.h>
|
#include <DataFlash/DataFlash.h>
|
||||||
#include <Filter/AverageFilter.h> // Mode Filter from Filter library
|
#include <Filter/AverageFilter.h> // Mode Filter from Filter library
|
||||||
#include <Filter/Butter.h> // Filter library - butterworth filter
|
#include <Filter/Butter.h> // Filter library - butterworth filter
|
||||||
@ -111,6 +112,7 @@ public:
|
|||||||
friend class ModeSteering;
|
friend class ModeSteering;
|
||||||
friend class ModeManual;
|
friend class ModeManual;
|
||||||
friend class ModeRTL;
|
friend class ModeRTL;
|
||||||
|
friend class ModeSmartRTL;
|
||||||
|
|
||||||
Rover(void);
|
Rover(void);
|
||||||
|
|
||||||
@ -384,6 +386,7 @@ private:
|
|||||||
ModeAuto mode_auto;
|
ModeAuto mode_auto;
|
||||||
ModeSteering mode_steering;
|
ModeSteering mode_steering;
|
||||||
ModeRTL mode_rtl;
|
ModeRTL mode_rtl;
|
||||||
|
ModeSmartRTL mode_smartrtl;
|
||||||
|
|
||||||
// cruise throttle and speed learning
|
// cruise throttle and speed learning
|
||||||
struct {
|
struct {
|
||||||
@ -568,6 +571,7 @@ private:
|
|||||||
void change_arm_state(void);
|
void change_arm_state(void);
|
||||||
bool arm_motors(AP_Arming::ArmingMethod method);
|
bool arm_motors(AP_Arming::ArmingMethod method);
|
||||||
bool disarm_motors(void);
|
bool disarm_motors(void);
|
||||||
|
void smart_rtl_update();
|
||||||
|
|
||||||
// test.cpp
|
// test.cpp
|
||||||
void print_hit_enter();
|
void print_hit_enter();
|
||||||
|
@ -24,6 +24,9 @@ Mode *Rover::control_mode_from_num(const enum mode num)
|
|||||||
case RTL:
|
case RTL:
|
||||||
ret = &mode_rtl;
|
ret = &mode_rtl;
|
||||||
break;
|
break;
|
||||||
|
case SMART_RTL:
|
||||||
|
ret = &mode_smartrtl;
|
||||||
|
break;
|
||||||
case GUIDED:
|
case GUIDED:
|
||||||
ret = &mode_guided;
|
ret = &mode_guided;
|
||||||
break;
|
break;
|
||||||
|
@ -33,6 +33,7 @@ enum mode {
|
|||||||
HOLD = 4,
|
HOLD = 4,
|
||||||
AUTO = 10,
|
AUTO = 10,
|
||||||
RTL = 11,
|
RTL = 11,
|
||||||
|
SMART_RTL = 12,
|
||||||
GUIDED = 15,
|
GUIDED = 15,
|
||||||
INITIALISING = 16
|
INITIALISING = 16
|
||||||
};
|
};
|
||||||
|
@ -338,6 +338,40 @@ protected:
|
|||||||
bool _enter() override;
|
bool _enter() override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ModeSmartRTL : public Mode
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
uint32_t mode_number() const override { return SMART_RTL; }
|
||||||
|
const char *name4() const override { return "SRTL"; }
|
||||||
|
|
||||||
|
// methods that affect movement of the vehicle in this mode
|
||||||
|
void update() override;
|
||||||
|
|
||||||
|
// attributes of the mode
|
||||||
|
bool is_autopilot_mode() const override { return true; }
|
||||||
|
bool failsafe_throttle_suppress() const override { return false; }
|
||||||
|
|
||||||
|
float get_distance_to_destination() const override { return _distance_to_destination; }
|
||||||
|
bool reached_destination() override { return smart_rtl_state == SmartRTL_StopAtHome; }
|
||||||
|
|
||||||
|
// save current position for use by the smart_rtl flight mode
|
||||||
|
void save_position(bool save_pos);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Safe RTL states
|
||||||
|
enum SmartRTLState {
|
||||||
|
SmartRTL_WaitForPathCleanup,
|
||||||
|
SmartRTL_PathFollow,
|
||||||
|
SmartRTL_StopAtHome,
|
||||||
|
SmartRTL_Failure
|
||||||
|
} smart_rtl_state;
|
||||||
|
|
||||||
|
bool _enter() override;
|
||||||
|
bool _load_point;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class ModeSteering : public Mode
|
class ModeSteering : public Mode
|
||||||
{
|
{
|
||||||
|
79
APMrover2/mode_smart_rtl.cpp
Normal file
79
APMrover2/mode_smart_rtl.cpp
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
#include "mode.h"
|
||||||
|
#include "Rover.h"
|
||||||
|
|
||||||
|
bool ModeSmartRTL::_enter()
|
||||||
|
{
|
||||||
|
// SmartRTL requires EKF (not DCM)
|
||||||
|
Location ekf_origin;
|
||||||
|
if (!ahrs.get_origin(ekf_origin)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// refuse to enter SmartRTL if smart RTL's home has not been set
|
||||||
|
if (!g2.smart_rtl.is_active()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// RTL never reverses
|
||||||
|
rover.set_reverse(false);
|
||||||
|
|
||||||
|
// init state
|
||||||
|
smart_rtl_state = SmartRTL_WaitForPathCleanup;
|
||||||
|
_reached_destination = false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ModeSmartRTL::update()
|
||||||
|
{
|
||||||
|
switch (smart_rtl_state) {
|
||||||
|
case SmartRTL_WaitForPathCleanup:
|
||||||
|
// check if return path is computed and if yes, begin journey home
|
||||||
|
if (g2.smart_rtl.request_thorough_cleanup()) {
|
||||||
|
smart_rtl_state = SmartRTL_PathFollow;
|
||||||
|
_load_point = true;
|
||||||
|
}
|
||||||
|
// Note: this may lead to an unnecessary 20ms slow down of the vehicle (but it is unlikely)
|
||||||
|
stop_vehicle();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SmartRTL_PathFollow:
|
||||||
|
// load point if required
|
||||||
|
if (_load_point) {
|
||||||
|
Vector3f next_point;
|
||||||
|
if (!g2.smart_rtl.pop_point(next_point)) {
|
||||||
|
// if not more points, we have reached home
|
||||||
|
gcs().send_text(MAV_SEVERITY_INFO, "Reached destination");
|
||||||
|
smart_rtl_state = SmartRTL_StopAtHome;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
_load_point = false;
|
||||||
|
// set target destination to new point
|
||||||
|
if (!set_desired_location_NED(next_point)) {
|
||||||
|
gcs().send_text(MAV_SEVERITY_INFO, "SmartRTL: failed to set destination");
|
||||||
|
smart_rtl_state = SmartRTL_Failure;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// check if we've reached the next point
|
||||||
|
_distance_to_destination = get_distance(rover.current_loc, _destination);
|
||||||
|
if (_distance_to_destination <= rover.g.waypoint_radius || location_passed_point(rover.current_loc, _origin, _destination)) {
|
||||||
|
_load_point = true;
|
||||||
|
}
|
||||||
|
// continue driving towards destination
|
||||||
|
calc_steering_to_waypoint(_origin, _destination);
|
||||||
|
calc_throttle(calc_reduced_speed_for_turn_or_distance(_desired_speed), true);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SmartRTL_StopAtHome:
|
||||||
|
case SmartRTL_Failure:
|
||||||
|
_reached_destination = true;
|
||||||
|
stop_vehicle();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// save current position for use by the smart_rtl flight mode
|
||||||
|
void ModeSmartRTL::save_position(bool save_pos)
|
||||||
|
{
|
||||||
|
g2.smart_rtl.update(true, save_pos);
|
||||||
|
}
|
@ -133,6 +133,8 @@ void Rover::init_ardupilot()
|
|||||||
// give AHRS the range beacon sensor
|
// give AHRS the range beacon sensor
|
||||||
ahrs.set_beacon(&g2.beacon);
|
ahrs.set_beacon(&g2.beacon);
|
||||||
|
|
||||||
|
// initialize SmartRTL
|
||||||
|
g2.smart_rtl.init();
|
||||||
|
|
||||||
init_capabilities();
|
init_capabilities();
|
||||||
|
|
||||||
@ -332,6 +334,9 @@ bool Rover::arm_motors(AP_Arming::ArmingMethod method)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reset SmartRTL return location. If activated, SmartRTL will ultimately try to land at this point
|
||||||
|
g2.smart_rtl.reset_path(true);
|
||||||
|
|
||||||
change_arm_state();
|
change_arm_state();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -354,3 +359,10 @@ bool Rover::disarm_motors(void)
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// save current position for use by the smart_rtl mode
|
||||||
|
void Rover::smart_rtl_update()
|
||||||
|
{
|
||||||
|
const bool save_position = hal.util->get_soft_armed() && (control_mode != &mode_smartrtl);
|
||||||
|
mode_smartrtl.save_position(save_position);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user