Paparazzi UAS  v6.2.0_stable
Paparazzi is a free software Unmanned Aircraft System.
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
sim_gps.c
Go to the documentation of this file.
1 /* OCaml binding to link the simulator to autopilot functions. */
2 
3 #include <assert.h>
4 #include <math.h>
5 #include <inttypes.h>
6 
8 #include "generated/airframe.h"
9 #include "generated/flight_plan.h"
10 #include "modules/gps/gps_sim.h"
12 #include "math/pprz_geodetic_int.h"
13 
14 // currently needed for nav_utm_zone0
15 #include "modules/nav/common_nav.h"
16 
17 #include <caml/mlvalues.h>
18 
19 
20 value sim_use_gps_pos(value x, value y, value z, value c, value a, value s, value cl, value t, value m, value lat,
21  value lon)
22 {
23  gps.fix = (Bool_val(m) ? 3 : 0);
24  gps.course = Double_val(c) * 1e7;
26  gps.hmsl = Double_val(a) * 1000.;
28  gps.gspeed = Double_val(s) * 100.;
29  gps.ned_vel.x = gps.gspeed * cos(Double_val(c));
30  gps.ned_vel.y = gps.gspeed * sin(Double_val(c));
31  gps.ned_vel.z = -Double_val(cl) * 100.;
33  gps.week = 0; // FIXME
34  gps.tow = Double_val(t) * 1000.;
35 
36  struct LlaCoor_f lla_f;
37  lla_f.lat = Double_val(lat);
38  lla_f.lon = Double_val(lon);
39  //TODO set alt above ellipsoid, use hmsl for now
40  lla_f.alt = Double_val(a);
41  LLA_BFP_OF_REAL(gps.lla_pos, lla_f);
43 
44  gps.utm_pos.east = Int_val(x);
45  gps.utm_pos.north = Int_val(y);
47  gps.utm_pos.zone = Int_val(z);
49 
51  gps.nb_channels = 7;
52  int i;
53  static int time;
54  time++;
55  for (i = 0; i < gps.nb_channels; i++) {
56  gps.svinfos[i].svid = 7 + i;
57  gps.svinfos[i].elev = (cos(((100 * i) + time) / 100.) + 1) * 45;
58  gps.svinfos[i].azim = (time / gps.nb_channels + 50 * i) % 360;
59  gps.svinfos[i].cno = 40 + sin((time + i * 10) / 100.) * 10.;
60  gps.svinfos[i].flags = ((time / 10) % (i + 1) == 0 ? 0x00 : 0x01);
61  gps.svinfos[i].qi = (int)((time / 1000.) + i) % 8;
62  }
63  gps.pdop = gps.sacc = gps.pacc = 500 + 200 * sin(time / 100.);
64  gps.num_sv = 7;
65 
67 
68  return Val_unit;
69 }
70 
71 /* Second binding required because number of args > 5 */
72 value sim_use_gps_pos_bytecode(value *a, int argn)
73 {
74  assert(argn == 11);
75  return sim_use_gps_pos(a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], a[10]);
76 }
77 
78 void ubxsend_cfg_rst(uint16_t a __attribute__((unused)), uint8_t b __attribute__((unused)))
79 {
80  return;
81 }
82 
struct GpsState gps
global GPS state
Definition: gps.c:69
int16_t azim
azimuth in deg
Definition: gps.h:86
uint32_t tow
GPS time of week in ms.
Definition: gps.h:112
uint8_t qi
quality bitfield (GPS receiver specific)
Definition: gps.h:83
int32_t hmsl
height above mean sea level (MSL) in mm
Definition: gps.h:97
int8_t elev
elevation in deg
Definition: gps.h:85
struct LlaCoor_i lla_pos
position in LLA (lat,lon: deg*1e7; alt: mm over ellipsoid)
Definition: gps.h:95
uint32_t sacc
speed accuracy in cm/s
Definition: gps.h:106
struct UtmCoor_i utm_pos
position in UTM (north,east: cm; alt: mm over MSL)
Definition: gps.h:96
int32_t course
GPS course over ground in rad*1e7, [0, 2*Pi]*1e7 (CW/north)
Definition: gps.h:102
#define GPS_VALID_VEL_NED_BIT
Definition: gps.h:55
uint8_t cno
Carrier to Noise Ratio (Signal Strength) in dbHz.
Definition: gps.h:84
#define GPS_VALID_POS_LLA_BIT
Definition: gps.h:52
uint16_t pdop
position dilution of precision scaled by 100
Definition: gps.h:108
#define GPS_VALID_HMSL_BIT
Definition: gps.h:56
struct NedCoor_i ned_vel
speed NED in cm/s
Definition: gps.h:99
uint8_t svid
Satellite ID.
Definition: gps.h:81
uint8_t nb_channels
Number of scanned satellites.
Definition: gps.h:114
uint32_t pacc
position accuracy in cm
Definition: gps.h:103
uint16_t gspeed
norm of 2d ground speed in cm/s
Definition: gps.h:100
uint8_t valid_fields
bitfield indicating valid fields (GPS_VALID_x_BIT)
Definition: gps.h:91
struct SVinfo svinfos[GPS_NB_CHANNELS]
holds information from the Space Vehicles (Satellites)
Definition: gps.h:115
uint8_t flags
bitfield with GPS receiver specific flags
Definition: gps.h:82
#define GPS_VALID_COURSE_BIT
Definition: gps.h:57
#define GPS_VALID_POS_UTM_BIT
Definition: gps.h:53
uint8_t num_sv
number of sat in fix
Definition: gps.h:109
uint16_t week
GPS week.
Definition: gps.h:111
uint8_t fix
status of fix
Definition: gps.h:110
void gps_sim_publish(void)
Definition: gps_sim.c:30
int32_t alt
in millimeters (above WGS84 reference ellipsoid or above MSL)
int32_t z
Down.
uint8_t zone
UTM zone number.
int32_t y
East.
int32_t east
in centimeters
int32_t x
North.
int32_t north
in centimeters
#define LLA_BFP_OF_REAL(_o, _i)
static uint32_t s
Paparazzi floating point math for geodetic calculations.
float alt
in meters (normally above WGS84 reference ellipsoid)
float lon
in radians
float lat
in radians
vector in Latitude, Longitude and Altitude
Paparazzi fixed point math for geodetic calculations.
void ubxsend_cfg_rst(uint16_t a, uint8_t b)
Definition: sim_gps.c:78
value sim_use_gps_pos(value x, value y, value z, value c, value a, value s, value cl, value t, value m, value lat, value lon)
From airborne/autopilot/.
Definition: sim_gps.c:20
value sim_use_gps_pos_bytecode(value *a, int argn)
Definition: sim_gps.c:72
unsigned short uint16_t
Typedef defining 16 bit unsigned short type.
Definition: vl53l1_types.h:88
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.
Definition: vl53l1_types.h:98
float b
Definition: wedgebug.c:202