この文書の現在のバージョンと選択したバージョンの差分を表示します。
壁制御 [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: | ||
</code> | </code> | ||
- | このようにすることで、壁がない時に必要のない制御がかかってしまう事がなくなります。 | + | r_threshold、l_thresholdは、壁が無い時のセンサの値~リファレンス値の間で調整しましょう。 \\ |
+ | このようにすることで、壁がない時に必要のない制御がかかってしまう事がなくなるはずです。 \\ | ||
+ | が、現実はそんなに甘くありません。 次の項で説明します。 | ||
+ | =====壁の切れ目対策===== | ||
+ | 上の制御式で実際に走らせてみたでしょうか? \\ | ||
+ | すると、壁の切れ目に吸いこまれてしまうような挙動をする事が確認できると思います。 \\ | ||
+ | 下のグラフは、まっすぐに車体を走らせた場合の、壁の切れ目でのセンサの値の変化です。 | ||
+ | {{:sensorgraph.png|}} | ||
+ | |||
+ | 黒が理想的なセンサ値の変化、赤が実際のセンサの変化です。\\ | ||
+ | 徐々にセンサの値が変化するせいで、変化している最中、 \\ | ||
+ | 真ん中を走っているのに制御がかかってしまってるため、変な動きをしてしまっています。 | ||
+ | |||
+ | これの対策として、有効に動いているものの一つとして、\\ | ||
+ | センサの値の変化量が一定より大きかったら、壁制御の閾値をリファレンス値より少し大きくする\\ | ||
+ | という物があります。 | ||
+ | |||
+ | 式にすると、閾値の項のコードの前の部分に、 | ||
+ | <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; //変化量が一定以下なら、設定通りの閾値 | ||
+ | } | ||
+ | </code> | ||
+ | というような感じで追加してあげると、良い動きをするようになると思います。 \\ | ||
+ | ちなみに、l_sen.diff とかr_sen.diffは、各々のセンサの変化量です。 \\ | ||
+ | 普通に、 | ||
+ | <code c> | ||
+ | l_sen.diff = l_sen.val - l_sen.old_val; | ||
+ | </code> | ||
+ | みたいな感じで、変化量を見てあげれば良いです。 | ||
+ | |||
+ | センサの配置角度がきつい場合には、 \\ | ||
+ | センサの変化量がプラスの場合とマイナスの場合で、\\ | ||
+ | 変化量の閾値を変えてあげると良い結果になる場合があります。 | ||
+ | |||
+ | =====センサの配置===== | ||
+ | 後日編集予定 | ||