Changeset 433

Show
Ignore:
Timestamp:
02/18/07 16:53:30 (2 years ago)
Author:
anthony_rowe
Message:

auto servo mode

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/projects/cmucam2/cmucam2.c

    r431 r433  
    1212#include <cc3_jpg.h> 
    1313#include <cc3_math.h> 
    14 #include "polly.h" 
     14 
     15// Uncomment the line below to reverse the servo direction 
     16//#define REVERSE_SERVO_DIRECTION 
    1517 
    1618//#define SERIAL_BAUD_RATE  CC3_UART_RATE_230400 
     
    2527//#define SERIAL_BAUD_RATE  CC3_UART_RATE_300 
    2628 
     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. 
    2734 
    2835static const int MAX_ARGS = 10; 
     
    4754  VIRTUAL_WINDOW, 
    4855  DOWN_SAMPLE, 
    49   GET_POLLY, 
    5056  GET_HISTOGRAM, 
    5157  TRACK_WINDOW, 
     
    5561  NOISE_FILTER, 
    5662  TRACK_INVERT, 
     63  SERVO_MASK, 
     64  SERVO_PARAMETERS, 
    5765  SERVO_OUTPUT, 
    5866  GET_SERVO, 
    5967  CMUCAM2_CMD_END               // Must be last entry so array sizes are correct 
    6068} cmucam2_command_t; 
     69 
     70typedef struct { 
     71uint8_t pan_step,tilt_step; 
     72uint8_t pan_range_near,tilt_range_near; 
     73uint8_t pan_range_far,tilt_range_far; 
     74int16_t x; 
     75int16_t y; 
     76bool y_control; 
     77bool x_control; 
     78bool y_report; 
     79bool x_report; 
     80} cmucam2_servo_t; 
     81 
    6182 
    6283char *cmucam2_cmds[CMUCAM2_CMD_END]; 
     
    89110  //  SM servo mask 
    90111  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   
    92119  /* Image Windowing Commands */ 
    93120  cmucam2_cmds[SEND_FRAME] = "SF"; 
     
    138165  /* CMUcam3 New Commands */ 
    139166  cmucam2_cmds[SEND_JPEG] = "SJ"; 
    140   cmucam2_cmds[GET_POLLY] = "GP"; 
     167  //cmucam2_cmds[GET_POLLY] = "GP"; 
    141168} 
    142169 
     
    148175static void cmucam2_write_s_packet (cc3_color_info_pkt_t * pkt); 
    149176static 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); 
    152179static int32_t cmucam2_get_command (int32_t * cmd, int32_t * arg_list); 
    153180static void print_ACK (void); 
    154181static void print_NCK (void); 
    155 static void cmucam2_write_t_packet (cc3_track_pkt_t * pkt); 
     182static void cmucam2_write_t_packet (cc3_track_pkt_t * pkt, cmucam2_servo_t *servo_settings); 
    156183static void cmucam2_write_h_packet (cc3_histogram_pkt_t * pkt); 
    157184static void cmucam2_send_image_direct (bool auto_led); 
     185 
     186 
    158187 
    159188int main (void) 
     
    162191  int32_t val, n; 
    163192  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
    165194  cc3_track_pkt_t t_pkt; 
    166195  cc3_color_info_pkt_t s_pkt; 
    167196  cc3_histogram_pkt_t h_pkt; 
     197  cmucam2_servo_t servo_settings; 
    168198 
    169199  set_cmucam2_commands (); 
     
    181211  } 
    182212 
     213  servo_settings.x_control=false; 
     214  servo_settings.y_control=false; 
     215  servo_settings.x_report=false; 
     216  servo_settings.y_report=false; 
    183217  demo_mode = false; 
    184   auto_servo_mode = false; 
     218  
    185219  start_time = cc3_timer_get_current_ms (); 
     220   
    186221  do { 
    187222    if (cc3_button_get_state () == 1) { 
    188223      // Demo Mode flag 
    189224      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; 
    191229      // Debounce Switch 
    192230      cc3_led_set_off (0); 
     
    211249  t_pkt.lower_bound.channel[2] = 16; 
    212250  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; 
    213261 
    214262 
     
    223271  cc3_gpio_set_mode (2, CC3_GPIO_MODE_SERVO); 
    224272  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); 
    225278 
    226279  cc3_pixbuf_set_subsample (CC3_SUBSAMPLE_NEAREST, 2, 1); 
     
    303356        break; 
    304357 
    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: 
    307387        if (n != 1) { 
    308388          error = true; 
     
    471551          t_pkt.upper_bound.channel[2] = arg_list[5]; 
    472552        } 
    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); 
    474554        break; 
    475555 
     
    537617            tmp = 240; 
    538618          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); 
    540620        } 
    541621        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, &reg_line); 
    571  
    572             // return linear regression offset value 
    573             printf ("P %f ", reg_line.b); 
    574             // return linear regression slope 
    575             printf ("%f ", reg_line.m); 
    576             // return r squared value 
    577             printf ("%f ", reg_line.r_sqr); 
    578             // return distance to line at middle of image 
    579             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         } 
    588622        break; 
    589623 
     
    613647 
    614648      case SET_SERVO: 
    615         if (n != 2) { 
     649        if (n != 2 || arg_list[0]>4) { 
    616650          error = true; 
    617651          break; 
     
    621655        cc3_gpio_set_mode (arg_list[0], CC3_GPIO_MODE_SERVO); 
    622656        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]; 
    623659        break; 
    624660 
     
    772808 
    773809void 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) 
    776812{ 
    777813  cc3_image_t img; 
    778   uint16_t i
     814  uint16_t i,x_mid,y_mid
    779815 
    780816  img.channels = 3; 
     
    785821    return; 
    786822  } 
     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   
    787828  do { 
    788829    cc3_pixbuf_load (); 
     
    848889          cc3_led_set_off (0); 
    849890      } 
    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; 
    858927    } 
    859928  } while (!poll_mode); 
     
    863932 
    864933 
    865 void cmucam2_write_t_packet (cc3_track_pkt_t * pkt
     934void cmucam2_write_t_packet (cc3_track_pkt_t * pkt, cmucam2_servo_t *servo_settings
    866935{ 
    867936  if (pkt->centroid_x > 255) 
     
    883952 
    884953  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"); 
    886955  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, 
    888957            pkt->x0, pkt->y0, pkt->x1, pkt->y1, pkt->num_pixels, 
    889958            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" ); 
    890962 
    891963}