ページ 1 / 1
比例航法について
Posted: 2010年6月25日(金) 10:29
by HY
比例航法について学習中の者です
現在、以下のサイトを参考に比例航法のプログラムを書いてみましたが
うまくいきません(コンパイルは成功するものの、途中でエラー終了してしまう)
参考サイト:ttp://raptor.ddo.jp/stg/doc.html
比例航法についてご理解のある方、ご助言よろしくお願いします
以下が失敗プログラムです
/*** missile.cpp ***/
//比例航法によるミサイル制御
void _pattern2(int i){
double f,F,fF,e,eF,FF;
int t=missile.cnt;//ミサイルフラグが立った時t=0
if(t==0) missile.vy=2.0;//y方向への速度
if(t>=60){//60でなくともよい
if(t==60){
e = atan2(terget.y-missile.y,terget.x-missile.x);
}
if(t>60){
f = atan2(terget.y-missile.y,terget.x-missile.x);//対象への角度を計測
F = atan2(missile.vy,missile.vx);//ミサイルの進行角度を計測
fF=f-F;//差分計算
eF=e-F;//1ループ前の差分計算
FF=eF-fF;
missile.vy = 2.0*sin(4.0*FF);//比例定数n=4とした
missile.vx = 2.0*cos(4.0*FF);
e = atan2(terget.y-missile[i].y,terget.x-missile[i].x);//対象への角度保存
}
}
Re:比例航法について
Posted: 2010年6月25日(金) 10:40
by シエル
どんなエラーが出るんですか?
Re:比例航法について
Posted: 2010年6月25日(金) 10:59
by ookami
比例航法は分かりませんが、
途中でエラー終了するとのことなので、
気になった点を挙げます。
とりあえず{}が対応していないですね^^;
コンパイルが通るとのことなので、コピペのミスだと思いますが...
なんとなくですが、missileのiに範囲外が指定されることは
ありませんか?
Re:比例航法について
Posted: 2010年6月25日(金) 11:20
by シエル
if(t>60)のとき、eが初期化されていないのにもかかわらず
、
eF=e-F;//1ループ前の差分計算
で、eを使用してるからかな。
Re:比例航法について
Posted: 2010年6月25日(金) 11:32
by ookami
それなら 変な値が入るだけでエラーにはならないんじゃ...
と思ったら、なるんですね^^; 勉強になりました!
void main(void) {
double i,j;
i=j;
}
↑を実行したところ、添付のエラーが出ました。HYさん、同じエラーでしょうか?
--
ついでにこんなことも。
void main(void) {
int i;
printf("%d",i);
}
これでも同じエラーが出ました。
あれ...?前は、変な数字が出るだけで、実行時エラーにはならなかったと思ったのですが...
コンパイラが賢くなったのでしょうか。
Re:比例航法について
Posted: 2010年6月25日(金) 11:37
by シエル
私もデタラメな値が入るだけだと思ったんですが、もしやと思って
一応指摘しました。。。
Re:比例航法について
Posted: 2010年6月25日(金) 13:14
by へろりくしょん
>コンパイラが賢くなったのでしょうか。
C言語において、初期化されていない auto 変数の読み出しの動作は未定義となっています。 鼻から悪魔です。
Re:比例航法について
Posted: 2010年6月25日(金) 14:07
by toyo
未初期化変数の使用はVC++2008だとコンパイル時の警告だけですね
VC++2010ではdebug版で実行時にもダイアログが出ました
releaseでは出ません
Re:比例航法について
Posted: 2010年6月25日(金) 20:17
by HY
>>シエル様 ookami様 へろり様 toyo様
早速のお返事ありがとうございます
まず、エラーについてですがookami様が示したエラーが出ます
次に、iについてですが「i=0」固定ですので(他の航法もあるので、比例航法はたまたまi=0になった)
ここには問題はないかと思われます(言葉足らずで申し訳ございません)
それから、比例航法についてですが参考サイトから以下のように認識しております
①対象への角度を計測(fの部分)「参考サイト:r+θ’」
②ミサイルの速度ベクトルの計測(Fの部分)「参考サイト:r」
③①と②との差分を計算(fFの部分)「参考サイト:θ’」
④前回の対象への角度とミサイルの速度ベクトルとの差分を計算(eFの部分)「参考サイト:θ」
⑤④と⑤の差分を計算(FFの部分)「参考サイト:dθ」
⑥⑤の差分に定数を掛ける(4.0*FFの部分)「参考サイト:4.0*θ」
⑦⑥の数値を指定した旋回限界で切り揃えて速度ベクトルに加算(missile.vy = 2.0*sin(4.0*FF)の部分)
⑧敵への角度を保存(eの部分)「参考サイト:r+θ」
→以後①~⑧の繰り返し
以上からeについて
t=61における④の段階ではeの値が定まっていないと考え、t=60でeに値を持たせました
そして、t=61ではt=60のeの値が持ち越され、④が算出できると考えておりました
ただ、eFのところで止まってしまうようなので、この認識は間違っているのかもしれません(シエル様もご指摘されてますが)
未だ解決には至らないので、再考してみます
また、何か妙案があればご報告していただければ幸いです
Re:比例航法について
Posted: 2010年6月25日(金) 20:23
by シエル
if(t==60){
e = atan2(terget.y-missile.y,terget.x-missile.x);
}
↑のようにeの値はt==60の時しか設定されないようになっています。
eの変数は自動変数なので、一度この関数から抜けると、消滅して値は消えてしまいます。
よってtの値が60以外の値だと、eに値がセットされないまま、↓の計算式が実行されエラーが出ていると思われます。
eF=e-F;//1ループ前の差分計算
ですので、eの変数はグローバル変数にするか、staticを付けて静的変数にするのが
いいと思われます。
Re:比例航法について
Posted: 2010年6月25日(金) 21:26
by へろりくしょん
比例航法についてはさっぱりわかりませんが、変数 e に関するエラーはとりあえず、宣言時にでも e = 0.0 とでもして、とりあえず初期化しておくことで回避出来ます。

Re:比例航法について
Posted: 2010年6月25日(金) 21:33
by シエル
>消えません。
>変数 e は 関数 _pattern2 のブロックの頭で宣言されていますので、その寿命は関数を抜けるまで有効です。
ん?どういうことですか?
変数eは関数から抜けたら値は消えないんですか?
Re:比例航法について
Posted: 2010年6月25日(金) 21:37
by シエル
>比例航法についてはさっぱりわかりませんが、変数 e に関するエラーはとりあえず、宣言時にでも e = 0.0 と>でもして、とりあえず初期化しておくことで回避出来ます。
初期化すると、
eF=e-F;//1ループ前の差分計算
での差分計算ができないと思われます。