2016年度 情報科学類 ソフトウェアサイエンス実験B
以下のソースコードを用いると、gnuplotでセンサデータをリアルタイムに可視化することができます。 gnuplotをインストールした上で利用してください。
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#include <signal.h>
#include <scip2awd.h>
int gIsShuttingDown;
void ctrl_c(int aStatus) {
/* exit loop */
gIsShuttingDown = 1;
signal(SIGINT, NULL);
}
int main(int argc, char **argv) {
/* variables */
int ret;
S2Port *urg_port; /* port */
S2Sdd_t urg_buff; /* buffer */
S2Scan_t *urg_data; /* pointer to buffer */
S2Param_t urg_param; /* parameter */
/* set Ctrl-c function */
signal(SIGINT, ctrl_c);
/* check argument */
if( argc < 2 ) {
fprintf(stderr, "ERORR: missing device operand\n");
fprintf(stderr, "USAGE: %s \n", argv[0]);
fprintf(stderr, " e.g.: %s /dev/ttyACM0\n", argv[0]);
return 1;
}
/* open port */
urg_port = Scip2_Open(argv[1], B115200);
if(urg_port == 0) {
fprintf(stderr, "ERORR: cannot open %s\n", argv[1]);
return 1;
}
fprintf(stdout, "port opened\n");
/* init buffer */
S2Sdd_Init(&urg_buff);
/* get paramerter */
Scip2CMD_PP(urg_port, &urg_param);
/* scan start */
// Scip2CMD_StartMS(urg_port, 44, 725, 1, 0, 0, &urg_buff, SCIP2_ENC_3BYTE);
ret = Scip2CMD_StartMS(urg_port, urg_param.step_min, urg_param.step_max, 1, 0, 0, &urg_buff, SCIP2_ENC_3BYTE );
if(ret == 0) {
fprintf(stderr, "ERROR: Scip2CMD_StartMS\n");
return 1;
}
fprintf(stdout, "scan started\n");
/* open pipe to gnuplot */
FILE *fp = popen("gnuplot -noraise", "w");
if(fp == NULL) {
fprintf(stderr, "ERROR: popen\n");
return 1;
}
fprintf(stdout, "pipe opened\n");
fputs("set terminal x11\n", fp); /* drawing destination */
fputs("set grid\n", fp); /* draw grid */
fputs("set mouse\n", fp); /* use mouse */
fputs("set xlabel \"y [m]\"\n", fp); /* label of x-axis */
fputs("set ylabel \"x [m]\"\n", fp); /* label of y-axis */
fputs("set xrange [-6:6] reverse\n", fp); /* range of x-axis */
fputs("set yrange [-6:6]\n", fp); /* range of y-axis */
fputs("set size ratio -1\n", fp); /* aspect ratio */
fputs("unset key\n", fp); /* hide graph legends */
/* main loop */
gIsShuttingDown = 0;
while(!gIsShuttingDown) {
int i;
double x, y, rad;
/* lock buffer */
ret = S2Sdd_Begin(&urg_buff, &urg_data);
if(ret > 0) {
fputs("plot '-'\n", fp);
for(i = 0; i < urg_data->size; ++i) {
if(urg_data->data[i] < 20) { /* error code */
continue;
}
rad = (2 * M_PI / urg_param.step_resolution) * (i + urg_param.step_min - urg_param.step_front);
x = urg_data->data[i] * cos(rad) / 1000.0;
y = urg_data->data[i] * sin(rad) / 1000.0;
fprintf(fp, "%f %f\n", y, x);
}
fputs("e\n", fp);
/* unlock buffer */
S2Sdd_End(&urg_buff);
/* wait 90 ms (URG-04LX 1scan = 100 ms) */
usleep(90000);
} else if(ret == -1) {
fprintf(stderr, "ERROR: S2Sdd_Begin\n");
break;
} else {
usleep(100);
}
}
/* close pipe */
pclose(fp);
fprintf(stdout, "pipe closed\n");
/* scan stop */
ret = Scip2CMD_StopMS(urg_port, &urg_buff);
if(ret == 0) {
fprintf(stderr, "ERROR: Scip2CMD_StopMS\n");
return 1;
}
fprintf(stdout, "scan stopped\n");
/* destruct buffer */
S2Sdd_Dest(&urg_buff);
/* close port */
Scip2_Close(urg_port);
fprintf(stdout, "port closed\n");
}