概要

ここではサンプルとして付属しているPD_HGtestを用いて、関節タイプがfreeのルート関節をハイゲインモードで、他の関節をトルク制御モードでシミュレーションする手順を説明します。 サンプルに使用しているモデルは、ROOT関節と2つのリンクから構成される単純なものです。ROOT関節はコントローラから位置と姿勢を、他の関節は関節トルクを与えます。 主な手順は以下のようになります。

  1. シミュレーションプロジェクトの設定
  2. コントローラの作成
  3. コントローラブリッジの設定

以下これらの手順について詳細に説明します。

シミュレーションプロジェクトの設定

PD_HGtest.xmlにシミュレーションプロジェクトの設定が記述されています。

モデルの各関節の制御モードは何も指定しなければ、トルク制御モードになります。ハイゲインモードにしたい関節ROOTに"HighGain"の設定をします。下の赤字の部分です。

PD_HGtest.xml
     :
     :
     <item class="com.generalrobotix.ui.item.GrxModelItem" name="testRobot" select="true" url="$(PROJECT_DIR)/../model/PD_HGtest.wrl">
            <property name="isRobot" value="true"/>
            <property name="controller" value="PD_HGtestController"/>
            <property name="controlTime" value="0.002"/>
            <property name="setupDirectory" value="$(PROJECT_DIR)/../controller/PD_HGtest"/>
            <property name="setupCommand" value="PD_HGtest$(BIN_SFX)"/>
            <property name="ROOT.mode" value="HighGain"/>
            <property name="ROOT.translation" value="0.0 0.0 1.0 "/>
     </item>
     :
     :


コントローラの作成

コントローラのソースファイルはsample/controller/PD_HGtest/PD_HGtest.{h, cpp}です。

コントローラはROOT関節をX方向に動かし、他の関節には関節トルク(=0)を出力するという単純なものです。X方向の軌道(位置、速度、加速度)はあらかじめ適当に作成し、sample/controller/PD_HGtest/etc/root.datに保存しておきます。

まず最初に各関節に値を出力するポートを設定します。ROOT関節には位置、速度、加速度用のポートを用意し、データの長さを12,6,6と設定します。

PD_HGtest.h
     :
     :
  // DataOutPort declaration
  // <rtc-template block="outport_declare">
  TimedDoubleSeq m_torque0;
  OutPort<TimedDoubleSeq> m_torque0Out;
  TimedDoubleSeq m_torque1;
  OutPort<TimedDoubleSeq> m_torque1Out;
  
  TimedDoubleSeq m_root_trans;
  OutPort<TimedDoubleSeq> m_root_transOut;
  TimedDoubleSeq m_root_vel;
  OutPort<TimedDoubleSeq> m_root_velOut;
  TimedDoubleSeq m_root_acc;
  OutPort<TimedDoubleSeq> m_root_accOut;
     :
     :

PD_HGtest.cpp
     :
     :
PD_HGtest::PD_HGtest(RTC::Manager* manager)
  : RTC::DataFlowComponentBase(manager),
    // <rtc-template block="initializer">
    m_torque0Out("torque0", m_torque0),
    m_torque1Out("torque1", m_torque1),
    m_root_transOut("root_trans", m_root_trans),
    m_root_velOut("root_vel", m_root_vel),
    m_root_accOut("root_acc", m_root_acc)
     :
     :
  // Registration: InPort/OutPort/Service
  // <rtc-template block="registration">
  // Set OutPort buffer
  registerOutPort("torque0", m_torque0Out);
  registerOutPort("torque1", m_torque1Out);
  registerOutPort("root_trans", m_root_transOut);
  registerOutPort("root_vel", m_root_velOut);
  registerOutPort("root_acc", m_root_accOut);
  
  m_torque0.data.length(1);
  m_torque1.data.length(1);
  m_root_trans.data.length(12);
  m_root_vel.data.length(6);
  m_root_acc.data.length(6);
     :
     :

次に実際に値を出力する処理を記述します。

まず、ファイルからROOT関節への出力値を読み込みます(1)。

ROOT関節以外の出力値を設定します(2)。

ROOT関節の位置を設定します(3)。データは順に、位置ベクトル、3x3の姿勢行列になります。

ROOT関節の速度(加速度)を設定します(4)。データは順に、速度(加速度)ベクトル、角速度(角加速度)ベクトルになります。

データを出力します(5)。

PD_HGtest.cpp
     :
     :
RTC::ReturnCode_t PD_HGtest::onExecute(RTC::UniqueId ec_id)
{
     :
     :
  static double root_x_p, root_x_v, root_x_a;           (1)
  if(!waist.eof()){
    waist >> root_x_p;  //skip time
    waist >> root_x_a;
    waist >> root_x_v;
    waist >> root_x_p;
  }

  m_torque0.data[0] = 0.0;                                (2)
  m_torque1.data[0] = 0.0;
  
  for(int i=0; i<12; i++)                                (3)
    m_root_trans.data[i] = 0;
  m_root_trans.data[0] = root_x_p;    //x
  m_root_trans.data[2] = 1.0;          //z
  m_root_trans.data[3] = 1.0;
  m_root_trans.data[7] = 1.0;
  m_root_trans.data[11] = 1.0;
  for(int i=0; i<6; i++)                                   (4)
      m_root_vel.data[i] = 0.0;
  m_root_vel.data[0] = root_x_v;
  for(int i=0; i<6; i++)                                    
      m_root_acc.data[i] = 0.0;
  m_root_acc.data[0] = root_x_a;

  m_torque0Out.write();                                     (5)
  m_torque1Out.write();
  m_root_transOut.write();
  m_root_velOut.write();
  m_root_accOut.write();

  return RTC::RTC_OK;
  }
     :
     :


コントローラブリッジの設定

次にコントローラブリッジの設定を行います。コントローラブリッジの設定はsample/controller/PD_HGtest/bridge.confに記述しています。

in-port= torque0:J0:JOINT_TORQUE
in-port= torque1:J1:JOINT_TORQUE

in-port= root_trans:ROOT:ABS_TRANSFORM
in-port= root_vel:ROOT:ABS_VELOCITY
in-port= root_acc:ROOT:ABS_ACCELERATION
 
connection= torque0:torque0
connection= torque1:torque1

connection= root_trans:root_trans
connection= root_vel:root_vel
connection= root_acc:root_acc
 
server-name= PD_HGtestController

以上で、シミュレーションの準備が整いました。シミュレーションを実行してください。