[Documentation] [TitleIndex] [WordIndex

コントローラーインタフェース

リアルタイムコントローラーとして実装するために、あなたのコントローラはpr2_controller_interface::Controllerベースクラスから継承する必要があります。 ベースクラスは下記を含みます

ベースクラスはこのように見えます:

   1 namespace pr2_controller_interface
   2 {
   3   class Controller
   4   {
   5   public:
   6     virtual bool init(pr2_mechanism_model::RobotState *robot,
   7                      ros::NodeHandle &n);
   8     virtual void starting();
   9     virtual void update();
  10     virtual void stopping();
  11 
  12     bool getController(const std::string& name,
  13                        int sched,
  14                        ControllerType*& c);
  15   };
  16 }

下のイメージはこれらの4つの方法がどういう順序で呼び出されるか示すフローチャートを与えます (より詳細は下記の文章で).

controllers.png

コントローラーの初期化

init メソッドは non-realtime で実行されます。

   6     virtual bool init(pr2_mechanism_model::RobotState *robot,
   7                      ros::NodeHandle &n);

コントローラーを初期化するために、コントローラーをロードするとき、initメソッドが呼ばれます。 コントローラーを初期化することは、それをスタートすることについて、独立していることに注意を払ってください: コントローラーをスタートする前に、 initialization はどんな量の時間も与えられることができます。 init メソッドは2つのアーギュメントをとります:

もし initialization が成功した、あるいはそうでないなら、initメソッドは戻ります。 もし initialization が失敗するなら、コントローラーはja/pr2_controller_managerによってアンロードされるでしょう。ユーザーにあなたのコントローラーがなぜ初期化することに失敗したかについて通知するために常にROS_ERROR("explanation");を使うことを確実にしてください。コントローラーはただ1度初期化されることができるだけです。もしあなたがコントローラーを再度初期化することを望むなら、あなたは最初にそれをアンロードして、そして次に再びそれをロードする必要があります。

コントローラのスタート

startingメソッドはhard realtimeで実行されます。

   8     virtual void starting();

starting メソッドはcontroller managerによって、コントローラーがスタートされる時いつも、1度呼ばれます。 スタートすることは、このアップデートコールの直前に、最初のアップデートコールと同じサイクルの中で実行されます。

最初のアップデートが呼び出される直前に、`startingメソッドはコントローラーを初期化します。 controller managerは、コントローラーをアンロードして / ロードすることを必要とせずに、後の時にコントローラーをリスタートすることを許されます.

コントローラーの更新

updateメソッドはhard realtimeで実行されます。

   9     virtual void update();

すべてのコントローラーのupdateメソッドは周期的にpr2_controller_managerで1000 Hzの周波数でコールされます。これはすべてのコントローラーの時間が結合した実行が1ミリ 秒以上を要することができないことを意味します。アップデートループで、本当のコントロールの作業がされます。

コントローラーの停止

stoppingメソッドはhard realtimeで実行されます。

  10     virtual void stopping();

stopping メソッドは毎回1度呼ばれコントローラーはストップします。 ストップすることは、このアップデートコールのすぐ後に、同じサイクルの中で最後のアップデートコールとして実行されます。stoppingメソッドは何も返しません、それは失敗することを許されません。

他のコントローラーへのポインターを要求

getControllerメソッドはnon-realtimeで実行されます。

  12     bool getController(const std::string& name,
  13                        int sched,
  14                        ControllerType*& c);

getControllerメソッドはコントローラーがもう1つのコントローラーへのポインタを得ることを可能にします。 これはリアルタイムでそれぞれのコントローラーがそのアウトプットを次のコントローラーに送るコントローラーの"チェーン"を作成するために使われます。このシステムは不十分な非リアルタイムの ROS コミュニケーションの代替物です。

getController メソッドは3つのアーギュメントをとります:


2024-06-15 12:56