6 #include <CRecognition.h>
10 #include <roboorte_robottype.h>
12 #include "../control/CRecognition.h"
24 CRecognition *recognition;
25 //SRobotCommand command;
26 SPixelPosition meanPosition;
28 Uint8 lastKeys[10000];
32 unsigned char color [3];
33 unsigned char* pix = NULL;
38 /* Public data for ORTE comuunication */
39 struct robottype_orte_data orte;
40 bool camera_control_on = false;
42 void send_cmr_res_cb(const ORTESendInfo *info, void *vinstance, void *recvCallBackParam);
43 void rcv_cmr_ctrl_cb(const ORTERecvInfo *info, void *vinstance, void *recvCallBackParam);
44 void rcv_cmr_rsw_cb(const ORTERecvInfo *info, void *vinstance, void *recvCallBackParam);
49 while (SDL_PollEvent(&event)){
50 if (event.type == SDL_MOUSEBUTTONDOWN) {
51 pix = &image->data[3*(image->width*event.motion.y + event.motion.x)];
52 recognition->learnPixel(pix, color, teamcolor);
56 keys = SDL_GetKeyState(&keyNumber);
57 if (keys[SDLK_ESCAPE]) stop = true;
58 if (keys[SDLK_a]) camera->setBrightness(camera->getBrightness()+10);
59 if (keys[SDLK_z]) camera->setBrightness(camera->getBrightness()-10);
60 if (keys[SDLK_s]) camera->setExposition(camera->getExposition()+10);
61 if (keys[SDLK_x]) camera->setExposition(camera->getExposition()-10);
62 if (keys[SDLK_u]) camera->setExposition(7);
63 if (keys[SDLK_SPACE] && lastKeys[SDLK_SPACE] == false) move = (move == false);
64 if (keys[SDLK_m]) recognition->increaseTolerance();
65 if (keys[SDLK_n]) recognition->decreaseTolerance();
66 //if (keys[SDLK_l]) recognition->learnPixel(&image->data[3*(640*240+320)]);
67 if (keys[SDLK_RETURN])image->saveBmp();
68 memcpy(lastKeys,keys,keyNumber);
71 static void sig_handler(int sig)
76 void controlExposition(CRawImage *img, CCamera *camera) {
79 const int referenceBr = 130;
81 int actualBr = img->getOverallBrightness(false);
82 //fprintf(stderr,"Overal brightness=%d\n",actualBr);
84 int curExp = camera->getExposition();
85 //fprintf(stderr,"Current exposition is %d\n",curExp);
86 int correction = lround(0.01*(referenceBr-actualBr));
92 //fprintf(stderr,"Correction is %d\n",correction);
94 if (correction != 0) {
95 //fprintf(stderr,"Setting exposition to %d\n",curExp);
97 camera->setExposition(curExp);
101 //sprintf(name,"ex%06d.bmp",aa++);
102 //img->saveBmp(name);
106 /* Funkce pro odeslani dat do ORTE */
107 void send_data(SPixelPosition pos)
110 orte.camera_result.x = pos.x;
111 orte.camera_result.y = pos.y;
112 orte.camera_result.target_valid = pos.info; // OK / NOTĀ OK
113 orte.camera_result.data_valid = data;
115 ORTEPublicationSend(orte.publication_camera_result);
116 fprintf(stderr, "ORTE: x: %d y: %d, info: %d \n", pos.x, pos.y, pos.info);
119 /* Fce pro zapnuti a vypnuti rozpoznavani */
120 inline bool getCameraControlOn(void) {
123 if(orte.camera_control.on != camera_control_on) {
124 camera_control_on = orte.camera_control.on;
125 fprintf(stderr, "orte: camera_control changed: ctrl %d\n",
129 for (int i =0;i<3;i++){
130 if (color[i] != orte.camera_control.color[i]) {
131 color[i] = orte.camera_control.color[i];
135 if(col) recognition->learnPixel(pix, color, teamcolor);
136 return camera_control_on;
139 /** Orte camera control callback function.
140 * Sets actual value of orte.camera_control.on to camera_control_on. */
141 void rcv_cmr_ctrl_cb(const ORTERecvInfo *info, void *vinstance, void *recvCallBackParam) {
142 struct robottype_orte_data *orte_data = (struct robottype_orte_data *)recvCallBackParam;
144 switch (info->status) {
146 fprintf(stderr, "orte: New camera data: ctrl %d\n",
147 orte_data->camera_control.on);
148 getCameraControlOn();
151 fprintf(stderr, "ORTE deadline occurred - CMR_CTRL receive\n");
156 /** Orte robot switches callback function.
157 * Sets actual value of orte.robot_switches to rswitch */
158 void rcv_cmr_rsw_cb(const ORTERecvInfo *info, void *vinstance, void *recvCallBackParam) {
159 struct robottype_orte_data *orte_data = (struct robottype_orte_data *)recvCallBackParam;
161 switch (info->status) {
163 fprintf(stderr, "orte: New camera data: ctrl %d\n",
164 orte_data->robot_switches.team_color);
165 teamcolor = orte.robot_switches.team_color;
168 fprintf(stderr, "ORTE deadline occurred - CMR_CTRL receive\n");
173 int main(int argc,char* argv[])
175 //Pokud neni zadan argument na prikazove radce, program vypise nasledujici chybove hlaseni a ukonci se
177 fprintf(stderr,"usage: %s cameraDevice \ne.g. %s /dev/video0\n",argv[0],argv[0]);
181 // Signal handler registration
182 signal(SIGINT, sig_handler);
183 signal(SIGTERM, sig_handler);
185 const char* cameraDevice = argv[1];
186 //const char* robotDevice = argv[2];
190 ret = robottype_roboorte_init(&orte);
192 fprintf(stderr, "robottype_roboorte_init failed\n");
196 robottype_subscriber_camera_control_create(&orte, rcv_cmr_ctrl_cb, &orte);
197 robottype_subscriber_robot_switches_create(&orte, rcv_cmr_rsw_cb, &orte);
199 //Vytvoreni instanci tridy kamery, gui a obrazku
200 camera = new CCamera();
204 image = new CRawImage();
205 //robot = new CRobot();
206 recognition = new CRecognition();
208 //Inicializace zarizeni
209 camera->init(cameraDevice);
210 //robot->init(robotDevice);
211 //image->getSaveNumber();
213 camera->setExposition(8);
216 while (camera_control_on && !stop) {
218 camera->renewImage(image);
220 //start timeru pro mereni doby zpracovani obrazu
225 //meanPosition = recognition->findMean(image);
226 meanPosition = recognition->findSegment(image);
227 //fprintf(stdout,"meanPosition: xy = %i %i\n", meanPosition.x, meanPosition.y);
228 //vypis timeru doby zpracovani obrazu
229 //fprintf(stdout,"Timer %i\n",timer.getTime());
231 //command = robot->computeCommand(meanPosition);
232 //odeslani obrazu robotovi
233 //if (move) robot->sendCommand(command);
235 //vykresleni vysledku zpracovani
236 if (move==false || i%1 ==0) {
237 fprintf(stdout,"pred send_data: xy = %i %i\n", meanPosition.x, meanPosition.y);
238 send_data(meanPosition);
239 image->plotLine(meanPosition.x,meanPosition.y);
243 gui->drawImage(image);
247 //Zpracovani udalosti z klavesnice
251 //fprintf(stderr,"Device exposition=%d\n",camera->getExposition());
252 //fprintf(stderr,"%d\n\nBR=%lf\n",i,image->getOverallBrightness(true));
255 controlExposition(image,camera);
265 ret = robottype_roboorte_destroy(&orte);