amiro-os / devices / DiWheelDrive / userthread.hpp @ a0033dcb
History | View | Annotate | Download (3.348 KB)
| 1 | 58fe0e0b | Thomas Schöpping | #ifndef AMIRO_USERTHREAD_H_
|
|---|---|---|---|
| 2 | #define AMIRO_USERTHREAD_H_
|
||
| 3 | |||
| 4 | #include <ch.hpp> |
||
| 5 | #include <amiroosconf.h> |
||
| 6 | 181f2892 | galberding | #include <amiro/Color.h> |
| 7 | 05d54823 | galberding | |
| 8 | 181f2892 | galberding | |
| 9 | // Speed when driving towards the docking station
|
||
| 10 | #define CHARGING_SPEED 5 |
||
| 11 | 61544eee | galberding | #define DETECTION_SPEED 10 |
| 12 | #define DIST_THRESH 100 |
||
| 13 | #define RELEASE_COUNT 200 |
||
| 14 | 181f2892 | galberding | // Thresh to determain how much update steps should pass while alining
|
| 15 | 61544eee | galberding | #define MAX_CORRECTION_STEPS 300 |
| 16 | 181f2892 | galberding | // Thresh for wheel proxy sensors, when summed values fall below the state changes
|
| 17 | #define PROXY_WHEEL_THRESH 18000 |
||
| 18 | e2002d0e | galberding | // Thresh for detecting obsticles
|
| 19 | 61544eee | galberding | #define PROXY_RING_THRESH 15000 |
| 20 | 27d4e1fa | galberding | |
| 21 | fbcb25cc | galberding | #define PUSH_BACK_COUNT 5 |
| 22 | 181f2892 | galberding | // Thresh for how long (update steps) the front sensors are allowed to detect white
|
| 23 | 61544eee | galberding | #define WHITE_COUNT_THRESH 150 |
| 24 | 181f2892 | galberding | // Rotation around 180 degrees in microradian
|
| 25 | #define ROTATION_180 3141592 |
||
| 26 | // Rotation around -20 degrees in microradian
|
||
| 27 | #define ROTATION_20 -349065 |
||
| 28 | #define ROTATION_DURATION 10000 |
||
| 29 | |||
| 30 | 61544eee | galberding | #define RING_PROX_FRONT_THRESH 18000 |
| 31 | #define PROX_MAX_VAL 65430 |
||
| 32 | 58fe0e0b | Thomas Schöpping | |
| 33 | 27d4e1fa | galberding | // Threshold for failing to dock
|
| 34 | #define DOCKING_ERROR_THRESH 4 |
||
| 35 | |||
| 36 | 58fe0e0b | Thomas Schöpping | namespace amiro {
|
| 37 | |||
| 38 | 181f2892 | galberding | |
| 39 | 58fe0e0b | Thomas Schöpping | class UserThread : public chibios_rt::BaseStaticThread<USER_THREAD_STACK_SIZE> |
| 40 | {
|
||
| 41 | 181f2892 | galberding | |
| 42 | // Messages which can be received and trigger state changes
|
||
| 43 | public:
|
||
| 44 | enum msg_content{
|
||
| 45 | STOP, |
||
| 46 | START, |
||
| 47 | EDGE_LEFT, |
||
| 48 | EDGE_RIGHT, |
||
| 49 | FUZZY, |
||
| 50 | DOCK, |
||
| 51 | UNDOCK, |
||
| 52 | CHARGE |
||
| 53 | }; |
||
| 54 | |||
| 55 | // States of user thread state machine
|
||
| 56 | 27d4e1fa | galberding | enum states : uint8_t{
|
| 57 | IDLE = 0,
|
||
| 58 | FOLLOW_LINE = 1,
|
||
| 59 | DETECT_STATION = 2,
|
||
| 60 | REVERSE = 3,
|
||
| 61 | PUSH_BACK = 4,
|
||
| 62 | CHECK_POSITIONING = 5,
|
||
| 63 | CHECK_VOLTAGE = 6,
|
||
| 64 | CHARGING = 7,
|
||
| 65 | RELEASE = 8,
|
||
| 66 | RELEASE_TO_CORRECT = 9,
|
||
| 67 | CORRECT_POSITIONING = 10,
|
||
| 68 | fbcb25cc | galberding | ERROR = 11,
|
| 69 | TURN =12
|
||
| 70 | 181f2892 | galberding | }; |
| 71 | |||
| 72 | 27d4e1fa | galberding | struct ut_counter{
|
| 73 | int whiteCount = 0; |
||
| 74 | int proxyCount = 0; |
||
| 75 | fbcb25cc | galberding | // int correctionCount = 0;
|
| 76 | 27d4e1fa | galberding | int errorCount = 0; |
| 77 | fbcb25cc | galberding | int idleCount = 0; |
| 78 | int stepCount = 0; |
||
| 79 | 27d4e1fa | galberding | }; |
| 80 | 181f2892 | galberding | |
| 81 | 27d4e1fa | galberding | // static const struct ut_counter emptyUtCount;
|
| 82 | ut_counter utCount; |
||
| 83 | 181f2892 | galberding | |
| 84 | 58fe0e0b | Thomas Schöpping | explicit UserThread();
|
| 85 | |||
| 86 | virtual ~UserThread();
|
||
| 87 | |||
| 88 | virtual msg_t main();
|
||
| 89 | 181f2892 | galberding | |
| 90 | private:
|
||
| 91 | void setRpmSpeed(const int (&rpmSpeed)[2]); |
||
| 92 | c9fa414d | galberding | void setRpmSpeedFuzzy(const int (&rpmSpeed)[2]); |
| 93 | 181f2892 | galberding | void lightOneLed(Color color, int idx); |
| 94 | void lightAllLeds(Color color);
|
||
| 95 | /**
|
||
| 96 | * Uses light ring indicate the state of charge.
|
||
| 97 | */
|
||
| 98 | void showChargingState();
|
||
| 99 | void checkForMotion();
|
||
| 100 | bool checkPinVoltage();
|
||
| 101 | bool checkPinEnabled();
|
||
| 102 | c9fa414d | galberding | int getProxyRingSum();
|
| 103 | fbcb25cc | galberding | |
| 104 | /**
|
||
| 105 | * Returns true when front sensors reaching high values
|
||
| 106 | * and all others are low. This indicates that the loading station is ahead.
|
||
| 107 | * If other sensores are blocked too, indicates that someone grabs the robot.
|
||
| 108 | */
|
||
| 109 | bool checkFrontalObject();
|
||
| 110 | c9fa414d | galberding | |
| 111 | fbcb25cc | galberding | states utState = states::IDLE; |
| 112 | states newState = states::IDLE; |
||
| 113 | bool continue_on_obstacle = true; |
||
| 114 | 181f2892 | galberding | /**
|
| 115 | * Check if current position changes when the wheel are deactivated.
|
||
| 116 | *
|
||
| 117 | * When AMiRo drives towards the loading station, it stops when a specific marker is reached.
|
||
| 118 | * In order to validate that the AMiRo is correctly positioned in the loading station
|
||
| 119 | * the wheels are turned off. When the position remains the same the docking procedure
|
||
| 120 | * was successful (return 1) otherwise a correction is needed (return 0).
|
||
| 121 | */
|
||
| 122 | int checkDockingSuccess();
|
||
| 123 | 58fe0e0b | Thomas Schöpping | }; |
| 124 | |||
| 125 | } // end of namespace amiro
|
||
| 126 | |||
| 127 | #endif // AMIRO_USERTHREAD_H_ |