robot positie error test ding
Dependencies: MODSERIAL mbed EMG_Input QEI biquadFilter
main.cpp@0:86fe02a64f0e, 2016-10-24 (annotated)
- Committer:
- kbruil
- Date:
- Mon Oct 24 08:26:06 2016 +0000
- Revision:
- 0:86fe02a64f0e
- Child:
- 1:ffc1a2d6a824
robot control error;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kbruil | 0:86fe02a64f0e | 1 | #include "mbed.h" |
kbruil | 0:86fe02a64f0e | 2 | #include "math.h" |
kbruil | 0:86fe02a64f0e | 3 | #include "stdio.h" |
kbruil | 0:86fe02a64f0e | 4 | #include "MODSERIAL.h" |
kbruil | 0:86fe02a64f0e | 5 | // Angle limits 215, 345 lower arm, 0, 145 upper arm |
kbruil | 0:86fe02a64f0e | 6 | // Robot arm x,y limits (limit to table top) |
kbruil | 0:86fe02a64f0e | 7 | #define R_XTABLE_LO -30.0 // Robot in the middle, table width=60 |
kbruil | 0:86fe02a64f0e | 8 | #define R_XTABLE_HI 30.0 |
kbruil | 0:86fe02a64f0e | 9 | #define R_YTABLE_LO -18.0 |
kbruil | 0:86fe02a64f0e | 10 | #define R_YTABLE_HI 82.0 |
kbruil | 0:86fe02a64f0e | 11 | #define R_XROBOT_LO -8.0 // Robot limited from moving onto itself (20x20 base) |
kbruil | 0:86fe02a64f0e | 12 | #define R_XROBOT_HI 8.0 |
kbruil | 0:86fe02a64f0e | 13 | #define R_YROBOT_LO -18.0 |
kbruil | 0:86fe02a64f0e | 14 | #define R_YROBOT_HI 2.0 |
kbruil | 0:86fe02a64f0e | 15 | |
kbruil | 0:86fe02a64f0e | 16 | #define ARM1_ALIMLO (2*M_PI/360)*125 |
kbruil | 0:86fe02a64f0e | 17 | #define ARM1_ALIMHI -(2*M_PI/360)*125 |
kbruil | 0:86fe02a64f0e | 18 | #define ARM2_ALIMLO 0 |
kbruil | 0:86fe02a64f0e | 19 | #define ARM2_ALIMHI (2*M_PI/360)*145 |
kbruil | 0:86fe02a64f0e | 20 | |
kbruil | 0:86fe02a64f0e | 21 | #define M_PI 3.141592653589793238462643383279502884L // Pi |
kbruil | 0:86fe02a64f0e | 22 | |
kbruil | 0:86fe02a64f0e | 23 | // Struct r_link: |
kbruil | 0:86fe02a64f0e | 24 | // Defines a robot link type (arm or end effector). |
kbruil | 0:86fe02a64f0e | 25 | struct r_link { |
kbruil | 0:86fe02a64f0e | 26 | float length; // link length |
kbruil | 0:86fe02a64f0e | 27 | float x; // link x position |
kbruil | 0:86fe02a64f0e | 28 | float y; // link y position |
kbruil | 0:86fe02a64f0e | 29 | float vx; // link x speed |
kbruil | 0:86fe02a64f0e | 30 | float vy; // link y speed |
kbruil | 0:86fe02a64f0e | 31 | float ax; // link x accelleration |
kbruil | 0:86fe02a64f0e | 32 | float ay; // link y accelleration |
kbruil | 0:86fe02a64f0e | 33 | float theta; // link angle |
kbruil | 0:86fe02a64f0e | 34 | float omega; // link angular velocity |
kbruil | 0:86fe02a64f0e | 35 | float alpha; // link angular accelleration |
kbruil | 0:86fe02a64f0e | 36 | }; |
kbruil | 0:86fe02a64f0e | 37 | |
kbruil | 0:86fe02a64f0e | 38 | MODSERIAL pc(USBTX, USBRX); |
kbruil | 0:86fe02a64f0e | 39 | DigitalIn switch1(SW3); |
kbruil | 0:86fe02a64f0e | 40 | DigitalIn switch2(SW2); |
kbruil | 0:86fe02a64f0e | 41 | DigitalIn switch3(D7); |
kbruil | 0:86fe02a64f0e | 42 | DigitalIn switch4(D9); |
kbruil | 0:86fe02a64f0e | 43 | DigitalOut ledr(LED_RED); |
kbruil | 0:86fe02a64f0e | 44 | DigitalOut ledg(LED_GREEN); |
kbruil | 0:86fe02a64f0e | 45 | |
kbruil | 0:86fe02a64f0e | 46 | |
kbruil | 0:86fe02a64f0e | 47 | r_link arm1; // Robot upper arm |
kbruil | 0:86fe02a64f0e | 48 | r_link arm2; // Robot lower arm |
kbruil | 0:86fe02a64f0e | 49 | r_link end; // Robot end effector |
kbruil | 0:86fe02a64f0e | 50 | |
kbruil | 0:86fe02a64f0e | 51 | // robot_applylinmits |
kbruil | 0:86fe02a64f0e | 52 | // Input: x,y |
kbruil | 0:86fe02a64f0e | 53 | // Output: x,y limited to limits set by constants |
kbruil | 0:86fe02a64f0e | 54 | void robot_applylimits (float& x, float& y){ |
kbruil | 0:86fe02a64f0e | 55 | float z; |
kbruil | 0:86fe02a64f0e | 56 | float angle; |
kbruil | 0:86fe02a64f0e | 57 | |
kbruil | 0:86fe02a64f0e | 58 | // Limit x,y to table top size |
kbruil | 0:86fe02a64f0e | 59 | if (x<R_XTABLE_LO) { x=R_XTABLE_LO; } |
kbruil | 0:86fe02a64f0e | 60 | else if (x>R_XTABLE_HI) { x=R_XTABLE_HI; } |
kbruil | 0:86fe02a64f0e | 61 | if (y<R_YTABLE_LO) { y=R_YTABLE_LO; } |
kbruil | 0:86fe02a64f0e | 62 | else if (y>R_YTABLE_HI) { y=R_YTABLE_HI; } |
kbruil | 0:86fe02a64f0e | 63 | |
kbruil | 0:86fe02a64f0e | 64 | // Limit x,y from moving into the robot base |
kbruil | 0:86fe02a64f0e | 65 | /* |
kbruil | 0:86fe02a64f0e | 66 | if (x>R_XROBOT_LO && x<R_XROBOT_HI && y>R_YROBOT_LO && y<R_YROBOT_HI) |
kbruil | 0:86fe02a64f0e | 67 | { |
kbruil | 0:86fe02a64f0e | 68 | if (x<=0){ |
kbruil | 0:86fe02a64f0e | 69 | x=R_XROBOT_LO; |
kbruil | 0:86fe02a64f0e | 70 | } |
kbruil | 0:86fe02a64f0e | 71 | else { |
kbruil | 0:86fe02a64f0e | 72 | x=R_XROBOT_HI; |
kbruil | 0:86fe02a64f0e | 73 | } |
kbruil | 0:86fe02a64f0e | 74 | if (y<=0){ |
kbruil | 0:86fe02a64f0e | 75 | y=R_YROBOT_LO; |
kbruil | 0:86fe02a64f0e | 76 | } |
kbruil | 0:86fe02a64f0e | 77 | else { |
kbruil | 0:86fe02a64f0e | 78 | y=R_YROBOT_HI; |
kbruil | 0:86fe02a64f0e | 79 | } |
kbruil | 0:86fe02a64f0e | 80 | } |
kbruil | 0:86fe02a64f0e | 81 | */ |
kbruil | 0:86fe02a64f0e | 82 | // Limit x,y to maximum size of robot arm |
kbruil | 0:86fe02a64f0e | 83 | z = sqrt(pow(x,2)+pow(y,2)); |
kbruil | 0:86fe02a64f0e | 84 | angle = atan2(y,x); |
kbruil | 0:86fe02a64f0e | 85 | //if (angle < 0) { angle = angle + 2*M_PI; } |
kbruil | 0:86fe02a64f0e | 86 | if (z>(arm1.length+arm2.length)){ |
kbruil | 0:86fe02a64f0e | 87 | z = arm1.length+arm2.length; |
kbruil | 0:86fe02a64f0e | 88 | x = z*cos(angle); |
kbruil | 0:86fe02a64f0e | 89 | y = z*sin(angle); |
kbruil | 0:86fe02a64f0e | 90 | } |
kbruil | 0:86fe02a64f0e | 91 | } |
kbruil | 0:86fe02a64f0e | 92 | |
kbruil | 0:86fe02a64f0e | 93 | // robot_setposition: |
kbruil | 0:86fe02a64f0e | 94 | // Input: x,y cartesian coordinates |
kbruil | 0:86fe02a64f0e | 95 | // Function: calculate arm angles based on cartesian coordinates |
kbruil | 0:86fe02a64f0e | 96 | void robot_setposition (float x,float y){ |
kbruil | 0:86fe02a64f0e | 97 | float z; |
kbruil | 0:86fe02a64f0e | 98 | float z1; |
kbruil | 0:86fe02a64f0e | 99 | float z2; |
kbruil | 0:86fe02a64f0e | 100 | |
kbruil | 0:86fe02a64f0e | 101 | float angle; |
kbruil | 0:86fe02a64f0e | 102 | float b1,b2; |
kbruil | 0:86fe02a64f0e | 103 | |
kbruil | 0:86fe02a64f0e | 104 | float old; |
kbruil | 0:86fe02a64f0e | 105 | |
kbruil | 0:86fe02a64f0e | 106 | robot_applylimits(x,y); |
kbruil | 0:86fe02a64f0e | 107 | // end.x = x; |
kbruil | 0:86fe02a64f0e | 108 | // end.y = y; |
kbruil | 0:86fe02a64f0e | 109 | |
kbruil | 0:86fe02a64f0e | 110 | printf("xy: %f, %f\n\r",x,y); |
kbruil | 0:86fe02a64f0e | 111 | z = sqrt(pow(x,2)+pow(y,2)); |
kbruil | 0:86fe02a64f0e | 112 | angle = atan2(y,x); |
kbruil | 0:86fe02a64f0e | 113 | /* |
kbruil | 0:86fe02a64f0e | 114 | if (angle<=pi/2 && angle>0) |
kbruil | 0:86fe02a64f0e | 115 | angle = angle - pi/2; |
kbruil | 0:86fe02a64f0e | 116 | elseif (angle<=pi && angle>pi/2) |
kbruil | 0:86fe02a64f0e | 117 | angle = angle - pi/2; |
kbruil | 0:86fe02a64f0e | 118 | elseif (angle<=0 && angle>=-pi/2) |
kbruil | 0:86fe02a64f0e | 119 | angle = angle - 0.5 * pi; |
kbruil | 0:86fe02a64f0e | 120 | else |
kbruil | 0:86fe02a64f0e | 121 | angle = angle + 1.5*pi; |
kbruil | 0:86fe02a64f0e | 122 | end |
kbruil | 0:86fe02a64f0e | 123 | */ |
kbruil | 0:86fe02a64f0e | 124 | if (angle>=-(M_PI/2.0) && angle <= M_PI){ |
kbruil | 0:86fe02a64f0e | 125 | angle -= 0.5*M_PI; |
kbruil | 0:86fe02a64f0e | 126 | } |
kbruil | 0:86fe02a64f0e | 127 | else { |
kbruil | 0:86fe02a64f0e | 128 | angle += 1.5*M_PI; |
kbruil | 0:86fe02a64f0e | 129 | } |
kbruil | 0:86fe02a64f0e | 130 | |
kbruil | 0:86fe02a64f0e | 131 | |
kbruil | 0:86fe02a64f0e | 132 | z1 = (pow(arm1.length,2)-pow(arm2.length,2)+pow(z,2))/(2*z); |
kbruil | 0:86fe02a64f0e | 133 | z2 = z-z1; |
kbruil | 0:86fe02a64f0e | 134 | |
kbruil | 0:86fe02a64f0e | 135 | b1 = acos(z1/arm1.length); |
kbruil | 0:86fe02a64f0e | 136 | b2 = acos(z2/arm2.length); |
kbruil | 0:86fe02a64f0e | 137 | |
kbruil | 0:86fe02a64f0e | 138 | old = arm1.theta; |
kbruil | 0:86fe02a64f0e | 139 | arm1.theta = angle - b1; |
kbruil | 0:86fe02a64f0e | 140 | |
kbruil | 0:86fe02a64f0e | 141 | if (arm1.theta>ARM1_ALIMLO){ |
kbruil | 0:86fe02a64f0e | 142 | arm1.theta = ARM1_ALIMLO; |
kbruil | 0:86fe02a64f0e | 143 | } |
kbruil | 0:86fe02a64f0e | 144 | else if (arm1.theta<ARM1_ALIMHI){ |
kbruil | 0:86fe02a64f0e | 145 | arm1.theta = ARM1_ALIMHI; |
kbruil | 0:86fe02a64f0e | 146 | } |
kbruil | 0:86fe02a64f0e | 147 | |
kbruil | 0:86fe02a64f0e | 148 | arm1.omega = arm1.theta - old; |
kbruil | 0:86fe02a64f0e | 149 | old = arm2.theta; |
kbruil | 0:86fe02a64f0e | 150 | arm2.theta = b1 + b2; |
kbruil | 0:86fe02a64f0e | 151 | if (arm2.theta>ARM2_ALIMHI){ |
kbruil | 0:86fe02a64f0e | 152 | arm2.theta = ARM2_ALIMHI; |
kbruil | 0:86fe02a64f0e | 153 | } |
kbruil | 0:86fe02a64f0e | 154 | arm2.omega = arm2.theta - old; |
kbruil | 0:86fe02a64f0e | 155 | |
kbruil | 0:86fe02a64f0e | 156 | old = arm2.x; |
kbruil | 0:86fe02a64f0e | 157 | arm2.x = arm1.length*-sin(arm1.theta); |
kbruil | 0:86fe02a64f0e | 158 | arm2.vx = arm2.x - old; |
kbruil | 0:86fe02a64f0e | 159 | old = arm2.y; |
kbruil | 0:86fe02a64f0e | 160 | arm2.y = arm1.length*cos(arm1.theta); |
kbruil | 0:86fe02a64f0e | 161 | arm2.vy = arm2.y - old; |
kbruil | 0:86fe02a64f0e | 162 | |
kbruil | 0:86fe02a64f0e | 163 | old = end.x; |
kbruil | 0:86fe02a64f0e | 164 | end.x = arm2.length*(-sin(arm1.theta+arm2.theta)) + arm2.x; |
kbruil | 0:86fe02a64f0e | 165 | end.vx = end.x - old; |
kbruil | 0:86fe02a64f0e | 166 | old = end.y; |
kbruil | 0:86fe02a64f0e | 167 | end.y = arm2.length*(cos(arm1.theta+arm2.theta)) + arm2.y; |
kbruil | 0:86fe02a64f0e | 168 | end.vy = old - end.y; |
kbruil | 0:86fe02a64f0e | 169 | } |
kbruil | 0:86fe02a64f0e | 170 | |
kbruil | 0:86fe02a64f0e | 171 | // robot_init |
kbruil | 0:86fe02a64f0e | 172 | // Initialise robot |
kbruil | 0:86fe02a64f0e | 173 | void robot_init() { |
kbruil | 0:86fe02a64f0e | 174 | // Init arm1 (upper arm) first link |
kbruil | 0:86fe02a64f0e | 175 | arm1.length = 28.0f; |
kbruil | 0:86fe02a64f0e | 176 | arm1.x = 0; arm1.y = 0; |
kbruil | 0:86fe02a64f0e | 177 | arm1.vx = 0; arm1.vy = 0; |
kbruil | 0:86fe02a64f0e | 178 | arm1.ax = 0; arm1.ay = 0; |
kbruil | 0:86fe02a64f0e | 179 | arm1.theta = 0.5*M_PI; |
kbruil | 0:86fe02a64f0e | 180 | arm1.omega = 0; |
kbruil | 0:86fe02a64f0e | 181 | arm1.alpha = 0; |
kbruil | 0:86fe02a64f0e | 182 | |
kbruil | 0:86fe02a64f0e | 183 | // Init arm2 (lower arm) second link |
kbruil | 0:86fe02a64f0e | 184 | arm2.length = 35.0f; |
kbruil | 0:86fe02a64f0e | 185 | arm2.x = 0; arm2.y = arm1.length; |
kbruil | 0:86fe02a64f0e | 186 | arm2.vx = 0; arm2.vy = 0; |
kbruil | 0:86fe02a64f0e | 187 | arm2.ax = 0; arm2.ay = 0; |
kbruil | 0:86fe02a64f0e | 188 | arm2.theta = 1.5*M_PI; |
kbruil | 0:86fe02a64f0e | 189 | arm2.omega = 0; |
kbruil | 0:86fe02a64f0e | 190 | arm2.alpha = 0; |
kbruil | 0:86fe02a64f0e | 191 | |
kbruil | 0:86fe02a64f0e | 192 | // Init end (end effector) third/last link |
kbruil | 0:86fe02a64f0e | 193 | end.length = 30.0f; |
kbruil | 0:86fe02a64f0e | 194 | end.x = 0; end.y = arm1.length+arm2.length; |
kbruil | 0:86fe02a64f0e | 195 | end.vx = 0; end.vy = 0; |
kbruil | 0:86fe02a64f0e | 196 | end.ax = 0; end.ay = 0; |
kbruil | 0:86fe02a64f0e | 197 | end.theta = 0; |
kbruil | 0:86fe02a64f0e | 198 | end.omega = 0; |
kbruil | 0:86fe02a64f0e | 199 | end.alpha = 0; |
kbruil | 0:86fe02a64f0e | 200 | } |
kbruil | 0:86fe02a64f0e | 201 | |
kbruil | 0:86fe02a64f0e | 202 | int lr_state=0; |
kbruil | 0:86fe02a64f0e | 203 | int ud_state=0; |
kbruil | 0:86fe02a64f0e | 204 | int sw2_state=0; |
kbruil | 0:86fe02a64f0e | 205 | float ax=0.1; |
kbruil | 0:86fe02a64f0e | 206 | float ay=0.1; |
kbruil | 0:86fe02a64f0e | 207 | float vx=0; |
kbruil | 0:86fe02a64f0e | 208 | float vy=0; |
kbruil | 0:86fe02a64f0e | 209 | |
kbruil | 0:86fe02a64f0e | 210 | void inputswitches() |
kbruil | 0:86fe02a64f0e | 211 | { |
kbruil | 0:86fe02a64f0e | 212 | if(switch1.read()) |
kbruil | 0:86fe02a64f0e | 213 | { |
kbruil | 0:86fe02a64f0e | 214 | if (lr_state==0){ |
kbruil | 0:86fe02a64f0e | 215 | vx=0; |
kbruil | 0:86fe02a64f0e | 216 | ledr.write(1); |
kbruil | 0:86fe02a64f0e | 217 | } |
kbruil | 0:86fe02a64f0e | 218 | } |
kbruil | 0:86fe02a64f0e | 219 | else |
kbruil | 0:86fe02a64f0e | 220 | { |
kbruil | 0:86fe02a64f0e | 221 | lr_state=0; |
kbruil | 0:86fe02a64f0e | 222 | vx = vx - ax; |
kbruil | 0:86fe02a64f0e | 223 | if (vx<-3.0f){ |
kbruil | 0:86fe02a64f0e | 224 | vx=-3.0f; |
kbruil | 0:86fe02a64f0e | 225 | } |
kbruil | 0:86fe02a64f0e | 226 | ledr.write(0); |
kbruil | 0:86fe02a64f0e | 227 | } |
kbruil | 0:86fe02a64f0e | 228 | |
kbruil | 0:86fe02a64f0e | 229 | if(switch2.read()) |
kbruil | 0:86fe02a64f0e | 230 | { |
kbruil | 0:86fe02a64f0e | 231 | if(lr_state==1){ |
kbruil | 0:86fe02a64f0e | 232 | vx=0; |
kbruil | 0:86fe02a64f0e | 233 | ledr.write(1); |
kbruil | 0:86fe02a64f0e | 234 | } |
kbruil | 0:86fe02a64f0e | 235 | } |
kbruil | 0:86fe02a64f0e | 236 | else |
kbruil | 0:86fe02a64f0e | 237 | { |
kbruil | 0:86fe02a64f0e | 238 | lr_state=1; |
kbruil | 0:86fe02a64f0e | 239 | vx = vx + ax; |
kbruil | 0:86fe02a64f0e | 240 | if (vx>3.0f){ |
kbruil | 0:86fe02a64f0e | 241 | vx=3.0f; |
kbruil | 0:86fe02a64f0e | 242 | } |
kbruil | 0:86fe02a64f0e | 243 | ledr.write(0); |
kbruil | 0:86fe02a64f0e | 244 | } |
kbruil | 0:86fe02a64f0e | 245 | if(switch3.read()) |
kbruil | 0:86fe02a64f0e | 246 | { |
kbruil | 0:86fe02a64f0e | 247 | if (ud_state==0){ |
kbruil | 0:86fe02a64f0e | 248 | vy=0; |
kbruil | 0:86fe02a64f0e | 249 | ledr.write(1); |
kbruil | 0:86fe02a64f0e | 250 | } |
kbruil | 0:86fe02a64f0e | 251 | } |
kbruil | 0:86fe02a64f0e | 252 | else |
kbruil | 0:86fe02a64f0e | 253 | { |
kbruil | 0:86fe02a64f0e | 254 | ud_state=0; |
kbruil | 0:86fe02a64f0e | 255 | vy = vy - ay; |
kbruil | 0:86fe02a64f0e | 256 | if (vy<-3.0f){ |
kbruil | 0:86fe02a64f0e | 257 | vy=-3.0f; |
kbruil | 0:86fe02a64f0e | 258 | } |
kbruil | 0:86fe02a64f0e | 259 | ledr.write(0); |
kbruil | 0:86fe02a64f0e | 260 | } |
kbruil | 0:86fe02a64f0e | 261 | |
kbruil | 0:86fe02a64f0e | 262 | if(switch4.read()) |
kbruil | 0:86fe02a64f0e | 263 | { |
kbruil | 0:86fe02a64f0e | 264 | if(ud_state==1){ |
kbruil | 0:86fe02a64f0e | 265 | vy=0; |
kbruil | 0:86fe02a64f0e | 266 | ledr.write(1); |
kbruil | 0:86fe02a64f0e | 267 | } |
kbruil | 0:86fe02a64f0e | 268 | } |
kbruil | 0:86fe02a64f0e | 269 | else |
kbruil | 0:86fe02a64f0e | 270 | { |
kbruil | 0:86fe02a64f0e | 271 | ud_state=1; |
kbruil | 0:86fe02a64f0e | 272 | vy = vy + ay; |
kbruil | 0:86fe02a64f0e | 273 | if (vy>3.0f){ |
kbruil | 0:86fe02a64f0e | 274 | vy=3.0f; |
kbruil | 0:86fe02a64f0e | 275 | } |
kbruil | 0:86fe02a64f0e | 276 | ledr.write(0); |
kbruil | 0:86fe02a64f0e | 277 | } |
kbruil | 0:86fe02a64f0e | 278 | } |
kbruil | 0:86fe02a64f0e | 279 | |
kbruil | 0:86fe02a64f0e | 280 | int main(){ |
kbruil | 0:86fe02a64f0e | 281 | pc.baud(115200); |
kbruil | 0:86fe02a64f0e | 282 | robot_init(); |
kbruil | 0:86fe02a64f0e | 283 | while(true){ |
kbruil | 0:86fe02a64f0e | 284 | inputswitches(); |
kbruil | 0:86fe02a64f0e | 285 | robot_setposition(end.x+vx,end.y+vy); |
kbruil | 0:86fe02a64f0e | 286 | printf("Angle1\n\r"); |
kbruil | 0:86fe02a64f0e | 287 | printf("%f\n\r", arm1.theta); |
kbruil | 0:86fe02a64f0e | 288 | printf("Angle2\n\r"); |
kbruil | 0:86fe02a64f0e | 289 | printf("%f\n\r", arm2.theta); |
kbruil | 0:86fe02a64f0e | 290 | printf("x: %f | y: %f\n\r", end.x, end.y); |
kbruil | 0:86fe02a64f0e | 291 | printf("%f || %f", ARM1_ALIMLO, ARM1_ALIMHI); |
kbruil | 0:86fe02a64f0e | 292 | |
kbruil | 0:86fe02a64f0e | 293 | // for(int i=0;i<30;i++) |
kbruil | 0:86fe02a64f0e | 294 | // { |
kbruil | 0:86fe02a64f0e | 295 | // printf("\n"); |
kbruil | 0:86fe02a64f0e | 296 | // } |
kbruil | 0:86fe02a64f0e | 297 | /* |
kbruil | 0:86fe02a64f0e | 298 | printf("speed %f\n\r",vx); |
kbruil | 0:86fe02a64f0e | 299 | printf("end(x,y,theta) %f.2 : %f.2 : %f.2\n\r",end.x, end.y, arm2.theta); |
kbruil | 0:86fe02a64f0e | 300 | printf("arm2(x,y,theta) %f.2 : %f.2 : %f.2\n\r",arm2.x,arm2.y, arm1.theta); |
kbruil | 0:86fe02a64f0e | 301 | printf("end(vx, vy, theta) %f.2 : %f.2 : %f.2\n\r", end.vx, end.vy, arm2.omega); |
kbruil | 0:86fe02a64f0e | 302 | printf("arm2(vx, vy, theta) %f.2 : %f.2 : %f.2\n\r", arm2.vx, arm2.vy, arm1.omega); |
kbruil | 0:86fe02a64f0e | 303 | */ |
kbruil | 0:86fe02a64f0e | 304 | wait(0.1f); |
kbruil | 0:86fe02a64f0e | 305 | } |
kbruil | 0:86fe02a64f0e | 306 | } |