Browse Source

Implement altitude acceptance radius

sbg
sander 9 years ago committed by Lorenz Meier
parent
commit
e4f20f98cd
  1. 13
      src/modules/navigator/mission_block.cpp
  2. 9
      src/modules/navigator/navigator.h
  3. 14
      src/modules/navigator/navigator_main.cpp
  4. 30
      src/modules/navigator/navigator_params.c

13
src/modules/navigator/mission_block.cpp

@ -167,13 +167,13 @@ MissionBlock::is_mission_item_reached()
&& _navigator->get_vstatus()->is_rotary_wing) { && _navigator->get_vstatus()->is_rotary_wing) {
/* require only altitude for takeoff for multicopter, do not use waypoint acceptance radius */ /* require only altitude for takeoff for multicopter, do not use waypoint acceptance radius */
if (_navigator->get_global_position()->alt > if (_navigator->get_global_position()->alt >
altitude_amsl - _navigator->get_acceptance_radius()) { altitude_amsl - _navigator->get_altitude_acceptance_radius()) {
_waypoint_position_reached = true; _waypoint_position_reached = true;
} }
} else if (_mission_item.nav_cmd == NAV_CMD_TAKEOFF) { } else if (_mission_item.nav_cmd == NAV_CMD_TAKEOFF) {
/* for takeoff mission items use the parameter for the takeoff acceptance radius */ /* for takeoff mission items use the parameter for the takeoff acceptance radius */
if (dist >= 0.0f && dist <= _navigator->get_acceptance_radius() if (dist >= 0.0f && dist <= _navigator->get_acceptance_radius()
&& dist_z <= _navigator->get_default_acceptance_radius()) { && dist_z <= _navigator->get_altitude_acceptance_radius()) {
_waypoint_position_reached = true; _waypoint_position_reached = true;
} }
} else if (!_navigator->get_vstatus()->is_rotary_wing && } else if (!_navigator->get_vstatus()->is_rotary_wing &&
@ -186,7 +186,7 @@ MissionBlock::is_mission_item_reached()
* radius (+ some margin). Time inside and turn count is handled elsewhere. * radius (+ some margin). Time inside and turn count is handled elsewhere.
*/ */
if (dist >= 0.0f && dist <= _navigator->get_acceptance_radius(_mission_item.loiter_radius * 1.2f) if (dist >= 0.0f && dist <= _navigator->get_acceptance_radius(_mission_item.loiter_radius * 1.2f)
&& dist_z <= _navigator->get_default_acceptance_radius()) { && dist_z <= _navigator->get_altitude_acceptance_radius()) {
_waypoint_position_reached = true; _waypoint_position_reached = true;
} else { } else {
@ -214,7 +214,7 @@ MissionBlock::is_mission_item_reached()
&dist_xy, &dist_z); &dist_xy, &dist_z);
if (dist >= 0.0f && dist <= _navigator->get_acceptance_radius(_mission_item.loiter_radius * 1.2f) if (dist >= 0.0f && dist <= _navigator->get_acceptance_radius(_mission_item.loiter_radius * 1.2f)
&& dist_z <= _navigator->get_default_acceptance_radius()) { && dist_z <= _navigator->get_altitude_acceptance_radius()) {
// now set the loiter to the final altitude in the NAV_CMD_LOITER_TO_ALT mission item // now set the loiter to the final altitude in the NAV_CMD_LOITER_TO_ALT mission item
curr_sp->alt = altitude_amsl; curr_sp->alt = altitude_amsl;
@ -223,7 +223,7 @@ MissionBlock::is_mission_item_reached()
} else { } else {
if (dist >= 0.0f && dist <= _navigator->get_acceptance_radius(_mission_item.loiter_radius * 1.2f) if (dist >= 0.0f && dist <= _navigator->get_acceptance_radius(_mission_item.loiter_radius * 1.2f)
&& dist_z <= _navigator->get_default_acceptance_radius()) { && dist_z <= _navigator->get_altitude_acceptance_radius()) {
_waypoint_position_reached = true; _waypoint_position_reached = true;
@ -253,7 +253,8 @@ MissionBlock::is_mission_item_reached()
} }
if (dist >= 0.0f && dist <= mission_acceptance_radius if (dist >= 0.0f && dist <= mission_acceptance_radius
&& dist_z <= _navigator->get_default_acceptance_radius()) { && dist_z <= _navigator->get_altitude_acceptance_radius()) {
printf("reached acrad: %f \n", (double)_navigator->get_altitude_acceptance_radius());
_waypoint_position_reached = true; _waypoint_position_reached = true;
} }
} }

9
src/modules/navigator/navigator.h

@ -166,6 +166,13 @@ public:
*/ */
float get_acceptance_radius(); float get_acceptance_radius();
/**
* Get the altitude acceptance radius
*
* @return the distance from the target altitude before considering the waypoint reached
*/
float get_altitude_acceptance_radius();
/** /**
* Get the cruising speed * Get the cruising speed
* *
@ -285,6 +292,8 @@ private:
control::BlockParamFloat _param_loiter_radius; /**< loiter radius for fixedwing */ control::BlockParamFloat _param_loiter_radius; /**< loiter radius for fixedwing */
control::BlockParamFloat _param_acceptance_radius; /**< acceptance for takeoff */ control::BlockParamFloat _param_acceptance_radius; /**< acceptance for takeoff */
control::BlockParamFloat _param_fw_alt_acceptance_radius; /**< acceptance radius for fixedwing altitude */
control::BlockParamFloat _param_mc_alt_acceptance_radius; /**< acceptance radius for multicopter altitude */
control::BlockParamInt _param_datalinkloss_act; /**< select data link loss action */ control::BlockParamInt _param_datalinkloss_act; /**< select data link loss action */
control::BlockParamInt _param_rcloss_act; /**< select data link loss action */ control::BlockParamInt _param_rcloss_act; /**< select data link loss action */

14
src/modules/navigator/navigator_main.cpp

@ -155,6 +155,8 @@ Navigator::Navigator() :
_follow_target(this, "TAR"), _follow_target(this, "TAR"),
_param_loiter_radius(this, "LOITER_RAD"), _param_loiter_radius(this, "LOITER_RAD"),
_param_acceptance_radius(this, "ACC_RAD"), _param_acceptance_radius(this, "ACC_RAD"),
_param_fw_alt_acceptance_radius(this, "FW_ALT_RAD"),
_param_mc_alt_acceptance_radius(this, "MC_ALT_RAD"),
_param_datalinkloss_act(this, "DLL_ACT"), _param_datalinkloss_act(this, "DLL_ACT"),
_param_rcloss_act(this, "RCL_ACT"), _param_rcloss_act(this, "RCL_ACT"),
_param_cruising_speed_hover(this, "MPC_XY_CRUISE", false), _param_cruising_speed_hover(this, "MPC_XY_CRUISE", false),
@ -723,6 +725,18 @@ Navigator::get_acceptance_radius()
return get_acceptance_radius(_param_acceptance_radius.get()); return get_acceptance_radius(_param_acceptance_radius.get());
} }
float
Navigator::get_altitude_acceptance_radius()
{
if (!this->get_vstatus()->is_rotary_wing) {
return _param_fw_alt_acceptance_radius.get();
} else {
return _param_mc_alt_acceptance_radius.get();
}
}
float float
Navigator::get_cruising_speed() Navigator::get_cruising_speed()
{ {

30
src/modules/navigator/navigator_params.c

@ -58,7 +58,7 @@ PARAM_DEFINE_FLOAT(NAV_LOITER_RAD, 50.0f);
* Acceptance Radius * Acceptance Radius
* *
* Default acceptance radius, overridden by acceptance radius of waypoint if set. * Default acceptance radius, overridden by acceptance radius of waypoint if set.
* For fixed wing NAV_ACC_RAD is the vertical acceptance, as the L1 turning distance is used for horizontal acceptance. * For fixed wing the L1 turning distance is used for horizontal acceptance.
* *
* @unit m * @unit m
* @min 0.05 * @min 0.05
@ -69,6 +69,34 @@ PARAM_DEFINE_FLOAT(NAV_LOITER_RAD, 50.0f);
*/ */
PARAM_DEFINE_FLOAT(NAV_ACC_RAD, 10.0f); PARAM_DEFINE_FLOAT(NAV_ACC_RAD, 10.0f);
/**
* FW Altitude Acceptance Radius
*
* Acceptance radius for fixedwing altitude.
*
* @unit m
* @min 0.05
* @max 200.0
* @decimal 1
* @increment 0.5
* @group Mission
*/
PARAM_DEFINE_FLOAT(NAV_FW_ALT_RAD, 10.0f);
/**
* MC Altitude Acceptance Radius
*
* Acceptance radius for multicopter altitude.
*
* @unit m
* @min 0.05
* @max 200.0
* @decimal 1
* @increment 0.5
* @group Mission
*/
PARAM_DEFINE_FLOAT(NAV_MC_ALT_RAD, 3.0f);
/** /**
* Set data link loss failsafe mode * Set data link loss failsafe mode
* *

Loading…
Cancel
Save