[2095] はじめまして☆質問☆ 投稿者:hiro 投稿日:02/12/09(Mon) 19:44
はじめまして。僕はただいま卒業研究を必死にやっている大学生です。その卒業研究において、ぜひ教えてもらいたいことがありまして投稿しました。

僕はいま、レゴ・マインドストームを使い倒立振子の実験をしています。台車に棒を立てて、中心でバランスをとらせたいのです。そのためにタッチセンサーと光センサーを使っています。光センサーで明るさを測り前進と後進を決めています。さらに、タッチセンサーに触れた時その時の進行方向の逆に進むようにしたいのです。プログラムはlegOSを使っているのですが、どうしてもわからないことがあります。プログラムにおいて、前進はfwd・後進はrevはわかるのですが、出力ポートが一つしかない場合で、タッチセンサーに触れた時逆方向に進ませるにはどのようなプログラム言語を使えばよいのですか?教えてください。宜しくお願いいたします。

[2096] 倒立振子の実験 投稿者:JinSato 投稿日:02/12/09(Mon) 19:51
ようやく本来書いていただきたいところに書いてくれましたね。
ありがとう。

>タッチセンサーに触れた時逆方向に進ませるにはどのような
>プログラム言語を使えばよいのですか?教えてください。

この「プログラム言語」と言うのが、なんだかトテモ引っかかるんです。 legOS を使っているのであればC言語を使ってプログラムを
書いていると思うのです。

 そこで、念のために、質問への質問&確認ですが

 聞きたいことは、C言語を使って、どのようなプログラムを
作ったらよいのかという事なんですよね。

 大学では、どのような科目を勉強されたのかも書いていただけると
あとで例としての比喩なども書きやすいので教えてください。

[2106] そうです!! 投稿者:hiro 投稿日:02/12/11(Wed) 11:24
そうなんです。今角度センサーも使用して、結局角度センサー1個、光センサー1個、タッチセンサー2個をつかって実験しています。光センサーは黄色と黒のブロックを組み合わせて明るさを区別させています。タッチセンサーは振子の両サイドにつけ、タッチセンサーが押されると今の状態から逆方向の回転にするというプログラムにしています。しかし、これだけでは振子がタッチセンサーに触れたままになったとき、おわってしまうので、タイマーを設けています。流れとしては、タッチセンサーに触れているかどうか→光センサーの明るさはどちらか→角度センサーの角度は何度か というように制御したいのです。角度センサーは誤差が22度程度あるので、振子の軸とセンサーの間にギアを2枚いれ、軸の回転がすくなくてもセンサーがたくさん回転するようにしてあります。
 このような制御をするときに一番きをつけなければいけないこと、アドバイスなどありましたらよろしくお願いいたします。

[2109] Re: そうです!! 投稿者:JinSato 投稿日:02/12/11(Wed) 14:03
> そうなんです。今角度センサーも使用して、結局角度センサー1個、光センサー1個、タッチセンサー2個をつかって実験しています。光センサーは黄色と黒のブロックを組み合わせて明るさを区別させています。タッチセンサーは振子の両サイドにつけ、タッチセンサーが押されると今の状態から逆方向の回転にするというプログラムにしています。

>しかし、これだけでは振子がタッチセンサーに触れたままに
>なったとき、おわってしまうので、タイマーを設けています。
 ん〜、おわってしまうってどういう意味でしょうか〜?

>流れとしては、タッチセンサーに触れているかどうか→光センサーの
>明るさはどちらか→角度センサーの角度は何度か というように制御
>したいのです。

 という流れがある程度把握できているのなら

1:タッチセンサーに触れているかの判断をするルーチンを作り
 小さなプログラムで作動を確認する

2:光センサーの明るさを測定するルーチンをつくり
 小さなプログラムで作動を確認する

3:角度センサーで角度を測定するルーチンを作り
 小さなプログラムで作動を確認する


 ということを1つ1つ片付けていって、それで、それぞれの
コードを自己評価していくのが順番だと思います。
 プログラミングには近道がないですから、1つ1つ自分で
納得して進んでいってください。

 最後に、角度センサーは絶対値を返すわけではなく相対値を
返しますから、その辺を考えたルーチンやメカにしないと
いけないと思います。

 ということで、3つのステップ。多分、それぞれ100行にも
満たない小さなコードになると思いますが、1つ1つ書いてみて
ください。

 またある程度すすんだら、報告してくれるとうれしいです。

[2113] 困っています! 投稿者:hiro 投稿日:02/12/12(Thu) 17:18
・タッチセンサー、光センサー、回転センサーそれぞれ一つずつプログラムを作り動かせる事ができたので、作った台車に
 ・タッチセンサーと光センサーを使ったプログラム
  台車につけた黒と黄色のブロックを光センサーで明るさを測り、明るい時  はfwdに、暗いときはrevにして、棒が端までいった時にはタッチセンサー
  に触れ今までの逆方向に進むプログラムにしました。
 ・タッチセンサーと回転センサーを使ったプログラム
  回転センサーにより棒が傾いた方向で進行方向を決め、傾きの角度でスピ  ードを決め、タッチセンサーで上記のようにしました。
 ・タッチセンサーと光センサーと回転センサーを使ったプログラム
  光センサーで上記のように明るさを測り進行方向を決め、回転センサーの
  傾きの角度でスピードを決め、タッチセンサーは上記のようにしました。
それぞれで倒立振子の実験を行いましたが、どれもうまくいきません。
台車はインターネットのhttp://www-b2.is.tokushima-u.ac.jp/~ikeda/fes2000/legopend.htmlに載っている台車を参考にして作りました。しかし、どのプログラムで実験してみても、台車の中央にある棒のバランスがうまくとれません。何か良い実験方法などがあれば、参考にしたいので、
よろしかったら教えてください。よろしくお願いします。

[2116] Re: 困っています! 投稿者:JinSato 投稿日:02/12/12(Thu) 20:44
> それぞれで倒立振子の実験を行いましたが、どれもうまくいきません。

どううまくいかないのでしょうか〜?
ビデオなどで動きを撮影して、見えるような感じにしてくれないと
何ともコメントができないです。

 また、もしも、プログラムが大きくないようでしたら
それらも、どこかに公開されるようにしていただけると
コメントがつけやすいですね。


>何か良い実験方法などがあれば、参考にしたいので、
> よろしかったら教えてください。よろしくお願いします。

 動くまで、粘り切磋琢磨というしかない感じがします。
と書いてますが、自分もそんな感じでやってます。

 誰も作ったことがないものを作るとや、初めて自分で作る
時は、みんなそんな風に、寝る間も惜しんでやるんじゃ
ないかと思います。

 がんばってください。

[2119] Re^2: 困っています! 投稿者:JinSato 投稿日:02/12/12(Thu) 20:51
> > それぞれで倒立振子の実験を行いましたが、どれもうまくいきません。

1つ聞き忘れましたが、制御はどのような手法を使っている
のでしょうか、PIDのような制御をしているのでしょうか?、
それとも、違う方法ですか。

[2121] 例えば・・・ 投稿者:hiro 投稿日:02/12/12(Thu) 21:59
ただいま勉強中なので、制御というのがよくわからないのですが僕が今使っているのはRCX1.0です。意味が間違っていたらすいません。ビデオはまだ撮っていないので、撮りしだい載せさせていただきますが、プログラムは光センサーとタッチセンサーの場合は下のような感じになりましたが、お気づきの点がありましたら教えて下さい。よろしくお願い致します。
#include <unistd.h>
#include <dsensor.h>
#include <dmotor.h>
#include <dlcd.h>
#include <conio.h>

int main(void)
{
int th;
ds_active(&SENSOR_2);
msleep(2000);
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
th=LIGHT_2;
lcd_int(th);
lcd_refresh();
msleep(2000);
lcd_int(LIGHT_2);
lcd_refresh();
while(1){
msleep(200);
if(LIGHT_2==th){
motor_a_dir(off);
motor_c_dir(off);
}
else if(TOUCH_3){
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
motor_a_dir(rev);
motor_a_dir(rev);
msleep(200);
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
motor_a_dir(fwd);
motor_c_dir(fwd);
}
else if(TOUCH_1){
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
motor_a_dir(fwd);
motor_c_dir(fwd);
msleep(200);
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
motor_a_dir(rev);
motor_c_dir(rev);
}
else if(LIGHT_2>th){
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
motor_a_dir(fwd);
motor_c_dir(fwd);
}
else if(LIGHT_2<th){
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
motor_a_dir(rev);
motor_c_dir(rev);
}
}
}

[2122] Re: 例えば・・・ 投稿者:JinSato 投稿日:02/12/12(Thu) 22:19
> ただいま勉強中なので、制御というのがよくわからないのですが …
 ソースを見ました。 

 見た限りだと、このプログラムのままで、倒立振子が立つように
するにはかなり無理があると思います。

なぜ、そう思ったのかは
1:現在どの程度傾いているのか把握するのに光センサーの
 初期値との比較だけで行っていて、どの程度の差なのか
 を把握していない。

2:また、傾きが大きいときと小さいときでも同じ処理を
  している。

と言う印象をうけました。
基本的に、現在の棒がどの程度傾いているかを把握して、
傾きが大きいときはモーターをフルスピードで動かす。
傾きが小さいときはモーターの力を少しにして動かす

よいうような感じの処理をしないといけないと思います。

1つ前に「PIDのような制御をしているのでしょうか」
と書きましたが、「PID制御」をキーワードにしてGoogle.co.jp
などで検索してみると、PID制御とはどんなものかを説明
しているサイトが見つかると思います。

 また、PID制御に関しては制御論理など関連の本もたくさん
出ていると思うので、それらを読むと良いと思います。

 ここになって疑問なんですが、Hiroさんはどの関連の
勉強をされているのですか〜?

[2129] 光・タッチ・回転センサーにおいて 投稿者:hiro 投稿日:02/12/13(Fri) 16:28
いろいろためになるアドバイスどうもありがとうございます。僕はC言語の勉強を少ししましたがまだまだわからないことばかりです。legOSにおいてもC言語を多数使いますが参考書などを見て四苦八苦してプログラムを書いています。今日、光・タッチ・回転センサーを使いプログラムを作り、動かして見たところ今までの実験の中で一番うまくいきました。光センサーの明るさで進行方向を決め回転センサーの傾きでモーターの速度を決め、タッチセンサーに触れた時、進行方向を逆にするプログラムです。これから実験を繰り返していき
棒が立つように頑張りたいです!プログラムを載せますので何かお気づきの点がありましたら教えてください。宜しくお願いします。
#include <unistd.h>
#include <dsensor.h>
#include <dmotor.h>
#include <dlcd.h>
#include <conio.h>
#include <sys/tm.h>

int main(void)
{
int th,m_a_d,m_c_d;
ds_active(&SENSOR_2);
ds_active(&SENSOR_1);
msleep(1000);
ds_rotation_set(&SENSOR_1,0);
ds_rotation_on(&SENSOR_1);
m_a_d=1;
m_c_d=1;
th=LIGHT_2;
lcd_int(th);
lcd_refresh();
msleep(1000);
lcd_int(LIGHT_2);
lcd_refresh();
msleep(1000);
while(1)
{
if(TOUCH_3){
if(m_a_d==1 && m_c_d==1){
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
motor_a_dir(rev);m_a_d=0;
motor_c_dir(rev);m_c_d=0;
msleep(200);
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
motor_a_dir(fwd);m_a_d=1;
motor_c_dir(fwd);m_c_d=1;
msleep(200);
}
else if(m_a_d==0 && m_c_d==0){
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
motor_a_dir(fwd);m_a_d=1;
motor_c_dir(fwd);m_c_d=1;
msleep(200);
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
motor_a_dir(rev);m_a_d=0;
motor_c_dir(rev);m_c_d=0;
msleep(200);
}
}
else{
if(ROTATION_1==0){
motor_a_speed(80);
motor_c_speed(80);
}
else if(3>=ROTATION_1 && ROTATION_1>0){
motor_a_speed(150);
motor_c_speed(150);
}
else if(5>=ROTATION_1 && ROTATION_1>3){
motor_a_speed(200);
motor_c_speed(200);
}
else if(15>=ROTATION_1 && ROTATION_1>3){
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
}
else if(0>ROTATION_1 && ROTATION_1>=-3){
motor_a_speed(150);
motor_c_speed(150);
}
else if(-3>ROTATION_1 && ROTATION_1>=-5){
motor_a_speed(200);
motor_c_speed(200);
}
else if(-5>ROTATION_1 && ROTATION_1>=-15){
motor_a_speed(MAX_SPEED);
motor_c_speed(MAX_SPEED);
}
if(LIGHT_2==th){
motor_a_dir(off);
motor_c_dir(off);
}
else if(LIGHT_2>th){
motor_a_dir(fwd);m_a_d=1;
motor_c_dir(fwd);m_c_d=1;
}
else if(LIGHT_2<th){
motor_a_dir(rev);m_a_d=0;
motor_c_dir(rev);m_c_d=0;
}
}
}
}

[2132] Re: 光・タッチ・回転センサーにおいて 投稿者:JinSato 投稿日:02/12/13(Fri) 19:09
PID制御とか調べてみましたか〜。

[2097] Re: 倒立振子の実験 投稿者:">mac 投稿日:02/12/09(Mon) 21:44 <URL>
> この「プログラム言語」と言うのが、なんだかトテモ引っかかるんです。 legOS を使っているのであればC言語を使ってプログラムを
> 書いていると思うのです。

横から失礼します。
「C言語」と自分でも書くことあるんですが、これも随分変です。
だって、「variable A」と書いてあったら、ふつう「変数A」と訳しますよね、「A変数」なんて言いませんよね。
"Programing language C"なんだから、
「プログラミング言語C」ですよねえ (^o^)

>  聞きたいことは、C言語を使って、どのようなプログラムを
> 作ったらよいのかという事なんですよね。

これは本当に疑問です。Cの話でも、FORTRANでも、Basicでも、
自然言語でさえ同じ事ですね。

前に進む関数f()と、後ろに進む関数g()を知っていて、
逆向きに進む方法を知らないロボットAがいる。
Aに今進んでいる方向とは逆に進ませるにはどうしたらよいか?

と言う命題ですからね。
「逆」、「反対方向」などの単語を使わず、日本語でも、英語でもかまわないから書いみてください。

[2098] Re^2: 倒立振子の実験 投稿者:JinSato 投稿日:02/12/09(Mon) 22:05
どうも、mac さん。

> 「C言語」と自分でも書くことあるんですが、これも随分変です。
> だって、「variable A」と書いてあったら、ふつう「変数A」と訳しますよね、「A変数」なんて言いませんよね。
> "Programing language C"なんだから、
> 「プログラミング言語C」ですよねえ (^o^)

 お〜、面白い。
まあ、だけど、C言語の場合は、英語でも「The C Programming Language」 と言う風に言うことが多いですね。 K&Rの本なんかの
タイトルも「The C Programming Language」と言う風になっている
から和訳するときに、Cプログラミング言語となって、日本語は
なんでも短くする傾向があるから、C言語とか、単にCなんてなった
のかもしれませんね。

> と言う命題ですからね。
> 「逆」、「反対方向」などの単語を使わず、日本語でも、
> 英語でもかまわないから書いみてください。

 そう、そのとおりですね。
ということで、hiro さん、プログラミング言語では
なくて、普通の言葉でも結構なので、自分が行いたいことを
箇条書きができるようにがんばってください。

[2100] The C Programming Language 投稿者:">mac 投稿日:02/12/10(Tue) 00:15 <URL>
完全脱線モードですが...

> K&Rの本なんかの
> タイトルも「The C Programming Language」と言う風になっている
> から和訳するときに、Cプログラミング言語となって、

邦題は、「プログラミング言語C 」だったりするんですよ...
http://www.amazon.co.jp/exec/obidos/ASIN/4320026926/qid=1039445282/sr=1-7/ref=sr_1_2_7/250-0602904-0986607#product-details
> 日本語は
> なんでも短くする傾向があるから、C言語とか、単にCなんてなった
> のかもしれませんね。

「なんでも短くする傾向」ではなく、3〜4音節を好むんだと思います。
「め」を「おめめ」と言ったり、「胃」を「いぶくろ」と伸ばすことも、ままありますね。
単に「シー」では、短すぎて、伸ばしたんじゃないかなあ。
「シープラプラ言語」と呼んでいる人は、あまりいないようだし。

[2101] Re: The C Programming Language 投稿者:JinSato 投稿日:02/12/10(Tue) 11:45
どうも、mac さん

> 完全脱線モードですが...
アハハ、そうですね

> 邦題は、「プログラミング言語C 」だったりするんですよ...

 あれ、そうでしたっけ。 この本、初版のころのを
持っていたのですが、どこかに消えてしまいました。
英語版の方はANSIのドラフトのころに買ったのですが、
いま、みたら、1988年に購入とメモが残ってました。
時間がたつのは早いもんです。

> 「なんでも短くする傾向」ではなく、3〜4音節を好むんだと
>思います。
 そうですね、なんでも、俳句調じゃないけど、きっと
音が右脳、左脳と交差するのが気持ちよいのかもしれませんね。


> 「シープラプラ言語」と呼んでいる人は、あまりいないようだし。
 この、++の部分をプラプラとカナダで言ったら意味が通じない
ですね。 ま、そういう和製英語もどきがいっぱいありますが。

 ということで、元ねたに戻って、hiro さん、がんばって
いるころでしょうか?