課題でy=0.5の直線追従のプログラムを作成せよといった課題が出たのですが以下のように作成してみると動きすらしません。
動かすためのメインのものとなるのがw = w-(以下略)で書かれているものでこれによって直線に近づいていくようになっているのですがどこがダメで動かないのかわからないのでどなたかお手伝い願えませんか?
C言語
1void user_program(void) { 2 static double x, y, th = 0; 3 static int count = 0; 4 static double v = 0.0, w = 0.0; 5 double vl = 0.0, vr = 0.0; 6 static double k, a, b, c; 7 8 x += v*cos(deg2rad(th)); 9 y += v*sin(deg2rad(th)); 10 th += rad2deg(w); 11 12 k = 0.5 - y; 13 14 w = w - (a * w + b * th + c * k); 15 16 vl = v - w*T / 2.0; 17 vr = v + w*T / 2.0; 18 19 robot_set_position(x, y, th); 20 fprintf(fp, "%d %f %f %f %f %f\n", count, x, y, th, vr, vl); 21 22 count++; 23 24 if (count > 10000) exit(1); 25}
追随していくには、動作を繰り返す必要があるのに、コードにはループ(繰り返し)がありません。ASCII文字でないη(ギリシャ語のイータ)が使う必要性が判りません。wの初期値が0.0なのも問題です。
ηはあくまでこちら側で置いた引数なので問題はないのではないでしょうか?また初期値としてのwはループさせるとしたら問題ないのではないのでしょうか?
識別子として使える文字として定義されている基本文字集合は A から Z 及び a から z 、それと数値といくつかの記号に制限されています。 η はその範囲にない文字だということです。
その旨はだいたいの処理系でエラーメッセージとして提示されると思うのですが……
なるほどではηを何か代替文字で書いてやればいいということですね ありがとうございます
どなたかこうすればできるよというのがあればお願いします。
vl = v - w*T / 2.0; とありますが、ここでのTは宣言されていませんが、何を表しているのでしょう?
このカウンタは何なの?exitしちゃっていいのこれ。countがクリアされるタイミング無いから動いてたロボットがどっかのタイミングでいきなりストップすると思うんだけど
最初の状態と、なって欲しい理想的な最後の状態がどのようなものなのか提示してほしい。a, b, c の初期値はなにかとか
ロボットの問題なので、図とか、ロボットの形状や、そのy=0.5への追従方法などを説明しないと回答できないと思います。あと、理論的なシミュレーションモデルなのか、実機なのかによっても回答の仕方が変わると思いますので。
今回の問題当方で解決いたしました >>Woodenhamlet様:カウントに関してはほとんど無視していただいて結構です。a,b,cの値はPID制御と同様のものと考えていただけると幸いです。そのためにa,b,cをともに1.0に設定してやりプログラムを修復すれば動作しました
>>anndount様今回環境はvisual studio 2017を使用したためにシュミレーションモデルを試用して運用いたしました。先ほど述べたように動かすことができました。自己解決してしまったためにせっかく答えていただこうとしているのに申し訳ありません。
自己解決した場合は自分で回答を書き、同じような疑問を持った別の人が同じように解決できるようにしてくださいね。自己解決するボタンとか、そういう機能がありますので。
あなたの回答
tips
プレビュー