|
| 1 | +function createFleetBusObjects(N_uav, nSat) |
| 2 | +% createFleetBusObjects - Define bus objects for fleet telemetry |
| 3 | +% |
| 4 | +% Creates bus objects in the base workspace for use by the |
| 5 | +% MultiUAV_DroneShow model. |
| 6 | +% |
| 7 | +% nSat is the number of satellite slots in GNSSObservableBus (default rtk_n_sat's |
| 8 | +% shipped value, 8). It is separate from N_uav because the GNSS interface is a |
| 9 | +% property of the base station, not of the fleet. |
| 10 | + |
| 11 | +if nargin < 2 |
| 12 | + nSat = 8; |
| 13 | +end |
| 14 | + |
| 15 | +%% VehicleStateBus - Per-UAV estimated state |
| 16 | +elems = Simulink.BusElement; |
| 17 | +elems(1).Name = 'Position'; |
| 18 | +elems(1).Dimensions = [3 1]; |
| 19 | +elems(1).DataType = 'double'; |
| 20 | + |
| 21 | +elems(2) = Simulink.BusElement; |
| 22 | +elems(2).Name = 'Velocity'; |
| 23 | +elems(2).Dimensions = [3 1]; |
| 24 | +elems(2).DataType = 'double'; |
| 25 | + |
| 26 | +elems(3) = Simulink.BusElement; |
| 27 | +elems(3).Name = 'Attitude'; |
| 28 | +elems(3).Dimensions = [3 1]; |
| 29 | +elems(3).DataType = 'double'; |
| 30 | + |
| 31 | +elems(4) = Simulink.BusElement; |
| 32 | +elems(4).Name = 'AngularRate'; |
| 33 | +elems(4).Dimensions = [3 1]; |
| 34 | +elems(4).DataType = 'double'; |
| 35 | + |
| 36 | +elems(5) = Simulink.BusElement; |
| 37 | +elems(5).Name = 'PositionAccuracy'; |
| 38 | +elems(5).Dimensions = [1 1]; |
| 39 | +elems(5).DataType = 'double'; |
| 40 | + |
| 41 | +elems(6) = Simulink.BusElement; |
| 42 | +elems(6).Name = 'RTKMode'; |
| 43 | +elems(6).Dimensions = [1 1]; |
| 44 | +elems(6).DataType = 'double'; |
| 45 | + |
| 46 | +VehicleStateBus = Simulink.Bus; |
| 47 | +VehicleStateBus.Elements = elems; |
| 48 | +assignin('base','VehicleStateBus', VehicleStateBus); |
| 49 | + |
| 50 | +%% FleetTelemetryBus - Aggregated fleet state |
| 51 | +elems2 = Simulink.BusElement; |
| 52 | +elems2(1).Name = 'Positions'; |
| 53 | +elems2(1).Dimensions = [N_uav 3]; |
| 54 | +elems2(1).DataType = 'double'; |
| 55 | + |
| 56 | +elems2(2) = Simulink.BusElement; |
| 57 | +elems2(2).Name = 'Velocities'; |
| 58 | +elems2(2).Dimensions = [N_uav 3]; |
| 59 | +elems2(2).DataType = 'double'; |
| 60 | + |
| 61 | +elems2(3) = Simulink.BusElement; |
| 62 | +elems2(3).Name = 'Attitudes'; |
| 63 | +elems2(3).Dimensions = [N_uav 3]; |
| 64 | +elems2(3).DataType = 'double'; |
| 65 | + |
| 66 | +elems2(4) = Simulink.BusElement; |
| 67 | +elems2(4).Name = 'LEDColors'; |
| 68 | +elems2(4).Dimensions = [N_uav 3]; |
| 69 | +elems2(4).DataType = 'double'; |
| 70 | + |
| 71 | +elems2(5) = Simulink.BusElement; |
| 72 | +elems2(5).Name = 'TrackingErrors'; |
| 73 | +elems2(5).Dimensions = [N_uav 1]; |
| 74 | +elems2(5).DataType = 'double'; |
| 75 | + |
| 76 | +elems2(6) = Simulink.BusElement; |
| 77 | +elems2(6).Name = 'MinSeparation'; |
| 78 | +elems2(6).Dimensions = [1 1]; |
| 79 | +elems2(6).DataType = 'double'; |
| 80 | + |
| 81 | +elems2(7) = Simulink.BusElement; |
| 82 | +elems2(7).Name = 'CommStatus'; |
| 83 | +elems2(7).Dimensions = [N_uav 1]; |
| 84 | +elems2(7).DataType = 'double'; |
| 85 | + |
| 86 | +FleetTelemetryBus = Simulink.Bus; |
| 87 | +FleetTelemetryBus.Elements = elems2; |
| 88 | +assignin('base','FleetTelemetryBus', FleetTelemetryBus); |
| 89 | + |
| 90 | +%% MultirotorGuidanceControlBus - Control commands for guidance model (vectorized) |
| 91 | +elems3(1) = Simulink.BusElement; |
| 92 | +elems3(1).Name = 'Roll'; |
| 93 | +elems3(1).Dimensions = [1 N_uav]; |
| 94 | +elems3(1).DataType = 'double'; |
| 95 | + |
| 96 | +elems3(2) = Simulink.BusElement; |
| 97 | +elems3(2).Name = 'Pitch'; |
| 98 | +elems3(2).Dimensions = [1 N_uav]; |
| 99 | +elems3(2).DataType = 'double'; |
| 100 | + |
| 101 | +elems3(3) = Simulink.BusElement; |
| 102 | +elems3(3).Name = 'YawRate'; |
| 103 | +elems3(3).Dimensions = [1 N_uav]; |
| 104 | +elems3(3).DataType = 'double'; |
| 105 | + |
| 106 | +elems3(4) = Simulink.BusElement; |
| 107 | +elems3(4).Name = 'Thrust'; |
| 108 | +elems3(4).Dimensions = [1 N_uav]; |
| 109 | +elems3(4).DataType = 'double'; |
| 110 | + |
| 111 | +MultirotorGuidanceControlBus = Simulink.Bus; |
| 112 | +MultirotorGuidanceControlBus.Elements = elems3; |
| 113 | +assignin('base','MultirotorGuidanceControlBus', MultirotorGuidanceControlBus); |
| 114 | + |
| 115 | +%% MultirotorGuidanceEnvironmentBus - Environment inputs for guidance model (vectorized) |
| 116 | +elems4(1) = Simulink.BusElement; |
| 117 | +elems4(1).Name = 'Gravity'; |
| 118 | +elems4(1).Dimensions = [1 N_uav]; |
| 119 | +elems4(1).DataType = 'double'; |
| 120 | + |
| 121 | +MultirotorGuidanceEnvironmentBus = Simulink.Bus; |
| 122 | +MultirotorGuidanceEnvironmentBus.Elements = elems4; |
| 123 | +assignin('base','MultirotorGuidanceEnvironmentBus', MultirotorGuidanceEnvironmentBus); |
| 124 | + |
| 125 | +%% MultirotorGuidanceStateBus - Output state from guidance model (vectorized) |
| 126 | +elems5(1) = Simulink.BusElement; |
| 127 | +elems5(1).Name = 'WorldPosition'; |
| 128 | +elems5(1).Dimensions = [3 N_uav]; |
| 129 | +elems5(1).DataType = 'double'; |
| 130 | + |
| 131 | +elems5(2) = Simulink.BusElement; |
| 132 | +elems5(2).Name = 'WorldVelocity'; |
| 133 | +elems5(2).Dimensions = [3 N_uav]; |
| 134 | +elems5(2).DataType = 'double'; |
| 135 | + |
| 136 | +elems5(3) = Simulink.BusElement; |
| 137 | +elems5(3).Name = 'EulerZYX'; |
| 138 | +elems5(3).Dimensions = [3 N_uav]; |
| 139 | +elems5(3).DataType = 'double'; |
| 140 | + |
| 141 | +elems5(4) = Simulink.BusElement; |
| 142 | +elems5(4).Name = 'BodyAngularRateRPY'; |
| 143 | +elems5(4).Dimensions = [3 N_uav]; |
| 144 | +elems5(4).DataType = 'double'; |
| 145 | + |
| 146 | +elems5(5) = Simulink.BusElement; |
| 147 | +elems5(5).Name = 'Thrust'; |
| 148 | +elems5(5).Dimensions = [1 N_uav]; |
| 149 | +elems5(5).DataType = 'double'; |
| 150 | + |
| 151 | +MultirotorGuidanceStateBus = Simulink.Bus; |
| 152 | +MultirotorGuidanceStateBus.Elements = elems5; |
| 153 | +assignin('base','MultirotorGuidanceStateBus', MultirotorGuidanceStateBus); |
| 154 | + |
| 155 | +%% GNSSObservableBus - the RTK engine's input contract |
| 156 | +% Defined in gnssObservableBus.m rather than inline, so the definition has one home and any |
| 157 | +% caller can build the same bus into its own model workspace without writing into base. |
| 158 | +% Read that file for the contract: undifferenced, metres, row 1 base and row 2 rover. |
| 159 | +assignin('base', 'GNSSObservableBus', gnssObservableBus(nSat)); |
| 160 | + |
| 161 | +end |
0 commit comments