Statistics
| Branch: | Tag: | Revision:

amiro-os / include / amiro / Constants.h @ 4d54a507

History | View | Annotate | Download (9.935 KB)

1
#ifndef AMIRO_CONSTANTS_H_
2
#define AMIRO_CONSTANTS_H_
3

    
4
/*! \brief Constants regarding the AMiRo platform
5
 *
6
 *  This header contains constant variables
7
 *  regarding the AMiRo platform, which means that
8
 *  these values do not change during runtime.
9
 *  Constants are e.g. physical ones like seconds per minute
10
 *  or geometrical ones like the circumference of wheel.
11
 *  All physical constants (therefore all values with a
12
 *  physical unit) are implicitly in µ iff the variable
13
 *  is of type integer, unless it is explicitly named in
14
 *  the variable.
15
 *  All physical constants (therefore all values with a
16
 *  physical unit) are implicitly without prefix (e.g. µ)
17
 *  iff the variable is of type float, unless it is
18
 *  explicitly named in the variable. The SI prefix is
19
 *  used, iff the variable is of type float and therefor
20
 *  in SI units.
21
 */
22

    
23
#include <math.h>
24
#include <stdint.h>
25

    
26
/* CAN_* defines start */
27

    
28
/** \brief Controller Area Network specific defines
29
 *
30
 * These CAN_* defines are used in ControllerAreaNetworkRx.h
31
 * and ControllerAreaNetworkTx.h
32
 */
33

    
34
/* CAN_* defines end */
35

    
36
namespace amiro {
37

    
38
struct map_state {
39
  // 0 - left, 1- right
40
  uint8_t strategy;
41
  // Node ID of last detected fixpoint
42
  uint8_t current;
43
  // Next node ID
44
  uint8_t next;
45
  // Traveled Distance between current and next in %
46
  uint32_t dist;
47
  // True if the current loaded map is valid
48
  bool valid;
49
  // Length of the currently traveled edge
50
  uint32_t eLength;
51
};
52

    
53
enum msg_content : uint8_t {
54
  MSG_STOP = 0,
55
  MSG_START = 1,
56
  MSG_EDGE_LEFT = 2,
57
  MSG_EDGE_RIGHT = 3,
58
  MSG_FUZZY = 4,
59
  MSG_DOCK = 5,
60
  MSG_UNDOCK = 6,
61
  MSG_CHARGE = 7,
62
  MSG_RESET_ODOMETRY = 8,
63
  MSG_CALIBRATE_BLACK = 9,
64
  MSG_CALIBRATE_WHITE = 10,
65
  MSG_TEST_MAP_STATE = 11,
66
  MSG_SET_DIST_THRESH = 12,
67
  MSG_GET_MAP_INFO = 13
68
};
69

    
70
enum ut_states : int8_t {
71
  UT_IDLE = 0,
72
  UT_FOLLOW_LINE = 1,
73
  UT_DETECT_STATION = 2,
74
  UT_REVERSE = 3,
75
  UT_PUSH_BACK = 4,
76
  UT_CHECK_POSITIONING = 5,
77
  UT_CHECK_VOLTAGE = 6,
78
  UT_CHARGING = 7,
79
  UT_RELEASE = 8,
80
  UT_RELEASE_TO_CORRECT = 9,
81
  UT_CORRECT_POSITIONING = 10,
82
  UT_TURN = 12,
83
  UT_INACTIVE = 13,
84
  UT_CALIBRATION = 14,
85
  UT_CALIBRATION_CHECK = 15,
86
  UT_DEVIATION_CORRECTION = 16,
87
  UT_TEST_MAP_STATE = 17,
88
  UT_TEST_MAP_AUTO_STATE = 18,
89
  UT_DOCKING_ERROR = -1,
90
  UT_REVERSE_TIMEOUT_ERROR = -2,
91
  UT_CALIBRATION_ERROR = -3,
92
  UT_WHITE_DETECTION_ERROR = -4,
93
  UT_PROXY_DETECTION_ERROR = -5,
94
  UT_NO_CHARGING_POWER_ERROR = -6,
95
  UT_UNKNOWN_STATE_ERROR = -7
96
};
97

    
98
namespace CAN {
99

    
100
  const uint32_t UPDATE_PERIOD        = US2ST(10000);  // 100 Hz
101

    
102
  const uint32_t PERIODIC_TIMER_ID         = 1;
103
  const uint32_t RECEIVED_ID               = 2;
104

    
105
  const uint32_t BOARD_ID_SHIFT            = 0x00u;
106
  const uint32_t BOARD_ID_MASK             = 0x07u;
107
  const uint32_t DEVICE_ID_SHIFT           = 0x03u;
108
  const uint32_t DEVICE_ID_MASK            = 0xFFu;
109
  const uint32_t INDEX_ID_SHIFT            = 0x03u;
110
  const uint32_t INDEX_ID_MASK             = 0x07u;
111

    
112
  const uint32_t DI_WHEEL_DRIVE_ID         = 1;
113
  const uint32_t POWER_MANAGEMENT_ID       = 2;
114
  const uint32_t LIGHT_RING_ID             = 3;
115
  const uint32_t COGNITION                 = 4;
116

    
117
  const uint32_t MAGNETOMETER_X_ID         = 0x54;
118
  const uint32_t MAGNETOMETER_Y_ID         = 0x55;
119
  const uint32_t MAGNETOMETER_Z_ID         = 0x56;
120
  const uint32_t GYROSCOPE_ID              = 0x58;
121
  const uint32_t PROXIMITY_FLOOR_ID        = 0x51;
122
  const uint32_t ODOMETRY_ID               = 0x50;
123
  const uint32_t BRIGHTNESS_ID             = 0x40;
124
  inline constexpr uint32_t COLOR_ID(uint32_t index)             {return 0x38 | ((index) & 0x7);}
125
  inline constexpr uint32_t PROXIMITY_RING_ID(uint32_t index)    {return 0x30 | ((index) & 0x7);}
126
  // Charging
127
  const uint32_t REQUEST_CHARGING_OVER_PIN = 0x25;
128

    
129
  // Line following
130
  const uint32_t TRANSMIT_LINE_FOLLOW_STATE= 0x19;
131
  const uint32_t SET_LINE_FOLLOW_MSG       = 0x24;
132
  const uint32_t SET_LINE_FOLLOW_SPEED     = 0x23;
133
  const uint32_t SET_KINEMATIC_CONST_ID    = 0x22;
134
  const uint32_t TARGET_POSITION_ID        = 0x21;
135
  const uint32_t ACTUAL_SPEED_ID           = 0x20;
136
  const uint32_t SET_ODOMETRY_ID           = 0x12;
137
  const uint32_t TARGET_RPM_ID             = 0x11;
138
  const uint32_t TARGET_SPEED_ID           = 0x10;
139
  const uint32_t POWER_STATUS_ID           = 0x60;
140
  const uint32_t ROBOT_ID                  = 0x48;
141
  inline constexpr uint32_t SHELL_QUERY_ID(uint8_t index)        {return 0x70 | ((index) & 0x7);}
142
  inline constexpr uint32_t SHELL_REPLY_ID(uint8_t index)        {return 0x78 | ((index) & 0x7);}
143
  const uint32_t BROADCAST_SHUTDOWN        = 0x80u;
144

    
145
  const uint32_t CALIBRATE_PROXIMITY_FLOOR = 0x81u;
146
  const uint32_t CALIBRATE_PROXIMITY_RING  = 0x82u;
147

    
148
  const uint32_t SHUTDOWN_MAGIC            = 0xAA55u;
149
}
150

    
151
namespace constants {
152

    
153
  /** \brief Amount of seconds per minute */
154
  const int32_t secondsPerMinute = 60;
155

    
156
  /** \brief Amount of minutes per hour */
157
  const int32_t minutesPerHour = 60;
158

    
159
  /** \brief Amount of milliseconds per second */
160
  const int32_t millisecondsPerSecond = 1000;
161

    
162
  /* Several definitions of PI */
163
  constexpr float    PI   = float(M_PI);                /**< PI approximated with single precision floating point */
164
  constexpr uint32_t PIe9 = (M_PI * 1000000000) + 0.5f; /**< PI approximated with 32-bit integer and multiplied by factor 1e9 */
165
  constexpr uint32_t PIe6 = (M_PI * 1000000) + 0.5f;    /**< PI approximated with 32-bit integer and multiplied by factor 1e6 */
166
  constexpr uint16_t PIe3 = (M_PI * 1000) + 0.5f;       /**< PI approximated with 16-bit integer and multiplied by factor 1e3 */
167
  constexpr uint16_t PIe2 = (M_PI * 100) + 0.5f;        /**< PI approximated with 16-bit integer and multiplied by factor 1e2 */
168
  constexpr uint8_t  PIe1 = (M_PI * 10) + 0.5f;         /**< PI approximated with 8-bit integer and multiplied by factor 1e1 */
169
  constexpr uint8_t  PIe0 = (M_PI * 1) + 0.5f;          /**< PI approximated with 8-bit integer and multiplied by factor 1e0 */
170

    
171
namespace LightRing {
172

    
173
  /** \brief Index of the top LEDs
174
   *
175
   * Top view of the AMiRo top LEDs and their indices:
176
   *   _______
177
   *  / 7 F 0 \
178
   * |6       1|
179
   * |5       2|
180
   *  \_4_B_3_/
181
   */
182
  enum ledIndex : uint8_t {
183
    LED_BL = 4, LED_BACK_LEFT = 4, LED_SSW = 4, LED_SOUTH_SOUTHWEST = 4,
184
    LED_LB = 5, LED_LEFT_BACK = 5, LED_WSW = 5, LED_WEST_SOUTHWEST = 5,
185
    LED_LF = 6, LED_LEFT_FRONT = 6, LED_WNW = 6, LED_WEST_NORTHWEST = 6,
186
    LED_FL = 7, LED_FRONT_LEFT = 7, LED_NNW = 7, LED_NORTH_NORTHWEST = 7,
187
    LED_FR = 0, LED_FRONT_RIGHT = 0, LED_NNE = 0, LED_NORTH_NORTHEAST = 0,
188
    LED_RF = 1, LED_RIGHT_FRONT = 1, LED_ENE = 1, LED_EAST_NORTHEAST = 1,
189
    LED_RB = 2, LED_RIGHT_BACK = 2, LED_ESE = 2, LED_EAST_SOUTHEAST = 2,
190
    LED_BR = 3, LED_BACK_RIGHT = 3, LED_SSE = 3, LED_SOUTH_SOUTHEAST = 3
191
  };
192
}
193

    
194
namespace DiWheelDrive {
195

    
196
  /** \brief Distance between wheels in meter */
197
  const float wheelBaseDistanceSI = 0.069f;
198

    
199
  /** \brief Distance between wheels in micrometer */
200
  const int32_t wheelBaseDistance = wheelBaseDistanceSI * 1e6;
201

    
202
  /** \brief Wheel diameter in meter */
203
  const float wheelDiameterSI = 0.05571f;
204

    
205
  /** \brief Wheel diameter */
206
  const int32_t wheelDiameter = wheelDiameterSI * 1e6;
207

    
208
  /** \brief Wheel circumference in meter */
209
  const float wheelCircumferenceSI = M_PI * wheelDiameterSI;
210

    
211
  /** \brief Wheel circumference in micrometer */
212
  const int32_t wheelCircumference = wheelCircumferenceSI * 1e6;
213

    
214
  /** \brief Wheel error in meter (topview left:0, right:1) */
215
  const float wheelErrorSI[2] = {0.1, 0.1};
216

    
217
  /** \brief Wheel error in meter (topview left:0, right:1) */
218
  const int32_t wheelError[2] = {(int32_t) (wheelErrorSI[0] * 1e6), (int32_t) (wheelErrorSI[1] * 1e6)};
219

    
220
  /** \brief Motor increments per revolution
221
   *
222
   *  The increments are produced by 2 channels á 16
223
   *  pulses per revolution with respect to the rising
224
   *  and falling signal => 2*2*16 pulses/revolution.
225
   *  The gearbox is 22:1 => 2*2*16*22 pulses/revolution
226
   */
227
  const int32_t incrementsPerRevolution = 2 * 2 * 16 * 22;
228

    
229
  /** \brief Index of the proximity sensors
230
   *
231
   * Bottom view of the AMiRo sensors and their indices (F:Front, B:Back):
232
   *  _____
233
   * / 0F3 \
234
   * |1   2|
235
   * \__B__/
236
   */
237
  enum proximitySensorIdx : uint8_t {
238
    PROX_WL = 2, PROX_LW = 2, PROX_WHEEL_LEFT = 2, PROX_LEFT_WHEEL = 2,
239
    PROX_FL = 3, PROX_LF = 3, PROX_FRONT_LEFT = 3, PROX_LEFT_FRONT = 3,
240
    PROX_FR = 0, PROX_RF = 0, PROX_FRONT_RIGHT = 0, PROX_RIGHT_FRONT = 0,
241
    PROX_WR = 1, PROX_RW = 1, PROX_WHEEL_RIGHT = 1, PROX_RIGHT_WHEEL = 1,
242
  };
243

    
244
  /** \brief Index of the wheels
245
   *
246
   * Top view of the AMiRo wheels and their indices (F:Front, B:Back):
247
   *   ____
248
   * /| F |\
249
   * |0   1|
250
   * \|_B_|/
251
   */
252
  enum wheelIdx : uint8_t {
253
    WHEEL_L = 0, WHEEL_LEFT = 0, LEFT_WHEEL = 0,
254
    WHEEL_R = 1, WHEEL_RIGHT = 1, RIGHT_WHEEL = 1,
255
  };
256

    
257

    
258
}
259

    
260

    
261

    
262
namespace PowerManagement {
263

    
264
  /** \brief Index of the proximity sensors
265
   *
266
   * Top view of the AMiRo sensors and their indices:
267
   *   _______
268
   *  / 3 F 4 \
269
   * |2       5|
270
   * |1       6|
271
   *  \_0_B_7_/
272
   */
273
  enum proximitySensorIdx : uint8_t {
274
    PROX_BL = 0, PROX_BACK_LEFT = 0, PROX_SSW = 0, PROX_SOUTH_SOUTHWEST = 0,
275
    PROX_LB = 1, PROX_LEFT_BACK = 1, PROX_WSW = 1, PROX_WEST_SOUTHWEST = 1,
276
    PROX_LF = 2, PROX_LEFT_FRONT = 2, PROX_WNW = 2, PROX_WEST_NORTHWEST = 2,
277
    PROX_FL = 3, PROX_FRONT_LEFT = 3, PROX_NNW = 3, PROX_NORTH_NORTHWEST = 3,
278
    PROX_FR = 4, PROX_FRONT_RIGHT = 4, PROX_NNE = 4, PROX_NORTH_NORTHEAST = 4,
279
    PROX_RF = 5, PROX_RIGHT_FRONT = 5, PROX_ENE = 5, PROX_EAST_NORTHEAST = 5,
280
    PROX_RB = 6, PROX_RIGHT_BACK = 6, PROX_ESE = 6, PROX_EAST_SOUTHEAST = 6,
281
    PROX_BR = 7, PROX_BACK_RIGHT = 7, PROX_SSE = 7, PROX_SOUTH_SOUTHEAST = 7
282
  };
283

    
284
  /** \brief Index of the batteries.
285
   *
286
   * The port names are printed on the PCB.
287
   */
288
  enum batteryPortIdx : uint8_t {
289
    BAT_P7 = 0, BAT_A = 0,
290
    BAT_P8 = 1, BAT_B = 1
291
  };
292

    
293
  /** \brief Index of the power monitors.
294
   */
295
  enum powerMonitorIdx : uint8_t {
296
    INA_VDD = 0,
297
    INA_VIO18 = 1,
298
    INA_VIO33 = 2,
299
    INA_VIO42 = 3,
300
    INA_VIO50 = 4
301
  };
302
}
303

    
304
}
305

    
306
}
307

    
308
#endif /* AMIRO_CONSTANTS_H_ */