このページの2つのバージョン間の差分を表示します。
| 次のリビジョン | 前のリビジョン | ||
| 壁制御 [2010/11/30 01:43] – 作成 member | 壁制御 [2010/11/30 02:16] (現在) – member | ||
|---|---|---|---|
| 行 37: | 行 37: | ||
| こんな感じです. | こんな感じです. | ||
| <code c> | <code c> | ||
| - | if((r_sen.value > r_threshold) && (l_sen.value > l_threshold)){ | + | if( (r_sen.value > r_threshold) && (l_sen.value > l_threshold) ){ |
| // | // | ||
| Error = (sen_l.value - sen_l.ref) - (sen_r.value - sen_r.ref); | Error = (sen_l.value - sen_l.ref) - (sen_r.value - sen_r.ref); | ||
| - | }else if((r_sen.value <= r_threshold) && (l_sen.value < l_threshold)){ | + | }else if( (r_sen.value <= r_threshold) && (l_sen.value < l_threshold) ){ |
| // | // | ||
| Error = 0; | Error = 0; | ||
| - | }else if(r_sen.value > r_threshold){ | + | }else if( r_sen.value > r_threshold ){ |
| // | // | ||
| Error = -2*(sen_r.val - sen_r.ref); | Error = -2*(sen_r.val - sen_r.ref); | ||
| 行 52: | 行 52: | ||
| </ | </ | ||
| - | このようにすることで、壁がない時に必要のない制御がかかってしまう事がなくなります。 | + | r_threshold、l_thresholdは、壁が無い時のセンサの値~リファレンス値の間で調整しましょう。 \\ |
| + | このようにすることで、壁がない時に必要のない制御がかかってしまう事がなくなるはずです。 \\ | ||
| + | が、現実はそんなに甘くありません。 次の項で説明します。 | ||
| + | =====壁の切れ目対策===== | ||
| + | 上の制御式で実際に走らせてみたでしょうか? \\ | ||
| + | すると、壁の切れ目に吸いこまれてしまうような挙動をする事が確認できると思います。 \\ | ||
| + | 下のグラフは、まっすぐに車体を走らせた場合の、壁の切れ目でのセンサの値の変化です。 | ||
| + | {{: | ||
| + | |||
| + | 黒が理想的なセンサ値の変化、赤が実際のセンサの変化です。\\ | ||
| + | 徐々にセンサの値が変化するせいで、変化している最中、 \\ | ||
| + | 真ん中を走っているのに制御がかかってしまってるため、変な動きをしてしまっています。 | ||
| + | |||
| + | これの対策として、有効に動いているものの一つとして、\\ | ||
| + | センサの値の変化量が一定より大きかったら、壁制御の閾値をリファレンス値より少し大きくする\\ | ||
| + | という物があります。 | ||
| + | |||
| + | 式にすると、閾値の項のコードの前の部分に、 | ||
| + | <code c> | ||
| + | if( abs(r_sen.diff) > DIFF_THRESHOLD ){ | ||
| + | r_threshold = r_sen.ref + 10; // | ||
| + | }else{ | ||
| + | r_threshold = r_sen.thredhold; | ||
| + | } | ||
| + | |||
| + | if( abs(l_sen.diff) > DIFF_THRESHOLD ){ | ||
| + | l_threshold = l_sen.ref + 10; // | ||
| + | }else{ | ||
| + | l_threshold = l_sen.thredhold; | ||
| + | } | ||
| + | </ | ||
| + | というような感じで追加してあげると、良い動きをするようになると思います。 \\ | ||
| + | ちなみに、l_sen.diff とかr_sen.diffは、各々のセンサの変化量です。 \\ | ||
| + | 普通に、 | ||
| + | <code c> | ||
| + | l_sen.diff = l_sen.val - l_sen.old_val; | ||
| + | </ | ||
| + | みたいな感じで、変化量を見てあげれば良いです。 | ||
| + | |||
| + | センサの配置角度がきつい場合には、 \\ | ||
| + | センサの変化量がプラスの場合とマイナスの場合で、\\ | ||
| + | 変化量の閾値を変えてあげると良い結果になる場合があります。 | ||
| + | |||
| + | =====センサの配置===== | ||
| + | 後日編集予定 | ||