mirror of
https://gitee.com/xiaohuolufeihua/bizhang_-obav.git
synced 2026-05-22 01:12:31 +00:00
FlightTaskAuto: set heading based on yaw mode
This commit is contained in:
@@ -101,6 +101,7 @@ bool FlightTaskAuto::_evaluateTriplets()
|
|||||||
// takeoff/land was initiated. Until then we do this kind of logic here.
|
// takeoff/land was initiated. Until then we do this kind of logic here.
|
||||||
|
|
||||||
// Check if triplet is valid. There must be at least a valid altitude.
|
// Check if triplet is valid. There must be at least a valid altitude.
|
||||||
|
|
||||||
if (!_sub_triplet_setpoint->get().current.valid || !PX4_ISFINITE(_sub_triplet_setpoint->get().current.alt)) {
|
if (!_sub_triplet_setpoint->get().current.valid || !PX4_ISFINITE(_sub_triplet_setpoint->get().current.alt)) {
|
||||||
// Best we can do is to just set all waypoints to current state and return false.
|
// Best we can do is to just set all waypoints to current state and return false.
|
||||||
_prev_prev_wp = _triplet_prev_wp = _triplet_target = _triplet_next_wp = _position;
|
_prev_prev_wp = _triplet_prev_wp = _triplet_target = _triplet_next_wp = _position;
|
||||||
@@ -191,12 +192,14 @@ bool FlightTaskAuto::_evaluateTriplets()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if yaw target is valid.
|
// set heading
|
||||||
_yaw_setpoint = _sub_triplet_setpoint->get().current.yaw;
|
|
||||||
|
|
||||||
if (_type == WaypointType::follow_target && _sub_triplet_setpoint->get().current.yawspeed_valid) {
|
if (_type == WaypointType::follow_target && _sub_triplet_setpoint->get().current.yawspeed_valid) {
|
||||||
_yawspeed_setpoint = _sub_triplet_setpoint->get().current.yawspeed;
|
_yawspeed_setpoint = _sub_triplet_setpoint->get().current.yawspeed;
|
||||||
_yaw_setpoint = NAN;
|
_yaw_setpoint = NAN;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
_set_heading_from_mode();
|
||||||
|
_yawspeed_setpoint = NAN;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate the current vehicle state and check if it has updated.
|
// Calculate the current vehicle state and check if it has updated.
|
||||||
@@ -210,6 +213,52 @@ bool FlightTaskAuto::_evaluateTriplets()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FlightTaskAuto::_set_heading_from_mode()
|
||||||
|
{
|
||||||
|
|
||||||
|
matrix::Vector2f v; // Vector that points towards desired location
|
||||||
|
|
||||||
|
switch (MPC_YAW_MODE.get()) {
|
||||||
|
|
||||||
|
case 0: { // Heading is set by waypoint.
|
||||||
|
_yaw_setpoint = _sub_triplet_setpoint->get().current.yaw;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 1: { // Heading points towards the current waypoint.
|
||||||
|
v = Vector2f(&_target(0)) - Vector2f(&_position(0));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 2: { // Heading points towards home.
|
||||||
|
if (_sub_home_position->get().valid_hpos) {
|
||||||
|
v = Vector2f(_sub_home_position->get().x, _sub_home_position->get().y) - Vector2f(&_position(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case 3: { // Heading point away from home.
|
||||||
|
if (_sub_home_position->get().valid_hpos) {
|
||||||
|
v = Vector2f(&_position(0)) - Vector2f(_sub_home_position->get().x, _sub_home_position->get().y);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// We only adjust yaw if vehicle is outside of acceptance radius.
|
||||||
|
// This prevents excessive yawing.
|
||||||
|
if (PX4_ISFINITE(v.length()) && v.length() > NAV_ACC_RAD.get()) {
|
||||||
|
v.normalize();
|
||||||
|
// To find yaw: take dot product of x = (1,0) and v
|
||||||
|
// and multiply by the sign given of cross product of x and v.
|
||||||
|
// Dot product: (x(0)*v(0)+(x(1)*v(1)) = v(0)
|
||||||
|
// Cross product: x(0)*v(1) - v(0)*x(1) = v(1)
|
||||||
|
_yaw_setpoint = math::sign(v(1)) * wrap_pi(acosf(v(0)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool FlightTaskAuto::_isFinite(const position_setpoint_s sp)
|
bool FlightTaskAuto::_isFinite(const position_setpoint_s sp)
|
||||||
{
|
{
|
||||||
return (PX4_ISFINITE(sp.lat) && PX4_ISFINITE(sp.lon) && PX4_ISFINITE(sp.alt));
|
return (PX4_ISFINITE(sp.lat) && PX4_ISFINITE(sp.lon) && PX4_ISFINITE(sp.alt));
|
||||||
|
|||||||
Reference in New Issue
Block a user