main() { int fd,c, res; struct termios oldtio,newtio; char buf[255]; char buf2[255]; // ssmのイニシャライズ initSSM(); DORDER.open(SSM_READ); fd = open(MODEMDEVICE, O_WRONLY | O_NOCTTY ); if (fd <0) {perror(MODEMDEVICE); exit(-1); } tcgetattr(fd,&oldtio); /* 現在のポート設定を待避 */ bzero(&newtio, sizeof(newtio)); newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; /* set input mode (non-canonical, no echo,...) */ newtio.c_lflag = 0; newtio.c_cc[VTIME] = 0; /* キャラクタ間タイマは未使用 */ newtio.c_cc[VMIN] = 5; /* 5文字受け取るまでブロックする */ tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); while(1) { DORDER.readNew(); cout << DORDER.data.order << endl; buf[0] = 'o'; buf2[0] = 'c'; if(DORDER.data.order >= 1) { write(fd, buf, 1); }else{ write(fd, buf2, 1); } usleep(1000); } tcsetattr(fd,TCSANOW,&oldtio);//設定をもとに戻す close(fd); }
bool initialize(Step_buf& raw_data_U, Step_buf& raw_data_D, LS3D& background_U, LS3D& background_D) { cout << "初期化開始" << endl; int scan_cnt_U = 0; int scan_cnt_D = 0; double loop_start_time = 0.0; double loop_end_time = 0.0; while(scan_cnt_U < BUFFER_LENGTH && scan_cnt_D < BUFFER_LENGTH) { if (SCAN_DATA.readNew()) { loop_start_time = get_time(); //-読み込みデータのセット-// if(SCAN_DATA.data.det == 'U') { raw_data_U.set_data(SCAN_DATA.data.det, SCAN_DATA.data.dist, SCAN_DATA.data.x, SCAN_DATA.data.y, SCAN_DATA.data.z); scan_cnt_U++; } if(SCAN_DATA.data.det == 'D') { raw_data_D.set_data(SCAN_DATA.data.det, SCAN_DATA.data.dist, SCAN_DATA.data.x, SCAN_DATA.data.y, SCAN_DATA.data.z); scan_cnt_D++; } loop_end_time = get_time(); sleep_const_freq(loop_start_time, loop_end_time, FREQ); }else{ usleep(1000); } } get_background (raw_data_U, background_U); get_background (raw_data_D, background_D); cout << "初期化完了" << endl; }
void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //変換行列 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -camera_distance); glRotatef(-camera_pitch, 1.0, 0.0, 0.0); glRotatef(-camera_yaw, 0.0, 1.0, 0.0); glRotatef(-camera_roll, 0.0, 0.0, 1.0); // 変換行列を設定(物体のモデル座標系→カメラ座標系) //(物体が (0.0, 1.0, 0.0) の位置にあり、静止しているとする) glTranslatef( -1000.0, 0.0, SENSOR_HEIGHT); if (OBJECT.readNew()) { //スキャンデータの格納 if (OBJECT.data.det == 'U') { for (int i = 0; i < STEP_NUM_MAX; i++) { vertex_U[i][0] = OBJECT.data.x[i]; vertex_U[i][1] = OBJECT.data.y[i]; vertex_U[i][2] = OBJECT.data.z[i]; } } if (OBJECT.data.det == 'D') { for (int i = 0; i < STEP_NUM_MAX; i++) { vertex_D[i][0] = OBJECT.data.x[i]; vertex_D[i][1] = OBJECT.data.y[i]; vertex_D[i][2] = OBJECT.data.z[i]; } } //スキャン点の描画 glLineWidth(1.0); glClear(GL_COLOR_BUFFER_BIT); glPointSize(POINTSIZE); glBegin(GL_POINTS); for(int j=0; j<STEP_NUM_MAX; j++) { glColor3d(1.0, 0.0, 0.0); glVertex3d(vertex_U[j][0], vertex_U[j][1], vertex_U[j][2]); } for(int j=0; j<STEP_NUM_MAX; j++) { glColor3d(0.0, 0.0, 1.0); glVertex3d(vertex_D[j][0], vertex_D[j][1], vertex_D[j][2]); } glEnd(); // //1メートルのエリア // glColor3d(0.0, 0.0, 0.0); // glBegin(GL_LINE_LOOP); // glVertex3d(0.0, -1000.0, -SENSOR_HEIGHT); // glVertex3d(1000.0, -1000.0, -SENSOR_HEIGHT); // glVertex3d(1000.0, 1000.0, -SENSOR_HEIGHT); // glVertex3d(0.0, 1000.0, -SENSOR_HEIGHT); // glEnd(); //監視領域(スポット) glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); glVertex3d(0.0, -2200.0, -SENSOR_HEIGHT); glVertex3d(3000.0, -2200.0, -SENSOR_HEIGHT); glVertex3d(3000.0, 2200.0, -SENSOR_HEIGHT); glVertex3d(0.0, 2200.0, -SENSOR_HEIGHT); glEnd(); glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); glVertex3d(0.0, 0.0, -SENSOR_HEIGHT); glVertex3d(6000.0, -0.0, -SENSOR_HEIGHT); glEnd(); glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); glVertex3d(0.0, 4000.0, -SENSOR_HEIGHT); glVertex3d(0.0, -4000.0, -SENSOR_HEIGHT); glEnd(); glBegin(GL_LINE_LOOP); glVertex3d(0.0, 0.0, 1000.0); glVertex3d(0.0, 0.0, -SENSOR_HEIGHT); glEnd(); // //円周を線だけで表示(1000) // glBegin( GL_LINE_LOOP ); // float cx, cy, cz; // glColor3f( 0.0, 0.0, 0.0 );//white // for(int i=0;i<=180;i++){ // cx = 1000.0*sin(M_PI*(double)i/(double)180.0); // cy = 1000.0*cos(M_PI*(double)i/(double)180.0); // cz = -SENSOR_HEIGHT; // glVertex3f( cx, cy, cz ); // } // glEnd(); // //円周を線だけで表示(2000) // glBegin( GL_LINE_LOOP ); // cx = 0.0; // cy = 0.0; // cz = 0.0; // glColor3f( 0.0, 0.0, 0.0 );//white // for(int i=0;i<=180;i++){ // cx = 2000.0*sin(M_PI*(float)i/(float)180.0); // cy = 2000.0*cos(M_PI*(float)i/(float)180.0); // cz = -SENSOR_HEIGHT; // glVertex3f( cx, cy, cz ); // } // glEnd(); // //円周を線だけで表示(3000) // glBegin( GL_LINE_LOOP ); // cx = 0.0; // cy = 0.0; // cz = 0.0; // glColor3f( 0.0, 0.0, 0.0 );//white // for(int i=0;i<=180;i++){ // cx = 3000.0*sin(M_PI*(float)i/(float)180.0); // cy = 3000.0*cos(M_PI*(float)i/(float)180.0); // cz = -SENSOR_HEIGHT; // glVertex3f( cx, cy, cz ); // } // glEnd(); //センサ glPushMatrix(); glColor3d(0.0, 0.0, 0.0); //色の設定 glTranslated(0.0, 0.0, 0.0);//平行移動値の設定 glutSolidSphere(100.0, 20, 20);//引数:(半径, Z軸まわりの分割数, Z軸に沿った分割数) glPopMatrix(); glutSwapBuffers(); } //if(OBJECT.readNew) sleepSSM(0.005); }
int main (int argc, char *argv[]) { //-SSM-// initSSM(); OBJECT.create(5.0,1.0); SCAN_DATA.open(SSM_READ); AREA.create(5.0, 1.0); //-クラスと構造体-// Step_buf raw_data_U; //生データ Step_buf raw_data_D; //生データ Step_buf ped_data; //加工後のデータ LS3D background_U; //環境データ LS3D background_D; //環境データ //-時間の制御用-// double time_MovingObjects_are_detected = get_time(); // 動体が検出された時の時刻 double time_MovingObjects_gets_out = get_time(); // 動体がいなくなったときの時刻 double time_get_background = 0.0; //-初期化-// initialize(raw_data_U, raw_data_D, background_U, background_D); time_get_background = get_time(); // raw_data.out_csv(); // デバッグ用 //-ループ開始-// while(1) { if (SCAN_DATA.readNew()) { double loop_start_time = get_time(); if (SCAN_DATA.data.det == 'U') { //-読み込みデータのセット-// raw_data_U.set_data(SCAN_DATA.data.det, SCAN_DATA.data.dist, SCAN_DATA.data.x, SCAN_DATA.data.y, SCAN_DATA.data.z); //-差分データの計算-// cal_background_diff (raw_data_U, ped_data, background_U); //-エリアフィルタの適用-// apply_area_filter(ped_data); //-差分データをSSM構造体にセット-// OBJECT.data.det = ped_data.det[CUR_INDEX]; for (int i=0; i<STEP_NUM; i++) { OBJECT.data.dist[i] = ped_data.dist[i][CUR_INDEX]; OBJECT.data.x[i] = ped_data.x[i][CUR_INDEX]; OBJECT.data.y[i] = ped_data.y[i][CUR_INDEX]; OBJECT.data.z[i] = ped_data.z[i][CUR_INDEX]; } } if (SCAN_DATA.data.det == 'D') { //-読み込みデータのセット-// raw_data_D.set_data(SCAN_DATA.data.det, SCAN_DATA.data.dist, SCAN_DATA.data.x, SCAN_DATA.data.y, SCAN_DATA.data.z); //-差分データの計算-// cal_background_diff (raw_data_D, ped_data, background_D); //-エリアフィルタの適用-// apply_area_filter(ped_data); //-差分データをSSM構造体にセット-// OBJECT.data.det = ped_data.det[CUR_INDEX]; for (int i=0; i<STEP_NUM; i++) { OBJECT.data.dist[i] = ped_data.dist[i][CUR_INDEX]; OBJECT.data.x[i] = ped_data.x[i][CUR_INDEX]; OBJECT.data.y[i] = ped_data.y[i][CUR_INDEX]; OBJECT.data.z[i] = ped_data.z[i][CUR_INDEX]; } } //-静止物体が存在するかの判定-// // AREA.data.hasObjects = judge_Objects_exist(ped_data); //-動体が存在するかの判定-// AREA.data.hasMovingObjects = judge_MovingObjects_exist(ped_data); if ( AREA.data.hasMovingObjects == true) { // 動物体を検出したときの時刻を取得 time_MovingObjects_are_detected = get_time(); }else{ // 動物体が存在しないときの時刻を取得 time_MovingObjects_gets_out = get_time(); // 最後に物体を検出してからの時間を算出 double timelength_noMovingObjects = time_MovingObjects_gets_out - time_MovingObjects_are_detected; cout << "timelength_noMovingObjects = " << timelength_noMovingObjects << endl; // 動物体が長い間存在していなかったら、環境データを更新する。 if (timelength_noMovingObjects > 3 && (get_time() - time_get_background) > 180) { get_background (raw_data_U, background_U); get_background (raw_data_D, background_D); time_get_background = get_time(); time_MovingObjects_are_detected = get_time(); time_MovingObjects_gets_out = get_time(); } } //-SSMの書き込み-// OBJECT.write(); AREA.write(); double loop_end_time = get_time(); sleep_const_freq(loop_start_time, loop_end_time, FREQ); }else{ usleep(10000); // CPU使用率100%対策 } } //-SSMクローズ-// OBJECT.release(); SCAN_DATA.close(); AREA.release(); endSSM(); return 0; }
void idle() { bool update = false; if(setgl) { qout << "r"; } #ifdef MERGEDEBUG if(edata.isOpen()) if(edata.readNew()) { double minX=1e10, maxX=-1e10; double minY=1e10, maxY=-1e10; for(int i=0; i<edata.data.numpoints; i++) { minX = min(minX, edata.data. start_x[i]); minX = min(minX, edata.data. finish_x[i]); minY = min(minY, edata.data. start_y[i]); minY = min(minY, edata.data. finish_y[i]); maxX = max(maxX, edata.data. start_x[i]); maxX = max(maxX, edata.data. finish_x[i]); maxY = max(maxY, edata.data. start_y[i]); maxY = max(maxY, edata.data. finish_y[i]); point s(edata.data. start_x[i], edata.data. start_y[i]); point t(edata.data.finish_x[i], edata.data.finish_y[i]); mergedline.push(line(s,t)); } mergecenter = point( (minX+maxX)/2.0, (minY+maxY)/2.0 ); if(true) //mergecnt==0) { mergedline.shift(-mergecenter); mergedline.prepare(); mergedline.clustering_line(); mergedline.clustering_segment(); mergedline.merge(); mergedline.shift(+mergecenter); } update=true; } #endif if(ldata.isOpen()) if(ldata.readNew()) { update=true; } if(edata.isOpen()) if(edata.readNew()) { update=true; } if(lajst.isOpen()) if(lajst.readNew()) { update=true; } if(eajst.isOpen()) if(eajst.readNew()) { update=true; } if(pinfo.isOpen()) if(pinfo.readNew()) { update=true; } if(glpos.isOpen()) if(glpos.readNew()) { robot = triple(glpos.data.x, glpos.data.y, 0); update=true; } triple t; if(linfo.isOpen()) { if(linfo.readNew()) { linemap.clear(); ifstream fin(linfo.data.mapname); if(fin) while(fin >> t.x >> t.y) { linemap.push_back(t); } } }
int main (int argc, char *argv[]) { //-SSM-// initSSM(); OBJECT.create(5.0,1.0); SCAN_DATA.open(SSM_READ); get_background(&background_U, &background_D); // ofstream ofs; // ofs.open("background"); // for (int i = 0; i < beam_num; i++) // { // ofs << background_U.dist[i] << endl; // } // for (int i = 0; i < beam_num; i++) // { // ofs << background_D.dist[i] << endl; // } // ofs.close(); cout << "get background" << endl; while(1) //データ取得ループ { if(SCAN_DATA.readNew()) //readNew { time_1 = get_time(); if(SCAN_DATA.data.det == 'U') { OBJECT.data.det = 'U'; for(int i=0; i<beam_num; i++) { dist_diff[i] = fabs(SCAN_DATA.data.dist[i] - background_U.dist[i]); if(dist_diff[i] <= diff_min) { OBJECT.data.dist[i] = 0.0; OBJECT.data.x[i] = 0.0; OBJECT.data.y[i] = 0.0; OBJECT.data.z[i] = 0.0; }else{//(dist_diff[i] > diff_min /*&& dist_diff[i] < diff_max*/){ OBJECT.data.dist[i] = SCAN_DATA.data.dist[i]; OBJECT.data.x[i] = SCAN_DATA.data.x[i]; OBJECT.data.y[i] = SCAN_DATA.data.y[i]; OBJECT.data.z[i] = SCAN_DATA.data.z[i]; } } } if(SCAN_DATA.data.det == 'D') { OBJECT.data.det = 'D'; for(int i=0; i<beam_num; i++) { dist_diff[i] = fabs(SCAN_DATA.data.dist[i] - background_D.dist[i]); if(dist_diff[i] <= diff_min ) { OBJECT.data.dist[i] = 0.0; OBJECT.data.x[i] = 0.0; OBJECT.data.y[i] = 0.0; OBJECT.data.z[i] = 0.0; }else{//(dist_diff[i] > diff_min /*&& dist_diff[i] < diff_max*/){ OBJECT.data.dist[i] = SCAN_DATA.data.dist[i]; OBJECT.data.x[i] = SCAN_DATA.data.x[i]; OBJECT.data.y[i] = SCAN_DATA.data.y[i]; OBJECT.data.z[i] = SCAN_DATA.data.z[i]; } } } OBJECT.write(); time_2 = get_time(); usleep(freq*1000000 - (time_2 - time_1)*1000000); time_3 = get_time(); cout << "time = " << time_3 - time_1 << endl; }else{ //readNew usleep(1000); //CPU使用率100%対策 } } //データ取得ループ //-SSMクローズ-// OBJECT.release(); SCAN_DATA.close(); endSSM(); return 0; }
void get_background(LS3D *background_U, LS3D *background_D) { int cnt_U=0; int cnt_D=0; while(cnt_U < 10 && cnt_D <10) { if(SCAN_DATA.readNew()) { if(SCAN_DATA.data.det == 'U') { for(int i=0; i<beam_num; i++) { buf_U[cnt_U].dist[i] = SCAN_DATA.data.dist[i]; buf_U[cnt_U].det = SCAN_DATA.data.det; buf_U[cnt_U].x[i] = SCAN_DATA.data.x[i]; buf_U[cnt_U].y[i] = SCAN_DATA.data.y[i]; buf_U[cnt_U].z[i] = SCAN_DATA.data.z[i]; } cnt_U++; } if(SCAN_DATA.data.det == 'D') { for(int i=0; i<beam_num; i++) { buf_D[cnt_D].dist[i] = SCAN_DATA.data.dist[i]; buf_D[cnt_D].det = SCAN_DATA.data.det; buf_D[cnt_D].x[i] = SCAN_DATA.data.x[i]; buf_D[cnt_D].y[i] = SCAN_DATA.data.y[i]; buf_D[cnt_D].z[i] = SCAN_DATA.data.z[i]; } cnt_D++; } } } //-バブルソート-// for(int k=0; k<beam_num; k++) //スキャンラインの数だけループ { double w; for(int i=0;i<(10-1);i++){ // 一番小さいデータを配列の右端から詰めていく for(int j=0;j<(10-1)-i;j++){// 詰めた分だけ比較する配列要素は減る if(buf_U[j].dist[k] < buf_U[j+1].dist[k]){ w = buf_U[j].dist[k]; buf_U[j].dist[k] = buf_U[j+1].dist[k]; buf_U[j+1].dist[k] = w; } } } } for(int k=0; k<beam_num; k++) //スキャンラインの数だけループ { double w; for(int i=0;i<(10-1);i++){ // 一番小さいデータを配列の右端から詰めていく for(int j=0;j<(10-1)-i;j++){// 詰めた分だけ比較する配列要素は減る if(buf_D[j].dist[k] < buf_D[j+1].dist[k]){ w = buf_D[j].dist[k]; buf_D[j].dist[k] = buf_D[j+1].dist[k]; buf_D[j+1].dist[k] = w; } } } } for(int i=0; i<beam_num; i++) { background_U->dist[i] = buf_U[5].dist[i]; background_U->x[i] = buf_U[5].x[i]; background_U->y[i] = buf_U[5].y[i]; background_U->z[i] = buf_U[5].z[i]; background_D->dist[i] = buf_D[5].dist[i]; background_D->x[i] = buf_D[5].x[i]; background_D->y[i] = buf_D[5].y[i]; background_D->z[i] = buf_D[5].z[i]; } background_U->det = 'U'; background_D->det = 'D'; }
void display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //変換行列 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0, 0.0, -camera_distance); glRotatef(-camera_pitch, 1.0, 0.0, 0.0); glRotatef(-camera_yaw, 0.0, 1.0, 0.0); glRotatef(-camera_roll, 0.0, 0.0, 1.0); // 変換行列を設定(物体のモデル座標系→カメラ座標系) //(物体が (0.0, 1.0, 0.0) の位置にあり、静止しているとする) glTranslatef( -1000.0, 0.0, SENSOR_HEIGHT); if (SCAN_DATA.readNew()) { //スキャンデータの格納 if (SCAN_DATA.data.det == 'U') { for (int i = 0; i < STEP_NUM_MAX; i++) { vertex_U[i][0] = SCAN_DATA.data.x[i]; vertex_U[i][1] = SCAN_DATA.data.y[i]; vertex_U[i][2] = SCAN_DATA.data.z[i]; } } if (SCAN_DATA.data.det == 'D') { for (int i = 0; i < STEP_NUM_MAX; i++) { vertex_D[i][0] = SCAN_DATA.data.x[i]; vertex_D[i][1] = SCAN_DATA.data.y[i]; vertex_D[i][2] = SCAN_DATA.data.z[i]; } } //スキャン点の描画 glLineWidth(1.0); glClear(GL_COLOR_BUFFER_BIT); glPointSize(pointsize); glBegin(GL_POINTS); for(int j=0; j<2720; j++) { glColor3d(1.0, 0.0, 0.0); glVertex3d(vertex_U[j][0], vertex_U[j][1], vertex_U[j][2]); } for(int j=0; j<2720; j++) { glColor3d(0.0, 0.0, 1.0); glVertex3d(vertex_D[j][0], vertex_D[j][1], vertex_D[j][2]); } glEnd(); //1メートルのエリア glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); glVertex3d(0.0, -1000.0, -SENSOR_HEIGHT); glVertex3d(1000.0, -1000.0, -SENSOR_HEIGHT); glVertex3d(1000.0, 1000.0, -SENSOR_HEIGHT); glVertex3d(0.0, 1000.0, -SENSOR_HEIGHT); glEnd(); //監視領域(スポット) glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); glVertex3d(0.0, -2200.0, -SENSOR_HEIGHT); glVertex3d(3000.0, -2200.0, -SENSOR_HEIGHT); glVertex3d(3000.0, 2200.0, -SENSOR_HEIGHT); glVertex3d(0.0, 2200.0, -SENSOR_HEIGHT); glEnd(); glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); glVertex3d(0.0, 0.0, -SENSOR_HEIGHT); glVertex3d(6000.0, -0.0, -SENSOR_HEIGHT); glEnd(); glColor3d(0.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); glVertex3d(0.0, 4000.0, -SENSOR_HEIGHT); glVertex3d(0.0, -4000.0, -SENSOR_HEIGHT); glEnd(); glBegin(GL_LINE_LOOP); glVertex3d(0.0, 0.0, 1000.0); glVertex3d(0.0, 0.0, -SENSOR_HEIGHT); glEnd(); //センサ glPushMatrix(); glColor3d(0.0, 0.0, 0.0); //色の設定 glTranslated(0.0, 0.0, 0.0);//平行移動値の設定 glutSolidSphere(100.0, 20, 20);//引数:(半径, Z軸まわりの分割数, Z軸に沿った分割数) glPopMatrix(); glutSwapBuffers(); } //if(SCAN_DATA.readNew) sleepSSM(0.005); }