前提・実現したいこと
Linux ubuntu16.04で C++の”角度を3次多項式で算出しPID制御で動作するプログラム”を実行しようとしています.
元々,windowsXP上で作成されたものだったのですが,指定されたファイルが見つからず,デバックが開始されない状態になってしまいました.必要なファイルがなくなってしまい動かせないため,Linuxに変更して動作させようとしています.端末から直接コンパイルを行っているのですが,実装中に以下のエラーメッセージが発生しました。
エラーを解決し,プログラムを実行させたいです.
発生している問題・エラーメッセージ
①2014robotarm.cpp:5:21: fatal error: windows.h: そのようなファイルやディレクトリはありません #include <windows.h> ②2014robotarm.cpp:7:22: fatal error: mmsystem.h: そのようなファイルやディレクトリはありません #include <mmsystem.h> ③2014robotarm.cpp:10:19: fatal error: conio.h: そのようなファイルやディレクトリはありません #include <conio.h> ④2014robotarm.cpp:12:19: fatal error: I7sIo.h: そのようなファイルやディレクトリはありません #include "I7sIo.h" ⑤2014robotarm.cpp:13:24: fatal error: I7sPciBase.h: そのようなファイルやディレクトリはありません #include "I7sPciBase.h" ⑥2014robotarm.cpp:124:1: error: ‘WORD’ does not name a type WORD DA_Data[16]; ⑦2014robotarm.cpp:125:1: error: ‘DWORD’ does not name a type DWORD dwDat,CNT[16],Cnt[16]; ⑧2014robotarm.cpp:206:1: error: ‘IB7_PARAINFO’ does not name a type IB7_PARAINFO Ib7ParaInfo; ⑨2014robotarm.cpp:207:1: error: ‘IB7_PARAENC’ does not name a type IB7_PARAENC Ib7ParaEnc; ⑩2014robotarm.cpp:208:1: error: ‘IB7_PARADA’ does not name a type IB7_PARADA Ib7ParaDa; ⑪2014robotarm.cpp:209:1: error: ‘IB7_PARAAD’ does not name a type IB7_PARAAD Ib7ParaAd; ⑫2014robotarm.cpp:243:15: error: expected initializer before ‘LCSetUpTimer’ void CALLBACK LCSetUpTimer(UINT uTimerID, UINT uMsg, DWORD dwUser,DWORD dw1, DWORD dw2)
###該当のソースコード
#include <windows.h> #include <stdio.h> #include <mmsystem.h> #include <limits.h> #include <float.h> #include <conio.h> #include <math.h> #include "I7sIo.h" #include "I7sPciBase.h" #pragma comment(lib,"winmm.lib") #define PI 3.1416 FILE *Data; FILE *A_sen; FILE *R_sen; FILE *P_sen; FILE *Gain; FILE *T_Data; ///////変数宣言////// int i=0; int j,k; int fd; int ret; int bdno;//ボード番号 double time=0; double C=300;//カットオフ周波数 /* double x,y; double theta1; double theta2; double d1, d2; double i1,i2; /////////逆運動学パラメータ設定////// double subkine( double x,double y,double l1,double l2,double n1,double n2,double d1,double d2) { double atan2(double y, double x); double atan2(double i1, double d1); double atan2(double i2, double d2); //theta1 = kine(atan2(y,x),atan2(i1,i2),x,y,d1,d2,n1,n2,l1,l2); return 0; } ////////////目標位置計算///////// double kine(double x,double y, double theta1, double theta2, double d1, double d2, double l1, double l2,double i1,double i2) { return theta1; }*/ ////////////パラメータ調整部///////////////////////////////////////// int T=10;//制御周期(サンプリングタイム) 単位[ms] double Eq=5.5; //////////目標位置計算/////// /* double l1= 37; double l2 = 33; double x = 50; double y = 40; double n1 = x*x; double n2 = y*y; double d1 = (n1 + n2 + l1*l1 - l2*l2) / (2 * l1); double d2 = (n1 + n2 - l1*l1 + l2*l2) / (2 * l2); double i1 = sqrt( n1 + n2 - d1*d1); double i2 = sqrt( n1 + n2 - d2*d2); double theta1 = (atan2( y, x) - atan2( i1, d1))*180/PI; double theta2 = (atan2( i1, d1) + atan2( i2, d2))*180/PI; */ //double theta1 = 0; //double theta2 = 0; int P = 8;//通常動作時の中継点の数 int tf[10] = { 400, 300 ,400 ,250 ,250 ,190 ,250};//通常動作時の各中継点アーム動作時間 double Pa_q[4][10] = {{0, -30 , -30 ,0 ,0 , 0 , 0 , 0 , 0 , 0}, //各中継点の目標角度[deg](肩関節ピッチ軸) {0, 0 , 0 ,0 ,0 , 0 , 0 , 0 , 0 , 0}, //各中継点の目標角度[deg](肩関節ロール軸) {0, 0 , 0 ,0 ,0 , 0 , 0 , 0 , 0 , 0}}; //各中継点の目標角度[deg](肘関節) //{0, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}}; //各中継点の目標角度[deg](手部開閉) double Kp[4]={1.2 , 0.25 , 0.5 , 1.5}; //Pゲイン {肩部Roll,肩部Pittch,肘部,手部} double Ki[4]={0.01 , 0.015 , 0.015 , 0.015}; //Iゲイン {肩部Roll,肩部Pittch,肘部,手部} double Kv[4]={0.08 , 0.07 , 0.07 , 0}; //Dゲイン {肩部Roll,肩部Pittch,肘部,手部} double L_Kp[4]={1.8 , 0.25 , 0.25 , 1}; //Pゲイン {肩部Roll,肩部Pittch,肘部,手部} double L_Ki[4]={0.01 , 0.015 , 0.015 , 0.015}; //Iゲイン {肩部Roll,肩部Pittch,肘部,手部} double L_Kv[4]={0.2 , 0.07 , 0.07 , 0}; //Dゲイン {肩部Roll,肩部Pittch,肘部,手部} double Kp_e[4]={0.22 , 0.25 , 0.25 , 0}; //Pゲイン {肩部Roll,肩部Pittch,肘部,手部} double Ki_e[4]={0 , 0 , 0 , 0}; //Iゲイン {肩部Roll,肩部Pittch,肘部,手部} double Kv_e[4]={0 , 0 , 0 , 0}; //Dゲイン {肩部Roll,肩部Pittch,肘部,手部} int Twe=200;//衝撃緩和時のアーム動作待機時間[ms] int Tsh=250;//衝撃緩和後のアーム修正時間[ms] /////////////////////////////////////////////////////////////////// int mode=0;//作業モード番号 int flag=0;//動作フラグ(0=通常動作,1=軌道修正のモード) int Cflag=0;//衝突フラグ int t=0;//待機時間計測変数 double Ti=0;//ワールドタイム(0は初期時刻) WORD DA_Data[16]; DWORD dwDat,CNT[16],Cnt[16]; double ENCData[16];//エンコーダのデータ値 double O_ENCData[5000];//過去のエンコーダのデータ値 double d_ENCData[5000]; double Od_ENCData[5000]; double OCNTData[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; double Er[16]; double dEr[16]; double IntgEr[16]; double IntgEr_r[16]; double DAvolt[16];//D/Aの電圧値 単位[V] double O_Er[16]; double O_dEr[16]; double T_Er[16]; double T_dEr[16]; double T_IntgEr[16]; double TO_Er[16]; double TO_dEr[16]; double Igain; double LPF_Er[16]; double LPF_dEr[16]; double O_LPF_dEr[16]; double LPF_IntgEr[16]; double L_DAvolt[16]; double A_dEr[16]; double A_Kp[16]; double A_Kv[16]; double AD_Data[16];//ADのデータ値 double AD_volt[16];//圧力センサの値[V] double LAD_volt[16];//ローパスフィルタを掛けたセンサの値[V] double AD_kg[16];//LAD_volt[V]を[kg]に変換したもの double AD_Force[16];//ニュートン単位の出力 double loadCellData[100];//ロードセル基準点用サンプリングデータ double loadCellSum = 0; double loadCellOrigin = 0; bool isLCInitialize = true; int LCReadCounter = 0; double AD_pre[16]; double Test_DA[16]; int ENCch[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//エンコーダのチャンネル番号 肩部ピッチ軸:4ch 肩部ヨー軸:0ch 肘:1ch 手首ヨ―:2ch 手首開閉:3ch int DAch[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//DAのチャンネル番号 肩部ピッチ軸:0 肩部ヨー軸:1ch 肘:2ch 手首ヨ―:3ch 手首開閉:4ch int ADch[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};//ADのチャンネル番号 各ADch(0-15) int fa_q[4];//(fa:armのフラグ)通常動作時のフラグ double a[16],b[16],c[16],e[16],T_a[16],T_b[16],T_c[16]; double L_a[16],L_b[16],L_c[16]; double A_a[16],A_c[16]; double qd[4][5000]; //通常動作時の目標軌道角度(多項式) double d_qd[4][5000];//通常動作時の目標軌道角速度(多項式) double dd_qd[4][5000];//通常動作時の目標軌道角加速度(多項式) double qr1[5000],qr2[5000],qr3[5000]; //軌道修正時の目標軌道角度(多項式) double d_qr1[5000],d_qr2[5000],d_qr3[5000];//軌道修正時の目標軌道角速度(多項式) double dd_qr1[5000],dd_qr2[5000],dd_qr3[5000];//軌道修正時の目標軌道角加速度(多項式) double cnt[5]; //センサー角度 int rflag=0,Recflag=0; int tu = 0;//通常動作時のタイム int tv = 0;//衝撃直後待機時のタイム int tw = 0;//軌道修正時のタイム int ts = 0;//軌道復帰後から次の目標角度までの必要時間 int th = 0;//各目標角度までのトータル時間 int tp[8];//tf[i]までのトータル時間 int w = 0; int c1 = 0,c2 = 0,c3 = 0; int r1,r2,r3; int d[4]; double rdh[4]={426 , 416 , 200 , 1870};//減速比+カウント {(300.0000*500.0000)/360.0000 , (300.0000*512.0000)/360.0000 , 0 , 430.000*500.000/360.000}; //double rdh[4]={426,200,416,597}; IB7_PARAINFO Ib7ParaInfo; IB7_PARAENC Ib7ParaEnc; IB7_PARADA Ib7ParaDa; IB7_PARAAD Ib7ParaAd; //////////// 軌道生成関数 ////////////////////////////////////////// int dpath(int z0,double tha,double thb,double tf,double Rd[],double dRd[],double DRd[]){//z0は初期時間,tfは最終時間 double a0,a1,a2,a3;//3次多項式係数 double dtha=0; double Dtha=0; double dthb=0; double Dthb=0; int z=0; int Z=0; int d=0; tf=tf; for(z=z0;z<=z0+tf;z++){//(z=z0+0;z<z0+tf;z++) a0 = tha; a1 = dtha; a2 = 3/pow(tf,2)*(thb-tha); a3 = -2/pow(tf,3)*(thb-tha); Rd[z] = a0+a1*(z-z0)+a2*pow(double(z-z0),2)+a3*pow(double(z-z0),3);//各時間においての目標角度 dRd[z] = a1+2*a2*(z-z0)+3*a3*pow(double(z-z0),2); //各時間においての目標角度 DRd[z] = 2*a2+6*a3*(z-z0); //各時間においての目標角加速度 Z = Z++; } d = z0+Z; return d; } void CALLBACK LCSetUpTimer(UINT uTimerID, UINT uMsg, DWORD dwUser,DWORD dw1, DWORD dw2) { printf("Correct No Weight Data.%i\n",LCReadCounter); if(LCReadCounter<100) { printf("checked\n"); Ib7ParaAd.ChData.ch =ADch[3]; if ( (ret=I7fAdRead(&Ib7ParaAd)) < 0 ) { printf("AD Read Error. ret=%i\n", ret); ret = -1; } AD_Data[3]=Ib7ParaAd.ChData.wData[0]; loadCellData[LCReadCounter]=20.0*AD_Data[3]/4096.0-10.0;//データ->電圧値(±10V入力レンジ) //LAD_volt[i]=(LAD_volt[i]+(double)T/1000*C*AD_volt[i])/(1.0+(double)T/1000*C);//デジタルローパスフィルタ //LAD_volt[i]=LAD_volt[i]/(1+(double)T*C)+(double)T*C*AD_volt[i]/(1+((double)T/1000)*C);//論文のフィルタ //LAD_volt[i]=LAD_volt[i]*0.8+(1-0.8)*AD_volt[i];//RCフィルタ //AD_kg[i]=4325.9*AD_volt[i]+0.1679; } LCReadCounter++; return; }
まだ下にプログラムは続きますが,エラーの出ている部分だけ,表示しました.
試したこと
エラーの①から⑪まではコメントアウトすることでエラー表示は消えましたが,正しいのかどうか不安です.
⑫は何をやっても,どう調べても解決方法が分かりません.
また①から⑪のほうで,コメントアウト以外の解決方法があれば教えて頂きたいです.
補足情報
プログラミングについて学び始めたばかりです.
調べたら出てくる内容もあるかと思いますが,一つ一つ細かく,少しでもいいので教えていただきたいです.
よろしくお願い致します.