mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-06-13 19:00:05 +08:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 21b4052d82 | |||
| 8296d02b1e | |||
| e3db31f5ab |
@@ -70,27 +70,28 @@ CameraFeedback::Run()
|
|||||||
|
|
||||||
camera_trigger_s trig{};
|
camera_trigger_s trig{};
|
||||||
|
|
||||||
while (_trigger_sub.update(&trig)) {
|
vehicle_attitude_s att{};
|
||||||
|
|
||||||
|
while (_att_sub.update(&att)) {
|
||||||
// update geotagging subscriptions
|
// update geotagging subscriptions
|
||||||
vehicle_global_position_s gpos{};
|
vehicle_global_position_s gpos{};
|
||||||
_gpos_sub.copy(&gpos);
|
_gpos_sub.copy(&gpos);
|
||||||
|
|
||||||
vehicle_attitude_s att{};
|
|
||||||
_att_sub.copy(&att);
|
_att_sub.copy(&att);
|
||||||
|
_trigger_sub.copy(&trig);
|
||||||
|
|
||||||
if (trig.timestamp == 0 ||
|
// if (trig.timestamp == 0 ||
|
||||||
gpos.timestamp == 0 ||
|
// gpos.timestamp == 0 ||
|
||||||
att.timestamp == 0) {
|
// att.timestamp == 0) {
|
||||||
|
|
||||||
// reject until we have valid data
|
// // reject until we have valid data
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if ((_cam_cap_fback >= 1) && !trig.feedback) {
|
// if ((_cam_cap_fback >= 1) && !trig.feedback) {
|
||||||
// Ignore triggers that are not feedback when camera capture feedback is enabled
|
// // Ignore triggers that are not feedback when camera capture feedback is enabled
|
||||||
continue;
|
// continue;
|
||||||
}
|
// }
|
||||||
|
|
||||||
camera_capture_s capture{};
|
camera_capture_s capture{};
|
||||||
|
|
||||||
|
|||||||
@@ -709,8 +709,24 @@ FixedwingPositionControl::set_control_mode_current(const hrt_abstime &now)
|
|||||||
|
|
||||||
_skipping_takeoff_detection = false;
|
_skipping_takeoff_detection = false;
|
||||||
|
|
||||||
if (((_control_mode.flag_control_auto_enabled && _control_mode.flag_control_position_enabled) ||
|
if (_control_mode.flag_control_offboard_enabled && _position_setpoint_current_valid) {
|
||||||
_control_mode.flag_control_offboard_enabled) && _position_setpoint_current_valid) {
|
if (_control_mode.flag_control_position_enabled) {
|
||||||
|
if (PX4_ISFINITE(_pos_sp_triplet.current.vx) && PX4_ISFINITE(_pos_sp_triplet.current.vy)
|
||||||
|
&& PX4_ISFINITE(_pos_sp_triplet.current.vz)) {
|
||||||
|
// Offboard position with velocity setpoints
|
||||||
|
_control_mode_current = FW_POSCTRL_MODE_AUTO_PATH;
|
||||||
|
return;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Offboard position setpoint only
|
||||||
|
_control_mode_current = FW_POSCTRL_MODE_AUTO;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((_control_mode.flag_control_auto_enabled && _control_mode.flag_control_position_enabled)
|
||||||
|
&& _position_setpoint_current_valid) {
|
||||||
|
|
||||||
if (_pos_sp_triplet.current.type == position_setpoint_s::SETPOINT_TYPE_TAKEOFF) {
|
if (_pos_sp_triplet.current.type == position_setpoint_s::SETPOINT_TYPE_TAKEOFF) {
|
||||||
|
|
||||||
@@ -1097,17 +1113,7 @@ FixedwingPositionControl::control_auto_position(const float control_interval, co
|
|||||||
_npfg.setAirspeedNom(target_airspeed * _eas2tas);
|
_npfg.setAirspeedNom(target_airspeed * _eas2tas);
|
||||||
_npfg.setAirspeedMax(_param_fw_airspd_max.get() * _eas2tas);
|
_npfg.setAirspeedMax(_param_fw_airspd_max.get() * _eas2tas);
|
||||||
|
|
||||||
if (_control_mode.flag_control_offboard_enabled && PX4_ISFINITE(pos_sp_curr.vx) && PX4_ISFINITE(pos_sp_curr.vy)) {
|
navigateWaypoints(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed, _wind_vel);
|
||||||
// Navigate directly on position setpoint and path tangent
|
|
||||||
matrix::Vector2f velocity_2d(pos_sp_curr.vx, pos_sp_curr.vy);
|
|
||||||
float curvature = PX4_ISFINITE(_pos_sp_triplet.current.loiter_radius) ? 1 / _pos_sp_triplet.current.loiter_radius :
|
|
||||||
0.0f;
|
|
||||||
navigatePathTangent(curr_pos_local, curr_wp_local, velocity_2d.normalized(), ground_speed,
|
|
||||||
_wind_vel, curvature);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
navigateWaypoints(prev_wp_local, curr_wp_local, curr_pos_local, ground_speed, _wind_vel);
|
|
||||||
}
|
|
||||||
|
|
||||||
_att_sp.roll_body = _npfg.getRollSetpoint();
|
_att_sp.roll_body = _npfg.getRollSetpoint();
|
||||||
target_airspeed = _npfg.getAirspeedRef() / _eas2tas;
|
target_airspeed = _npfg.getAirspeedRef() / _eas2tas;
|
||||||
@@ -1282,6 +1288,57 @@ FixedwingPositionControl::control_auto_loiter(const float control_interval, cons
|
|||||||
_param_climbrate_target.get());
|
_param_climbrate_target.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
FixedwingPositionControl::control_auto_path(const float control_interval, const Vector2d &curr_pos,
|
||||||
|
const Vector2f &ground_speed, const position_setpoint_s &pos_sp_curr)
|
||||||
|
{
|
||||||
|
|
||||||
|
float tecs_fw_thr_min;
|
||||||
|
float tecs_fw_thr_max;
|
||||||
|
|
||||||
|
if (pos_sp_curr.gliding_enabled) {
|
||||||
|
/* enable gliding with this waypoint */
|
||||||
|
_tecs.set_speed_weight(2.0f);
|
||||||
|
tecs_fw_thr_min = 0.0;
|
||||||
|
tecs_fw_thr_max = 0.0;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
tecs_fw_thr_min = _param_fw_thr_min.get();
|
||||||
|
tecs_fw_thr_max = _param_fw_thr_max.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
// waypoint is a plain navigation waypoint
|
||||||
|
float target_airspeed = adapt_airspeed_setpoint(control_interval, pos_sp_curr.cruising_speed,
|
||||||
|
_param_fw_airspd_min.get(), ground_speed);
|
||||||
|
|
||||||
|
Vector2f curr_pos_local{_local_pos.x, _local_pos.y};
|
||||||
|
Vector2f curr_wp_local = _global_local_proj_ref.project(pos_sp_curr.lat, pos_sp_curr.lon);
|
||||||
|
|
||||||
|
_npfg.setAirspeedNom(target_airspeed * _eas2tas);
|
||||||
|
_npfg.setAirspeedMax(_param_fw_airspd_max.get() * _eas2tas);
|
||||||
|
|
||||||
|
// Navigate directly on position setpoint and path tangent
|
||||||
|
matrix::Vector2f velocity_2d(pos_sp_curr.vx, pos_sp_curr.vy);
|
||||||
|
float curvature = PX4_ISFINITE(_pos_sp_triplet.current.loiter_radius) ? 1 / _pos_sp_triplet.current.loiter_radius :
|
||||||
|
0.0f;
|
||||||
|
navigatePathTangent(curr_pos_local, curr_wp_local, velocity_2d.normalized(), ground_speed, _wind_vel, curvature);
|
||||||
|
|
||||||
|
_att_sp.roll_body = _npfg.getRollSetpoint();
|
||||||
|
target_airspeed = _npfg.getAirspeedRef() / _eas2tas;
|
||||||
|
|
||||||
|
_att_sp.yaw_body = _yaw; // yaw is not controlled, so set setpoint to current yaw
|
||||||
|
|
||||||
|
tecs_update_pitch_throttle(control_interval,
|
||||||
|
pos_sp_curr.alt,
|
||||||
|
target_airspeed,
|
||||||
|
radians(_param_fw_p_lim_min.get()),
|
||||||
|
radians(_param_fw_p_lim_max.get()),
|
||||||
|
tecs_fw_thr_min,
|
||||||
|
tecs_fw_thr_max,
|
||||||
|
_param_sinkrate_target.get(),
|
||||||
|
_param_climbrate_target.get());
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
FixedwingPositionControl::control_auto_takeoff(const hrt_abstime &now, const float control_interval,
|
FixedwingPositionControl::control_auto_takeoff(const hrt_abstime &now, const float control_interval,
|
||||||
const Vector2d &global_position, const Vector2f &ground_speed, const position_setpoint_s &pos_sp_curr)
|
const Vector2d &global_position, const Vector2f &ground_speed, const position_setpoint_s &pos_sp_curr)
|
||||||
@@ -2345,6 +2402,11 @@ FixedwingPositionControl::Run()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case FW_POSCTRL_MODE_AUTO_PATH: {
|
||||||
|
control_auto_path(control_interval, curr_pos, ground_speed, _pos_sp_triplet.current);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case FW_POSCTRL_MODE_AUTO_TAKEOFF: {
|
case FW_POSCTRL_MODE_AUTO_TAKEOFF: {
|
||||||
control_auto_takeoff(_local_pos.timestamp, control_interval, curr_pos, ground_speed, _pos_sp_triplet.current);
|
control_auto_takeoff(_local_pos.timestamp, control_interval, curr_pos, ground_speed, _pos_sp_triplet.current);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -243,6 +243,7 @@ private:
|
|||||||
FW_POSCTRL_MODE_AUTO_TAKEOFF,
|
FW_POSCTRL_MODE_AUTO_TAKEOFF,
|
||||||
FW_POSCTRL_MODE_AUTO_LANDING_STRAIGHT,
|
FW_POSCTRL_MODE_AUTO_LANDING_STRAIGHT,
|
||||||
FW_POSCTRL_MODE_AUTO_LANDING_CIRCULAR,
|
FW_POSCTRL_MODE_AUTO_LANDING_CIRCULAR,
|
||||||
|
FW_POSCTRL_MODE_AUTO_PATH,
|
||||||
FW_POSCTRL_MODE_MANUAL_POSITION,
|
FW_POSCTRL_MODE_MANUAL_POSITION,
|
||||||
FW_POSCTRL_MODE_MANUAL_ALTITUDE,
|
FW_POSCTRL_MODE_MANUAL_ALTITUDE,
|
||||||
FW_POSCTRL_MODE_OTHER
|
FW_POSCTRL_MODE_OTHER
|
||||||
@@ -585,6 +586,18 @@ private:
|
|||||||
void control_auto_loiter(const float control_interval, const Vector2d &curr_pos, const Vector2f &ground_speed,
|
void control_auto_loiter(const float control_interval, const Vector2d &curr_pos, const Vector2f &ground_speed,
|
||||||
const position_setpoint_s &pos_sp_prev, const position_setpoint_s &pos_sp_curr, const position_setpoint_s &pos_sp_next);
|
const position_setpoint_s &pos_sp_prev, const position_setpoint_s &pos_sp_curr, const position_setpoint_s &pos_sp_next);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Vehicle control for following a path.
|
||||||
|
*
|
||||||
|
* @param control_interval Time since last position control call [s]
|
||||||
|
* @param curr_pos Current 2D local position vector of vehicle [m]
|
||||||
|
* @param ground_speed Local 2D ground speed of vehicle [m/s]
|
||||||
|
* @param pos_sp_prev previous position setpoint
|
||||||
|
* @param pos_sp_curr current position setpoint
|
||||||
|
*/
|
||||||
|
void control_auto_path(const float control_interval, const Vector2d &curr_pos, const Vector2f &ground_speed,
|
||||||
|
const position_setpoint_s &pos_sp_curr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Controls a desired airspeed, bearing, and height rate.
|
* @brief Controls a desired airspeed, bearing, and height rate.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ void LoggedTopics::add_default_topics()
|
|||||||
add_topic("airspeed", 1000);
|
add_topic("airspeed", 1000);
|
||||||
add_optional_topic("airspeed_validated", 200);
|
add_optional_topic("airspeed_validated", 200);
|
||||||
add_optional_topic("autotune_attitude_control_status", 100);
|
add_optional_topic("autotune_attitude_control_status", 100);
|
||||||
add_optional_topic("camera_capture");
|
add_topic("camera_capture");
|
||||||
add_optional_topic("camera_trigger");
|
add_optional_topic("camera_trigger");
|
||||||
add_topic("cellular_status", 200);
|
add_topic("cellular_status", 200);
|
||||||
add_topic("commander_state");
|
add_topic("commander_state");
|
||||||
|
|||||||
Reference in New Issue
Block a user