## repository: https://code.ros.org/svn/wg-ros-pkg <> <> == コントローラーインタフェース == リアルタイムコントローラーとして実装するために、あなたのコントローラは`pr2_controller_interface::Controller`ベースクラスから継承する必要があります。 ベースクラスは下記を含みます * あなたが実装する必要がある4つのメソッド:init, starting, update と stopping, * 1つのあなたが呼ぶことができるメソッド; getController ベースクラスはこのように見えます: {{{ #!cplusplus block=controller namespace pr2_controller_interface { class Controller { public: virtual bool init(pr2_mechanism_model::RobotState *robot, ros::NodeHandle &n); virtual void starting(); virtual void update(); virtual void stopping(); bool getController(const std::string& name, int sched, ControllerType*& c); }; } }}} 下のイメージはこれらの4つの方法がどういう順序で呼び出されるか示すフローチャートを与えます (より詳細は下記の文章で). {{attachment:controllers.png||width=550}} === コントローラーの初期化 === `init` メソッドは '''non-realtime''' で実行されます。 <> コントローラーを初期化するために、コントローラーをロードするとき、`init`メソッドが呼ばれます。 コントローラーを初期化することは、それをスタートすることについて、独立していることに注意を払ってください: コントローラーをスタートする前に、 initialization はどんな量の時間も与えられることができます。 `init` メソッドは2つのアーギュメントをとります: * '''robot''': これは `pr2_mechanism_model::RobotState` ロボットモデルを記述します. ([[ja/pr2_mechanism_model]]参照). モデルはロボット Joint へのアクセス(アクチュエータ、エンコーダなど)を提供して、そしてロボットメカニズムのキネマティックの / ダイナミックな記述を含んでいます。 * '''n''': この `ros::NodeHandle` はコントローラの "namespace" です. このノードハンドルの namespace で、コントローラーはパラメータサーバーからコンフィギュレーションを読み込んで、トピックを公表するなどすることができます。 もし initialization が成功した、あるいはそうでないなら、`init`メソッドは戻ります。 もし initialization が失敗するなら、コントローラーは[[ja/pr2_controller_manager]]によってアンロードされるでしょう。ユーザーにあなたのコントローラーがなぜ初期化することに失敗したかについて通知するために常に`ROS_ERROR("explanation");`を使うことを確実にしてください。コントローラーはただ1度初期化されることができるだけです。もしあなたがコントローラーを再度初期化することを望むなら、あなたは最初にそれをアンロードして、そして次に再びそれをロードする必要があります。 === コントローラのスタート === `starting`メソッドは'''hard realtime'''で実行されます。 <> starting メソッドは[[ja/pr2_controller_manager|controller manager]]によって、コントローラーがスタートされる時いつも、1度呼ばれます。 スタートすることは、このアップデートコールの直前に、最初のアップデートコールと同じサイクルの中で実行されます。 最初のアップデートが呼び出される直前に、`startingメソッドはコントローラーを初期化します。 [[ja/pr2_controller_manager|controller manager]]は、コントローラーをアンロードして / ロードすることを必要とせずに、後の時にコントローラーをリスタートすることを許されます. === コントローラーの更新 === `update`メソッドは'''hard realtime'''で実行されます。 <> すべてのコントローラーの`update`メソッドは周期的に[[pr2_controller_manager]]で1000 Hzの周波数でコールされます。これはすべてのコントローラーの時間が結合した実行が1ミリ 秒以上を要することができないことを意味します。アップデートループで、本当のコントロールの作業がされます。 === コントローラーの停止 === `stopping`メソッドは'''hard realtime'''で実行されます。 <> `stopping` メソッドは毎回1度呼ばれコントローラーはストップします。 ストップすることは、このアップデートコールのすぐ後に、同じサイクルの中で最後のアップデートコールとして実行されます。`stopping`メソッドは何も返しません、それは失敗することを許されません。 === 他のコントローラーへのポインターを要求 === `getController`メソッドは'''non-realtime'''で実行されます。 <> `getController`メソッドはコントローラーがもう1つのコントローラーへのポインタを得ることを可能にします。 これは'''リアルタイムで'''それぞれのコントローラーがそのアウトプットを次のコントローラーに送るコントローラーの"チェーン"を作成するために使われます。このシステムは不十分な非リアルタイムの ROS コミュニケーションの代替物です。 `getController` メソッドは3つのアーギュメントをとります: * '''name''': あなたがポインタをもっていくことを望むコントローラーの名前を持った文字列 * '''sched''': int (ENUM) これはリクエストされたコントローラーがあなたのコントローラーの前か後に実行されるべきであるかどうか明示します。可能な値は `pr2_controller_interface:BEFORE_ME` と `pr2_controller_interface::AFTER_ME`です. * '''c''' これはあなたが、リクエストされたコントローラーのタイプとマッチするタイプの、リクエストしたコントローラーへのポインタです。タイプは `getController` メソッドのについての同じくテンプレートアーギュメントです。 ## AUTOGENERATED DON'T DELETE ## CategoryPackage ## CategoryPackageWG ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface ## controller interface controller interface