セグメンテーション違反?!

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
はじめまして!

セグメンテーション違反?!

#1

投稿記事 by はじめまして! » 9年前

セグメンテーション違反とはどうすれば解決できますか?

code


/************************************************************************/
/* */
/* TEST test30.c Ver. 4.1.16t02xghb9 */
/* */
/* Control of Angle */
/* by input of omegan and zeta */
/* */
/* desired files */
/* (Case PC) */
/* ..\header\robot3.h, ..\header\3darm.h, */
/* ..\header\ctable.h, */
/* ..\libpc\io\3dio.lib or ..\libpc\simu\3dsm.lib, */
/* ..\libpc\graph\2dgr.lib, ..\libpc\file\nddf.lib */
/* (Case WS) */
/* ../header/robot3.h, ../header/3darm.h, */
/* ../header/ctable.h, */
/* ../libws/3simulib/3simulib.a */
/* */
/* Apr. 13, 1991 K. Nagai */
/* Apr. 03, 1993 K. Nagai & H. Hanai */
/* Sep. 19, 1994 S. Iwasa Ver. 3.1 -> 3.2 */
/* Mar. 26, 1998 T. Kawai Ver. 3.2 -> 4.0 */
/* Mar. 27, 2000 J.Yabuki Ver. 4.0 -> 4.1 */
/* Ver. 2016 */
/************************************************************************/

#include <stdio.h>
#include <math.h>

#ifdef WIN32 /* If Personal Computer */
#include <conio.h>
#include "..\header\robot3.h"
#include "..\header\3darm.h"
#include "..\header\ctable.h"
#else /* If UNIX WorkStation */
#include "../header/robot3.h"
#include "../header/3darm.h"
#include "../header/ctable.h"
#endif


#define NJMAX 3 /* number of joint, max. */
#define NPMAX 250 /* number of data, max. */
#define NGMAX 6 /* number of graph, max. */
#define CRT 1 /* device number of CRT */
#define PLOTTER 2 /* device number of PLOTTER */

int nog=6; /* number of graph */

long nl; /* loop counter */
long nlmax; /* max. of loop counter */
float ts; /* (s) sampling time */
float t_data[NPMAX+1]; /* (s) time data */
float qmd_data[NPMAX+1][NJMAX]; /* (deg) desired angle data */
float qm_data[NPMAX+1][NJMAX]; /* (deg) angle data */
float dqm_data[NPMAX+1][NJMAX]; /* (deg/s) angular velocity data */
float taum_data[NPMAX+1][NJMAX]; /* (Nm) motor torque data */
float qd_data[NPMAX+1][NJMAX]; /* (deg) desired angle data */
float q_data[NPMAX+1][NJMAX]; /* (deg) angle data */
float dq_data[NPMAX+1][NJMAX]; /* (deg/s) angular velocity data */
float tau_data[NPMAX+1][NJMAX]; /* (Nm) motor torque data */
float vm_data[NPMAX+1][NJMAX]; /* (v) input voltage for motor */
float data[NGMAX+1][NPMAX+1]; /* for graphs */

int main()
{
int i,j,k; /* joint number */
int nt; /* trial number */
int ntmax; /* max. of trial number */
int nw; /* waiting number for getting data */
int nwmax; /* max. of waiting number for getting data */
int np; /* point number of data */
int npl; /* last point number of data */

float t; /* (s) time */
float tc; /* (s) time span for control */
float qmd[NJMAX]; /* (rad) desired angle of motor axis */
float qm[NJMAX]; /* (rad) angle of motor axis */
float dqm[NJMAX]; /* (rad/s) angular velocity of motor axis */
float taum[NJMAX]; /* (Nm) torque by motor */
float vm[NJMAX]; /* (v) input voltage of motor */
float qd[NJMAX]; /* (rad) desired angle */
float q[NJMAX]; /* (rad) angle */
float dq[NJMAX]; /* (rad/s) angular velocity */
float tau[NJMAX]; /* (Nm) torque by motor */
float M[NJMAX]; /* (kg m^2) M */
float D[NJMAX]; /* (Nm/(rad/s)) D */
float K[NJMAX]; /* ((rad/s)/v) K */
float T[NJMAX]; /* (s) T */
float Mja[NJMAX]; /* (kg m^2) Mjaxis */
float Dja[NJMAX]; /* (Nm/(rad/s)) Djaxis */
float Kja[NJMAX]; /* ((rad/s)/(Nm)) Kjaxis */
float Tja[NJMAX]; /* (s) Tjaxis */
float kp[NJMAX]; /* (v/rad) or (Nm/rad) kp */
float kv[NJMAX]; /* (v/(rad/s)) or (Nm/(rad/s)) kv */
float omegan[NJMAX]; /* (1/s) $B&X(Bn */
float zeta[NJMAX]; /* (-) $B&F(B */
float taxis[3]; /* axis parameters of t for graph */
float vmaxis[3]; /* axis parameters of vm for graph */
float tauaxis[3]; /* axis parameters of taum for graph */
float dqaxis[3]; /* axis parameters of dqm for graph */
float qaxis[3]; /* axis parameters of qm for graph */
float xaxis[3];
float yaxis[3];





int again=1; /* condition for repeating */
int yes_no=1; /* index for selection */
int nd=CRT; /* device number */
float qtemp; /* temporary val. for angle q(deg) */

float j_f; /* 'float' type of 'j' for data file */
float ntmax_f; /* 'float' type of 'ntmax' for data file */
float npl_f; /* 'float' type of 'npl' for data file */

float N[NJMAX]; /* $B8:B.Hf(B */
float R[NJMAX]; /* $BEE5$;RDq93(B (ohm) */
float Kt[NJMAX]; /* $B%H%k%/Dj?t(B KT (kg cm/A) */
float Kb[NJMAX]; /* $B5U5/EENODj?t(B (V/(rad/s)) */
int col[NJMAX]; /* color code entry */
int c; /* color code for graph */

float L, x,y,rdx,rdy,rdth,rdthtemp,dxdt,dydt,theta,theta2,alpha;

float armkidou_data[NPMAX+1][2];



/* top of main program */

init_graph(nd); /* initialization of CRT */

Kt[0] = Kt1; Kt[1] = Kt2; Kt[2] = Kt3;
R[0] = R1; R[1] = R2; R[2] = R3;
Kb[0] = Kb1; Kb[1] = Kb2; Kb[2] = Kb3;
N[0] = N1; N[1] = N2; N[2] = N3;
// L[0] = L1; L[1] = L4 - L2; L[2] = L5;

for(i=0;i<NJMAX;i++){
printf("Kt[%d](Nm/A) = %e\n",i,Kt);
printf("R[%d](ohm) = %e\n",i,R);
printf("Kb[%d](v/(rad/s))= %e\n\n",i,Kb);
}

Mja[0]=Mjaxis1; Mja[1]=Mjaxis2; Mja[2]=Mjaxis3; /* set of M */
Dja[0]=Djaxis1; Dja[1]=Djaxis2; Dja[2]=Djaxis3; /* set of D */
for(j=0;j<NJMAX;j++){
Kja[j]=1/(Dja[j]+(N[j]*N[j]*Kt[j]*Kb[j]/R[j])); /* cal. of Kja */
Tja[j]=Mja[j]/(Dja[j]+(N[j]*N[j]*Kt[j]*Kb[j]/R[j]));/* cal. of Tja */
printf("Mja[%d](kg m^2) = %e\n",j,Mja[j]);
printf("Dja[%d](Nm/(rad/s))= %e\n\n",j,Dja[j]);
printf("Kja[%d]((rad/s)/v)= %e\n",j,Kja[j]);
printf("Tja[%d](s) = %e\n\n",j,Tja[j]);
}

printf("Input a control time, tc(s).\n");
printf("tc(s)= ");scanf("%f",&tc);
printf("tc(s)= %f\n\n",tc);
printf("Input a sampling time, ts(s).\n");
printf("ts(s)= ");scanf("%f",&ts);
printf("ts(s)= %f\n\n",ts);
nlmax=(long)(tc/ts+0.5); /* cal. of max. loop counter */
printf("nlmax= %ld\n\n",nlmax);

printf("Input a waiting number for data acquisition, nwmax.\n");
nwmax=(int)((float)nlmax/NPMAX+0.5);
printf("nwmax>= %d\n",nwmax);

for(nt=1;again!=0;nt++){

set_crtpage(0); /* set of 1st page for CRT */
taxis[0] = 0.5; taxis[1] = 0.0; taxis[2] = tc;
vmaxis[0] = 10.0; vmaxis[1] =-35.0; vmaxis[2] = 35.0;
tauaxis[0] = 0.5; tauaxis[1] = -2.5; tauaxis[2] = 2.5;
dqaxis[0] = 0.2; dqaxis[1] = -1.0; dqaxis[2] = 1.0;
qaxis[0] = 45.0; qaxis[1] = -270.0; qaxis[2] = 270.0;
xaxis[0] = 0.1; xaxis[1] = -0.5; xaxis[2] =0.5;
yaxis[0] = 0.1; yaxis[1] = -0.5; yaxis[2] =0.5;




draw_axis(nd,nog,1,taxis,vmaxis,"time ","voltage [V] ");
draw_axis(nd,nog,2,taxis,tauaxis,"time ","torque [Nm] 2250140042-8");
draw_axis(nd,nog,3,taxis,dqaxis,"time ","angular velocity [kdeg/s]");
draw_axis(nd,nog,4,taxis,qaxis,"time ","angle [deg]");
draw_axis(nd,nog,5,xaxis,yaxis,"x[m]","y[m]2250140042-8");
printf("trial number is %d\n\n",nt);



for(j=0;j<NJMAX;j++){
printf("Input rdx,rdy and rdth[deg]\n");
printf("rdx=");scanf("%f",&rdx);

printf("rdy=");scanf("%f",&rdy);

printf("rdth=");scanf("%f",&rdthtemp);

rdth=rdthtemp*PI/180;

dxdt=rdx-L5*cos(rdth);
dydt=rdy-L5*sin(rdth);

alpha = acos((-dxdt*dxdt-dydt*dydt+L1*L1+(L4-L2)*(L4-L2))/(2*L1*(L4-L2)));
theta2=PI-alpha;
qd[0]=atan2(dydt,dxdt)-atan2((L4-L2)*sin(theta2),(L4-L2)+(L4-L2)*cos(theta2));
qd[1]=theta2+qd[0];
qd[2]=rdth-(theta2+qd[0]);

for(j=0;j<NJMAX;j++){
printf("qd[%d]=%f\n\n", j,qd[j]);

}





for(j=0;j<NJMAX;j++){
printf("Input omegan[%d] and zeta[%d].\n",j,j);
printf("omegan[%d]= ",j);scanf("%f",&omegan[j]);
printf("omegan[%d]= %f\n\n",j,omegan[j]);
printf("zeta[%d]= ",j);scanf("%f",&zeta[j]);
printf("zeta[%d]= %f\n\n",j,zeta[j]);
kp[j]=omegan[j]*omegan[j]*Tja[j]/Kja[j];
kv[j]=(2.0*zeta[j]*omegan[j]*Tja[j]-1.0)/Kja[j];
printf("kp[%d]= %f\n",j,kp[j]);
printf("kv[%d]= %f\n\n",j,kv[j]);
}

init_robot(q,dq); /* initialization of robot */
vm[0]=vm[1]=vm[2]=0.0;put_vm(vm); /* set output to 0 */
tau[0]=tau[1]=tau[2]=0.0; /* set output to 0 for put_tau() */
init_lpf_dq();

getchar();
printf("Start of Loop : Ready ? ");getchar();printf("\n");
printf(" (control)\n");
for(nl=0,np=0,nw=nwmax;nl<=nlmax;nl++){
t=ts*(float)nl; /* cal. of time */

get_q(q); /* input of angle */
get_dq(dq); /* input of angular velocity */

for(j=0;j<NJMAX;j++){
vm[j]=R[j]*(kp[j]*(qd[j]-q[j])-kv[j]*dq[j])/(Kt[j]*N[j]);
/* control law */
}

put_vm(vm); /* output of voltage */

if(nw==nwmax){
if(np<=NPMAX){
t_data[np]=t;
for(i=0;i<NJMAX;i++){
qd_data[np]=qd*180.0/PI;
q_data[np]=q*180.0/PI;
dq_data[np]=dq*180.0/PI;
tau_data[np]=Kt[i]*(vm[i]-Kb[i]*dq[i])/R[i];
vm_data[np][i]=vm[i];
}

armkidou_data[np][0]=L1*cos(q[0])+(L4-L2)*cos(q[1])+L5*cos(q[1]+q[2]);
armkidou_data[np][1]=L1*sin(q[0])+(L4-L2)*sin(q[1])+L5*sin(q[1]+q[2]);
np=np+1;
}
nw=0;
}
nw=nw+1;
}
vm[0]=vm[1]=vm[2]=0.0;put_vm(vm); /* set output as 0 */

printf(" End of loop : Ready ? ");getchar();printf("\n\n");

for(i=0;i<NJMAX;i++){
npl=np-1; /* set of last number of data */
term_robot(); /* terminaton of robot */

for(np=0;np<=npl;np++){
data[0][np]=qd_data[np][i]; /* for 4th graph */
data[1][np]=vm_data[np][i]; /* for 1st graph */
data[2][np]=tau_data[np][i]; /* for 2nd graph */
data[3][np]=dq_data[np][i]*0.001; /* for 3rd graph */
data[4][np]=q_data[np][i]; /* for 4th graph */
}
col[0]=BLUE; col[1]=RED; col[2]=GREEN;
c=col[i];
set_crtpage(0); /* set of 1st page for CRT */
draw_data(nd,nog,4,taxis,qaxis,t_data,&data[0][0],npl,PURPLE);
draw_data(nd,nog,1,taxis,vmaxis,t_data,&data[1][0],npl,c);
draw_data(nd,nog,2,taxis,tauaxis,t_data,&data[2][0],npl,c);
draw_data(nd,nog,3,taxis,dqaxis,t_data,&data[3][0],npl,c);
draw_data(nd,nog,4,taxis,qaxis,t_data,&data[4][0],npl,c);
// draw_data(nd,nog,5,xaxis,yaxis,&data[5][0],data[6][0], npl,c);
}

for(np=0;np<npl;np++){
data[5][np]=armkidou_data[np][0];
data[6][np]=armkidou_data[np][1];
}

write_data(nt,"qd.dat",t_data,qd_data,npl,NJMAX,"%9.3f");
write_data(nt,"q.dat",t_data,q_data,npl,NJMAX,"%9.3f");
write_data(nt,"dq.dat",t_data,dq_data,npl,NJMAX,"%9.2f");
write_data(nt,"tau.dat",t_data,tau_data,npl,NJMAX,"%9.5f");
write_data(nt,"vm.dat",t_data,vm_data,npl,NJMAX,"%9.4f");
write_data(nt,"armkidou.dat",t_data,armkidou_data,npl,2,"%9.3f");

printf("Try again ? (yes=1/no=0) ");scanf("%d",&again);printf("\n");
}
ntmax=nt-1; /* set of max. trial number */

j_f=(float)j;
ntmax_f=(float)ntmax;
npl_f=(float)npl;
write_data(0,"tc.dat",1,&tc,0,1,"%9.3f");
write_data(0,"joint.dat",1,&j_f,0,1,"%9.1f");
write_data(0,"ntmax.dat",1,&ntmax_f,0,1,"%9.1f");
write_data(0,"npl.dat",1,&npl_f,0,1,"%9.1f");

printf("Clear of CRT : Ready ? (Input an integer) ");scanf("%d",&yes_no);
nd=CRT;
term_graph(nd); /* termination of CRT */
/* end of main program */
}}


/* end of file 4.1.16t02xghb9 */


/code

はじめまして!

Re: セグメンテーション違反?!

#2

投稿記事 by はじめまして! » 9年前

code
ただ、セグメンテーショ
ン違反ですとだけ出てきやがります(´・ω・`)

/code

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: セグメンテーション違反?!

#3

投稿記事 by みけCAT » 9年前

ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でBBCodeのcodeタグで囲んでいただけると、見やすくてありがたいです。
はじめまして! さんが書きました:セグメンテーション違反とはどうすれば解決できますか?
多分デバッグをすれば解決できるでしょう。
まずはデバッガ(利用できない場合はprintfデバッグなど)で落ちている位置を特定しましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る