タスクを並行処理してロボットを制御する
通知方法を改善しよう
さて、ライントレース処理を別のタスクにして、ロボットを動かすことができました。アフレルでは、この記事で扱ったようなマルチタスクを実感できる実践的な研修を用意しているので、興味のある方は問い合せてみるとよいでしょう。
タスクを分けたことによってライントレース処理はその他の処理から切り離され、ライントレース処理を変えても、他への影響が少なくなりました。
ライントレースの開始と終了を通知する方法には、グローバル変数への書き込みと読み出しによって実現しましたが、このようにタスクとタスクの間で何らかの情報のやりとりをすることをタスク間通信と呼び、タスク間通信をするための便利なサービスコールが用意されています。
タスク間通信は、RTOSによって、使える機能や名称は異なっています。μITRONでは、イベントフラグ、セマフォ、データキューといった方法が提供されています。
これらのタスク間通信機能には、使用目的に応じて次のような特徴があります。
- イベントフラグ
- あるタスクから別のタスクに、できごとの発生を伝える方法。イベント情報をビットに割り当てて、複数のビットによって複数のイベントの組み合わせを表現します。
- セマフォ
- 複数のタスク間で資源(リソース)の共有を排他制御する方法。共有データを使うときに、順序を守ったり、同時に使えるタスクを制限しながら実行するときに使います。
- データキュー
- 複数のタスク間でデータを授受したい場合に使う方法。1ワードのメッセージ(データ)を受け渡すことができます。
今回作成している2輪倒立振子ロボット(プログラムは、RunnerThinkIT_v3_P)には、システム全体をコントロールしているタスクから、ライントレースをするかしないかという指示を出しています。
走行中状態になるまでは、ライントレース処理は待たせておけば良いでしょう。走行中状態になった時点で、情報をライントレースタスクに知らせて、ライントレースを開始するようにしましょう。一方のタスクから他方のタスクへ動作の指示を伝えるので、イベントフラグを使うのが良さそうです。
※解凍したフォルダ内にあるRunnerThinkIT_v4_Pというフォルダを、先ほどと同様に、Runnerフォルダの配下にコピーしてください。
主な変更点は次の通りです。
1. Runner.cfgファイルにイベントフラグの生成を追加しました。
Runner.cfg
2. システム全体をコントロールしているRunner.cファイルを次のように、イベントを通知するように変更しました。
Runner.c(64行目~)
3. ライントレースをする Tracer.cファイルは次のように、イベント通知を待つ様に変更しました。
Tracer.c(71行目~)
さて、いよいよ次回は、最終回です。
今までは、nxtJSPという環境で、2輪倒立振子ロボットに対して、PID制御やイベントフラグなどを使って来ました。次回は、TOPPERSプロジェクトが公開しているTOPPERS/JSPカーネルと、TOPPERSプロジェクトがETロボコン2010に対して提供している、ソフトウエアプラットフォームや、教育コンテンツの紹介をしていきたいと思います。お楽しみに。
【参考文献】
「TOPPERSプロジェクト/JSPカーネル」(アクセス:2010/07)