1+ using System ;
2+ using System . Collections ;
3+ using System . Collections . Generic ;
4+ using System . Threading . Tasks ;
5+ using UnityEngine ;
6+ using ZO . Util ;
7+
8+ namespace ZO . Sensors {
9+
10+
11+ /// <summary>
12+ /// Altimeter sensor.
13+ ///
14+ /// Notes: Based from Hector Quadrotor. See: https://github.com/udacity/RoboND-QuadRotor-Unity-Simulator/blob/1e71321d95e416bafa5296a229f36404bddc0452/Assets/Scripts/ROS/Hector_Quadrotor/hector_uav_msgs/Altimeter.cs
15+ /// </summary>
16+ public class ZOAltimeter : ZOGameObjectBase {
17+
18+
19+ public const float STANDARD_PRESSURE = 1013.25f ;
20+
21+ public float _QNH = STANDARD_PRESSURE ;
22+
23+ public float QNH {
24+ get => _QNH ;
25+ }
26+
27+ public float _startAltitude = 0.0f ;
28+ public float StartAltitude {
29+ get => _startAltitude ;
30+ }
31+
32+ [ Header ( "Noise Model" ) ]
33+ public ZO . Math . ZOGaussianNoiseModel _noiseModel = new Math . ZOGaussianNoiseModel {
34+ Mean = 0.0 ,
35+ StdDev = 2e-4 ,
36+ BiasMean = 75e-6 ,
37+ BiasStdDev = 8e-08
38+ } ;
39+
40+ /// <summary>
41+ /// Called every frame.
42+ /// Parameters: ZOAltimeter:this, altitude, pressure, qnh
43+ /// </summary>
44+ /// <value></value>
45+ public Func < ZOAltimeter , float , float , float , Task > OnPublishDelegate { get ; set ; }
46+
47+ public float AltitudeMeters {
48+ get ; set ;
49+ }
50+
51+ public static float AltitudeFromPressure ( float pressure , float qnh = ZOAltimeter . STANDARD_PRESSURE ) {
52+ return ( float ) ( 288.15 / 0.0065 * ( 1.0 - System . Math . Pow ( pressure / qnh , 1.0 / 5.255 ) ) ) ;
53+ }
54+
55+ public static float PressureFromAltitude ( float altitude , float qnh = ZOAltimeter . STANDARD_PRESSURE ) {
56+ return ( float ) ( qnh * System . Math . Pow ( 1.0 - ( 0.0065 * altitude ) / 288.15 , 5.255 ) ) ;
57+ }
58+
59+ protected override void ZOStart ( ) {
60+ base . ZOStart ( ) ;
61+ AltitudeMeters = 0.0f ;
62+ }
63+
64+ protected async override void ZOFixedUpdateHzSynchronized ( ) {
65+ base . ZOFixedUpdateHzSynchronized ( ) ;
66+
67+ float altitude = StartAltitude + transform . position . y ;
68+ AltitudeMeters = _noiseModel . Apply ( altitude ) ;
69+
70+ if ( OnPublishDelegate != null ) {
71+ await OnPublishDelegate ( this , AltitudeMeters , PressureFromAltitude ( AltitudeMeters ) , QNH ) ;
72+ }
73+ }
74+
75+ }
76+ }
0 commit comments