amiro-os / devices / DiWheelDrive / userthread.cpp @ 3c3c3bb9
History | View | Annotate | Download (36.732 KB)
1 | d4c6efa9 | galberding | #include "userthread.hpp" |
---|---|---|---|
2 | 3c3c3bb9 | galberding | #include "amiro/Constants.h" |
3 | e404e6c0 | galberding | #include "amiro_map.hpp" |
4 | d02c536e | galberding | #include "global.hpp" |
5 | #include "linefollow.hpp" |
||
6 | e404e6c0 | galberding | |
7 | 58fe0e0b | Thomas Schöpping | using namespace amiro; |
8 | |||
9 | extern Global global;
|
||
10 | |||
11 | // a buffer for the z-value of the accelerometer
|
||
12 | int16_t accel_z; |
||
13 | 5d138bca | galberding | bool running = false; |
14 | 58fe0e0b | Thomas Schöpping | |
15 | |||
16 | 181f2892 | galberding | /**
|
17 | * Set speed.
|
||
18 | 8dced1c9 | galberding | *
|
19 | 181f2892 | galberding | * @param rpmSpeed speed for left and right wheel in rounds/min
|
20 | */
|
||
21 | c9fa414d | galberding | void UserThread::setRpmSpeedFuzzy(const int (&rpmSpeed)[2]) { |
22 | 5d138bca | galberding | global.motorcontrol.setTargetRPM(rpmSpeed[constants::DiWheelDrive::LEFT_WHEEL] * 1000000, rpmSpeed[constants::DiWheelDrive::RIGHT_WHEEL] * 1000000); |
23 | 58fe0e0b | Thomas Schöpping | } |
24 | |||
25 | c9fa414d | galberding | void UserThread::setRpmSpeed(const int (&rpmSpeed)[2]) { |
26 | global.motorcontrol.setTargetRPM(rpmSpeed[constants::DiWheelDrive::LEFT_WHEEL], rpmSpeed[constants::DiWheelDrive::RIGHT_WHEEL]); |
||
27 | } |
||
28 | |||
29 | 181f2892 | galberding | void UserThread::lightOneLed(Color color, int idx){ |
30 | 5d138bca | galberding | global.robot.setLightColor(idx, Color(color)); |
31 | } |
||
32 | 58fe0e0b | Thomas Schöpping | |
33 | 181f2892 | galberding | void UserThread::lightAllLeds(Color color){
|
34 | 5d138bca | galberding | int led = 0; |
35 | for(led=0; led<8; led++){ |
||
36 | lightOneLed(color, led); |
||
37 | } |
||
38 | 58fe0e0b | Thomas Schöpping | } |
39 | |||
40 | 181f2892 | galberding | void UserThread::showChargingState(){
|
41 | uint8_t numLeds = global.robot.getPowerStatus().state_of_charge / 12;
|
||
42 | Color color = Color::GREEN; |
||
43 | if (numLeds <= 2){ |
||
44 | color = Color::RED; |
||
45 | }else if(numLeds <= 6){ |
||
46 | color = Color::YELLOW; |
||
47 | } |
||
48 | for (int i=0; i<numLeds; i++){ |
||
49 | lightOneLed(color, i); |
||
50 | this->sleep(300); |
||
51 | 9c46b728 | galberding | } |
52 | 181f2892 | galberding | this->sleep(1000); |
53 | lightAllLeds(Color::BLACK); |
||
54 | 9c46b728 | galberding | } |
55 | |||
56 | 10bf9cc0 | galberding | void UserThread::chargeAsLED(){
|
57 | uint8_t numLeds = global.robot.getPowerStatus().state_of_charge / 12;
|
||
58 | Color color = Color::GREEN; |
||
59 | if (numLeds <= 2){ |
||
60 | color = Color::RED; |
||
61 | }else if(numLeds <= 6){ |
||
62 | color = Color::YELLOW; |
||
63 | } |
||
64 | for (int i=0; i<numLeds; i++){ |
||
65 | lightOneLed(color, i); |
||
66 | // this->sleep(300);
|
||
67 | } |
||
68 | // this->sleep(1000);
|
||
69 | // lightAllLeds(Color::BLACK);
|
||
70 | } |
||
71 | |||
72 | // ----------------------------------------------------------------
|
||
73 | |||
74 | void UserThread::getProxySectorVals(uint16_t (&proxVals)[8], uint16_t (&sProx)[8]){ |
||
75 | for (int i=0; i<8; i++){ |
||
76 | sProx[i] = (proxVals[i] < proxVals[(i+1) % 8]) ? proxVals[i] : proxVals[(i+1) % 8]; |
||
77 | // chprintf((BaseSequentialStream*)&global.sercanmux1, "%d: %d, ", i, sProx[i]);
|
||
78 | 8dced1c9 | galberding | |
79 | 10bf9cc0 | galberding | } |
80 | // chprintf((BaseSequentialStream*)&global.sercanmux1, "\n");
|
||
81 | |||
82 | } |
||
83 | |||
84 | |||
85 | void UserThread::getMaxFrontSectorVal(uint16_t (&sProx)[8], int32_t &sPMax){ |
||
86 | for (int i=2; i<5; i++){ |
||
87 | sPMax = (sPMax < sProx[i]) ? sProx[i] : sPMax; |
||
88 | } |
||
89 | } |
||
90 | |||
91 | void UserThread::proxSectorSpeedCorrection(int (&rpmSpeed)[2], uint16_t (&proxVals)[8]){ |
||
92 | int i;
|
||
93 | uint16_t sProx[8];
|
||
94 | int32_t sPMax = 0;
|
||
95 | getProxySectorVals(proxVals, sProx); |
||
96 | getMaxFrontSectorVal(sProx, sPMax); |
||
97 | 8dced1c9 | galberding | |
98 | 10bf9cc0 | galberding | int32_t speedL = rpmSpeed[0] - (sPMax * pCtrl.pFactor);
|
99 | int32_t speedR = rpmSpeed[1] - (sPMax * pCtrl.pFactor);
|
||
100 | |||
101 | |||
102 | |||
103 | if(sPMax > pCtrl.threshMid){
|
||
104 | rpmSpeed[0] = 0; |
||
105 | rpmSpeed[1] = 0; |
||
106 | pCtrl.staticCont++; |
||
107 | }else if((speedL > 0) || (speedR > 0)){ |
||
108 | pCtrl.staticCont = 0;
|
||
109 | rpmSpeed[0] = speedL;
|
||
110 | rpmSpeed[1] = speedR;
|
||
111 | }else{
|
||
112 | rpmSpeed[0] = 4000000 + (rpmSpeed[0] - global.rpmForward[0] * 1000000); |
||
113 | rpmSpeed[1] = 4000000 + (rpmSpeed[1] - global.rpmForward[0] * 1000000); |
||
114 | } |
||
115 | |||
116 | for(i=4; i<5; i++){ |
||
117 | if ((proxVals[i] > pCtrl.threshMid) && (proxVals[i+1] > pCtrl.threshLow)){ |
||
118 | rpmSpeed[0] = -5000000 ; |
||
119 | rpmSpeed[1] = -5000000 ; |
||
120 | // pCtrl.staticCont++;
|
||
121 | break;
|
||
122 | } |
||
123 | } |
||
124 | chargeAsLED(); |
||
125 | 8dced1c9 | galberding | |
126 | 10bf9cc0 | galberding | // chprintf((BaseSequentialStream*)&global.sercanmux1, "Max: %d factor: %d, Panel: %d SpeedL: %d SpeedR: %d ActualL: %d ActualR: %d\n",sPMax, pCtrl.pFactor, sPMax * pCtrl.pFactor, speedL, speedR, rpmSpeed[0], rpmSpeed[1]);
|
127 | |||
128 | |||
129 | } |
||
130 | // -------------------------------------------------------------------
|
||
131 | |||
132 | |||
133 | void UserThread::preventCollision( int (&rpmSpeed)[2], uint16_t (&proxVals)[8]) { |
||
134 | |||
135 | if((proxVals[3] > pCtrl.threshLow) || (proxVals[4] > pCtrl.threshLow)){ |
||
136 | rpmSpeed[0] = rpmSpeed[0] / 2; |
||
137 | rpmSpeed[1] = rpmSpeed[1] / 2; |
||
138 | } |
||
139 | |||
140 | if((proxVals[3] > pCtrl.threshMid) || (proxVals[4] > pCtrl.threshMid)){ |
||
141 | d4c6efa9 | galberding | rpmSpeed[0] = rpmSpeed[0] / 3; |
142 | rpmSpeed[1] = rpmSpeed[1] / 3; |
||
143 | 10bf9cc0 | galberding | } |
144 | |||
145 | if((proxVals[3] > pCtrl.threshHigh) || (proxVals[4] > pCtrl.threshHigh)){ |
||
146 | rpmSpeed[0] = 0; |
||
147 | rpmSpeed[1] = 0; |
||
148 | utCount.ringProxCount++; |
||
149 | }else{
|
||
150 | utCount.ringProxCount = 0;
|
||
151 | } |
||
152 | 8dced1c9 | galberding | |
153 | 10bf9cc0 | galberding | } |
154 | |||
155 | |||
156 | 9c46b728 | galberding | /**
|
157 | * Blocks as long as the position changes.
|
||
158 | */
|
||
159 | 181f2892 | galberding | void UserThread::checkForMotion(){
|
160 | 8dced1c9 | galberding | bool motion = true; |
161 | 9c46b728 | galberding | int led = 0; |
162 | types::position oldPos = global.odometry.getPosition(); |
||
163 | while(motion){
|
||
164 | 8dced1c9 | galberding | this->sleep(200); |
165 | 9c46b728 | galberding | types::position tmp = global.odometry.getPosition(); |
166 | 8dced1c9 | galberding | motion = oldPos.x != tmp.x; //abs(oldPos.x - tmp.x)+ abs(oldPos.y - tmp.y)+abs(oldPos.z - tmp.z);
|
167 | 9c46b728 | galberding | oldPos = tmp; |
168 | 8dced1c9 | galberding | global.robot.setLightColor((led + 1) % 8, Color(Color::YELLOW)); |
169 | global.robot.setLightColor(led % 8, Color(Color::BLACK));
|
||
170 | led++; |
||
171 | 9c46b728 | galberding | } |
172 | 10bf9cc0 | galberding | lightAllLeds(Color::BLACK); |
173 | 9c46b728 | galberding | } |
174 | |||
175 | fbcb25cc | galberding | bool UserThread::checkFrontalObject(){
|
176 | 10bf9cc0 | galberding | uint32_t thresh = pCtrl.threshMid; |
177 | fbcb25cc | galberding | uint32_t prox; |
178 | for(int i=0; i<8; i++){ |
||
179 | prox = global.robot.getProximityRingValue(i); |
||
180 | if((i == 3) || (i == 4)){ |
||
181 | if(prox < thresh){
|
||
182 | return false; |
||
183 | } |
||
184 | }else{
|
||
185 | if(prox > thresh){
|
||
186 | return false; |
||
187 | } |
||
188 | } |
||
189 | } |
||
190 | return true; |
||
191 | } |
||
192 | |||
193 | 181f2892 | galberding | bool UserThread::checkPinVoltage(){
|
194 | 8dced1c9 | galberding | return global.ltc4412.isPluggedIn();
|
195 | 181f2892 | galberding | } |
196 | 9c46b728 | galberding | |
197 | 181f2892 | galberding | bool UserThread::checkPinEnabled(){
|
198 | return global.ltc4412.isEnabled();
|
||
199 | } |
||
200 | |||
201 | int UserThread::checkDockingSuccess(){
|
||
202 | // setRpmSpeed(stop);
|
||
203 | checkForMotion(); |
||
204 | 9c46b728 | galberding | int success = 0; |
205 | 10bf9cc0 | galberding | // global.odometry.resetPosition();
|
206 | 9c46b728 | galberding | types::position start = global.startPos = global.odometry.getPosition(); |
207 | 27d4e1fa | galberding | global.motorcontrol.setMotorEnable(false);
|
208 | this->sleep(1000); |
||
209 | 181f2892 | galberding | types::position stop_ = global.endPos = global.odometry.getPosition(); |
210 | 8dced1c9 | galberding | |
211 | 9c46b728 | galberding | // Amiro moved, docking was not successful
|
212 | 10bf9cc0 | galberding | // if ((start.x + stop_.x) || (start.y + stop_.y)){
|
213 | 84b4c632 | galberding | if (abs(start.x - stop_.x) > 200 /* || (start.y + stop_.y) */){ |
214 | 181f2892 | galberding | lightAllLeds(Color::RED); |
215 | // Enable Motor again if docking was not successful
|
||
216 | 27d4e1fa |