Revision 926
Odometry committed. New version is more general, but still drifts to zero.
trunk/code/projects/mapping/odometry/odometry.c | ||
---|---|---|
25 | 25 |
void odometry_init(void){ |
26 | 26 |
|
27 | 27 |
encoders_init(); |
28 |
|
|
29 |
delay_ms(100); |
|
28 | 30 |
|
29 | 31 |
odometry_reset(); |
30 | 32 |
|
... | ... | |
44 | 46 |
diff_y = 0; |
45 | 47 |
encoder_ltm1 = encoder_read(LEFT); |
46 | 48 |
encoder_rtm1 = encoder_read(RIGHT); |
47 |
sprintf(buf,"(en_right,en_left) in um: (%d,%d)\n\r",encoder_ltm1,encoder_rtm1); |
|
48 |
usb_puts(buf); |
|
49 |
//sprintf(buf,"(en_right,en_left) in um: (%d,%d)\n\r",encoder_ltm1,encoder_rtm1);
|
|
50 |
//usb_puts(buf);
|
|
49 | 51 |
angle = 0.0; |
50 | 52 |
} |
51 | 53 |
|
... | ... | |
112 | 114 |
//Angle swept through in a time step CCW- |
113 | 115 |
double theta, rl, dc; |
114 | 116 |
|
115 |
long dr,dl;
|
|
117 |
double dr,dl;
|
|
116 | 118 |
|
117 | 119 |
char buf[40]; |
118 | 120 |
//Relative to the inner wheel, turn radius. |
... | ... | |
122 | 124 |
int encoder_right = encoder_read(RIGHT); |
123 | 125 |
int encoder_left = encoder_read(LEFT); |
124 | 126 |
|
125 |
sprintf(buf,"(en_right,en_left) in um: (%d,%d)\n\r",encoder_left,encoder_right); |
|
126 |
usb_puts(buf); |
|
127 |
|
|
128 | 127 |
dl = encoder_left - encoder_ltm1; |
129 | 128 |
dr = encoder_right - encoder_rtm1; |
130 | 129 |
|
131 |
if(dl >=-1 && dl <= 1 && dr >= -1 && dr <= 1) return; |
|
130 |
//if(dl >=-1 && dl <= 1 && dr >= -1 && dr <= 1) return;
|
|
132 | 131 |
|
133 | 132 |
encoder_ltm1 = encoder_left; |
134 | 133 |
encoder_rtm1 = encoder_right; |
135 | 134 |
|
136 |
//sprintf(buf,"(dl,dr) in clicks: (%ld,%ld)\n\r",dl,dr); |
|
137 |
//usb_puts(buf); |
|
138 |
|
|
139 | 135 |
// Try to avoid over/underflow. |
140 | 136 |
dl = dl > 512 ? dl - 1024 :dl; |
141 | 137 |
dl = dl < -512 ? dl + 1024 :dl; |
142 | 138 |
dr = dr > 512 ? dr - 1024 :dr; |
143 | 139 |
dr = dr < -512 ? dr + 1024 :dr; |
144 | 140 |
|
145 |
sprintf(buf,"(dl,dr) in um: (%ld,%ld)\n\r",dl,dr); |
|
146 |
usb_puts(buf); |
|
147 | 141 |
//Convert "clicks" to um |
148 | 142 |
dl *= CLICK_DISTANCE_UM; //um |
149 | 143 |
dr *= CLICK_DISTANCE_UM; |
... | ... | |
152 | 146 |
//usb_putc('#'); |
153 | 147 |
diff_x += dl*cos(angle)/1000; |
154 | 148 |
diff_y += dl*sin(angle)/1000; |
155 |
//sprintf(buf,"Distance in um: %ld\n\r",dl); |
|
156 |
//usb_puts(buf); |
|
157 | 149 |
return; |
158 | 150 |
} |
159 |
//usb_putc('*'); |
|
160 |
//sprintf(buf,"(dl,dr) in um: (%ld,%ld)\n\r",dl,dr); |
|
161 |
//usb_puts(buf); |
|
162 | 151 |
|
163 | 152 |
//Call the left wheel 0, clockwise positive. |
164 |
|
|
165 | 153 |
rl = ((double)(ROBOT_WIDTH_UM*dl))/((double)(dl - dr)); //um |
166 | 154 |
|
167 |
//sprintf(buf,"Radius from left wheel: %ld\n\r",rl); |
|
168 |
//usb_puts(buf); |
|
169 |
|
|
170 | 155 |
theta = ((double)(dl - dr))/((double)ROBOT_WIDTH_UM); //rad |
171 | 156 |
|
172 | 157 |
dc = (rl - ROBOT_WIDTH_UM/2)*theta; //um |
173 | 158 |
|
174 |
//sprintf(buf,"Distance in um: %ld\n\r",dc); |
|
175 |
//usb_puts(buf); |
|
176 |
|
|
177 | 159 |
diff_x += ((dc * cos(angle))/1000); //mm |
178 | 160 |
diff_y += ((dc * sin(angle))/1000); //mm |
179 | 161 |
|
180 |
//sprintf(buf,"(dx, dy): (%ld, %ld)\n\r",diff_x, diff_y); |
|
181 |
//usb_puts(buf); |
|
182 |
|
|
183 | 162 |
//Change state variables. |
184 | 163 |
|
185 | 164 |
//angle is necessarily CCW+, so subtract. |
trunk/code/projects/mapping/odometry/main.c | ||
---|---|---|
7 | 7 |
odometry_init(); |
8 | 8 |
char buf[100]; |
9 | 9 |
while(1){ |
10 |
//sprintf(buf,"X: %ld, Y: %ld, Theta: %lf\n\r", odometry_dx(), odometry_dy(), odometry_angle());
|
|
11 |
//usb_puts(buf);
|
|
10 |
sprintf(buf,"X: %ld, Y: %ld, Theta: %lf\n\r", odometry_dx(), odometry_dy(), odometry_angle()); |
|
11 |
usb_puts(buf); |
|
12 | 12 |
delay_ms(500); |
13 | 13 |
} |
14 | 14 |
return 0; |
Also available in: Unified diff