ページへ戻る

− Links

 印刷 

DXLIB_abstract :: Besttechnology

knowledge:DXLIB_abstract

DXLIBないしDX2LIBのAPIはデバイスのコントロールテーブルにアクセスすることを目的としているため、Dynamixelシリーズの各モデルの差異はユーザプログラムに委ねられています。
ここで紹介するAPIは具体的なアドレスやコントロールテーブル上のアイテムが扱う数値範囲といったものを一切排除し、Dynamixelの基本的な操作に注力できるように物理値を元に制御することを目的としています。IDとボーレートさえ明確になっていればモデルの差異はAPI内でほとんど吸収しますので、使用するモデルが変わったとしても大抵の場合プログラムの改変すら必要無くなります。

ページ内コンテンツ
    • 初期設定関連
      • DXL_ScanDevices
      • DXL_GetModelInfo
      • DXL_PrintDevicesList
      • DXL_InitDevicesList
    • エラー
      • DXL_GetErrorCode
      • DXL_GetHWErrorCode
    • 動作モード
      • DXL_SetOperatingMode
      • DXL_SetOperatingModesEquival
      • DXL_GetOperatingMode
    • LED, 制御ON/OFF
      • DXL_SetLED
      • DXL_SetTorqueEnable
      • DXL_SetTorqueEnables
      • DXL_SetTorqueEnablesEquival
      • DXL_GetTorqueEnable
      • DXL_GetTorqueEnables
    • 角度制御
      • DXL_SetGoalAngle
      • DXL_SetGoalAngles
      • DXL_GetPresentAngle
      • DXL_GetPresentAngles
    • 速度制御
      • DXL_SetGoalVelocity
      • DXL_SetGoalVelocities
      • DXL_GetPresentVelocity
      • DXL_GetPresentVelocities
    • 電流制御
      • DXL_SetGoalCurrent
      • DXL_SetGoalCurrents
      • DXL_GetPresentCurrent
      • DXL_GetPresentCurrents
    • 角度と速度
      • DXL_SetGoalAngleAndVelocity
      • DXL_SetGoalAnglesAndVelocities
    • 角度と時間
      • DXL_SetGoalAngleAndTime
      • DXL_SetGoalAnglesAndTime
      • オリジナルな定義

初期設定関連 anchor.png[1]

Page Top

DXL_ScanDevices anchor.png[2]

全IDのレンジでデバイスをスキャンし、成功したIDのみライブラリ内のテーブルにその情報が反映され、以後プレフィクスに「DXL_Set」ないし「DXL_Get」が付与されるAPIが使用できるようになる。
ライブラリ内のテーブルが更新されないまま存在しているIDに対してDXL_Set~やDXL_Get~のAPIを使用すると、何の処理も行わずに即時復帰する。
また全IDをスキャンし終えるまでには時間がかかるため、IDが明確にわかっている場合はDXL_GetModelInfoの使用を推奨する。

int DXL_ScanDevices(TDeviceID dvid, uint8_t *ids);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t *ids

      検索された全IDをストアする配列のポインタ。不要ならNULLを指定。

  • 戻り値
    • bool

      検出されたデバイスの数を返す。

  • 使用例
    TDeviceID dev;
    uint8_t ids[255], num = 0;
    // COM10を57600bpsでオープン
    dev = DX_OpenPort ("\\\\.\\COM10", 9600);
    // デバイスをスキャン
    num = DXL_ScanDevices (dev, &ids);
Page Top

DXL_GetModelInfo anchor.png[3]

指定IDのデバイス情報の読み出しに成功すると、ライブラリ内のIDテーブルに現在の動作モードとモデルを記憶し、デバイスのReturn Delay Timeが0でなければトルクディスエーブルした後に0を書き込む。以後プレフィクスに「DXL_Set」ないし「DXL_Get」が付与された物理値の指令ないし取得等を行うAPIは、指定されたIDが実態を持つものとして処理される。
ライブラリ内のテーブルを更新しない場合、実際に存在しているIDに対してDXL_Set~やDXL_Get~のAPIを使用すると、何の処理も行わずに即時復帰する。

TDXL_ModelInfo *DXL_GetModelInfo(TDeviceID dvid, uint8_t id);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • TDXL_ModelInfo *

      内部のDynamixelの情報と一致するテーブルのポインタを返す。

  • 使用例
    TDeviceID dev;
    dev = DX_OpenPort ("/dev/ttyUSB0", 57600);
    // ID=1のデバイス情報から内部テーブルを更新し、かつモデル名を取得
    printf("%s", DXL_GetModelInfo (dev, 1).name);
Page Top

DXL_PrintDevicesList anchor.png[4]

DXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルに反映されたデバイスの全リストをコンソールに出力する。デバッグ用。

bool DXL_PrintDevicesList(int *pf(const char *, ...));
Page Top

DXL_InitDevicesList anchor.png[5]

void DXL_InitDevicesList (void);
Page Top

エラー anchor.png[6]

Page Top

DXL_GetErrorCode anchor.png[7]

API内で通信を行っている間に取得された最後のエラーコードを取り出す。
DXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。

TErrorCode DXL_GetErrorCode(TDeviceID dvid, uint8_t id);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • TErrorCode

      未検索のIDを指定すると0xFFFFを返す。

  • 使用例
Page Top

DXL_GetHWErrorCode anchor.png[8]

bool DXL_GetHWErrorCode (TDeviceID dvid, uint8_t id, uint8_t *hwerr);
Page Top

動作モード anchor.png[9]

Page Top

DXL_SetOperatingMode anchor.png[10]

動作モードを指定IDへ指令する。
デバイスの動作モードと指令値が異なる場合はトルクをディスエーブルした後に指令値に更新される。また、デバイスがサポートしないモードを指定した場合はエラーとなるため、必ず戻り値を取得して可否を判断すること。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。

bool DXL_SetOperatingMode(TDeviceID dvid, uint8_t id, uint8_t mode);
ValueModeDescription
0Current Control Mode電流制御。位置及び速度制御は行わない。
1Velocity Control Mode速度制御。位置及び電流制御は行わない。
3Position Control Mode位置制御。
4Extended Position Control Mode拡張位置制御。マルチターンを許容。
5Current-Base Position Control Mode電流制限付き位置制御。マルチターンを許容。
16PWM Control ModePWMのデューティー比を制御。

Page Top

DXL_SetOperatingModesEquival anchor.png[11]

複数軸に対して単一の動作モードを指令する。

予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。

Page Top

DXL_GetOperatingMode anchor.png[12]

指定IDの動作モードを取得する。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。

bool DXL_GetOperatingMode(TDeviceID dvid, uint8_t id, uint8_t *mode);
Page Top

LED, 制御ON/OFF anchor.png[13]

Page Top

DXL_SetLED anchor.png[14]

LEDの明滅を指定IDへ指令する。輝度や色の制御は対象外。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。

bool DXL_SetLED(TDeviceID dvid, uint8_t id, bool en);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_SetTorqueEnable anchor.png[15]

トルクイネーブルを指定IDへ指令する。
なおプロトコルV1搭載モデルに角度やか角速度を指令すると、本APIに関わらず自動的にトルクイネーブルが1になる。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。

bool DXL_SetTorqueEnable (TDeviceID dvid, uint8_t id, bool en);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_SetTorqueEnables anchor.png[16]

bool DXL_SetTorqueEnables (TDeviceID dvid, const uint8_t *ids, bool *ens, int num);
Page Top

DXL_SetTorqueEnablesEquival anchor.png[17]

bool DXL_SetTorqueEnablesEquival (TDeviceID dvid, const uint8_t *ids, int num, bool en);
Page Top

DXL_GetTorqueEnable anchor.png[18]

指定IDのトルクイネーブルを取得する。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。

bool DXL_SetTorqueEnable(TDeviceID dvid, uint8_t id, bool *en);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_GetTorqueEnables anchor.png[19]

bool DXL_GetTorqueEnables (TDeviceID dvid, const uint8_t *ids, bool *en, int num);
Page Top

角度制御 anchor.png[20]

Page Top

DXL_SetGoalAngle anchor.png[21]

位置決め制御時の角度(deg)を指定IDへ指令する。
0degは動作範囲の中央とし、実際の精度は対象のデバイスに依存する。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。

bool DXL_SetGoalAngle (TDeviceID dvid, uint8_t id, double angle);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_SetGoalAngles anchor.png[22]

複数軸に対して位置決め制御時の角度(deg)を指令する。
ライブラリ内ではSYNCやBULKインストラクションを使用しているため、実際のデバイスに指令が到達しているかの判断は行わない。
予めDXL_ScanDevicesかDXL_GetModelInfoでAPI内のIDテーブルを更新しておく必要がある。

bool DXL_SetGoalAngles (TDeviceID dvid, const uint8_t *ids, double *angles, int num);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_GetPresentAngle anchor.png[23]

指定IDの現在の角度(deg)を取得する。
0degは動作範囲の中央とし、実際の精度は対象のデバイスに依存する。また、制御モードやモデルによって取得される数値範囲に差がある。

bool DXL_GetPresentAngle(TDeviceID dvid, uint8_t id, double *angle);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_GetPresentAngles anchor.png[24]

複数軸の現在の角度(deg)を取得する。

bool DXL_GetPresentAngles (TDeviceID dvid, const uint8_t *ids, double *angles, int num);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

速度制御 anchor.png[25]

Page Top

DXL_SetGoalVelocity anchor.png[26]

速度制御時の角速度(deg/s)を指定IDへ指令する。
モデルによっては位置決め制御時と速度制御時のアイテが同じなため、動作モードを切り替えながら運用すると、以前指令された角速度値を引き継いで動作してしまう場合がある。

bool DXL_SetGoalVelocity (TDeviceID dvid, uint8_t id, double velocity);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_SetGoalVelocities anchor.png[27]

複数軸に対して速度制御時の角速度(deg/s)を指令する。

bool DXL_SetGoalVelocities (TDeviceID dvid, const uint8_t *ids, double *velocities, int num);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_GetPresentVelocity anchor.png[28]

指定IDの現在の角速度(deg/s)を取得する。

bool DXL_GetPresentVelocity (TDeviceID dvid, uint8_t id, double *velocity);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_GetPresentVelocities anchor.png[29]

bool DXL_GetPresentVelocities (TDeviceID dvid, const uint8_t *ids, double *velocities, int num);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

電流制御 anchor.png[30]

Page Top

DXL_SetGoalCurrent anchor.png[31]

電流制御時の電流(mA)を指定IDへ指令する。

bool DXL_SetGoalCurrent(TDeviceID dvid, uint8_t id, double current);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_SetGoalCurrents anchor.png[32]

bool DXL_SetGoalCurrents(TDeviceID dvid, const uint8_t *ids, double *currents, int num);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_GetPresentCurrent anchor.png[33]

現在の電流(mA)を取得する。
電流計測をサポートしないデバイスの場合は負荷を取得し、仕様上のストール電流を乗じたものとなる。

bool DXL_GetPresentCurrent(TDeviceID dvid, uint8_t id, double *current);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_GetPresentCurrents anchor.png[34]

bool DXL_GetPresentCurrents(TDeviceID dvid, const uint8_t *ids, double *current, int num);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

角度と速度 anchor.png[35]

Page Top

DXL_SetGoalAngleAndVelocity anchor.png[36]

位置制御時の角度(deg)と角速度(deg/s)を指定IDへ指令する。

bool DXL_SetGoalAngleAndVelocity (TDeviceID dvid, uint8_t id, double angle, double velocity);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

DXL_SetGoalAnglesAndVelocities anchor.png[37]

bool DXL_SetGoalAnglesAndVelocities (TDeviceID dvid, uint8_t *ids, PAngleVelocity anglevelocity, int num);
  • パラメータ
    • TDeviceID dvid

      オープン済のDeviceIDを指定。

    • uint8_t id

      検索対象のIDを指定。

  • 戻り値
    • bool

      成功するとTure、失敗するとFalseを返す。

  • 使用例
Page Top

角度と時間 anchor.png[38]

Page Top

DXL_SetGoalAngleAndTime anchor.png[39]

bool DXL_SetGoalAngleAndTime (TDeviceID dvid, uint8_t id, double angle, double sec);
Page Top

DXL_SetGoalAnglesAndTime anchor.png[40]

bool DXL_SetGoalAnglesAndTime (TDeviceID dvid, const uint8_t *ids, double *angles, int num, double sec);
Page Top

オリジナルな定義 anchor.png[41]

構造体はいずれもアライメントを1バイトとする。

TDXL_ModelInfo 
 struct {
  uint16_t modelno;      // デバイス固有のモデル番号
  char name[16];
  TDXL_DevType devtype;  // デバイスのグループ
  struct {               // 位置の範囲
    int32_t max;
    int32_t min;
  } positionlimit;
  struct {               // 角度の範囲
    double max;
    double min;
  } anglelimit;
  struct {               // 速度の範囲
    int32_t max;
    int32_t min;
  } velocitylimit;
  struct {               // PWMの範囲
    int32_t max;
    int32_t min;
  } pwmlimit;
  double velocityratio;     // 角速度変換係数 [deg]
  double currentratio;       // 電流変換係数 [mA]
  double pwmratio;          // PWM変換係数 [%]
}

Last-modified: 2018-06-11 (月) 19:17:14 (JST) (2152d) by takaboo