Changeset 433
- Timestamp:
- 02/18/07 16:53:30 (2 years ago)
- Files:
-
- trunk/projects/cmucam2/cmucam2.c (modified) (21 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/projects/cmucam2/cmucam2.c
r431 r433 12 12 #include <cc3_jpg.h> 13 13 #include <cc3_math.h> 14 #include "polly.h" 14 15 // Uncomment the line below to reverse the servo direction 16 //#define REVERSE_SERVO_DIRECTION 15 17 16 18 //#define SERIAL_BAUD_RATE CC3_UART_RATE_230400 … … 25 27 //#define SERIAL_BAUD_RATE CC3_UART_RATE_300 26 28 29 #define SERVO_MIN 0 30 #define SERVO_MID 128 31 #define SERVO_MAX 255 32 // Define a jitter guard such that more than SERVO_GUARD pixels are required 33 // for the servo to move. 27 34 28 35 static const int MAX_ARGS = 10; … … 47 54 VIRTUAL_WINDOW, 48 55 DOWN_SAMPLE, 49 GET_POLLY,50 56 GET_HISTOGRAM, 51 57 TRACK_WINDOW, … … 55 61 NOISE_FILTER, 56 62 TRACK_INVERT, 63 SERVO_MASK, 64 SERVO_PARAMETERS, 57 65 SERVO_OUTPUT, 58 66 GET_SERVO, 59 67 CMUCAM2_CMD_END // Must be last entry so array sizes are correct 60 68 } cmucam2_command_t; 69 70 typedef struct { 71 uint8_t pan_step,tilt_step; 72 uint8_t pan_range_near,tilt_range_near; 73 uint8_t pan_range_far,tilt_range_far; 74 int16_t x; 75 int16_t y; 76 bool y_control; 77 bool x_control; 78 bool y_report; 79 bool x_report; 80 } cmucam2_servo_t; 81 61 82 62 83 char *cmucam2_cmds[CMUCAM2_CMD_END]; … … 89 110 // SM servo mask 90 111 cmucam2_cmds[SERVO_OUTPUT] = "SO"; 91 112 // SM servo mask 113 cmucam2_cmds[SERVO_MASK] = "SM"; 114 // SP servo parameters 115 cmucam2_cmds[SERVO_PARAMETERS] = "SP"; 116 117 118 92 119 /* Image Windowing Commands */ 93 120 cmucam2_cmds[SEND_FRAME] = "SF"; … … 138 165 /* CMUcam3 New Commands */ 139 166 cmucam2_cmds[SEND_JPEG] = "SJ"; 140 cmucam2_cmds[GET_POLLY] = "GP";167 //cmucam2_cmds[GET_POLLY] = "GP"; 141 168 } 142 169 … … 148 175 static void cmucam2_write_s_packet (cc3_color_info_pkt_t * pkt); 149 176 static void cmucam2_track_color (cc3_track_pkt_t * t_pkt, 150 bool poll_mode,151 bool line_mode, bool auto_led, bool quiet);177 bool poll_mode, 178 bool line_mode, bool auto_led, cmucam2_servo_t *servo_settings, bool quiet); 152 179 static int32_t cmucam2_get_command (int32_t * cmd, int32_t * arg_list); 153 180 static void print_ACK (void); 154 181 static void print_NCK (void); 155 static void cmucam2_write_t_packet (cc3_track_pkt_t * pkt );182 static void cmucam2_write_t_packet (cc3_track_pkt_t * pkt, cmucam2_servo_t *servo_settings); 156 183 static void cmucam2_write_h_packet (cc3_histogram_pkt_t * pkt); 157 184 static void cmucam2_send_image_direct (bool auto_led); 185 186 158 187 159 188 int main (void) … … 162 191 int32_t val, n; 163 192 uint32_t arg_list[MAX_ARGS], start_time; 164 bool error, poll_mode, line_mode, auto_led, demo_mode , auto_servo_mode;193 bool error, poll_mode, line_mode, auto_led, demo_mode; 165 194 cc3_track_pkt_t t_pkt; 166 195 cc3_color_info_pkt_t s_pkt; 167 196 cc3_histogram_pkt_t h_pkt; 197 cmucam2_servo_t servo_settings; 168 198 169 199 set_cmucam2_commands (); … … 181 211 } 182 212 213 servo_settings.x_control=false; 214 servo_settings.y_control=false; 215 servo_settings.x_report=false; 216 servo_settings.y_report=false; 183 217 demo_mode = false; 184 auto_servo_mode = false;218 185 219 start_time = cc3_timer_get_current_ms (); 220 186 221 do { 187 222 if (cc3_button_get_state () == 1) { 188 223 // Demo Mode flag 189 224 demo_mode = true; 190 auto_servo_mode = true; 225 servo_settings.x_control=true; 226 servo_settings.y_control=true; 227 servo_settings.x_report=true; 228 servo_settings.y_report=true; 191 229 // Debounce Switch 192 230 cc3_led_set_off (0); … … 211 249 t_pkt.lower_bound.channel[2] = 16; 212 250 t_pkt.upper_bound.channel[2] = 240; 251 252 253 servo_settings.x=SERVO_MID; 254 servo_settings.y=SERVO_MID; 255 servo_settings.pan_range_far=16; 256 servo_settings.pan_range_near=8; 257 servo_settings.pan_step=5; 258 servo_settings.tilt_range_far=30; 259 servo_settings.tilt_range_near=15; 260 servo_settings.tilt_step=5; 213 261 214 262 … … 223 271 cc3_gpio_set_mode (2, CC3_GPIO_MODE_SERVO); 224 272 cc3_gpio_set_mode (3, CC3_GPIO_MODE_SERVO); 273 274 cc3_gpio_set_servo_position (0, SERVO_MID); 275 cc3_gpio_set_servo_position (1, SERVO_MID); 276 cc3_gpio_set_servo_position (2, SERVO_MID); 277 cc3_gpio_set_servo_position (3, SERVO_MID); 225 278 226 279 cc3_pixbuf_set_subsample (CC3_SUBSAMPLE_NEAREST, 2, 1); … … 303 356 break; 304 357 305 306 case HI_RES: 358 case SERVO_PARAMETERS: 359 if (n != 6) { 360 error = true; 361 break; 362 } 363 else 364 print_ACK (); 365 servo_settings.pan_range_far=arg_list[0]; 366 servo_settings.pan_range_near=arg_list[1]; 367 servo_settings.pan_step=arg_list[2]; 368 servo_settings.tilt_range_far=arg_list[3]; 369 servo_settings.tilt_range_near=arg_list[4]; 370 servo_settings.tilt_step=arg_list[5]; 371 break; 372 373 case SERVO_MASK: 374 if (n != 1) { 375 error = true; 376 break; 377 } 378 else 379 print_ACK (); 380 servo_settings.x_control=!!(arg_list[0]&0x1); 381 servo_settings.y_control=!!(arg_list[0]&0x2); 382 servo_settings.x_report=!!(arg_list[0]&0x4); 383 servo_settings.y_report=!!(arg_list[0]&0x8); 384 break; 385 386 case HI_RES: 307 387 if (n != 1) { 308 388 error = true; … … 471 551 t_pkt.upper_bound.channel[2] = arg_list[5]; 472 552 } 473 cmucam2_track_color (&t_pkt, poll_mode, line_mode, auto_led, 0);553 cmucam2_track_color (&t_pkt, poll_mode, line_mode,auto_led,&servo_settings, 0); 474 554 break; 475 555 … … 537 617 tmp = 240; 538 618 t_pkt.upper_bound.channel[2] = tmp; 539 cmucam2_track_color (&t_pkt, poll_mode, line_mode, auto_led, 0);619 cmucam2_track_color (&t_pkt, poll_mode, line_mode, auto_led,&servo_settings, 0); 540 620 } 541 621 demo_mode = false; 542 break;543 544 545 case GET_POLLY:546 if (n != 6) {547 error = true;548 break;549 }550 551 print_ACK ();552 {553 uint8_t *x_axis;554 polly_config_t p_config;555 cc3_linear_reg_data_t reg_line;556 x_axis = malloc (cc3_g_pixbuf_frame.width);557 558 p_config.color_thresh = arg_list[0]; //20;559 p_config.min_blob_size = arg_list[1]; //20;560 p_config.connectivity = arg_list[2]; //0;561 p_config.horizontal_edges = arg_list[3]; //0;562 p_config.vertical_edges = arg_list[4]; //1;563 p_config.blur = arg_list[5]; //1;564 p_config.histogram = malloc (cc3_g_pixbuf_frame.width);565 for (uint32_t i = 0; i < cc3_g_pixbuf_frame.width; i++)566 x_axis[i] = i;567 do {568 polly (p_config);569 cc3_linear_reg (x_axis, p_config.histogram,570 cc3_g_pixbuf_frame.width, ®_line);571 572 // return linear regression offset value573 printf ("P %f ", reg_line.b);574 // return linear regression slope575 printf ("%f ", reg_line.m);576 // return r squared value577 printf ("%f ", reg_line.r_sqr);578 // return distance to line at middle of image579 double distance =580 reg_line.m * (cc3_g_pixbuf_frame.width / 2) + reg_line.b;581 printf (" %f\r", distance);582 583 if (!cc3_uart_has_data (0))584 break;585 } while (!poll_mode);586 free (p_config.histogram);587 }588 622 break; 589 623 … … 613 647 614 648 case SET_SERVO: 615 if (n != 2 ) {649 if (n != 2 || arg_list[0]>4) { 616 650 error = true; 617 651 break; … … 621 655 cc3_gpio_set_mode (arg_list[0], CC3_GPIO_MODE_SERVO); 622 656 cc3_gpio_set_servo_position (arg_list[0], arg_list[1]); 657 if(arg_list[0]==0) servo_settings.x=arg_list[1]; 658 if(arg_list[0]==1) servo_settings.y=arg_list[1]; 623 659 break; 624 660 … … 772 808 773 809 void cmucam2_track_color (cc3_track_pkt_t * t_pkt, 774 bool poll_mode,775 bool line_mode, bool auto_led, bool quiet)810 bool poll_mode, 811 bool line_mode, bool auto_led,cmucam2_servo_t *servo_settings, bool quiet) 776 812 { 777 813 cc3_image_t img; 778 uint16_t i ;814 uint16_t i,x_mid,y_mid; 779 815 780 816 img.channels = 3; … … 785 821 return; 786 822 } 823 824 x_mid=cc3_g_pixbuf_frame.x0 + (cc3_g_pixbuf_frame.width/2); 825 y_mid=cc3_g_pixbuf_frame.y0 + (cc3_g_pixbuf_frame.height/2); 826 827 787 828 do { 788 829 cc3_pixbuf_load (); … … 848 889 cc3_led_set_off (0); 849 890 } 850 if (!quiet) 851 cmucam2_write_t_packet (t_pkt); 852 } 853 else 854 return 0; 855 while (!cc3_uart_has_data (0)) { 856 if (fgetc (stdin) == '\r') 857 break; 891 892 if( t_pkt->int_density>5) { 893 if(servo_settings->x_control ) 894 { 895 if(t_pkt->centroid_x>x_mid+servo_settings->pan_range_far) servo_settings->x+=servo_settings->pan_step; 896 else if(t_pkt->centroid_x>x_mid+servo_settings->pan_range_near) servo_settings->x+=servo_settings->pan_step/2; 897 898 if(t_pkt->centroid_x<x_mid-servo_settings->pan_range_far) servo_settings->x-=servo_settings->pan_step; 899 else if(t_pkt->centroid_x<x_mid-servo_settings->pan_range_near) servo_settings->x-=servo_settings->pan_step/2; 900 901 if(servo_settings->x>SERVO_MAX) servo_settings->x=SERVO_MAX; 902 if(servo_settings->x<SERVO_MIN) servo_settings->x=SERVO_MIN; 903 cc3_gpio_set_servo_position (0, servo_settings->x); 904 } 905 if( servo_settings->y_control ) 906 { 907 if(t_pkt->centroid_y>y_mid+servo_settings->tilt_range_far) servo_settings->y+=servo_settings->tilt_step; 908 else if(t_pkt->centroid_y>y_mid+servo_settings->tilt_range_near) servo_settings->y+=servo_settings->tilt_step/2; 909 910 if(t_pkt->centroid_y<y_mid-servo_settings->tilt_range_far) servo_settings->y-=servo_settings->tilt_step; 911 else if(t_pkt->centroid_y<y_mid-servo_settings->tilt_range_near) servo_settings->y-=servo_settings->tilt_step/2; 912 913 if(servo_settings->y>SERVO_MAX) servo_settings->y=SERVO_MAX; 914 if(servo_settings->y<SERVO_MIN) servo_settings->y=SERVO_MIN; 915 cc3_gpio_set_servo_position (1, servo_settings->y); 916 } 917 } 918 919 if(!quiet) cmucam2_write_t_packet (t_pkt,servo_settings); 920 921 } 922 else return 0; 923 while (!cc3_uart_has_data (0)) 924 { 925 if(fgetc(stdin)=='\r' ) 926 break; 858 927 } 859 928 } while (!poll_mode); … … 863 932 864 933 865 void cmucam2_write_t_packet (cc3_track_pkt_t * pkt )934 void cmucam2_write_t_packet (cc3_track_pkt_t * pkt, cmucam2_servo_t *servo_settings) 866 935 { 867 936 if (pkt->centroid_x > 255) … … 883 952 884 953 if (pkt->num_pixels == 0) 885 printf ("T 0 0 0 0 0 0 0 0 \r");954 printf ("T 0 0 0 0 0 0 0 0"); 886 955 else 887 printf ("T %d %d %d %d %d %d %d %d \r", pkt->centroid_x, pkt->centroid_y,956 printf ("T %d %d %d %d %d %d %d %d", pkt->centroid_x, pkt->centroid_y, 888 957 pkt->x0, pkt->y0, pkt->x1, pkt->y1, pkt->num_pixels, 889 958 pkt->int_density); 959 if(servo_settings->x_report) printf( " %d",servo_settings->x ); 960 if(servo_settings->y_report) printf( " %d",servo_settings->y ); 961 printf( "\r" ); 890 962 891 963 }
