G-ROBOTS
An Open Software Platform for Robotic Technologies
Home RTC Software
OpenRT Platformソフトウェア >> G-ROBOTS

G-ROBOTS GR-001用RTC

G-ROBOTS GR-001

G-ROBOTS GR-001は、日本HPI社から販売されているホビー用人間型ロボットキットです。双葉電子工業株式会社製のサーボモータとコントローラを搭載しています。
このロボットは、シリアルポートを通じてPCから簡単に操作することができ、PCを使って色々な動作をさせることが可能です。このロボットを動かすためのライブラリの詳細については、こちらを参照して下さい。

Choreonoidを使って動きをつくる

Choreonoidには、GR-001の動きの作成やシリアルポートから実機を操作するためのプラグインと動作のサンプルが含まれていますのでこれを利用して、ロボットの動きを作っていきます。Choreonoidの使い方に関しては、GR-001を用いたチュートリアルが用意されていますので、そちらを参照して下さい。
作成した動きは、キーポーズを基本とした動作パターンファイルであるpseqファイル、pseqファイルを元に一定時間間隔の安定動作列からなる動作パターンファイルであるyamlファイルで保存することができます。これらの動作パターンファイルの詳細に関しては、こちらを参照して下さい。
では、これらのファイルを読み込み、GR-001を動作させるようなRTCを作っていきましょう。

GROBOT-RTC

GROBOT-RTCの設計

RTCを設計する場合には、何を入力として何を出力とするか、また、どのような処理を周期実行とするのかを明確にする必要があります。
ここで、GROBOT-RTCを作成するために、上述のG-ROBOTS用のライブラリを使うことにしましょう。
ライブラリの説明でも述べられていますが、このライブラリを使うとロボットへの動作コマンドは、Threadを生成し、その中で目標関節角に姿勢を変更するためのコマンドを送信するようになっています。
そのため、ここで開発するRTCは、コマンド入力部を周期実行にする方がよいと思います。
周期実行する処理が決まれば、あとは何を入力として何を出力とするかを決定します。今回のRTCは、コマンド入力処理を周期タスクとしますので、入力はString型のコマンドにしましょう。ロボットを動作させるだけでは、出力する情報があまり必要ないですが、デバッグなどを考えるとサーボモータの状態、現在の姿勢(関節角の列)くらいはあった方がよいと思います。
上記の検討から、下図のようなRTCにすることにします。

  • 入力データポート
    • ポート名:command
      • データ型: TimedString
      • データの内容:予め決めたコマンド、または、動作パターンファイル名
  • 出力データポート
    • ポート名:q
      • データ型:TimedDoubleSeq
      • データの内容:現在の関節角の列(関節角ID順)+ 変移時間
    • ポート名:servoState
      • データ型:TimeLongSeq
      • データの内容:現在の各関節のサーボモータの状態(0:Off, 1:On, 2:BreakMode)の列

次に周期実行タスク(onExecutionの内容)ですが、GR001のクラスライブラリのHPにあるサンプルプログラムを参考にすると、commandに入力があった場合に次の処理をすることにします。
  1. commandが予め決めておいたコマンドに合致した場合 → それに応じた処理を記述する
  2. commandが上記以外の場合 → motionDir内のファイルを検索し、commandと同じファイル名があればその動作パターンファイルを読み込み実行する。合致するファイルがなければ何もしないで、そのコマンドを破棄する。

最後に、コンフィグレーションパラメータを決めておきましょう。RTCを実行するときおよび実行中に変更したいパラメータとしてどういうものがあるかを考えます。
色々な場面でRTCを起動したときに、シリアルポート名はPCに応じて変わりますので、これをコンフィグレーションパラメータにすべきことはすぐにわかります。また、動作パターンを保存しておくファイルも決め打ちだと何かと不便ですので、これもコンフィグレーションにすべきでしょう。あとは、実行後にRTシステムエディタから変更できると良いものをコンフィグレーションパラメータとして設定しておきましょう。
ここでは、以下の4つとします。
  • portDevice: シリアルポート名を格納。GR001クラスのコンストラクタに与える引数に対応。
  • motionDir:動作パターンを保存しておくフォルダ名。GR001クラスのメンバ変数motionDirに対応。
  • motion_time:目標姿勢が与えられた時に動作する変移時間。GR001クラスのメンバ変数motionTimeに対応。
  • limitMode:各関節に一定以上の負荷があった場合に、Breakモードにするかどうかのパラメータ。GR001クラスのメンバ変数freeMotionに対応。
以上でGROBO-RTCの設計が終わりです。

GROBOT-RTCを実装する

前述の設計に基づいてGROBOT-RTCを実装していきます。RTCビルダを起動して、上記の設計方針に従ってパラメータを設定して行きましょう。まず、基本情報、データポート、コンフィグレーションを前述の設計に従って入力ます。
また、アクティビティとしては、初期化処理(onInitialize)、終了処理(onFinalize)、周期実行処理(onExecute)、そして活性化処理(onActivate)と不活性化処理(onDeactivate)を有効しておきましょう。下図が、RTCビルダでGROBO-RTCのひな形を作成しているところです。

これで作成したひな形は、このページに添付しておきます。

添付ファイル:GROBO_RTC.zip



次に、各アクティビティについて詳細設計をします。

初期化処理(onInitialize)

RTCの初期化処理では、既に入出力ポートとコンフィグレーションに関する記述が追加されています。通常、この初期化処理では必要なクラスのインスタンスを生成しておくべきかと思いますが、GR001はコンストラクタにシリアルポート名の設定がありますので、活性化処理のところでインスタンスを生成することにします。もちろん、ここでインスタンス化処理をして、活性化処理でシリアルポートの設定をしてもよいとおもいますが、ここではこのままにしておきます。

終了処理(onFinalize)

通常、終了処理は、初期化処理で生成した変数などを解放したり、実行中に生成したメモリ領域の開放をしたりするところですので、このRTCでは、特に記述する必要はありません。

活性化処理(onActivate)

活性化処理後は、周期実行処理が始まりますので、それに必要な全ての処理をします。まずは、GR-001を制御するためのクラスGR001のインスタンス化をしましょう。次に、シリアルポートを開いて、GR-001と通信できるかどうかを確認します。通信できなければ、エラー状態に遷移しましょう。通信できていることが確認できれば、GR-001にコマンド送信を行うThreadを生成します。ここで、注意することは、送信用データポートでSequence型を使っている場合には、バッファを確保しておく必要があります。
このRTCでは、qとservoStateの2つの出力ポートともにSequence型ですので、送信に必要なバッファを確保しておきます。
最後に、念のためロボットのサーボモータのトルクをONにしておいた方がよいでしょう。

不活性化処理(onDeactivate)

不活性化処理は、活性化処理のほぼ反対の処理ですので、コマンド送信用Threadの終了、GR-001との接続を解除、インスタンスの開放を行います。また、出力ポート用のデータ領域も開放しておきましょう。

周期実行処理(onExecute)

周期実行処理は、RTCのメインとなる処理です。RTCの設計のときに定義したように、
  1. commandに入力があるかをチェックする
  2. commadnに入力があった場合に以下のの処理を実行する。
    1. commandが予め決めておいたコマンドに合致した場合 → それに応じた処理を記述する
    2. commandが上記以外の場合 → motionDir内のファイルを検索し、commandと同じファイル名があればその動作パターンファイルを読み込み実行する。合致するファイルがなければ何もしないで、そのコマンドを破棄する。
  3. サーボモータの状態を取得し、出力ポートservoStateに書きこむ
  4. 各関節の角度を取得し、出力ポートqに書きこむ
を記述していきます。予め決めておいたコマンドですが、GR001クラスのサンプルプログラムを参考に下記のように定義しましょう。
  • On: すべてのサーボモータをONの状態にする
  • Off:すべてのサーボモータをOFFの状態にする
  • Free:一定の負荷がサーボモータにかかったときに、サーボモータをOFFにするような状態にする
  • Init:初期化姿勢(中腰状態)になる。
  • PrintMotion:現在の状態を標準出力に出力する
  • Start:現在の動作パターンを実行する
  • Reverse:現在の動作パターンを逆向きに実行する
  • connect:シリアルポートを最接続する
  • quit:周期実行処理を終了し、不活性状態に移行する
以上で、GROBOT-RTCができましたので、コンパイルして実行させます。

GROBOT-RTCをコンパイルする

GROBOT-RTCは、GR001というクラスを使いますので、外部ライブラリGR001.dllとインクルードファイルをダウンロードしておいてください。次に、VS2008を利用する場合には、copyprops.batを起動して、rtm_config.vspropsをコピーしておきます。そして、GROBOT-RTCのソリューションファイルを開きます。VS2008の場合には、GROBO_RTC_vc9.slnをダブルクリックでVS2008が起動します。
VS2010でコンパイルする場合には、ソリューションファイルを生成していませんので、Cmakeを実行する必要があります。VS2010への正式対応は、OpenRTM-aist-1.1からですので、ご注意下さい
VS2008を起動したら、GR001のライブラリとインクルードファイルを読み込むことができるように、プロジェクトのプロパティの構成マネージャの追加インクルードファイルのディレクトリ、追加ライブラリのディレクトリ、追加の依存ファイルの各項目に必要な情報を追加します。
ここまで、終了すればあとはコンパイルすれば、実行ファイルが生成されますので、GR-001を使ってテストをしてください。
なお、このコンポーネントは、コマンド文字列が入力ポートになっていますので、コンソールからコマンド入力できるようなコンポーネントを別途作成して下さい。OpenRTM-aistのサンプルのConsoleInを修正すれば簡単に作成できます。

GROBOT-RTCの機能を拡張する

上記まで、GROBOT−RTCの基本的な部分ができました。次は、このRTCを元に機能の拡張をして行きましょう。
機能の拡張点は、以下のとおりです。
  • 入力ポートを追加
    関節角の列を入力して、ロボットを動作させるようにしましょう。また、サーボモータのON/OFも入力ポートから切り替えられるようにしましょう。もちろん、各入力ポートからのデータに応じてロボットが動作したり、サーボモータのOn/OFFが切り替わらなければいけません。
  • 出力ポートのデータ出力の頻度を調節
    上記のコンポーネントでは、コンポーネントの実行周期ごとに現在の姿勢とサーボモータの状態を出力するように作成しました。これでは、データがあまりに頻繁に送信されるためにパフォーマンスが低下する恐れがあります。そのため、出力ポートへのデータ出力頻度を調整しましょう。ポイントは、”大きく動いたときに(1度以上でしょうか)のみ姿勢を出力する”、”サーボ−モータの状態が変化したときサーボモータの状態をに出力する”の2点です。
上記の修正行ったRTCは、以下のようになると思います。

このRTCを使うと以下のようなシステムも作成可能です。

このシステムでは、2つのGR-001を連結させて、同じ動作を同時に実行させることができます。また、1方のロボットのサーボモータをOFFにして、手で姿勢を変えるともう一方の姿勢も変化します。つまり、マスター−スレーブ型のシステムを簡単に構築することができます。これらのRTCは、分散環境で使うことができますので、簡易なテレオペシステムとも言えます。
拡張したRTCに関しては、こちらを参照して下さい。