ライントレースの精度を上げるために、ドライブベースを拡張。車幅を広げて車軸の近くに光センサーを設置した。缶キャッチャー用のモータとNXT本体を前後に配置。車重バランスを改善した。NXT本体を立てて組み込み、缶をつかむアームを折りたたんで収納することで省スペースを実現した。上面にタッチセンサをスタートスイッチとして置いた。当初缶を検知するセンサはタッチセンサを使用する方針だったが、予想以上にセンサの張りが強く、バンパーを設置してもなかなか缶の重さだけでセンサを反応させることが出来なかった。超音波センサを使う方針に切り替えてからも、タッチセンサに比べサイズの大きい超音波センサを組み込むのに苦労した。最終的にセンサを上部に設置し、背の高い500ml缶を用いることで解決した。缶を掴むアームも、2本の腕で確実に挟むためには、2つの回転数が同じで且つ回転方向が反対の出力を得なければならず、モータから動力を伝える機構の省スペース化が課題だった。モータの両端をギアで挟むという構造的な工夫で反対の回転方向を得ることができ、さらに必要最小限のギア配置を探ることで省スペース化を実現した。私は缶をつかむプログラムを担当した。考えなければならなかった。このうち缶を戻す動作は、下図のように90度の旋回を2回繰り返すことで解決した。ロボットをライン上に戻すためには、元の向きに戻ってから黒いラインに乗るまで左旋回を続けさせることで、光センサの描く円の中に黒いラインがあれば復帰できるようになった。これにより、直線の上だけでなくカーブの上にも缶を置くことが出来る。タイマーのずれに対しては、缶をつかむ動作の前後で時間を記録し、経過時間をタイマーから引くことで補正している。缶を戻す動作によってロボットが少し前に移動してしまうので、その距離を進むのにかかる時間を足すことで、より正確な補正を可能にした。今回はライントレース用のプログラムをTomo[[2013b/Member/Tomo/Mission1]]に作ってもらった。コースを交差点の有無・時計回り・反時計回りの観点から4つに分け、タイマーによってそれぞれに合わせた走行プログラムを切り替えるという優れものである。コーナリングを円滑に行うために、時計回りと反時計回りでトレースするラインの側を変えるという工夫もなされている。交差点の判定は一定回数以上右折または左折を繰り返したかで行っている。交差点だと判断されると、判定の間に回った分だけ戻ってから通常のライントレースに戻ることになっている。変数類はtaskの外で定義したが、taskの外では具体的な数値を代入できないので、メインタスクの中で初期値を代入した。命令文Precedes(a,b);は、aとbのタスクを並列して実行する。この際aとbのプログラムが同時にモータを使おうとすると想定外の動作になってしまう(競合という)。これを避けるために変数moveMutexを置き、この変数を参照しなければタイヤを駆動するモータを使えないようにプログラミングを施した。具体的にはAcquireでmoveMutexを参照し、ReleaseでmoveMutexを開放する。あるタスクでmoveMutexが参照されている間は他のタスクでmoveMutexを参照できない仕組みだ。いうプログラムがあった時、Aが満たされなくなった時にすぐにはYは実行されない。Bの条件が満たされなくならない限りXを実行し続けるからだ。このことを理解するまでに時間がかかってしまった。この他にも、プログラムは基本的に上から下へ順に評価されていくことを考えなければ思ったようにプログラムが動作しない点が多く、苦労した。ロボットが若干大きい。カーブは曲がり切れるが、せっかく戻した缶にカーブを曲がった先で接触してしまう。構造をより簡略化することが求められる。プログラムが大きくなりすぎた。今回は掲載しなかったが、使われない定義文があるなど無駄な部分があるので、それらを削ることが必要だ。電圧によってタイマーを調整しなければならない。電圧一定の信頼できる電源を使うか、もしくはタイマーによらないプログラムを考えなければならない。時間調整がうまく行ったので、狙った通りのタイミングで交差点判定をすることが出来た。缶をつかむ動作の最後に中々ライン上に戻ってくることが出来なかった。原因は、缶をつかむタスク開始時のラインに対する角度が大きく復帰時にラインから外れてしまうこと、復帰動作時に光センサがコースの紙から外れてしまい正常な復帰動作ができなくなってしまうことの二つだ。強引ではあるがコース外に紙を足し、白い範囲を拡張することで復帰動作が確実なものになり、必然的に角度のズレによる問題も解決されるはずである。ライントレースの精度を上げるために、ドライブベースを拡張。車幅を広げて車軸の近くに光センサーを設置した。缶キャッチャー用のモータとNXT本体を前後に配置。車重バランスを改善した。NXT本体を立てて組み込み、缶をつかむアームを折りたたんで収納することで省スペースを実現した。上面にタッチセンサをスタートスイッチとして置いた。当初缶を検知するセンサはタッチセンサを使用する方針だったが、予想以上にセンサの張りが強く、バンパーを設置してもなかなか缶の重さだけでセンサを反応させることが出来なかった。超音波センサを使う方針に切り替えてからも、タッチセンサに比べサイズの大きい超音波センサを組み込むのに苦労した。最終的にセンサを上部に設置し、背の高い500ml缶を用いることで解決した。缶を掴むアームも、2本の腕で確実に挟むためには、2つの回転数が同じで且つ回転方向が反対の出力を得なければならず、モータから動力を伝える機構の省スペース化が課題だった。モータの両端をギアで挟むという構造的な工夫で反対の回転方向を得ることができ、さらに必要最小限のギア配置を探ることで省スペース化を実現した。私は缶をつかむプログラムを担当した。考えなければならなかった。このうち缶を戻す動作は、下図のように90度の旋回を2回繰り返すことで解決した。ロボットをライン上に戻すためには、元の向きに戻ってから黒いラインに乗るまで左旋回を続けさせることで、光センサの描く円の中に黒いラインがあれば復帰できるようになった。これにより、直線の上だけでなくカーブの上にも缶を置くことが出来る。タイマーのずれに対しては、缶をつかむ動作の前後で時間を記録し、経過時間をタイマーから引くことで補正している。缶を戻す動作によってロボットが少し前に移動してしまうので、その距離を進むのにかかる時間を足すことで、より正確な補正を可能にした。今回はライントレース用のプログラムをTomo[[2013b/Member/Tomo/Mission1]]に作ってもらった。コースを交差点の有無・時計回り・反時計回りの観点から4つに分け、タイマーによってそれぞれに合わせた走行プログラムを切り替えるという優れものである。コーナリングを円滑に行うために、時計回りと反時計回りでトレースするラインの側を変えるという工夫もなされている。交差点の判定は一定回数以上右折または左折を繰り返したかで行っている。交差点だと判断されると、判定の間に回った分だけ戻ってから通常のライントレースに戻ることになっている。変数類はtaskの外で定義したが、taskの外では具体的な数値を代入できないので、メインタスクの中で初期値を代入した。命令文Precedes(a,b);は、aとbのタスクを並列して実行する。この際aとbのプログラムが同時にモータを使おうとすると想定外の動作になってしまう(競合という)。これを避けるために変数moveMutexを置き、この変数を参照しなければタイヤを駆動するモータを使えないようにプログラミングを施した。具体的にはAcquireでmoveMutexを参照し、ReleaseでmoveMutexを開放する。あるタスクでmoveMutexが参照されている間は他のタスクでmoveMutexを参照できない仕組みだ。いうプログラムがあった時、Aが満たされなくなった時にすぐにはYは実行されない。Bの条件が満たされなくならない限りXを実行し続けるからだ。このことを理解するまでに時間がかかってしまった。この他にも、プログラムは基本的に上から下へ順に評価されていくことを考えなければ思ったようにプログラムが動作しない点が多く、苦労した。ロボットが若干大きい。カーブは曲がり切れるが、せっかく戻した缶にカーブを曲がった先で接触してしまう。構造をより簡略化することが求められる。プログラムが大きくなりすぎた。今回は掲載しなかったが、使われない定義文があるなど無駄な部分があるので、それらを削ることが必要だ。電圧によってタイマーを調整しなければならない。電圧一定の信頼できる電源を使うか、もしくはタイマーによらないプログラムを考えなければならない。時間調整がうまく行ったので、狙った通りのタイミングで交差点判定をすることが出来た。缶をつかむ動作の最後に中々ライン上に戻ってくることが出来なかった。原因は、缶をつかむタスク開始時のラインに対する角度が大きく復帰時にラインから外れてしまうこと、復帰動作時に光センサがコースの紙から外れてしまい正常な復帰動作ができなくなってしまうことの二つだ。強引ではあるがコース外に紙を足し、白い範囲を拡張することで復帰動作が確実なものになり、必然的に角度のズレによる問題も解決されるはずである。