#!/bin/sh
################################################################################
# PX4 SITL Configuration for Ehang 184 Airtaxi (Quadcopter) in X-Plane
################################################################################
#
# Aircraft:          Ehang 184 Electric Airtaxi
# Type:              Quadrotor Wide (X configuration)
# Compatible Sim:    X-Plane 11/12
# Rotor Diameter:    5.2m (large manned aircraft)
# MTOW:              ~600kg (2 passengers + batteries)
#
# USAGE:
#   make px4_sitl_default xplane_ehang184
#
# CONFIGURATION NOTES:
# This airframe starts from conservative large-multicopter SITL values focused on:
# - Smooth flight and gentle commanded accelerations
# - Passenger-scale multicopter margins
# - Robust sensor fusion for variable X-Plane FPS
#
# Key values:
# - Barometer noise: 1.0 m to avoid overconfident frame-limited X-Plane fusion
# - Innovation gates: 5.0-10.0 to tolerate simulator timing variability
# - Navigation radii: 12 m horizontal, 2 m vertical for smooth but useful tracking
# - Cruise speed: 6 m/s (~22 km/h)
# - Jerk/acceleration limits kept near PX4-valid comfort-oriented minimums
#
# @name              Ehang 184 X-Plane SITL
# @type              Quadrotor Wide
# @class             Copter
# @maintainer        Alireza Ghaderi <p30planets@gmail.com>
# @url               https://github.com/alireza787b/px4xplane/
. ${R}etc/init.d/rc.mc_defaults


################################################################################
# CONTROL ALLOCATION - Motor Configuration
################################################################################
# Quadcopter X configuration with 5.2m diameter rotors
#
# Motor Layout:        Front
#                        ^
#                    1       0    (CW/CCW)
#                     \     /
#                      \   /
#                       \ /
#                       / \
#                      /   \
#                     /     \
#                    2       3
#
# Motor 0: Front-Right (CCW) - Position: (+1.4, -1.4, 0)m from CG
# Motor 1: Front-Left  (CW)  - Position: (+1.4, +1.4, 0)m from CG
# Motor 2: Rear-Left   (CCW) - Position: (-1.4, -1.4, 0)m from CG
# Motor 3: Rear-Right  (CW)  - Position: (-1.4, +1.4, 0)m from CG
#
# Default thrust and moment coefficients are used unless overridden below.

param set-default CA_ROTOR_COUNT 4

# Motor 0: Front-Right (CCW)
param set-default CA_ROTOR0_PX 1.4
param set-default CA_ROTOR0_PY -1.4
param set-default CA_ROTOR0_KM -0.05

# Motor 1: Front-Left (CW)
param set-default CA_ROTOR1_PX 1.4
param set-default CA_ROTOR1_PY 1.4

# Motor 2: Rear-Left (CCW)
param set-default CA_ROTOR2_PX -1.4
param set-default CA_ROTOR2_PY -1.4

# Motor 3: Rear-Right (CW)
param set-default CA_ROTOR3_PX -1.4
param set-default CA_ROTOR3_PY 1.4
param set-default CA_ROTOR3_KM -0.05

# PWM Output Mapping
param set-default PWM_MAIN_FUNC1 101
param set-default PWM_MAIN_FUNC2 102
param set-default PWM_MAIN_FUNC3 103
param set-default PWM_MAIN_FUNC4 104


################################################################################
# EKF2 SENSOR FUSION
################################################################################
# Optimized for X-Plane SITL with variable FPS (30-150 Hz)
#
# BAROMETER TUNING:
# - BARO_NOISE: 1.0 m, matching the Alia SITL lesson that X-Plane baro should
#   not be treated as centimeter-class when frame timing and physics vary.
# - BARO_GATE: 10.0 (increased from default 3.0)
#   * Tolerates FPS-induced timing gaps and altitude transients
#   * Prevents false "BARO switch" errors during mission climbs
#
# GPS TUNING:
# - GPS_P_NOISE: 0.15 m, kept conservative for this X-Plane model.
#   * Barometer remains the primary smooth height source, but not centimeter-class.
# - Horizontal noise: 0.01m (GPS horizontal is more accurate)
#
# INNOVATION GATES:
# All gates increased from default values for FPS variability tolerance.
# Prevents false sensor faults during:
# - X-Plane FPS drops (timing jitter)
# - Mission altitude changes (pressure transients)
# - Waypoint transitions (acceleration spikes)
#
# TROUBLESHOOTING:
# If "BARO switch" errors occur:
# 1. Verify CAL_BARO1_PRIO=0 (backup sensor disabled)
# 2. Check only one barometer message per frame in px4xplane plugin
# 3. Increase EKF2_BARO_GATE if needed (max 10.0)

# Simulation mode enablement
param set-default SENS_EN_GPSSIM 1
param set-default SENS_EN_BAROSIM 1

# Barometer priority (single sensor for SITL simplicity)
param set-default CAL_BARO0_ID 6620172
param set-default CAL_BARO0_PRIO 100
param set-default CAL_BARO1_ID 6620428
param set-default CAL_BARO1_PRIO 0        # Backup disabled (prevents mid-mission switching)

# EKF2 core configuration
param set-default EKF2_MULTI_IMU 1
param set-default SENS_IMU_MODE 0

# Accelerometer bias estimation for X-Plane SITL.
param set-default EKF2_ABL_LIM 2.5        # X-Plane SITL requires higher tolerance (see note below)
param set-default EKF2_ABL_ACCLIM 35.0
param set-default EKF2_ACC_NOISE 1.0      # Better accelerometer trust
param set-default EKF2_ACC_B_NOISE 0.001  # Accel bias damping for frame-paced SITL updates

# X-PLANE SITL NOTE: EKF2_ABL_LIM = 2.5 (vs Gazebo/jMAVSim default 0.4)
# Required because X-Plane sensor updates are frame-paced and can vary with
# rendering load, which can make EKF2 estimate higher acceleration bias.
# This does NOT affect flight performance - only the preflight arming check.

# Barometer parameters.
param set-default EKF2_BARO_NOISE 1.0     # Baro height noise in m; avoids overconfident fusion during X-Plane transients
param set-default EKF2_BARO_GATE 10.0     # Increased for FPS variability tolerance

# Use neutral simulated accelerometer offsets. The px4xplane bridge publishes
# attitude-consistent HIL accelerometer data, so model-specific calibration
# offsets would corrupt sensor_combined and can trip EKF2 bias checks.
param set-default CAL_ACC0_PRIO 50
param set-default CAL_ACC0_XOFF 0.0
param set-default CAL_ACC0_YOFF 0.0
param set-default CAL_ACC0_ZOFF 0.0

# GPS parameters
param set-default SENS_GPS0_DELAY 10
param set-default SENS_GPS1_DELAY 10
param set-default EKF2_GPS_P_NOISE 1.5    # X-Plane HIL position covariance
param set-default EKF2_GPS_V_NOISE 0.30   # X-Plane HIL velocity covariance for variable-FPS ground/transition phases
param set-default EKF2_GPS_P_GATE 8.0     # Innovation gate

# Magnetometer parameters
param set-default EKF2_MAG_TYPE 1
param set-default EKF2_MAG_GATE 5.0       # Increased for FPS tolerance

# Additional sensors
param set-default EKF2_ASP_DELAY 0.0
param set-default EKF2_AVEL_DELAY 0.0
param set-default EKF2_WIND_NSD 0.01
param set-default EKF2_REQ_VDRIFT 1.0

# IMU configuration
param set-default IMU_GYRO_RATEMAX 200


################################################################################
# MULTICOPTER RATE CONTROL (Inner Loop PID)
################################################################################
# Attitude rate controllers for roll, pitch, yaw.
#
# TUNING GUIDE:
# - P gain: Responsiveness (higher = faster, can cause oscillation)
# - I gain: Steady-state error correction (too high = overshoot)
# - D gain: Damping (reduces oscillation, sensitive to noise)
# - FF: Feedforward (improves tracking, reduces lag)
# - K: Loop gain multiplier
#
# For new airframes:
# 1. Start with these conservative values
# 2. Increase P until slight oscillation, then back off 20-30%
# 3. Add D for damping (typically P/10)
# 4. Add I last (typically P/15)

# Roll rate
param set-default MC_ROLLRATE_I 0.1
param set-default MC_ROLLRATE_D 0.01
param set-default MC_ROLLRATE_K 3.0

# Pitch rate
param set-default MC_PITCHRATE_I 0.1
param set-default MC_PITCHRATE_D 0.01
param set-default MC_PITCHRATE_K 2.05

# Yaw rate
param set-default MC_YAWRATE_P 2
param set-default MC_YAWRATE_I 0
param set-default MC_YAWRATE_FF 0.2
param set-default MC_YAWRATE_K 0.6
param set-default MC_YAWRATE_MAX 100


################################################################################
# MULTICOPTER ATTITUDE CONTROL (Outer Loop)
################################################################################
# Attitude controllers for orientation angles.

param set-default MC_ROLL_P 1.0
param set-default MC_PITCH_P 1.0
param set-default MC_YAW_P 0.6


################################################################################
# POSITION & VELOCITY CONTROL
################################################################################
# Outermost control loops for position and velocity.
#
# LARGE AIRCRAFT TUNING:
# Conservative speeds and gentle accelerations for passenger comfort.

# Position control
param set-default MPC_XY_P 0.05           # Conservative large-multicopter position P
param set-default MPC_Z_P 0.25            # Vertical position P

# Velocity control
param set-default MPC_XY_VEL_P_ACC 1.2
param set-default MPC_XY_VEL_I_ACC 0.2
param set-default MPC_XY_VEL_D_ACC 0.8
param set-default MPC_Z_VEL_P_ACC 3
param set-default MPC_Z_VEL_D_ACC 0.2

# Velocity limits (passenger comfort priority)
param set-default MPC_XY_VEL_MAX 6.5      # Max horizontal (m/s) ~23 km/h
param set-default MPC_Z_V_AUTO_UP 2.0
param set-default MPC_Z_V_AUTO_DN 1.2
param set-default MPC_VEL_MANUAL 5        # Manual horizontal speed below MPC_XY_VEL_MAX

# Trajectory & jerk limits (reduced for smooth ride)
param set-default MPC_ACC_HOR 1.5
param set-default MPC_ACC_HOR_MAX 1.8
param set-default MPC_ACC_UP_MAX 2.0
param set-default MPC_ACC_DOWN_MAX 2.0
param set-default MPC_JERK_AUTO 1.0       # PX4-valid low jerk for smooth auto motion
param set-default MPC_JERK_MAX 2.0        # Smooth manual acceleration changes

# Error limits
param set-default MPC_XY_ERR_MAX 10


################################################################################
# MANUAL FLIGHT MODE
################################################################################
# Manual flight characteristics and feel.

# Tilt & attitude limits
param set-default MPC_MAN_TILT_MAX 25
param set-default MPC_TILTMAX_AIR 30

# Yaw control
param set-default MPC_MAN_Y_MAX 15
param set-default MPC_YAWRAUTO_MAX 20

# Advanced options
param set-default MPC_ALT_MODE 0


################################################################################
# TAKEOFF & LANDING
################################################################################

# Takeoff
param set-default MPC_TKO_SPEED 2.0       # Smooth takeoff climb rate (m/s)

# Landing
param set-default MPC_LAND_ALT1 8         # Start slowing close to ground (m)
param set-default MPC_LAND_ALT2 3         # Final landing speed below this height (m)
param set-default MPC_LAND_SPEED 0.6      # PX4 minimum landing descend rate (m/s)
param set-default MPC_LAND_RADIUS 25
param set-default MPC_LAND_RC_HELP 1

# Land detector
param set-default LNDMC_Z_VEL_MAX 0.24
param set-default COM_DISARM_LAND 1.5


################################################################################
# NAVIGATION & MISSION
################################################################################
# LARGE MULTICOPTER CONFIGURATION
#
# Design philosophy: this X-Plane Ehang-style multicopter is not a small racing
# drone. Parameters prioritize smooth motion and stable commanded response
# over aggressive point capture.
#
# TUNING BY AIRCRAFT SIZE:
# - Small drone (<2kg):       NAV_ACC_RAD=5m,  ALT_RAD=0.8m, JERK=2.0
# - Medium drone (2-25kg):    NAV_ACC_RAD=10m, ALT_RAD=1.5m, JERK=1.5
# - Large multicopter (>100kg): NAV_ACC_RAD=12m, ALT_RAD=2m, JERK=1.0 <-- Current
# - Heavy cargo (>500kg):     NAV_ACC_RAD=50m, ALT_RAD=5m, JERK=0.5

# Mission parameters
param set-default MIS_YAW_ERR 30          # Max yaw error (deg) - gentle corrections
param set-default MIS_YAW_TMT 5

# Navigation acceptance radii
# Large enough for smooth waypoint capture while preserving useful tracking.
param set-default NAV_ACC_RAD 12          # Horizontal acceptance radius (m)
param set-default NAV_MC_ALT_RAD 2        # Vertical acceptance radius (m)

# Return to launch
param set-default RTL_DESCEND_ALT 30


# GPS configuration
param set-default GPS_UBX_DYNMODEL 6      # Airborne <1g

################################################################################
# END OF CONFIGURATION
################################################################################
# Maintainer: px4xplane project - https://github.com/alireza787b/px4xplane/
################################################################################
