C++
C++
本書では、JAKA SDK(C++)で定義されているデータ型とAPIについて説明します。これは、C/C++を使用して仮想または実際のコントローラーと通信するロボットアームアプリケーションを作成するソフトウェア開発者を主な対象としています。また、JAKAロボットアームコントローラアプリケーションを理解する必要があるユーザーにも役立ちます。
インターフェース一覧
ロボットアームの基礎
以下の例では、必要なヘッダーファイルが既に含まれており、「JAKAZuRobot.h」およびC++の標準ヘッダーファイルが含まれています。
ロボットアーム制御クラスのコンストラクタ
ロボットアーム制御クラスのコンストラクタです。すべてのインターフェースはこのクラス内に定義されています。
JAKAZuRobot();
ロボットアームログイン
ロボットアームコントローラに接続します。このインターフェースが正常に起動すると、他のインターフェース呼び出しの基盤となります。
- パラメータの説明
- ip コントローラのIPアドレス
- grpc_flag grpcインターフェースを使用するかどうかを示し、デフォルト値はfalseで、tcpインターフェースを使用します。
- username SDKユーザー名、デフォルト値はnullptr
- password SDKパスワード、デフォルト値はnullptr、アプリで設定されたjaka_sdkパスワード
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t login_in(const char *ip, bool grpc_flag = false, const char *username = nullptr, const char *password = nullptr);
ロボットアームログアウト
コントローラとの接続を切断します。このインターフェースが正常に呼び出された後は、login_in以外の関数は呼び出すことができません。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t login_out();
ロボットアーム通電
ロボットアームの電源を入れる
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t power_on();
ロボットアーム電源オフ
ロボットアームの電源を切る
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t power_off();
ロボットアームシャットダウン
ロボットアーム制御キャビネットのシャットダウン
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t shut_down();
ロボットアーム有効化
ロボットアームを有効にする
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t enable_robot();
ロボットアーム無効化
ロボットアームを無効にする
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t disable_robot();
ロボットアームをドラッグモードに入るまたは終了させる
ロボットアームをドラッグモードに入れるまたは退出させる
- パラメータの説明
- enable TRUEはドラッグモードに入る、FALSEはドラッグモードを退出する
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t drag_mode_enable(BOOL enable);
ロボットアームがドラッグモード中かどうかを照会する
ロボットアームがドラッグモードにあるかどうかを確認する
- パラメータの説明
- in_drag 確認結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t is_in_drag_mode(BOOL *in_drag);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
int example_drag()
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
BOOL in_drag;
demo.is_in_drag_mode(&in_drag);
demo.drag_mode_enable(TRUE);
return 0;
}
関節の摩擦補償係数(ドラッグ感パラメータ)を設定する
廃止されたインターフェース
ロボットアーム各軸の摩擦力補償係数を設定する
- パラメータの説明
- joint 関節番号 0~5
- gain 摩擦力補償係数、係数値範囲0〜200、200は摩擦力の200%を補償します
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_drag_friction_compensation_gain(int joint, int gain);
関節摩擦補償係数を取得する
ロボットアーム各軸の摩擦力補償係数(ドラッグ感パラメータ)を取得する
- パラメータの説明
- list は int 型の6次元配列で、それぞれ6つの関節の摩擦力補償係数に対応します
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_drag_friction_compensation_gain(DragFrictionCompensationGainList* list);
各機種の各関節のデフォルト値:(Zu7=Zu5、Zu は Pro、S と同じ)
| 機種 | 関節1 | 関節2 | 関節3 | 関節4 | 関節5 | 関節6 | 備考 |
|---|---|---|---|---|---|---|---|
| Zu7 | 90 | 90 | 90 | 70 | 70 | 70 | |
| A7 | 90 | 90 | 90 | 70 | 70 | 70 | |
| Zu12 | 60 | 60 | 60 | 45 | 45 | 45 | |
| A12 | 60 | 60 | 60 | 45 | 45 | 45 | |
| Zu18 | 60 | 60 | 64 | 45 | 45 | 45 | |
| Zu3 | 45 | 45 | 45 | 60 | 60 | 60 | |
| Pro16 | 100 | 100 | 80 | 90 | 90 | 90 | |
| Zu20 | 100 | 100 | 80 | 60 | 60 | 60 | |
| MiniCobo | 5 | 5 | 5 | 10 | 10 | 10 | |
| Mini2 | 50 | 50 | 50 | 60 | 60 | 60 |
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
int example_drag()
{
//APIオブジェクトdemoの例
JAKAZuRobot demo;
DragFrictionCompensationGainList list;
demo.get_drag_friction_compensation_gain(&list);
for(int i=0; i<6; i++){
std::cout << list.gain[i] << std::endl;
}
return 0;
}
SDKバージョン番号を取得
ロボットアームコントローラーのバージョン番号を取得
- パラメータの説明
- version SDKバージョン番号
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_sdk_version(char *version);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//SDKバージョン番号を取得
int example_getsdk_version()
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
char ver[100];
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//現在のSDKバージョンを照会する
demo.get_sdk_version(ver);
std::cout << " SDK version is :" << ver << std::endl;
return 0;
}
SDKログパスを取得(静的メソッド)
SDKログパスを取得します。これはSDKオブジェクト作成前に使用します。
- パラメータの説明
- filepath SDKログパス
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t static_get_SDK_filepath(char *filepath);
SDKログパスを取得
SDKログパスを取得
- パラメータの説明
- path SDKログパス
- size pathの長さ
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_SDK_filepath(char* path, int size);
SDKログパスを設定(静的メソッド)
廃止されたインターフェース
SDKログパスを設定します。これはSDKオブジェクト作成前に使用します。
- パラメータの説明
- filepath SDKログパス
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t static_set_SDK_filepath(char *filepath);
SDKログパスを設定する
SDKログパスを設定する
- パラメータの説明
- filepath SDKログパス
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_SDK_filepath(const char *filepath);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//SDKログパスを設定する
int example_set_SDK_filepath()
{
//SDKログパスを設定する
char path[20] = "D://test.log";
errno_t ret;
JAKAZuRobot demo;
ret = demo.set_SDK_filepath(path);//SDKファイルパスを設定する
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
std::cout << ret << std::endl;
return 0;
}
SDKのデバッグモードを有効にするかを設定
廃止されたインターフェース
デバッグモードを有効にするかどうかを設定します。TRUEを選択するとデバッグモードが開始され、このとき標準出力ストリームにデバッグ情報が出力されます。FALSEを選択するとデバッグ情報は出力されません。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_debug_mode(BOOL mode);
コントローラーIPを取得する
コントローラーIPを取得する
- パラメータの説明
- controller_name コントローラー名
- ip_list コントローラーIPリスト。コントローラー名が具体的な値の場合、その名前に対応するコントローラーのIPアドレスを返します。コントローラー名が空の場合、同一サブネット内のすべてのコントローラーのIPアドレスを返します。
- 戻り値 ERR_SUCC 成功 その他 失敗
- アプリ起動時、この関数は無効になります。
errno_t get_controller_ip(char *controller_name,char *ip_list);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//コントローラーIPを取得する
int example_get_controller_ip()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
char ip_list[2000] = { 0 };
char controller_name1[50] = "";
//コントローラーIPを取得する
ret = demo.get_controller_ip( controller_name1, ip_list);
std::cout << ret << std::endl;
std::cout << " ip_list is :" << ip_list << std::endl;
return 0;
}
ロボットアームの動作
ロボットアームのモーションプランナータイプを設定する
ロボットアームの動作で使用するプランナータイプを設定
- パラメータの説明
- type モーションプランナーのタイプ
- -1 プランナーを無効化し、デフォルトでTプランニングを採用
- 0 Tプランニング、すなわち速度優先
- 1 Sプランニング、すなわちスムーズさ優先
- type モーションプランナーのタイプ
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_motion_planner(MotionPlannerType type);
ロボットアームの手動モードでの動作
ロボットアームの手動モードでjog動作を制御する
- パラメータの説明
- aj_num 関節空間では関節番号[0-5を]表し、デカルト空間では軸x、y、z、rx、ry、rzの順
- move_mode ロボットアームの動作モード。選択可能タイプは絶対運動(ABS)、増分運動(INCR)、連続運動(CONTINUE)、停止(STOP)
- coord_type ロボットアームの動作座標系。選択可能な座標系はツール座標系(COORD_TOOL)、ベース座標系(COORD_BASE)、または関節空間(COORD_JOINT)
- vel_cmd 指令速度。回転軸または関節運動の単位はrad/s、移動軸の単位はmm/s
- pos_cmd 指令位置。回転軸または関節運動の単位はrad、移動軸の単位はmm。move_modeが連続のときはパラメータを無視してよい
- 戻り値 ERR_SUCC 成功 その他は失敗
- 補足: jog関数を呼び出す際、目標位置に到達するまで該当ポイントを継続的に送信する必要あり
errno_t jog(int aj_num, MoveMode move_mode, CoordType coord_type, double vel_cmd, double pos_cmd);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
#include <thread>
#define PI = 3.14159265358979323846
//ロボットアーム手動操作
int main()
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
double value = PI/6;
JointValue joints;
while(TRUE){
demo.get_joint_position(&joints);
static double start = joints.jVal[1];
//手動動作。ここでINCRは増分運動、0.5は速度が0.5rad/sであることを示す
demo.jog(1, INCR, COORD_JOINT, 0.5, value);
if(std::abs(start + value - joints.jVal[1]) < 0.001){break;}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
//手動操作停止
demo.jog_stop(0);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
//ロボットアームを無効化
demo.disable_robot();
//ロボットアーム電源オフ
demo.power_off();
return 0;
}
ロボットアームの手動モード動作を停止
ロボットアーム手動モードでの動作停止を制御する
- パラメータの説明
- num ロボットアームの軸番号0〜5、numが-1の場合、すべての軸を停止
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t jog_stop(int num);
ロボットアーム関節運動
ロボットアーム関節動作
- パラメータの説明
- joint_pos ロボットアームの関節動作の目標位置、double型の6次元配列
- move_mode ロボットアームの動作モード。選択可能タイプは絶対運動(ABS)、増分運動(INCR)、連続運動(CONTINUE)、停止(STOP)
- is_block インターフェースがブロッキングか非ブロッキングかを設定。TRUEはブロッキング、FALSEは非ブロッキング。ブロッキング時のデフォルトタイムアウトは30秒。
- speed ロボットアームの関節動作速度、単位:rad/s
- acc ロボットアームの関節動作の角加速度、デフォルト値は3.5rad/s2
- tol ロボットアーム関節動作終点誤差。このパラメータにより2つの動作間がより滑らかになります。このパラメータを使用する場合は、連続した複数の動作が必要であり、非ブロッキング状態にします。デフォルト値は0mmです。
- option_cond ロボットアーム関節のオプションパラメータ。不要な場合は値を設定しなくても構いません。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t joint_move(const JointValue *joint_pos, MoveMode move_mode, BOOL is_block, double speed, double acc = 3.5, double tol = 0, const OptionalCond *option_cond= nullptr);
ロボットアーム末端の直線運動
ロボットアームエンドの直線運動
- パラメータの説明
- end_pos ロボットアームエンドの運動目標位置
- tran デカルト空間におけるツールエンドの運動目標位置。単位はmmで、順にx、y、zです。
- rpy 回転軸空間におけるツールエンドの目標姿勢。単位はradで、順にrx、ry、rzです。
- move_mode ロボットアームの動作モード。選択可能タイプは絶対運動(ABS)、増分運動(INCR)、連続運動(CONTINUE)、停止(STOP)
- is_block インターフェースがブロッキングかどうかを設定します。TRUEはブロッキングインターフェース、FALSEは非ブロッキングインターフェース。ブロッキング時のデフォルトタイムアウトは30秒です。
- speed ロボットアームの直線運動速度。単位:mm/s
- acc ロボットアームの直線運動加速度。デフォルト値は500mm/s2です。
- tol ロボットアーム直線運動終点誤差。このパラメータにより2つの動作間がより滑らかになります。このパラメータを使用する場合は、連続した複数の動作が必要であり、非ブロッキング状態にします。デフォルト値は0mmです。
- option_cond ロボットアーム直線運動のオプションパラメータ。不要な場合は値を設定しなくても構いません。
- ori_vel 姿勢速度。デフォルト値は3.14rad/sです。
- ori_acc 姿勢加速度。デフォルト値は12.56rad/s2です。
- end_pos ロボットアームエンドの運動目標位置
- 戻り値 ERR_SUCC 成功 その他 失敗
- 特異点がよく発生する3つの状況:
- ツールエンドの位置が軸Z1およびZ2で構成される平面上にある;
- 軸Z2、Z3、Z4が同一平面上にある;
- 関節5の角度が0または180°である、すなわちZ4とZ6が平行である;
errno_t linear_move(const CartesianPose *end_pos, MoveMode move_mode, BOOL is_block, double speed, double accel = 500, double tol = 0, const OptionalCond *option_cond = nullptr, double ori_vel = 3.14, double ori_acc = 12.56);
コード例:
int example_linear_move()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
RobotStatus status;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//CartesianPose変数を定義して初期化し、回転角はラジアン単位です。
CartesianPose cart;
cart.tran.x = 300; cart.tran.y = 300; cart.tran.z = 100;
cart.rpy.rx = 3.14; cart.rpy.ry = 0 ; cart.rpy.rz = 0;
//デカルト空間の動作で、ABSは絶対運動を示し、FALSEは命令が非ブロッキングであることを意味し、10は速度が10mm/sであることを表します。
std::cout << "rx=" << cart.rpy.rx << " , ry=" << cart.rpy.ry<< " , rz=" << cart.rpy.rz << std::endl;
demo.linear_move(&cart, ABS, FALSE, 200, 10 ,1,NULL); //特異点を通過しないよう、事前に目標点付近まで移動しておく必要があります。
for (int i = 3; i > 0;i--) {
cart.tran.x = 150; cart.tran.y = 300;
//デカルト空間の拡張動作で、ABSは絶対運動を示し、FALSEは命令が非ブロッキングであることを意味し、20は最大速度が20mm/s、10は加速度が10mm/s²、5は円弧補間半径が5mmであることを表します。
demo.linear_move(&cart, ABS, FALSE, 20, 10, 5, NULL);
cart.tran.x = 150; cart.tran.y = 250;
demo.linear_move(&cart, ABS, FALSE, 20, 10, 5, NULL);
cart.tran.x = 225; cart.tran.y = 250;
demo.linear_move(&cart, ABS, FALSE, 20, 10, 5, NULL);
cart.tran.x = 300; cart.tran.y = 250;
demo.linear_move(&cart, ABS, FALSE, 20, 10, 5, NULL);
cart.tran.x = 300; cart.tran.y = 300;
demo.linear_move(&cart, ABS, FALSE, 20, 10, 5, NULL);
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
}
demo.login_out();
return 0;
}
ロボットアーム円弧運動
ロボットアームのエンドエフェクタが円弧運動を行います。このインターフェースは現在位置と入力された2つの点を使用して円軌道を生成します。
- パラメータの説明
- end_pos ロボットアームエンドの運動目標位置
- tran デカルト空間におけるツールエンドの運動目標位置。単位はmmで、順にx、y、zです。
- rpy 回転軸空間上でのツールエンドの目標姿勢。単位はradで、順にrx、ry、rzです。
- mid_pos ロボットアームのエンドエフェクタの中間点
- move_mode ロボットアームの動作モード。選択可能タイプは絶対運動(ABS)、増分運動(INCR)、連続運動(CONTINUE)、停止(STOP)
- is_block インターフェースがブロッキングであるかどうかを設定します。TRUEはブロッキング、FALSEは非ブロッキングを意味します。
- speed ロボットアームの直線運動速度。単位:mm/s
- acc ロボットアームのデカルト空間における加速度。単位:mm/s2
- tol ロボットアームのデカルト空間における運動終点誤差
- option_cond ロボットアーム関節のオプションパラメータ。不要な場合は値を設定しなくても構いません。
- circle_cnt ロボットアームの円弧運動の周回数を指定します。デフォルト値は0で、0の場合はcircular_moveと同等です。
- circle_mode ロボットアームの円弧動作モードを指定します。デフォルト値は0で、パラメータの説明は次の通りです:
- 0:開始姿勢から終了姿勢までの回転角が180°未満の軸角で姿勢変化を行います。(現在の方式)
- 1:姿勢変化は、固定された開始姿勢から終了姿勢までの回転角度が180°を超える軸角を使用して行う。
- 2:中間点の姿勢に基づいて、回転角度が180°未満か180°を超えるかを自動的に選択する。
- 3:姿勢のなす角と円弧の軸線は常に一致する(現在は完全円運動)。
- end_pos ロボットアームエンドの運動目標位置
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t circular_move(const CartesianPose *end_pos, const CartesianPose *mid_pos, MoveMode move_mode, BOOL is_block, double speed, double accel, double tol, const OptionalCond *option_cond = nullptr, double circle_cnt = 0, int circle_mode = 0);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
#define PI 3.14159265358979323846
//ロボットアームの円弧運動、関節速度の上限は3.14rad/s
int example_circle_move()
{
OptionalCond opt;
CartesianPose end_p,mid_p;
end_p.tran.x = -200; end_p.tran.y = 400; end_p.tran.z = 400;
end_p.rpy.rx = -PI/2 ; end_p.rpy.ry = 0 ; end_p.rpy.rz =0 ;
mid_p.tran.x = -300; mid_p.tran.y = 400; mid_p.tran.z = 500;
mid_p.rpy.rx = -PI/2 ; mid_p.rpy.ry = 0 ; mid_p.rpy.rz =0 ;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//JointValue変数を定義して初期化する
JointValue joint_pos = { 105.791*PI/180 , 63.471*PI/180 , -60.442*PI/180 , 176.971*PI/180 , 74.515*PI/180 , 0 };
//関節空間運動。ABSは絶対運動を意味し、TRUEはコマンドがブロッキングであることを意味し、1は速度が1rad/sであることを示す。
demo.joint_move(&joint_pos, ABS, TRUE, 1);
//円弧運動。ABSは絶対運動を意味し、TRUEはコマンドがブロッキングであることを意味し、20は直線速度が20mm/s、1は加速度、0.1はロボットアーム終端の許容誤差を示す。optはオプション引数で、3は回転数が3であることを示す。
demo.circular_move(&end_p, &mid_p, ABS, TRUE, 20, 1, 0.1,&opt);
return 0;
}
コード例2:
#include "jktypes.h"
#include "JAKAZuRobot.h"
#define PI 3.14159265358979323846
int example_circular_move()
{
JAKAZuRobot デモ;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
CartesianPose start_pos {-251.054, -48.360, 374.000, 3.14, 0, 1.57}; // 開始点
CartesianPose mid_pos = {-400.054, -198.360, 374.000, 3.14, 0, 1.57}; // 中間点
CartesianPose end_pos = {-251.054, -348.360, 374.000, 3.14, 0, 1.57}; // 終了点
demo.jog_stop(-1); // 現在の関節動作を停止
JointValue ref_jv {0, 90*PI/180, 90*PI/180, 90*PI/180, -90*PI/180, 0}; // まず開始点付近まで移動する
demo.joint_move(&ref_jv, MoveMode::ABS, true, 20);
JointValue start_jv;
demo.get_joint_position(&ref_jv); // 現在の関節角を取得
demo.kine_inverse(&ref_jv, &start_pos, &start_jv); // 現在の関節角を基準に開始関節角を計算
demo.joint_move(&start_jv, MoveMode::ABS, true, 80); // 開始関節角位置まで移動
OptionalCond opt;
// 回転を3回指定
demo.circular_move(&end_pos, &mid_pos, MoveMode::ABS, true, 120, 100, 0.1, &opt, 3);
demo.disable_robot();
demo.power_off();
demo.login_out();
}
ロボットアームの動作を中止する
現在のロボットアーム動作を終了し、ロボットアームのスクリプトプログラムも停止する
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t motion_abort();
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
#include <thread>
#define PI 3.14159265358979323846
// ロボットアーム動作停止
int example_motion_abort()
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//JointValue変数を定義して初期化する
printf("start_move");
JointValue joint_pos = { 0 , 0 , 50*PI/180 , 0 , 0 , 0 };
//関節空間運動。ABSは絶対運動を意味し、TRUEはコマンドがブロッキングであることを意味し、1は速度が1rad/sであることを示す。
demo.joint_move(&joint_pos, ABS, FALSE, 1);
std::this_thread::sleep_for(std::chrono::milliseconds(5000));
// 5秒間動作後に停止
demo.motion_abort();
printf("stop_move");
return 0;
}
ロボットアームの動作が停止しているかを確認する
ロボットアーム動作が停止しているかを確認
- パラメータの説明
- in_pos 検索結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t is_in_pos(BOOL *in_pos);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
#include <thread>
//ロボットアームの動作が停止したかを確認する
int example_is_in_pos()
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
BOOL in_pos;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
while (1)
{
//動作が停止したかを確認する
demo.is_in_pos(&in_pos);
std::cout << " in_pos は :" << in_pos << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
return 0;
}
ロボットアームの動作状態を確認する
ロボットアームの動作状態を確認します。
- パラメータの説明
- status ロボットアームの動作状態
- motion_line 現在の動作コマンドのID
- motion_line_sdk 予約パラメータ
- inpos 現在の動作が完了したかどうか
- err_add_line 動作コマンドの追加に失敗(ロボットアームはすでに目標位置にあります)
- queue キュー内で処理待ちの動作コマンド数
- active_queue キュー内で実行中のコマンド数
- queue_full コマンドキューが満杯かどうか、0:未満杯、1:満杯
- paused ロボットアームが一時停止状態かどうか、0:未停止、1:一時停止
- isOnLimit ロボットアームがソフトリミット状態かどうか、0:正常、1:ソフトリミットに到達
- isInEstop ロボットアームが緊急停止状態かどうか、0:正常、1:緊急停止中
- isInCollision ロボットアームが衝突状態かどうか、0:正常、1:衝突を検出
- status ロボットアームの動作状態
errno_t get_motion_status(MotionStatus *status);
外部軸の動作
外部軸のイネーブル
外部軸を有効化
- パラメータの説明
- ext_id 外部軸ID
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t enable_ext(int ext_id);
外部軸を無効化
外部軸を無効化
- パラメータの説明
- ext_id 外部軸ID
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t disable_ext(int ext_id);
外部軸の状態を取得
外部軸の状態を取得
- パラメータの説明
- status_list 外部軸の状態リスト
- ext_id 外部軸ID。-1はすべての外部軸の状態を取得することを意味します
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_ext_status(ExtAxisStatusList *status_list, int ext_id = -1);
外部軸のジョグ運動
外部軸のジョグ運動
- パラメータの説明
- ext_id 外部軸ID。-1はすべての外部軸の状態を取得することを意味します
- is_abs 0は絶対運動ABS、1は増分運動INCR、2は連続運動CONTINUEを表します
- vel 速度。増分および連続運動の方向は速度によって制御されます
- step ABS: stepは目標位置を示す; INCR: stepは目標ステップ長を示す; CONTINUE: stepは意味を持ちません
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t jog_ext(int ext_id, int is_abs, double vel, double step);
外部軸の連動運動
外部軸の状態を取得
- パラメータの説明
- status_list 外部軸の状態リスト(外部軸が関節運動の場合、単位はラジアンrad;外部軸が直線運動の場合、単位はミリメートルmm)
- ext_id 外部軸ID。-1はすべての外部軸の状態を取得することを意味します
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t multi_mov_with_ext(MultiMovInfoList multi_mov_info_list, DI_Info *di_info, int plannertype);
コード例:
#include <iostream>
#include <thread>
#include <math.h>
#include "JAKAZuRobot.h"
#define rad2deg(x) ((x)*180.0/M_PI)
#define deg2rad(x) ((x)*M_PI/180.0)
void jog_ext();
void move_ext();
void movej_with_ext();
void movel_with_ext();
void movec_with_ext();
JAKAZuRobot ロボット;
errno_t ret;
int main()
{
//初期化、通電してイネーブルにする
ret = robot.login_in("192.168.220.144",1,"jaka_sdk","Jaka123@");
if(ret==0){std::cout << "ログイン成功" << std::endl;}
else {std::cout << "ログイン失敗" << std::endl;}
robot.power_on();
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
robot.enable_robot();
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
JointValue jpos = {0, deg2rad(90), deg2rad(90), deg2rad(90), deg2rad(-90), deg2rad(10)};
robot.joint_move(&jpos, ABS, true, 10);
std::cout << "初期位置完了" << std::endl;
robot.enable_ext(0);
std::cout << "enable_ext完了" << std::endl;
jog_ext();
move_ext();
movej_with_ext();
movel_with_ext();
movec_with_ext();
robot.login_out();
return 0;
}
void jog_ext()
{
std::cout << " jog_ext" << std::endl;
robot.set_auto_manual_mode(false);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
robot.jog_ext(0,0,80,5);
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
robot.jog_ext(0,0,80,4);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
robot.jog_stop(-1);
robot.jog_ext(0,1,80,1);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
robot.jog_stop(-1);
robot.jog_ext(0,1,-80,1);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
robot.jog_ext(0,2,1,0);
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
robot.jog_stop(-1);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
robot.jog_ext(0,2,-1,0);
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
robot.jog_stop(-1);
robot.set_auto_manual_mode(true);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
void move_ext()
{
std::cout << "単独外部軸の動作" << std::endl;
MultiMovInfoList move_ext;
move_ext.count = 1;
move_ext.is_block = 1;
move_ext.multi_mov_info[0].motion_unit_type = 1;
move_ext.multi_mov_info[0].move_type = 0;
move_ext.multi_mov_info[0].motion_unit_id = 0;
move_ext.multi_mov_info[0].end_pos[0] = 100;
move_ext.multi_mov_info[0].move_mode = 0;
move_ext.multi_mov_info[0].j_vel = 80;
move_ext.multi_mov_info[0].j_acc = 80;
move_ext.multi_mov_info[0].radius = 0.0;
ret = robot.multi_mov_with_ext(move_ext);
std::cout << "単独外部軸の動作終了1" << std::endl;
move_ext.multi_mov_info[0].end_pos[0] = 200;
ret = robot.multi_mov_with_ext(move_ext);
std::cout << "単独外部軸の動作終了2" << std::endl;
move_ext.multi_mov_info[0].end_pos[0] = 0;
ret = robot.multi_mov_with_ext(move_ext);
std::cout << "単独外部軸の動作終了3" << std::endl;
}
void movej_with_ext()
{
std::cout << "関節動作+外部軸動作" << std::endl;
MultiMovInfoList movej_info;
movej_info.count = 2;
movej_info.is_block = 1;
movej_info.multi_mov_info[0].motion_unit_type = 1;
movej_info.multi_mov_info[0].move_type = 0;
movej_info.multi_mov_info[0].motion_unit_id = 0;
movej_info.multi_mov_info[0].end_pos[0] = 100;
movej_info.multi_mov_info[0].move_mode = 0;
movej_info.multi_mov_info[0].j_vel = 80;
movej_info.multi_mov_info[0].j_acc = 80;
movej_info.multi_mov_info[0].radius = 0.0;
movej_info.multi_mov_info[1].motion_unit_type = 0;
movej_info.multi_mov_info[1].move_type = 0;
movej_info.multi_mov_info[1].motion_unit_id = 0;
movej_info.multi_mov_info[1].end_pos[0] = deg2rad(90);
movej_info.multi_mov_info[1].end_pos[1] = deg2rad(90);
movej_info.multi_mov_info[1].end_pos[2] = deg2rad(90);
movej_info.multi_mov_info[1].end_pos[3] = deg2rad(90);
movej_info.multi_mov_info[1].end_pos[4] = deg2rad(-90);
movej_info.multi_mov_info[1].end_pos[5] = 0;
movej_info.multi_mov_info[1].move_mode = 0;
movej_info.multi_mov_info[1].j_vel = deg2rad(80);
movej_info.multi_mov_info[1].j_acc = deg2rad(200);
movej_info.multi_mov_info[1].radius = 0.0;
ret = robot.multi_mov_with_ext(movej_info);
std::cout << "関節運動+外部軸運動終了1" << std::endl;
movej_info.multi_mov_info[0].end_pos[0] = 0;
movej_info.multi_mov_info[1].end_pos[0] = deg2rad(0);
ret = robot.multi_mov_with_ext(movej_info);
std::cout << "関節運動+外部軸運動終了2" << std::endl;
}
void movel_with_ext()
{
std::cout << "直線運動+外部軸運動" << std::endl;
MultiMovInfoList multi_mov_info_list;
multi_mov_info_list.count = 2;
multi_mov_info_list.is_block = TRUE;
multi_mov_info_list.multi_mov_info[0].motion_unit_type = 1;
multi_mov_info_list.multi_mov_info[0].move_type = 0;
multi_mov_info_list.multi_mov_info[0].motion_unit_id = 0;
multi_mov_info_list.multi_mov_info[0].end_pos[0] = 100;
multi_mov_info_list.multi_mov_info[0].vel = 80;
multi_mov_info_list.multi_mov_info[0].acc = 80;
multi_mov_info_list.multi_mov_info[1].motion_unit_type = 0;
multi_mov_info_list.multi_mov_info[1].move_type = 1;
multi_mov_info_list.multi_mov_info[1].motion_unit_id = 0;
multi_mov_info_list.multi_mov_info[1].end_pos[0] = 0;
multi_mov_info_list.multi_mov_info[1].end_pos[1] = -300;
multi_mov_info_list.multi_mov_info[1].end_pos[2] = 300;
multi_mov_info_list.multi_mov_info[1].end_pos[3] = deg2rad(-180);
multi_mov_info_list.multi_mov_info[1].end_pos[4] = deg2rad(0);
multi_mov_info_list.multi_mov_info[1].end_pos[5] = deg2rad(180);
multi_mov_info_list.multi_mov_info[1].vel = 80;
multi_mov_info_list.multi_mov_info[1].acc = 80;
multi_mov_info_list.multi_mov_info[1].ori_vel = deg2rad(180);
multi_mov_info_list.multi_mov_info[1].ori_acc = deg2rad(720);
ret = robot.multi_mov_with_ext(multi_mov_info_list);
std::cout << "直線運動+外部軸運動終了1" << std::endl;
multi_mov_info_list.multi_mov_info[0].end_pos[0] = 0;
multi_mov_info_list.multi_mov_info[1].end_pos[0] = -300;
multi_mov_info_list.multi_mov_info[1].end_pos[1] = 100;
multi_mov_info_list.multi_mov_info[1].end_pos[2] = 300;
ret = robot.multi_mov_with_ext(multi_mov_info_list);
std::cout << "直線運動+外部軸運動終了2" << std::endl;
}
void movec_with_ext()
{
std::cout << "円弧運動+外部軸運動" << std::endl;
MultiMovInfoList multi_mov_info_list;
multi_mov_info_list.count = 2;
multi_mov_info_list.is_block = TRUE;
multi_mov_info_list.multi_mov_info[0].motion_unit_type = 1;
multi_mov_info_list.multi_mov_info[0].move_type = 0;
multi_mov_info_list.multi_mov_info[0].motion_unit_id = 0;
multi_mov_info_list.multi_mov_info[0].end_pos[0] = 100;
multi_mov_info_list.multi_mov_info[0].vel = 80;
multi_mov_info_list.multi_mov_info[0].acc = 80;
multi_mov_info_list.multi_mov_info[1].motion_unit_type = 0;
multi_mov_info_list.multi_mov_info[1].move_type = 2;
multi_mov_info_list.multi_mov_info[1].motion_unit_id = 0;
multi_mov_info_list.multi_mov_info[1].mid_pos.tran.x = -145.178;
multi_mov_info_list.multi_mov_info[1].mid_pos.tran.y = 15.344;
multi_mov_info_list.multi_mov_info[1].mid_pos.tran.z = 291.208;
multi_mov_info_list.multi_mov_info[1].mid_pos.rpy.rx = deg2rad(179.943);
multi_mov_info_list.multi_mov_info[1].mid_pos.rpy.ry = deg2rad(0);
multi_mov_info_list.multi_mov_info[1].mid_pos.rpy.rz = deg2rad(89.694);
multi_mov_info_list.multi_mov_info[1].end_pos[0] = -345.178;
multi_mov_info_list.multi_mov_info[1].end_pos[1] = 15.344;
multi_mov_info_list.multi_mov_info[1].end_pos[2] = 291.208;
multi_mov_info_list.multi_mov_info[1].end_pos[3] = deg2rad(179.943);
multi_mov_info_list.multi_mov_info[1].end_pos[4] = deg2rad(0);
multi_mov_info_list.multi_mov_info[1].end_pos[5] = deg2rad(89.694);
multi_mov_info_list.multi_mov_info[1].vel = 80;
multi_mov_info_list.multi_mov_info[1].acc = 200;
multi_mov_info_list.multi_mov_info[1].ori_vel = deg2rad(180);
multi_mov_info_list.multi_mov_info[1].ori_acc = deg2rad(720);
ret = robot.multi_mov_with_ext(multi_mov_info_list);
std::cout << "円弧運動+外部軸運動終了1" << std::endl;
multi_mov_info_list.multi_mov_info[0].end_pos[0] = 0;
multi_mov_info_list.multi_mov_info[1].end_pos[0] = -300;
multi_mov_info_list.multi_mov_info[1].end_pos[1] = 100;
multi_mov_info_list.multi_mov_info[1].end_pos[2] = 300;
multi_mov_info_list.multi_mov_info[1].end_pos[3] = deg2rad(-180);
multi_mov_info_list.multi_mov_info[1].end_pos[4] = deg2rad(0);
multi_mov_info_list.multi_mov_info[1].end_pos[5] = deg2rad(180);
ret = robot.multi_mov_with_ext(multi_mov_info_list);
std::cout << "円弧運動+外部軸運動終了2" << std::endl;
}
ロボットアーム操作情報の設定と取得
ロボットアームの状態監視データを取得(唯一のマルチスレッド安全インターフェース)
ロボットアームの状態データを取得、マルチスレッド安全
- パラメータの説明
- status ロボットアームの状態
- errcode ロボットアームのエラーコード、0:エラーなし
- inpos ロボットアームの動作が完了したかどうか、0:未完了、1:完了
- powered_on ロボットアームが通電しているかどうか、0:未通電、1:通電中
- enabled ロボットアームが有効化されているかどうか、0:無効、1:有効
- rapidrate ロボットアームの動作速度比率
- protective_stop ロボットアームが衝突を検出したかどうか、0:正常、1:衝突検出
- emergency_stop ロボットアームが緊急停止したかどうか、0:正常、1:緊急停止状態
- dout ロボットアーム制御キャビネットのデジタル出力信号、[dout0]は信号数
- din ロボットアーム制御キャビネットのデジタル入力信号、[din0]は信号数
- ain ロボットアーム制御キャビネットのアナログ入力信号、[ain0]は信号数
- aout ロボットアーム制御キャビネットのアナログ出力信号、[aout0]は信号数
- tio_dout ロボットアーム先端ツールのデジタル出力信号、[tio_dout0]は信号数
- tio_din ロボットアーム先端ツールのデジタル入力信号、[tio_din0]は信号数
- tio_ain ロボットアーム先端ツールのアナログ入力信号、[tio_ain0]は信号数
- tio_key ロボットアーム先端ツールの3つのボタン状態、[0free]、[1point]、[2pause_resume]
- extio ロボットアーム外部アプリケーションIO
- modbus_slave ロボットアームのModbusスレーブ
- profinet_slave ロボットアームProfinetスレーブ
- eip_slave ロボットアームEthernet/IPスレーブ
- current_tool_id 現在使用しているツール座標系ID
- cartesiantran_position ロボットのエンドツールのデカルト空間上での位置
- joint_position ロボット関節空間位置
- on_soft_limit ロボットアームがソフトリミット状態にあるかどうか、0:正常、1:ソフトリミットに到達
- current_user_id 現在使用しているユーザー座標系ID
- drag_status ロボットアームがドラッグ状態にあるかどうか、0:正常、1:ドラッグ状態
- robot_monitor_data ロボットアーム状態監視データ
- torq_sensor_monitor_data ロボットアームトルクセンサー状態監視データ
- is_socket_connect コントローラ接続状態、0:接続異常、1:接続正常
- status ロボットアームの状態
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_robot_status(RobotStatus *status);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//ロボットアーム状態監視データの取得
int example_get_robot_status()
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
RobotStatus robstatus;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアーム状態監視データの取得
demo.get_robot_status(&robstatus);
demo.login_out();
return 0;
}
ロボットアームの状態監視データを取得
ロボットアームの状態データを取得、マルチスレッド安全
- パラメータの説明
- status ロボットアームの状態
- error ロボットアームエラーコード、0はエラーなしを示す
- errmsg ロボットアームエラーメッセージ
- powered_on ロボットアームが通電しているかどうか、0:未通電、1:通電中
- enabled ロボットアームが有効化されているかどうか、0:無効、1:有効
- status ロボットアームの状態
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_robot_status_simple(RobotStatus_simple *status);
現在のロボットアームの関節角度——サーボフィードバックを取得する
現在のロボットアーム関節角度を取得し、関節角度行列を入力パラメータjoint_positionに保存する
- パラメータの説明
- joint_position 関節角度の照会結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_actual_joint_position(JointValue *joint_position);
現在のロボットアームの関節角度を取得する
現在のロボットアーム関節角度を取得し、関節角度行列を入力パラメータjoint_positionに保存する
- パラメータの説明
- joint_position 関節角度の照会結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_joint_position(JointValue *joint_position);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//現在のロボットアーム関節角度を取得
int example_get_joint_position()
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
JointValue jot_pos;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//現在の関節角を取得
demo.get_joint_position(&jot_pos);
for (int i = 0; i < 6; i++)
{
std::cout << "ジョイント[" << i+1 <<"] は:"<< jot_pos.jVal[i] << std::endl;
}
return 0;
}
手動または自動モードを設定
ロボットアームの操作モードを設定します。自動モードでは、安全関連の設定を行うことはできません。手動モードでは、安全な操作を確保するために自動的にインデントモードに入ります。
- パラメータの説明
- mode モードパラメータ、0:手動モード、1:自動モード
- robot_id ロボットID、省略値は0
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_auto_manual_mode(int mode, int robot_id = 0);
現在のロボットアーム操作モードを取得
現在のロボットアーム操作モードを取得
- パラメータの説明
- mode モードパラメータ、0:手動モード、1:自動モード
- robot_id ロボットID、省略値は0
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_auto_manual_mode(int *mode, int robot_id = 0);
ロボットアーム状態データの自動更新間隔を設定します
廃止されたインターフェース
ロボットアーム状態データの自動更新間隔を設定します。特に get_robot_status() に適用されます
- パラメータの説明
- millisecond 時間パラメータ、単位:ms
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_status_data_update_time_interval(float millisecond);
現在の設定下でのツールエンドの姿勢——サーボフィードバックを取得する
現在設定下でのツール末端の位置姿勢を取得し、その姿勢を入力パラメータ tcp_position に保存します
- パラメータの説明
- tcp_position ツール末端位置のクエリ結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_actual_tcp_position(CartesianPose *tcp_position);
現在の設定下でのツールエンドの姿勢を取得する
現在設定下でのツール末端の位置姿勢を取得し、その姿勢を入力パラメータ tcp_position に保存します
- パラメータの説明
- tcp_position ツール末端位置のクエリ結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_tcp_position(CartesianPose *tcp_position);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//ツール末端の位置姿勢を取得
int example_get_tcp_position()
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
CartesianPose tcp_pos;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//ツール末端の位置姿勢を取得
demo.get_tcp_position(&tcp_pos);
std::cout << "tcp_pos は : n x: " << tcp_pos.tran.x << " y: " << tcp_pos.tran.y << " z: " << tcp_pos.tran.z << std::endl;
std::cout << "rx: " << tcp_pos.rpy.rx << " ry: " << tcp_pos.rpy.ry << " rz: " << tcp_pos.rpy.rz << std::endl;
return 0;
}
ユーザー座標系情報を設定する
指定番号のユーザー座標系情報を設定する
- パラメータの説明
- id ユーザー座標系番号。取り得る値の範囲は[1~15]。0はデフォルトのワールド座標系で、変更不可。
- user_frame ユーザー座標系のオフセット値
- name ユーザー座標系の別名
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_user_frame_data(int id, const CartesianPose *user_frame, const char *name);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//ユーザー座標系の確認と調整
int example_user_frame()
{
int id_ret, id_set;
id_set = 2;
CartesianPose tcp_ret, tcp_set;
char name[50] = "test";
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
//現在使用しているユーザー座標系IDを取得
demo.get_user_frame_id(&id_ret);
//現在使用しているユーザー座標系情報を取得
demo.get_user_frame_data(id_ret, &tcp_ret);
std::cout << "id_using=" << id_ret << " nx=" << tcp_ret.tran.x << " y=" << tcp_ret.tran.y << " z=" << tcp_ret.tran.y << std::endl;
std::cout << "rx=" << tcp_ret.rpy.rx << " y=" << tcp_ret.rpy.ry << " z=" << tcp_ret.rpy.rz << std::endl;
//ユーザー座標系の座標を初期化
tcp_set.tran.x = 0; tcp_set.tran.y = 0; tcp_set.tran.z = 10;
tcp_set.rpy.rx = 120 ; tcp_set.rpy.ry = 90 ; tcp_set.rpy.rz = -90 ;
//ユーザー座標系情報を設定
demo.set_user_frame_data(id_set, &tcp_set, name);
//現在使用するユーザー座標系を切り替える
demo.set_user_frame_id(id_set);
//現在使用しているユーザー座標系IDを取得
demo.get_user_frame_id(&id_ret);
//設定されたユーザー座標系情報を取得
demo.get_user_frame_data(id_ret, &tcp_ret);
std::cout << "id_using=" << id_ret << " nx=" << tcp_ret.tran.x << " y=" << tcp_ret.tran.y << " z=" << tcp_ret.tran.y << std::endl;
std::cout << "rx=" << tcp_ret.rpy.rx << " y=" << tcp_ret.rpy.ry << " z=" << tcp_ret.rpy.rz << std::endl;
return 0;
}
ユーザー座標系情報を取得
現在使用中のユーザー座標系情報を照会する
- パラメータの説明
- id ユーザー座標系ID
- user_frame ユーザー座標系のオフセット値
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_user_frame_data(int id, CartesianPose *user_frame);
現在使用中のユーザー座標系IDを設定する
現在使用中のユーザー座標系IDを設定する
- パラメータの説明
- id ユーザー座標系ID、値の範囲は[0~15]、0はワールド座標系
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_user_frame_id(const int id);
現在使用中のユーザー座標系IDを照会
現在使用中のユーザー座標系IDを照会する
- パラメータの説明
- id 取得結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_user_frame_id(int *id);
ツール情報を設定
指定番号のツール情報を設定する
- パラメータの説明
- id ツール番号、値の範囲は[1~15]
- tcp ツール座標系のフランジ座標系に対するオフセット
- name 指定ツールの別名
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_tool_data(int id, const CartesianPose *tcp, const char *name);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//ツール座標系の表示および調整
int example_tool()
{
int id_ret,id_set;
id_set = 2;
CartesianPose tcp_ret,tcp_set;
char name[50] = "test";
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
//現在使用中のツールIDを照会する
demo.get_tool_id(&id_ret);
//現在使用中のツール情報を取得
demo.get_tool_data(id_ret,&tcp_ret);
std::cout << "id_using=" << id_ret << " x=" << tcp_ret.tran.x << " y=" << tcp_ret.tran.y << " z=" << tcp_ret.tran.y << std::endl;
std::cout << "rx=" << tcp_ret.rpy.rx << " ry=" << tcp_ret.rpy.ry << " rz=" << tcp_ret.rpy.rz << std::endl;
//ツール座標を初期化
tcp_set.tran.x = 0; tcp_set.tran.y = 0; tcp_set.tran.z = 10;
tcp_set.rpy.rx = 120 ; tcp_set.rpy.ry = 90 ; tcp_set.rpy.rz = -90 ;
//ツール情報を設定
demo.set_tool_data(id_set, &tcp_set, name);
//現在使用中のツール座標を切り替え
demo.set_tool_id(id_set);
//現在使用中のツールIDを照会する
demo.get_tool_id(&id_ret);
//設定されたツール情報を取得
demo.get_tool_data(id_ret, &tcp_ret);
std::cout << "id_using=" << id_ret << " nx=" << tcp_ret.tran.x << " y=" << tcp_ret.tran.y << " z=" << tcp_ret.tran.y << std::endl;
std::cout << "rx=" << tcp_ret.rpy.rx << " ry=" << tcp_ret.rpy.ry << " rz=" << tcp_ret.rpy.rz << std::endl;
return 0;
}
ツール情報を取得
現在使用中のツール情報を照会します。使用例はツール情報設定を参照してください。
- パラメータの説明
- id ツールID照会結果
- tcp ツール座標系のフランジ座標系に対するオフセット
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_tool_data(int id, CartesianPose *tcp);
現在使用中のツールIDを照会
現在使用中のツールIDを照会
- パラメータの説明
- id ツールID照会結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_tool_id(int *id);
現在使用中のツールIDを設定する
現在使用中のツールIDを設定します。ネットワークの揺らぎがある場合、ID切り替え後に反映されるまでに一定の遅延が必要です。
- パラメータの説明
- id ツール座標系ID 。値の範囲は[0~15]。0はデフォルトのエンドフランジ中心座標系を使用します。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_tool_id(const int id);
デジタル出力変数を設定する
デジタル出力変数(DO)の値を設定
- パラメータの説明
- type DOタイプ
- IO_CABINET:コントローラIO
- IO_TOOL:ツールIO
- IO_EXTEND:拡張IO
- IO_REALY:リレーIO(Cabv3のみ対応)
- IO_MODBUS_SLAVE、ModbusスレーブIO
- IO_PROFINET_SLAVE、ProfinetスレーブIO
- IO_EIP_SLAVE、ETHRENET/IPスレーブIO
- index DOインデックス(0から開始)
- value DO設定値
- type DOタイプ
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_digital_output(IOType type, int index, BOOL value);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
#include <thread>
//デジタル出力の設定と取得
int main()
{
BOOL DO3;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//do3の状態を取得
demo.get_digital_output(IO_CABINET, 2, &DO3);
std::cout << "D03 = " << DO3 << std::endl;
//io_cabinetは制御盤パネルIOで、2はDO3を表し、1は設定するDO値に対応します。
demo.set_digital_output(IO_CABINET, 2, 1);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));//1秒の遅延が必要
//do3の状態を取得
demo.get_digital_output(IO_CABINET, 2, &DO3);
std::cout << "D03 = " << DO3 << std::endl;
return 0;
}
アナログ出力変数を設定する
アナログ出力変数(AO)の値を設定する
- パラメータの説明
- type AOの種類、選択可能なタイプは
デジタル出力変数設定を参照;ModbusスレーブIOの場合、インデックスは4です - index AOインデックス(0から開始)
- value AO設定値
- type AOの種類、選択可能なタイプは
- 戻り値 ERR_SUCC 成功 その他は失敗
- Ps: V3バージョンでは制御盤タイプのアナログIOはサポートされていません。使用時はtypeに制御盤IOを選択しないでください。
errno_t set_analog_output(IOType type, int index, float value);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
#include <thread>
//アナログ出力の設定と取得
int main()
{
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
float AO1;
//Aoの状態を取得
demo.get_analog_output(IO_MODBUS_SLAVE, 0, &AO1);
std::cout << "AO1 = " << AO1 << std::endl;
//IO_MODBUS_SLAVEはmodbus IOであり、0はAO1を表し、1.5は設定するAO値に対応します。
demo.set_analog_output(IO_MODBUS_SLAVE, 0, 2);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
//Aoの状態を取得
demo.get_analog_output(IO_MODBUS_SLAVE, 0, &AO1);
std::cout << "AO1 = " << AO1 << std::endl;
return 0;
}
動作中にデジタル出力変数を設定する
動作中にデジタル出力変数(DO)の値を設定する
- パラメータの説明
- type DOタイプ、選択可能なタイプはデジタル
出力変数の設定を参照 - index DOインデックス(0から開始)
- value DO設定値
- rel 0: 動作開始点に対して, 1: 動作終点に対して
- distance 距離。開始点または終点(relパラメータに基づく)からどれだけ離れた位置でDOをトリガーするか
- type DOタイプ、選択可能なタイプはデジタル
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_motion_digital_output(IOType type, int index, BOOL value, BOOL rel, double distance);
動作中にアナログ出力変数を設定する
動作中にアナログ出力変数(AO)の値を設定する
- パラメータの説明
- type AOタイプ、選択可能なタイプはデジタル
出力変数の設定を参照 - index AOインデックス(0から開始)
- value AO設定値
- rel 0: 動作開始点に対して, 1: 動作終点に対して
- distance 距離。relパラメータに基づいて、始点または終点からどれだけ離れた位置でAOをトリガーするかを示す
- type AOタイプ、選択可能なタイプはデジタル
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_motion_analog_output(IOType type, int index, BOOL value, BOOL rel, double distance);
デジタル入力状態を照会
デジタル入力(DI)状態を照会する
- パラメータの説明
- type DIタイプ、選択可能なタイプはデジタル
出力変数の設定を参照 - index DIインデックス(0から開始)
- result DI状態の照会結果
- type DIタイプ、選択可能なタイプはデジタル
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_digital_input(IOType type, int index, BOOL *result);
デジタル出力状態を照会
デジタル出力(DO)状態を照会する
- パラメータの説明
- type DOタイプ、選択可能なタイプはデジタル
出力変数の設定を参照 - index DOインデックス(0から開始)
- result DO状態の照会結果
- type DOタイプ、選択可能なタイプはデジタル
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_digital_output(IOType type, int index, BOOL *result);
アナログ入力変数の値を取得
アナログ入力変数(AI)の値を取得する
- パラメータの説明
- type AIタイプ、選択可能なタイプはデジタル
出力変数の設定を参照 - index AIインデックス(0から開始)
- result 指定されたAI状態の照会結果
- type AIタイプ、選択可能なタイプはデジタル
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_analog_input(IOType type, int index, float *result);
アナログ出力変数の値を取得
アナログ出力変数(AO)の値を取得する
- パラメータの説明
- type AOのタイプ、選択可能なタイプはデジタル
出力変数の設定を参照 - index AOインデックス(0から開始)
- result AO状態の問い合わせ結果を指定
- type AOのタイプ、選択可能なタイプはデジタル
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_analog_output(IOType type, int index, float *result);
拡張IOが動作しているかを問い合わせる
拡張IOモジュールが動作しているかを問い合わせる
- パラメータの説明
- is_running 拡張IOモジュールの動作状態問い合わせ結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t is_extio_running(BOOL *is_running);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//拡張IOの状態を問い合わせる
int main()
{
BOOL is_running;
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
//TIOの状態を問い合わせる
demo.is_extio_running(&is_running);
std::cout << "tio = " << is_running << std::endl;
return 0;
}
ロボットアームのペイロードを設定する
ロボットアームの負荷設定
- パラメータの説明
- payload 負荷の重心および質量データ
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_payload(const PayLoad *payload);
ロボットアームのペイロードデータを取得する
ロボットアームの負荷データを取得
- パラメータの説明
- payload 負荷の問い合わせ結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_payload(PayLoad *payload);
コード例:
int example_payload()
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
PayLoad payloadret;
PayLoad payload_set;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//現在の負荷データを問い合わせる
demo.get_payload(&payloadret);
std::cout << " ペイロード質量は:" << payloadret.mass << " kg" << std::endl;
std::cout << " ペイロードの重心は x: " << payloadret.centroid.x<< " y: " << payloadret.centroid.y << " z: " << payloadret.centroid.z << std::endl;
payload_set.mass = 1.0;
//単位 mm
payload_set.centroid.x = 0; payload_set.centroid.y = 0; payload_set.centroid.z = 10;
//現在のペイロードデータを設定
demo.set_payload(&payload_set);
//現在の負荷データを問い合わせる
demo.get_payload(&payloadret);
std::cout << " ペイロード質量は:" << payloadret.mass << " kg" << std::endl;
std::cout << " ペイロードの重心は x: " << payloadret.centroid.x << " y: " << payloadret.centroid.y << " z: " << payloadret.centroid.z << std::endl;
return 0;
}
TIOV3電圧パラメータを設定
tioV3電圧パラメータを設定
- パラメータの説明
- vout_enable 電圧イネーブル、0:オフ、1:オン
- vout_vol 電圧レベル 0:24v 1:12v
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_tio_vout_param(int vout_enable, int vout_vol);
TIOV3電圧パラメータを取得
tioV3電圧パラメータを取得
- パラメータの説明
- vout_enable 電圧イネーブル、0:オフ、1:オン
- vout_vol 電圧レベル 0:24v 1:12v
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_tio_vout_param(int* vout_enable, int* vout_vol);
TIOセマフォを追加または変更
セマフォを追加または修正
- パラメータの説明
- sign_info セマフォパラメータ
- sig_name シグナル名
- chn_id チャネルID
- sig_type シグナルタイプ
- sig_addr シグナルアドレス
- value シグナル初期値
- frequency シグナル周波数
- sign_info セマフォパラメータ
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t add_tio_rs_signal(SignInfo sign_info);
コード例:
void example_add_tio_rs_signal()
{
JAKAZuRobot デモ;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
SignInfo sign_info {0};
memcpy(sign_info.sig_name, "sign_tmp", sizeof("sign_tmp"));
sign_info.chn_id = 0,
sign_info.sig_type = 0,
sign_info.value = 10,
sign_info.frequency = 5;
sign_info.sig_addr = 0x1;
demo.add_tio_rs_signal(sign_info);
demo.disable_robot();
demo.power_off();
demo.login_out();
}
TIOセマフォを削除
信号量を削除する
- パラメータの説明
- sig_name シグナル名
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t del_tio_rs_signal(const char* sig_name);
コード例:
void example_del_tio_rs_signal()
{
JAKAZuRobot デモ;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
const char* name = "sign_tmp";
demo.del_tio_rs_signal(name);
demo.disable_robot();
demo.power_off();
demo.login_out();
}
TIO RS485コマンドを送信
RS485コマンドを送信する
- パラメータの説明
- chn_id チャネル番号
- data データフィールド
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t send_tio_rs_command(int chn_id, uint8_t* data,int buffsize);
コード例:
void example_send_tio_rs_command()
{
JAKAZuRobot デモ;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
uint8_t cmd[] = {'t', 'e', 's', 't', 'c', 'm', 'd'};
demo.send_tio_rs_command(0, cmd, sizeof(cmd));
demo.disable_robot();
demo.power_off();
demo.login_out();
}
TIO セマフォ情報の更新
信号セマフォ情報を更新する
- パラメータの説明
- sign_info 信号セマフォ情報配列
- sig_name 信号名
- frequency 信号周波数
- sign_info 信号セマフォ情報配列
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t update_tio_rs_signal(SignInfo_simple sign_info);
TIOセマフォ情報を取得
信号セマフォ情報を取得します。取得する前に上記の更新インターフェースを呼び出すことを推奨します。
- パラメータの説明
- sign_info_array 信号セマフォ情報配列
- array_len 信号セマフォ情報配列の長さ
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_rs485_signal_info(SignInfo* sign_info_array, int* array_len);
コード例:
void example_get_rs485_signal_info()
{
JAKAZuRobot デモ;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
SignInfo sign_info[256];
int array_len = 0;
demo.get_rs485_signal_info(sign_info, &array_len);
demo.disable_robot();
demo.power_off();
demo.login_out();
}
TIOモードを設定
tioモードを設定する
- パラメータの説明
- pin_type tioタイプ 0 は DI ピン用、1 は DO ピン用、2 は AI ピン用
- DI ピン: 0:0x00 DI2はNPN、DI1はNPN。1:0x01 DI2はNPN、DI1はPNP。2:0x10 DI2はPNP、DI1はNPN。3:0x11 DI2はPNP、DI1はPNP。
- DO ピン: 下位8ビットのうち上位4ビットはDO2の設定、下位4ビットはDO1の設定。0x0 DOはNPN出力;0x1 DOはPNP出力;0x2 DOはプッシュプル出力;0xF RS485Hインターフェース。
- AI ピン: 0:アナログ入力機能を有効化し、RS485Lを無効化する。1:RS485Lインターフェースを有効化し、アナログ入力機能を無効化する。
- pin_type tioタイプ 0 は DI ピン用、1 は DO ピン用、2 は AI ピン用
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_tio_pin_mode(int pin_type, int pin_mode);
TIOモードを取得
tioモードを取得
- パラメータの説明
- pin_type tioタイプ 0: DIピン用, 1: DOピン用, 2: AIピン用
- DIピン: 0:0x00 DI2はNPN、DI1はNPN、1:0x01 DI2はNPN、DI1はPNP、2:0x10 DI2はPNP、DI1はNPN、3:0x11 DI2はPNP、DI1はPNP
- DO ピン: 下位8ビットのうち上位4ビットはDO2の設定、下位4ビットはDO1の設定。0x0 DOはNPN出力、0x1 DOはPNP出力、0x2 DOはプッシュプル出力、0xF RS485Hインターフェース
- AIピン: 0:アナログ入力機能有効、RS485L無効、 1:RS485Lインターフェース有効、アナログ入力機能無効
- pin_type tioタイプ 0: DIピン用, 1: DOピン用, 2: AIピン用
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_tio_pin_mode(int pin_type, int* pin_mode);
TIO RS485通信パラメータ設定
RS485通信パラメータ設定
- パラメータの説明
- mod_rtu_com チャンネルモードがModbus RTUに設定されている場合、追加でModbusスレーブノードIDを指定する必要があります
- chn_id RS485チャンネルID
- slaveId ModbusスレーブノードID
- baudrate ボーレート
- databit データビット
- stopbit ストップビット
- parity パリティ
- mod_rtu_com チャンネルモードがModbus RTUに設定されている場合、追加でModbusスレーブノードIDを指定する必要があります
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_rs485_chn_comm(ModRtuComm mod_rtu_com);
TIO RS485通信パラメータ照会
RS485通信パラメータの照会
- パラメータの説明
- mod_rtu_com 取得したチャンネルモードパラメータを受け取るために使用され、照会時にchn_idは入力パラメータとして使用されます
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_rs485_chn_comm(ModRtuComm* mod_rtu_com);
TIO RS485通信モード設定
RS485通信モード設定
- パラメータの説明
- chn_id 0: RS485H, チャンネル1; 1: RS485L, チャンネル2
- chn_mode 0: Modbus RTU, 1: Raw RS485, 2: トルクセンサー
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_rs485_chn_mode(int chn_id, int chn_mode);
TIO RS485通信モード照会
RS485通信モードの照会
- パラメータの説明
- chn_id 入力パラメータ 0: RS485H, チャンネル1。 1: RS485L、チャンネル2
- chn_mode 出力パラメータ 0: Modbus RTU。1: Raw RS485。2:トルクセンサー
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_rs485_chn_mode(int chn_id, int* chn_mode);
ロボットアームの設置角度を取得
設置角度を取得
- パラメータの説明
- quat 設置角度クォータニオン
- appang 設置角度RPY角
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_installation_angle(Quaternion* quat, Rpy* appang);
ロボットアームの設置角度を設定
設置角度を設定
- パラメータの説明
- angleX X軸周りの回転角度
- angleZ Z軸周りの回転角度
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_installation_angle(double angleX, double angleZ);
コード例:
#include <JAKAZuRobot.h>
#include <iostream>
int main()
{
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
errno_t ret = demo.login_in("192.168.2.194",1,"jaka_sdk","password");
if (ret != ERR_SUCC)
{
std::cerr << "ログインに失敗しました。";
return -1;
}
ret = demo.set_installation_angle(3.14, 0);
if (ret != ERR_SUCC)
{
std::cerr << "設置角度の設定に失敗しました。";
return -1;
}
Quaternion quat;
Rpy rpy;
ret = demo.get_installation_angle(&quat, &rpy);
if (ret != ERR_SUCC)
{
std::cerr << "インストール角度の取得に失敗しました。";
return -1;
}
std::cout << "quat: [" << quat.x << ", " << quat.y << ", " << quat.z << ", " << quat.s << "]";
std::cout << "角度x: " << rpy.rx << ", 角度z: " << rpy.rz << "";
ret = demo.login_out();
if (ret != ERR_SUCC)
{
std::cerr << "ログアウトに失敗しました。";
return -1;
}
return 0;
}
システム変数を設定する
システム変数を設定する
- パラメータの説明
- v システム変数
- id システム変数ID
- value システム変数値
- alias システム変数名
- v システム変数
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_user_var(UserVariable v);
ロボットアームの状態を取得
ロボットアームの状態を取得
- パラメータの説明
- state ロボットアーム状態の照会結果
- estop 0:正常、1:非常停止
- poweredOn 0: 電源OFF、1: 電源ON
- servoEnabled 0: 無効、1: 有効
- state ロボットアーム状態の照会結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_robot_state(RobotState* state);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//ロボットアームの状態を取得(非常停止 電源ON サーボ有効)
int example_get_robstate()
{
JAKAZuRobot demo;
//ロボットアーム状態構造体を宣言
RobotState state;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
//ロボットアームの状態を照会
demo.get_robot_state(&state);
std::cout << "非常停止状態: " << state.estoped << std::endl;
std::cout << "電源状態: " << state.poweredOn << std::endl;
std::cout << "サーボ有効状態 : " << state.servoEnabled << std::endl;
return 0;
}
システム変数を取得する
システム変数を取得する
- パラメータの説明
- vlist システム変数の照会結果リスト
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_user_var(UserVariableList* vlist);
振動抑制モードを設定
振動抑制モードを設定
- パラメータの説明
- mode 振動抑制モード、0:オフ、1:モード1、2:モード2
- robot_id ロボットアームID、デフォルト値は 0
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_vibsuppress_mode(int mode, int robot_id = 0);
各機種の初期デフォルト周波数は以下の通りです:
| 負荷/機種 | デフォルト周波数(Hz) |
|---|---|
| MiniCobot1 | 16 |
| MiniCobot2 | 15 |
| 3kg(Zu3など) | 14 |
| 5kg(C5/A5/双腕など) | 12 |
| 7kg(Zu7など) | 12 |
| 12kg(Zu12など) | 8 |
| 16kg(Zu16) | 7.5 |
| 18kg(Zu18) | 7.5 |
| 20kg(Zu20) | 7.5 |
| 30kg(Zu30) | 7.4 |
| Max40 | 5 |
振動抑制設定を有効にする
振動抑制設定を有効にする
- パラメータの説明
- frequency 振動周波数
- damping 振動ダンピング、デフォルト値は 0.05
- robot_id ロボットアームID、デフォルト値は 0
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t vibsuppress_on(double frequency, double damping = 0.05, int robot_id = 0);
振動抑制設定を無効にする
振動抑制設定を無効にする
- パラメータの説明
- robot_id ロボットアームID、デフォルト値は 0
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t vibsuppress_off(int robot_id = 0);
ロボットアームの安全状態の設定と照会
ロボットアームが非常停止状態にあるかを確認する
ロボットアームが緊急停止状態にあるかを照会
- パラメータの説明
- estop 照会結果
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t is_in_estop(BOOL *estop);
ロボットアームがリミットを超えているかを確認する
ロボットアームがソフトリミットを超えているかを照会
- パラメータの説明
- on_limit 照会結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t is_on_limit(BOOL *on_limit);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
#include <thread>
//リミットを超えているかを照会
int example_is_on_limit()
{
JAKAZuRobot demo;
BOOL on_limit;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
while (1)
{
//リミット超過を照会
demo.is_on_limit(&on_limit);
std::cout << " on_limit の状態は :" << on_limit << std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
}
return 0;
}
ロボットアームが衝突保護モードにあるかどうかを確認
ロボットアームが衝突保護モードにあるかどうかを照会する
- パラメータの説明
- in_collision 照会結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t is_in_collision(BOOL *in_collision);
衝突後に衝突保護モードから復帰
衝突後に衝突保護モードから復帰する
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t collision_recover();
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//衝突保護状態の照会と復帰
int example_collision_recover()
{
JAKAZuRobot demo;
BOOL in_collision;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
//衝突保護状態にあるかどうかを照会する
demo.is_in_collision(&in_collision);
std::cout << " in_collision is :" << in_collision << std::endl;
if (in_collision)
//衝突保護モード中の場合、保護から復帰する
{demo.collision_recover();}
else
{std::cout << "robot is not collisio" << std::endl;}
return 0;
}
ロボットアームの衝突レベルを設定
ロボットアームの衝突レベルを設定する
- パラメータの説明
- level 衝突レベル、値の範囲は[0〜5 。]0は衝突検知を無効、1は衝突しきい値25N、2は50N、3は75N、4は100N、5は125N
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_collision_level(const int level);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//衝突レベルの確認と設定
int example_collision_level()
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
int level;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//現在の衝突レベルを照会する
demo.get_collision_level(&level);
std::cout << " 衝突レベルは:" << level << std::endl;
//衝突レベルを設定します。[0,5]、0は衝突を無効化、1は衝突閾値25N、2は衝突閾値50N、3は衝突閾値75N、4は衝突閾値100N、5は衝突閾値125N
demo.set_collision_level(2);
//現在の衝突レベルを照会する
demo.get_collision_level(&level);
std::cout << " 衝突レベルは:" << level << std::endl;
return 0;
}
ロボットに設定された衝突レベルを取得
ロボットアームに設定されている衝突レベルを取得
- パラメータの説明
- level 衝突レベル、値の範囲は[0~5]。0は衝突を無効化、1は衝突閾値25N、2は衝突閾値50N、3は衝突閾値75N、4は衝突閾値100N、5は衝突閾値125N
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_collision_level(int *level);
ネットワーク異常時にロボットアームの動作を自動停止するタイプを設定
ネットワーク異常制御ハンドルを設定します。SDKがロボットアームコントローラとの接続を失った後、どのくらいの時間でロボットアームコントローラが現在の動作を終了するかを指定します
- パラメータの説明
- millisecond 時間パラメータ、単位:ms、範囲は500~30000ms。設定がこの範囲を超えた場合、実際に適用される時間は2秒です
- mnt ネットワーク異常時にロボットアームが行う動作タイプ。選択可能なタイプ:MOT_KEEP(デフォルト)、MOT_PAUSE、MOT_ABORT
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_network_exception_handle(float millisecond, ProcessType mnt);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//ネットワーク異常時にロボットアームが自動的に動作を終了するタイプを設定
int example_set_network_exception_handle()
{
float milisec = 100;
errno_t ret;
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
//コンプライアンストルク条件を設定
ret = demo.set_network_exception_handle(milisec, MOT_KEEP);
std::cout << ret << std::endl;
return 0;
}
ロボットアームで発生した最後のエラーコードを取得
ロボットアームの動作中に最後に発生したエラーコードを取得します。clear_errorを呼び出すと最後のエラーコードはクリアされます
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_last_error(ErrorCode *code);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//エラーコードの確認
int example_get_last_errcode()
{
errno_t ret;
//エラーコードファイルの保存パスを初期化
JAKAZuRobot demo;
ErrorCode Eret;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
ret = demo.program_load("not_exist999875");//存在しないプログラムを故意にロードして、エラーを発生させます。
std::cout << ret << std::endl;
demo.get_last_error(&Eret);//最後のエラー情報を照会
std::cout << " エラーコードは :" << Eret.code << " メッセージ: " << Eret.message << std::endl;
demo.get_last_error(&Eret);//最後のエラー情報を照会
std::cout << " エラーコードは :" << Eret.code << " メッセージ: " << Eret.message << std::endl;
return 0;
}
エラー状態をクリア
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t clear_error();
ロボットアームのエラー時にコールバック関数を登録
廃止されたインターフェース
ロボットアームの登録時にエラーが発生したときのコールバック関数
- パラメータの説明
- func はユーザー定義関数を指す関数ポインター
- error_code ロボットアームのエラーコード
errno_t set_error_handler(CallBackFuncType func);
ロボットアームのエラーコードファイル保存パスを設定
廃止されたインターフェース
エラーコードファイルパスを設定する。get_last_error インターフェースを使用する場合は設定が必要だが、使用しない場合は設定不要。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_errorcode_file_path(char *path);
Appスクリプトプログラムを使用する
現在読み込まれているジョブプログラムを実行する
現在ロードされているジョブプログラムを実行する
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t program_run();
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
#include <windows.h>
// スクリプトのロード、スクリプト実行制御、スクリプトプロセスの確認
int example_program()
{
char name[128];
int cur_line;
JAKAZuRobot demo;
errno_t ret;
ProgramState pstatus;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
if(ret==0){std::cout << "ログイン成功" << std::endl;}
else{
std::cout << ret << std::endl;
std::cout << "ログインに失敗しました" << std::endl;}
demo.power_on();
demo.enable_robot();
// 事前にアプリで編集済みの example スクリプトをロードする
demo.program_load("example");
// ロード済みのプログラム名を取得
demo.get_loaded_program(name);
std::cout << "プログラム名は:" << name << std::endl;
//現在ロードされているプログラムを実行する
demo.program_run();
std::this_thread::sleep_for(std::chrono::milliseconds(1000));//プログラムをまず1秒間実行する
//現在実行中のプログラムを一時停止する
demo.program_pause();
//現在実行しているプログラムの行番号を取得する
demo.get_current_line(&cur_line);
std::cout<<"cur_lineis:"<<cur_line<<std::endl;
//現在のプログラム状態を取得する
demo.get_program_state(&pstatus);
std::cout<<"pro_statusis:"<<pstatus<<std::endl;
//現在のプログラムの実行を再開する
demo.program_resume();
std::this_thread::sleep_for(std::chrono::milliseconds(10000));//10秒の遅延にはwindow.hが必要
//現在のプログラムを終了する
demo.program_abort();
return 0;
}
現在実行中のジョブプログラムを一時停止する
現在実行中のジョブプログラムを一時停止する
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t program_pause();
現在一時停止中のジョブプログラムを再開する
現在一時停止中のジョブプログラムを再開する
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t program_resume();
現在実行中のジョブプログラムを終了する
現在実行中のジョブプログラムを終了する
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t program_abort();
指定されたジョブプログラムを読み込む
指定されたジョブプログラムをロードする。プログラム名はapp内の名前でよい(軌跡再現データをロードする場合、フォルダー名の前にtrack/を付ける必要がある)
- パラメータの説明
- file プログラムファイルのパス
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t program_load(const char *file);
読み込まれているジョブプログラムの名前を取得する
読み込まれている作業プログラム名を取得する
- パラメータの説明
- file プログラムファイルのパス
- size file の長さ。最大値は100
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_loaded_program(char *file, uint8_t size);
現在のロボットアームジョブプログラムの実行行番号を取得する
現在のロボットアームの作業プログラムの実行行番号を取得する
- パラメータの説明
- curr_line 現在の行番号の照会結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_current_line(int *curr_line);
ロボットアームのジョブプログラムの実行状態を取得する
ロボットアーム作業プログラムの実行状態を取得する
- パラメータの説明
- status 作業プログラムの実行状態照会結果。PROGRAM_IDLE:停止状態、PROGRAM_RUNNING:実行中、PROGRAM_PAUSED:一時停止状態
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_program_state(ProgramState *status);
ロボットアームのジョブプログラム情報を取得する
ロボットアーム作業プログラム情報を取得する
- パラメータの説明
- info プログラム情報照会結果
- logic_line プログラムスクリプトの実行行番号
- motion_line 実行中のモーションCMD ID
- file 現在のプログラムファイル
- program_state プログラム実行状態
- info プログラム情報照会結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_program_info(ProgramInfo *info);
ロボットアームの動作倍率を設定
ロボットアームの動作倍率を設定する
- パラメータの説明
- rapid_rate はプログラムの動作倍率。設定範囲は[0〜1]
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_rapidrate(double rapid_rate);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
#include "thread"
//ロボットアームの速度確認および調整
int example_rapidrate()
{
double rapid_rate;
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
//ロボットアームの移動速度を取得する
demo.get_rapidrate(&rapid_rate);
std::cout << "rapid_rate は : " << rapid_rate << std::endl;
//ロボットアームの動作速度を設定する
demo.set_rapidrate(0.4);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
demo.get_rapidrate(&rapid_rate);
std::cout << "rapid_rate は : " << rapid_rate << std::endl;
return 0;
}
ロボットアームの動作倍率を取得
ロボットアームの動作倍率を取得する
- パラメータの説明
- rapid_rate 現在の制御システム倍率
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_rapidrate(double *rapid_rate);
ロボットアーム軌跡の再現
軌跡再現の設定パラメータを設定
軌跡再現の構成パラメータを設定する
- パラメータの説明
- para 軌跡再現構成パラメータ
- xyz_interval 軌跡再現の座標精度
- rpy_interval 軌跡再現の姿勢精度
- vel 軌跡再現の動作速度
- acc 軌跡再現の動作加速度
- para 軌跡再現構成パラメータ
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_traj_config(const TrajTrackPara *para);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//軌跡再現パラメータの確認と設定
int example_traj_config()
{
JAKAZuRobot demo;
TrajTrackPara trajpar_read;
TrajTrackPara trajpar_set;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//現在の軌跡再現パラメータを照会する
demo.get_traj_config(&trajpar_read);
std::cout << " trajTrackPara は :n xyz interval:" << trajpar_read.xyz_interval << " rpy interval は :" << trajpar_read.rpy_interval << std::endl;
std::cout << " vel: " << trajpar_read.vel << " acc: " << trajpar_read.acc << std::endl;
//現在の軌跡再現パラメータを設定する
trajpar_set.xyz_interval = 0.01; trajpar_set.rpy_interval = 0.01; trajpar_set.vel = 10; trajpar_set.acc = 2;
demo.set_traj_config(&trajpar_set);
//現在の軌跡再現パラメータを照会する
demo.get_traj_config(&trajpar_read);
std::cout << " trajTrackPara は :n xyz interval:" << trajpar_read.xyz_interval << " rpy interval は :" << trajpar_read.rpy_interval << std::endl;
std::cout << " vel: " << trajpar_read.vel << " acc: " << trajpar_read.acc << std::endl;
return 0;
}
軌跡再現の設定パラメータを取得
軌跡再現の設定パラメータを取得する
- パラメータの説明
- para 軌跡再現構成パラメータ
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_traj_config(TrajTrackPara *para);
軌跡再現データ収集の制御スイッチ
軌跡再現データの収集制御スイッチ。このスイッチをオンにした後、ドラッグ操作を開始すると軌跡ファイルが生成されます。
- パラメータの説明
- mode が TRUE の場合、データ収集を開始し、FALSE の場合、データ収集を終了します。
- filename は収集データの保存ファイル名です。filename がヌルポインタの場合、保存ファイルは現在の日付で命名されます。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_traj_sample_mode(const BOOL mode, char *filename);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
#include "thread"
//軌跡収集スイッチと状態の照会
int example_traj_sample()
{
BOOL samp_stu;
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
char name[20] = "testxx";
//軌跡再現データ収集スイッチをオンにする
ret = demo.set_traj_sample_mode(TRUE, name);
//軌跡再現データ収集状態を照会する
demo.get_traj_sample_status(&samp_stu);
std::this_thread::sleep_for(std::chrono::milliseconds(10000));
demo.set_traj_sample_mode(FALSE, name);
return 0;
}
軌跡再現データ収集の状態を照会
軌跡再現データ収集状態の照会
- パラメータの説明
- mode が TRUE の場合、データ収集中であり、FALSE の場合、データ収集が終了します。データ収集中は再度データ収集スイッチをオンにすることはできません。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_traj_sample_status(BOOL* sample_status);
コントローラ内に既に存在する軌跡再現データのファイル名を取得する
廃止されたインターフェース
コントローラー内に既に存在する軌跡再現データのファイル名を照会する
- パラメータの説明
- filename はコントローラー内に既に存在する軌跡再現データのファイル名です。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_exist_traj_file_name(MultStrStorType *filename);
軌跡再現データのファイル名を変更する
廃止されたインターフェース
軌跡再現データのファイル名をリネームする
- パラメータの説明
- src 元のファイル名
- dest 出力ファイル名。ファイル名の長さは100文字を超えてはいけません。ファイル名は空ではならず、出力ファイル名には中国語は使用できません。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t rename_traj_file_name(const char *src,const char *dest);
コントローラ内の軌跡再現データファイルを削除
廃止されたインターフェース
コントローラ内の軌跡再現データファイルを削除する
- パラメータの説明
- filename 削除対象のファイル名。ファイル名はデータファイルの名称。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t remove_traj_file(const char *filename);
コントローラ内の軌跡再現データファイルからコントローラ実行スクリプトを生成する
コントローラ内の軌跡再現データファイルからコントローラ実行スクリプトを生成する
- パラメータの説明
- filename データファイルのファイル名。ファイル名は拡張子なしのデータファイル名。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t generate_traj_exe_file(const char *filename);
ロボットアームのサーボ運動モード
ロボットアームがサーボ動作状態にあるかを確認
ロボットアームがサーボ動作状態にあるかを確認
- パラメータの説明
- in_servo TRUEの場合はサーボ運動状態、FALSEの場合は非サーボ運動状態
- robot_id ロボットアームのID。デフォルトは0。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t is_in_servomove(BOOL *in_servo, int robot_id = 0);
ロボットアームのサーボ位置制御モードを有効化
ロボットアームのサーボ位置制御モードを有効にする。
- パラメータの説明
- enable TRUEの場合はサーボ位置制御モードに入る。FALSEの場合はモードを終了する。
- is_block TRUEの場合はブロッキングモード、FALSEの場合はノンブロッキングモード。デフォルトはブロッキングモード。
- robot_id ロボットアームのID。デフォルトは0。
- 戻り値 ERR_SUCC 成功 その他 失敗
- 注: v19以前のバージョンではこのインターフェースはノンブロッキング命令、V20以降ではブロッキング命令に変更された。
errno_t servo_move_enable(BOOL enable, BOOL is_block = true, int robot_id = 0);
ロボットアーム関節空間サーボモード動作
ロボットアームのジョイント空間位置制御モード
- パラメータの説明
- joint_pos ロボットアーム関節の目標位置
- move_mode ロボットアームの運動モード。選択可能なタイプは絶対運動(ABS)と増分運動(INCR)。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t servo_j(const JointValue *joint_pos, MoveMode move_mode);
コード例:
//ロボットアームのサーボジョイント運動
//このインターフェースを使用する際は、edg_servoモードであってはいけません。edg_init(FALSE)で無効化できます。
//このインターフェースを使用する際は、事前にservo_move_enable(TRUE)を呼び出してサーボ制御を有効にする必要があります。
//コントローラの送信周期は8msであり、ユーザーの送信周期も8msにすることを推奨します。ネットワーク環境が悪い場合は周期を適度に短くしてください。
//関節速度の上限は180rad/s
//この命令はjoint_moveとは大きく異なります。joint_moveの補間はコントローラによって行われますが、servo_jは事前に軌道計画を行う必要があります。
#include <iostream>
#include "JAKAZuRobot.h"
int main()
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//TRUEはサーボモードに入ることを意味します
demo.servo_move_enable(TRUE);
//JointValue変数を定義し、初期化します
JointValue joint_pos = {-0.001, 0, 0, 0, 0, -0.001};
for (int i = 0; i < 100; i++)
{
//関節空間サーボ運動では、INCRは増分運動を表します
demo.servo_j(&joint_pos, INCR);
}
//FALSEはサーボモードを終了することを意味します
demo.servo_move_enable(FALSE);
return 0;
}
ロボットアーム関節空間サーボモード運動の拡張
ロボットアーム関節空間位置制御モードでは、周期の調整機能が追加されており、周期を8msの倍数に設定できます。(非ブロッキングサーボモードではコントローラのキュー長は100を超えてはいけません)
- パラメータの説明
- joint_pos ロボットアーム関節の目標位置
- move_mode ロボットアームの運動モード。選択可能なタイプは絶対運動(ABS)と増分運動(INCR)。
- step_num は周期の分割数であり、servo_jの運動周期は step_num*8ms です。ここで step_num>=1
- queue_num は出力ポインタで、現在の命令のキュー長を返します。デフォルトは nullptr です
- do_info はDO情報を指定します。デフォルトは nullptr です
- robot_id ロボットアームのID。デフォルトは0。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t servo_j(const JointValue *joint_pos, MoveMode move_mode, unsigned int step_num = 1, int *queue_num = nullptr, DOInfo *do_info = nullptr, int robot_id = 0);
ロボットアームデカルト空間サーボモード運動
ロボットアームデカルト空間位置制御モード
- パラメータの説明
- cartesian_pose ロボットアームのデカルト空間での目標位置
- move_mode ロボットアームの運動モード。選択可能なタイプは絶対運動(ABS)と増分運動(INCR)。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t servo_p(const CartesianPose *cartesian_pose, MoveMode move_mode);
コード例:
//ロボットアームのデカルト空間サーボ運動
//このインターフェースを使用する際は、edg_servoモードであってはいけません。edg_init(FALSE)で無効化できます。
//このインターフェースを使用する際は、事前にservo_move_enable(TRUE)を呼び出してサーボ制御を有効にする必要があります。
//コントローラの送信周期は8msであり、ユーザーの送信周期も8msにすることを推奨します。ネットワーク環境が悪い場合は周期を適度に短くしてください。
//関節速度の上限は180 rad/s。デカルト空間には直感的な制限はないが、この関節速度制限を満たす必要がある。
//この命令はlinear_moveとは大きく異なる。linear_moveの補間はコントローラによって実行されるが、servo_pは事前に軌道計画を行う必要がある。
#include <iostream>
#include "JAKAZuRobot.h"
int main()//ロボットアームのサーボによるデカルト空間運動
{
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//TRUEはサーボモードに入ることを意味します
demo.servo_move_enable(TRUE);
//CartesianPose変数を定義して初期化する
CartesianPose cart;
cart.tran.x = 0; cart.tran.y = 1; cart.tran.z = 0;
cart.rpy.rx = 0; cart.rpy.ry = 0; cart.rpy.rz = 0;
for (int i = 0; i < 100; i++)
{
//デカルト空間サーボ運動。INCRは増分運動を示す。
demo.servo_p(&cart, INCR);
}
//FALSEはサーボモードを終了することを意味します
demo.servo_move_enable(FALSE);
return 0;
}
ロボットアームデカルト空間サーボモード動作拡張
ロボットアームのデカルト空間位置制御モードでは、周期調整機能が追加され、周期を8msの倍数に設定できる(非ブロッキングサーボモードでは、コントローラのキュー長は100を超えてはならない)
- パラメータの説明
- cartesian_pose ロボットアームのデカルト空間での目標位置
- move_mode ロボットアームの運動モード。選択可能なタイプは絶対運動(ABS)と増分運動(INCR)。
- step_num 倍周期分割。servo_pの運動周期はstep_num*8msで、step_num>=1
- queue_num は出力ポインタで、現在の命令のキュー長を返します。デフォルトは nullptr です
- do_info はDO情報を指定します。デフォルトは nullptr です
- robot_id ロボットアームのID。デフォルトは0。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t servo_p(const CartesianPose *cartesian_pose, MoveMode move_mode, unsigned int step_num = 1, int *queue_num = nullptr, DOInfo *do_info = nullptr, int robot_id = 0);
ロボットアームのSERVOモードではフィルタを無効化する
SERVOモードではフィルタを使用しない。この命令はSERVOモード中は設定できず、SERVOを終了した後に設定可能。
- パラメータの説明
- robot_id ロボットアームのID。デフォルトは0。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t servo_move_use_none_filter(int robot_id = 0);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//servoモードでフィルタを無効化する
int example_servo_use_none_filter()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
ret = demo.servo_move_use_none_filter();
std::cout << ret << std::endl;
return 0;
}
ロボットアームのSERVOモードで関節空間一次ローパスフィルタ
SERVOモードで関節空間一次ローパスフィルタに切り替える。この命令はSERVOモード中は設定できず、SERVOを終了後に設定可能。
- パラメータの説明
- cutoffFreq 一次ローパスフィルタのカットオフ周波数
- robot_id ロボットアームのID。デフォルトは0。
errno_t servo_move_use_joint_LPF(double cutoffFreq, int robot_id = 0);
- パラメータの説明
- cutoffFreq 一次ローパスフィルタのカットオフ周波数
- 戻り値 ERR_SUCC 成功 その他 失敗 コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//servoモードで関節空間一次ローパスフィルタ
int example_servo_use_joint_LPF()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//servoモードにおける関節空間一次ローパスフィルタ、遮断周波数0.5Hz
ret = demo.servo_move_use_joint_LPF(0.5);
std::cout << ret << std::endl;
return 0;
}
ロボットアームのSERVOモードにおける関節空間非線形フィルタ
SERVOモードで関節空間非線形フィルタに切り替えます。この指令はSERVOモード中に設定できず、SERVOを終了した後に設定できます
- パラメータの説明
- max_vr カルテジアン空間の姿勢変化速度の上限値(絶対値)°/s
- max_ar カルテジアン空間の姿勢変化速度の加速度上限値(絶対値)°/s2
- max_jr カルテジアン空間の姿勢変化速度のジャーク(加加速度)上限値(絶対値)°/s3
- robot_id ロボットアームのID。デフォルトは0。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t servo_move_use_joint_NLF(double max_vr, double max_ar, double max_jr, int robot_id = 0);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//servoモードにおける関節空間非線形フィルタ
int example_servo_use_joint_NLF()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//servoモードにおける関節空間非線形フィルタ
ret = demo.servo_move_use_joint_NLF(2,2,4);
std::cout << ret << std::endl;
return 0;
}
ロボットアームのSERVOモードにおけるカルテジアン空間非線形フィルタ
SERVOモードでカルテジアン空間非線形フィルタに切り替えます。この指令はSERVOモード中に設定できず、SERVOを終了した後に設定できます
- パラメータの説明
- max_vp カルテジアン空間における移動指令速度の上限値(絶対値)。単位:mm/s
- max_ap カルテジアン空間における移動指令加速度の上限値(絶対値)。単位:mm/s2
- max_jp カルテジアン空間における移動指令のジャーク(加加速度)上限値(絶対値)単位:mm/s3
- max_vr カルテジアン空間の姿勢変化速度の上限値(絶対値)°/s
- max_ar カルテジアン空間の姿勢変化速度の加速度上限値(絶対値)°/s2
- max_jr カルテジアン空間の姿勢変化速度のジャーク(加加速度)上限値(絶対値)°/s3
- ori_quat オプションパラメータ。カルテジアン空間の姿勢を表現する方法を指定します。0はオイラー角による記述を意味し、1はクォータニオンによる記述を意味します
- robot_id ロボットアームのID。デフォルトは0。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t servo_move_use_carte_NLF(double max_vp, double max_ap, double max_jp, double max_vr, double max_ar, double max_jr, int ori_quat = 0, int robot_id = 0);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//servoモードにおけるカルテジアン空間非線形フィルタ
int example_servo_use_carte_NLF()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//servoモードにおけるカルテジアン空間非線形フィルタ
ret = demo.servo_move_use_carte_NLF(2, 2, 4, 2, 2, 4);
std::cout << ret << std::endl;
return 0;
}
ロボットアームのSERVOモードにおける関節空間多段平均フィルタ
SERVOモードで関節空間多段平均フィルターに切り替えます。この命令はSERVOモード中には設定できず、SERVOを終了後に設定可能です。
- パラメータの説明
- max_buf 平均フィルターのバッファサイズ
- kp 加速度フィルター係数
- kv 速度フィルター係数
- ka 位置フィルター係数
- robot_id ロボットアームのID。デフォルトは0。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t servo_move_use_joint_MMF(int max_buf, double kp, double kv, double ka, int robot_id = 0);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
#define PI 3.14159265358979323846
//servoモードでの関節空間多段平均フィルタ
int example_servo_use_joint_MMF()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//servoモードでの関節空間多段平均フィルタ
ret = demo.servo_move_use_joint_MMF(20, 0.2, 0.4, 0.2);
std::cout << ret << std::endl;
return 0;
}
ロボットアームSERVOモードでの速度予測パラメータ設定
SERVOモードで関節空間多段平均フィルター。この命令はSERVOモード中には設定できず、SERVO終了後に設定可能です。
- パラメータの説明
- max_buf 平均フィルターのバッファサイズ
- kp 比例ゲイン。値が大きいほど応答が速く、精度が高くなりますが、振動しやすくなります。値が小さいほど動作が滑らかで安定しますが、応答が遅れ、精度が低下します。
- ori_quat オプションパラメータ。カルテジアン空間の姿勢を表現する方法を指定します。0はオイラー角による記述を意味し、1はクォータニオンによる記述を意味します
- robot_id ロボットアームのID。デフォルトは0。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t servo_speed_foresight(int max_buf, double kp, int ori_quat = 0, int robot_id = 0);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//servoモードでの速度予測パラメータ設定
int example_speed_foresight()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//servoモードでの関節空間多段平均フィルタ
ret = demo.servo_speed_foresight(200, 2);
std::cout << ret << std::endl;
return 0;
}
ロボットアームのSERVOモードで関節空間フィルタを適用
SERVOモードで関節空間PCMフィルター。この命令はSERVOモード中には設定できず、SERVO終了後に設定可能です。
- パラメータの説明
- max_buf フィルターのバッファサイズ。推奨値範囲は[1〜50です。]
- kp 比例ゲイン。値の範囲は[0.05〜0.4]です。値が大きいほど応答が速く精度が高くなりますが、振動しやすくなります。値が小さいほど滑らかで安定しますが、応答が遅れ、精度が低下します。
- robot_id ロボットアームのID。デフォルトは0。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t servo_move_use_joint_PCM(int max_buf, double kp, int robot_id = 0);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//servoモードでの速度予測パラメータ設定
int example_speed_foresight()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//servoモードでの関節空間多段平均フィルタ
ret = demo.servo_move_use_joint_PCM(10, 0.1);
std::cout << ret << std::endl;
return 0;
}
ロボットアームのSERVOモードでデカルト空間フィルタを適用
SERVOモードでデカルト空間PCMフィルター。この命令はSERVOモード中には設定できず、SERVO終了後に設定可能です。
- パラメータの説明
- max_buf フィルターのバッファサイズ。推奨値範囲は[1〜50です。]
- kp 比例ゲイン。値の範囲は[0.05〜0.4]です。値が大きいほど応答が速く精度が高くなりますが、振動しやすくなります。値が小さいほど滑らかで安定しますが、応答が遅れ、精度が低下します。
- robot_id ロボットアームのID。デフォルトは0。
- 戻り値 ERR_SUCC 成功 その他は失敗 *備考:デカルト空間PCMフィルターは関節空間PCMフィルターと比べて精度が高いですが、指令点の品質要求が高くなります。もし計画された点の品質が低い場合、ロボットアームのサーボが無効になる可能性があります。
errno_t servo_move_use_carte_PCM(int max_buf, double kp, int robot_id = 0);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//servoモードでの速度予測パラメータ設定
int example_speed_foresight()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//ロボットアームの電源を入れる
demo.power_on();
//ロボットアームを有効化する
demo.enable_robot();
//servoモードでの関節空間多段平均フィルタ
ret = demo.servo_move_use_carte_PCM(10, 0.1);
std::cout << ret << std::endl;
return 0;
}
ロボットアームEDG(External Data Guider)機能
現在、この機能はC++言語とPython言語を介してのみ使用可能です。この機能はUDP(ユーザー・データグラム・プロトコル)通信を使用します。
ロボットアームEDGのイネーブル
ロボットアームEDG機能の有効化。有効化後にEDG関連のインターフェースを使用できます。
- パラメータの説明
- en 有効化スイッチ。trueはEDG機能をオンにし、falseはその機能を終了します。
- edg_stat_ip SDKクライアントのIPアドレス
- edg_port SDKクライアントのポート番号
- edg_mode EDGモード。デフォルト値は0。0は全てのEDG関連インターフェースを呼び出せることを意味し、1はedg_servo_jとedg_servo_pを除く全てのインターフェースを呼び出せることを意味します。
- 戻り値 ERR_SUCC 成功 その他 失敗
- 注: 有効化後はservo_jおよびservo_pを呼び出すことができません。EDG機能を閉じるにはedg_init(false)を呼び出す必要があります。
errno_t edg_init(BOOL en = true, const char* edg_stat_ip = "0.0.0.0", int edg_port = 10010, int edg_mode = 0);
ロボットアームの高速EDGフィードバックデータ取得
ロボットアームの高速EDGフィードバックデータ取得
- パラメータの説明
- edg_state EDGフィードバックデータ(関節位置、速度、トルク、デカルト位置、センサー情報を含む)
- robot_index デフォルト値は0で、デフォルト値を使用する場合は引数を渡す必要がありません。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t edg_get_stat(EDGState *edg_state, unsigned char robot_index = 0);
ロボットアームのEDGフィードバックデータ送信タイムスタンプ取得
ロボットアームのEDGフィードバックデータ送信タイムスタンプ取得
- パラメータの説明
- details タイムスタンプ
- details0秒[]
- details1[]ナノ秒
- details3[]タイムスタンプカウント
- details タイムスタンプ
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t edg_stat_details(unsigned long int details[3]);
ロボットアームEDG関節空間サーボモード動作
ロボットアームEDG関節空間位置制御モード
- パラメータの説明
- joint_pos ロボットアーム関節の目標位置
- move_mode ロボットアームの動作モード。選択可能タイプは絶対運動(ABS)、増分運動(INCR)、連続運動(CONTINUE)、停止(STOP)
- step_num 分割周期。edg_servo_jの動作周期はstep_num*8msで、step_num>=1、デフォルト値は1です。
- robot_index デフォルト値は0で、デフォルト値を使用する場合は引数を渡す必要がありません。
- 戻り値 ERR_SUCC成功 その他は失敗
- 注: このインターフェースは従来のservo_jインターフェースに比べ、リアルタイム制御の性能が向上していますが、
厳密に8ms周期で送信する必要があります。
errno_t edg_servo_j(const JointValue *joint_pos, MoveMode move_mode, unsigned int step_num = 1, unsigned char robot_index = 0);
```
**コード例:**
```c++
#include <iostream>
#include <chrono>
#include <thread>
#include <math.h>
#include "JAKAZuRobot.h"
#define rad2deg(x) ((x)*180.0/M_PI)
#define deg2rad(x) ((x)*M_PI/180.0)
JAKAZuRobot demo;
JointValue jpos = {0, deg2rad(90), deg2rad(-90), deg2rad(90), deg2rad(90), 0};
errno_t ret;
void check_return(int ret, const std::string& func_name) {
if (ret != 0) {
std::cout << func_name << " が失敗しました。戻り値: " << ret << std::endl;
}
}
void edg_servo_j_test() {
const std::chrono::milliseconds interval(8);
for(int i = 0;i<2000;i++)
{
auto start = std::chrono::steady_clock::now();
static JointValue jpos_cmd;
EDGState edgdata;
CartesianPose cpos;
double t = (i - 0)/5000.0;
double kk = 32;
jpos_cmd.jVal[0] = sin(kk*t)*deg2rad(30.0) + jpos.jVal[0];
jpos_cmd.jVal[1] = -sin(kk*t)*deg2rad(20.0) + jpos.jVal[1];
jpos_cmd.jVal[2] = jpos.jVal[2];
jpos_cmd.jVal[3] = -sin(kk*t)*deg2rad(10.0) + jpos.jVal[3];
jpos_cmd.jVal[4] = jpos.jVal[4];
jpos_cmd.jVal[5] = jpos.jVal[5];
ret = demo.edg_servo_j(&jpos_cmd,MoveMode::ABS);
check_return(ret, "edg_servo_j");
ret = demo.edg_get_stat(&edgdata);
check_return(ret, "edg_get_stat");
std::cout << "関節値:" << edgdata.jointVal.jVal[0] << "," << edgdata.jointVal.jVal[1] << "," << edgdata.jointVal.jVal[2]
<< "," << edgdata.jointVal.jVal[3] << "," << edgdata.jointVal.jVal[4] << "," << edgdata.jointVal.jVal[5] << std::endl;
std::cout << "関節速度:" << edgdata.jointVel.jVel[0] << "," << edgdata.jointVel.jVel[1] << "," << edgdata.jointVel.jVel[2]
<< "," << edgdata.jointVel.jVel[3] << "," << edgdata.jointVel.jVel[4] << "," << edgdata.jointVel.jVel[5] << std::endl;
std::cout << "関節トルク:" << edgdata.jointTorq.jtorq[0] << "," << edgdata.jointTorq.jtorq[1] << "," << edgdata.jointTorq.jtorq[2]
<< "," << edgdata.jointTorq.jtorq[3] << "," << edgdata.jointTorq.jtorq[4] << "," << edgdata.jointTorq.jtorq[5] << std::endl;
std::cout << "カート座標:" << edgdata.cartpose.tran.x << "," << edgdata.cartpose.tran.y << "," << edgdata.cartpose.tran.z
<< "," << edgdata.cartpose.rpy.rx << "," << edgdata.cartpose.rpy.ry << "," << edgdata.cartpose.rpy.rz << std::endl;
std::cout << "センサー:" << edgdata.torqSensor.fx << "," << edgdata.torqSensor.fy << "," << edgdata.torqSensor.fz
<< "," << edgdata.torqSensor.tx << "," << edgdata.torqSensor.ty << "," << edgdata.torqSensor.tz << std::endl;
unsigned long int 詳細[3];
ret = demo.edg_stat_details(詳細);
check_return(ret, "edg_stat_details");
std::cout << "詳細:" << 詳細[0] << "," << 詳細[1] << "," << 詳細[2] << std::endl;
auto 終了 = std::chrono::steady_clock::now();
auto 経過 = std::chrono::duration_cast<std::chrono::milliseconds>(終了 - 開始);
if (経過 < 間隔) {
std::this_thread::sleep_for(間隔 - 経過);//次の周期を待機
}
}
}
int メイン() {
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
ret = demo.login_in("192.168.2.194",1,"jaka_sdk","パスワード");
if(ret==0){std::cout << "ログイン成功" << std::endl;}
demo.power_on();
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
demo.enable_robot();
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
demo.clear_error();
ret = demo.servo_move_enable(0);
check_return(ret, "servo_move_enable");
ret = demo.edg_init(false);
check_return(ret, "edg_init");
ret = demo.servo_move_use_none_filter();
check_return(ret, "servo_move_use_none_filter");
ret = demo.joint_move(&jpos, ABS, TRUE, 10);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
ret = demo.edg_init(true,"192.168.2.194",10020,0);
check_return(ret, "edg_init");
ret = demo.servo_move_enable(1,1); //edg_initを呼び出した後にservo_move_enableを呼び出す必要があります
check_return(ret, "servo_move_enable");
edg_servo_j_test();
return 0;
}
ロボットアームEDGデカルト空間サーボモード動作
ロボットアームEDGデカルト空間位置制御モード
- パラメータの説明
- cartesian_pose ロボットアームのデカルト空間での目標位置
- move_mode ロボットアームの動作モード。選択可能タイプは絶対運動(ABS)、増分運動(INCR)、連続運動(CONTINUE)、停止(STOP)
- step_num 倍分周期。edg_servo_pの動作周期は step_num*8ms(step_num>=1)
- robot_index はデフォルト値を使用し、引数を渡す必要はありません
- 戻り値 ERR_SUCC 成功 その他 失敗
- 追記: このインターフェースは以前のservo_pインターフェースと比べてリアルタイム制御性能がより優れていますが、
8ms周期で厳密に送信する必要があります
errno_t edg_servo_p(const CartesianPose *cartesian_pose, MoveMode move_mode, unsigned int step_num = 1, unsigned char robot_index = 0);
コード例:
#include <iostream>
#include <chrono>
#include <thread>
#include <math.h>
#include "JAKAZuRobot.h"
#define rad2deg(x) ((x)*180.0/M_PI)
#define deg2rad(x) ((x)*M_PI/180.0)
JAKAZuRobot demo;
CartesianPose cpos_init;
JointValue jpos = {0, deg2rad(90), deg2rad(-90), deg2rad(90), deg2rad(90), 0};
errno_t ret;
void check_return(int ret, const std::string& func_name) {
if (ret != 0) {
std::cout << func_name << " が失敗しました。戻り値: " << ret << std::endl;
}
}
void edg_servo_p_test() {
const std::chrono::milliseconds interval(8);
for(int i = 0;i<2000;i++)
{
auto start = std::chrono::steady_clock::now();
static CartesianPose cpos_cmd;
double coefficient = sin(i/200.0);
double ori_step = deg2rad(20.0) * coefficient;
double y_step = 100.0 * coefficient;
double x_step = 100.0 * coefficient;
cpos_cmd.tran.x = cpos_init.tran.x + x_step;
cpos_cmd.tran.y = cpos_init.tran.y + y_step;
cpos_cmd.tran.z = cpos_init.tran.z;
cpos_cmd.rpy.rx = cpos_init.rpy.rx + ori_step;
cpos_cmd.rpy.ry = cpos_init.rpy.ry + ori_step;
cpos_cmd.rpy.rz = cpos_init.rpy.rz + ori_step;
ret = demo.edg_servo_p(&cpos_cmd,MoveMode::ABS);
check_return(ret, "edg_servo_p");
auto 終了 = std::chrono::steady_clock::now();
auto 経過 = std::chrono::duration_cast<std::chrono::milliseconds>(終了 - 開始);
if (経過 < 間隔) {
std::this_thread::sleep_for(間隔 - 経過);//次の周期を待機
}
}
}
int メイン() {
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
ret = demo.login_in("192.168.2.194",1,"jaka_sdk","パスワード");
if(ret==0){std::cout << "ログイン成功" << std::endl;}
demo.power_on();
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
demo.enable_robot();
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
demo.clear_error();
ret = demo.servo_move_enable(0);
check_return(ret, "servo_move_enable");
ret = demo.edg_init(false);
check_return(ret, "edg_init");
ret = demo.servo_move_use_none_filter();
check_return(ret, "servo_move_use_none_filter");
ret = demo.joint_move(&jpos, ABS, TRUE, 10);
demo.kine_forward(&jpos,&cpos_init);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
ret = demo.edg_init(true,"192.168.2.194",10020,0);
check_return(ret, "edg_init");
ret = demo.servo_move_enable(1,1); //edg_initを呼び出した後にservo_move_enableを呼び出す必要があります
check_return(ret, "servo_move_enable");
edg_servo_p_test();
return 0;
}
ロボットアームの運動学
ロボットアームの逆運動学を求める
指定された姿勢を現在のツール、現在の取り付け角度、および現在のユーザー座標系設定の下で逆運動学解を計算する
- パラメータの説明
- ref_pos 逆運動学計算のための参照関節空間位置
- cartesian_pose デカルト空間における姿勢値
- joint_pos 計算が成功した場合の関節空間位置の計算結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t kine_inverse(const JointValue *ref_pos, const CartesianPose *cartesian_pose, JointValue *joint_pos);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
// ロボットアーム逆運動学 既知のtcp_posからjoint_posを求める
int example_kine_inverse()
{
errno_t ret;
JAKAZuRobot demo;
//参照点を初期化する
JointValue ref_jpos = { 2*PI/180, 90*PI/180, 90*PI/180 , 90*PI/180, -90*PI/180, 0*PI/180 };
//デカルト空間点の座標を初期化する
CartesianPose tcp_pos;
tcp_pos.tran.x = -350; tcp_pos.tran.y = 100; tcp_pos.tran.z = 300;
tcp_pos.rpy.rx = -180*PI/180; tcp_pos.rpy.ry = 0; tcp_pos.rpy.rz = 90*PI/180;
//戻り値を初期化する
JointValue joint_pos = { 0,0,0,0,0,0 }; ;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
//逆運動学を求める
ret = demo.kine_inverse(&ref_jpos, &tcp_pos, &joint_pos);
std::cout << ret << std::endl;
for (int i = 0; i < 6; i++)
{
std::cout << "joint [" << i + 1 << "] is :" << joint_pos.jVal[i]*180/PI << std::endl;
}
return 0;
}
ロボットアームの逆運動学拡張求解
指定された姿勢を指定ツール、現在の取り付け角度、および指定ユーザー座標系設定の下で逆運動学解を計算する
- パラメータの説明
- ref_pos 逆運動学計算のための参照関節空間位置
- cartesian_pose デカルト空間における姿勢値
- joint_pos 計算が成功した場合の関節空間位置の計算結果
- tool 指定されたツール座標系。未指定の場合は現在のデフォルトツール座標系を使用する
- userFrame 指定されたユーザー座標系。指定されていない場合は現在のデフォルトのユーザー座標系を使用します。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t kine_inverse(const JointValue *ref_pos, const CartesianPose *cartesian_pose, JointValue *joint_pos, const CartesianPose* tool, const CartesianPose* userFrame);
ロボットアームの順運動学を求める
指定された関節位置における、現在のツール・現在の設置角度および現在のユーザー座標系設定下での姿勢値を計算します。
- パラメータの説明
- joint_pos 関節空間位置
- cartesian_pose デカルト空間における姿勢計算結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t kine_forward(const JointValue *joint_pos, CartesianPose *cartesian_pose);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
// 4.55 ロボットアームの順運動学 解:joint_pos が既知のときに tcp_pos を求める
int example_kine_forward()
{
errno_t ret;
JAKAZuRobot demo;
// 戻り値の初期化
CartesianPose tcp_pos;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
// 関節行列の初期化
JointValue joint_pos = { 0.558, 0.872, 0.872 , 0.349, 0.191, 0.191 };
// 順運動学を求める
ret = demo.kine_forward(&joint_pos, &tcp_pos);
std::cout << ret << std::endl;
std::cout << "tcp_pos は:\n x: " << tcp_pos.tran.x << " y: " << tcp_pos.tran.y << " z: " << tcp_pos.tran.z << std::endl;
std::cout << "rx: " << tcp_pos.rpy.rx << " ry: " << tcp_pos.rpy.ry << " rz: " << tcp_pos.rpy.rz << std::endl;
return 0;
}
ロボットアームの順運動学拡張求解
指定された関節位置における、指定ツール・現在の設置角度および指定されたユーザー座標系設定下での姿勢値を計算します。
- パラメータの説明
- joint_pos 関節空間位置
- cartesian_pose デカルト空間における姿勢計算結果
- tool 指定されたツール座標系。未指定の場合は現在のデフォルトツール座標系を使用する
- userFrame 指定されたユーザー座標系。指定されていない場合は現在のデフォルトのユーザー座標系を使用します。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t kine_forward(const JointValue *joint_pos, CartesianPose *cartesian_pose, const CartesianPose* tool, const CartesianPose* userFrame);
オイラー角から回転行列への変換
オイラー角から回転行列への変換
- パラメータの説明
- rpy 変換対象のオイラー角データ
- rot_matrix 変換後の回転行列
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t rpy_to_rot_matrix(const Rpy *rpy, RotMatrix *rot_matrix);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
// 4.56 オイラー角から回転行列へ
int example_rpy_to_rot_matrix()
{
errno_t ret;
JAKAZuRobot demo;
// 回転行列を初期化する
Rpy rpy;
rpy.rx = -1.81826; rpy.ry = -0.834253; rpy.rz = -2.30243;
//戻り値を初期化する
RotMatrix rot_matrix;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
// オイラー角を回転行列に変換する
ret = demo.rpy_to_rot_matrix(&rpy, &rot_matrix);
std::cout << ret << "eul2rotm" << std::endl;
std::cout << rot_matrix.x.x << " " << rot_matrix.y.x << " " << rot_matrix.z.x << std::endl;
std::cout << rot_matrix.x.y << " " << rot_matrix.y.y << " " << rot_matrix.z.y << std::endl;
std::cout << rot_matrix.x.z << " " << rot_matrix.y.z << " " << rot_matrix.z.z << std::endl;
return 0;
}
回転行列からオイラー角への変換
回転行列からオイラー角への変換
- パラメータの説明
- rot_matrix 変換対象の回転行列データ
- rpy 変換後のRPYオイラー角結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t rot_matrix_to_rpy(const RotMatrix *rot_matrix, Rpy *rpy);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
// 4.57 回転行列 ---> オイラー角
int example_rot_matrix_to_rpy()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
// オイラー角を初期化する
Rpy rpy;
// 回転行列を初期化する
RotMatrix rot_matrix;
rot_matrix.x.x = -0.4488, rot_matrix.y.x = -0.4998, rot_matrix.z.x = 0.7408;
rot_matrix.x.y = -0.6621, rot_matrix.y.y = -0.3708, rot_matrix.z.y = -0.6513;
rot_matrix.x.z = 0.6002, rot_matrix.y.z = -0.7828, rot_matrix.z.z = -0.1645;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
ret = demo.rot_matrix_to_rpy(&rot_matrix, &rpy);
std::cout << ret << "rotm2eul:" << std::endl;
std::cout << rpy.rx << " " << rpy.ry << " " << rpy.rz << std::endl;
return 0;
}
クォータニオンから回転行列への変換
クォータニオンから回転行列への変換
errno_t quaternion_to_rot_matrix(const Quaternion *quaternion, RotMatrix *rot_matrix);
- パラメータの説明
- quaternion 変換するクォータニオンデータ
- rot_matrix 変換後の回転行列の結果
- 戻り値 ERR_SUCC 成功 その他 失敗 コード例:
#include <iostream>
#include "JAKAZuRobot.h"
// 4.58 クォータニオン --> 回転行列
int example_quaternion_to_rot_matrix()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
// クォータニオンを初期化
Quaternion quat;
quat.s = 0.0629; quat.x = 0.522886; quat.y = -0.5592; quat.z = 0.6453;
// 回転行列を初期化する
RotMatrix rot_matrix;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
ret = demo.quaternion_to_rot_matrix(&quat, &rot_matrix);
std::cout << ret << "quatl2rotm:" << std::endl;
std::cout << rot_matrix.x.x << " " << rot_matrix.y.x << " " << rot_matrix.z.x << std::endl;
std::cout << rot_matrix.x.y << " " << rot_matrix.y.y << " " << rot_matrix.z.y << std::endl;
std::cout << rot_matrix.x.z << " " << rot_matrix.y.z << " " << rot_matrix.z.z << std::endl;
return 0;
}
現在接続されているロボットアームのDHパラメータを取得する
ロボットアームのDHパラメータを取得
- パラメータの説明
- dhParam DHパラメータ:alpha、a、d、theta
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_dh_param(DHParam* dh_param);
回転行列からクォータニオンへの変換
回転行列からクォータニオンへの変換
- パラメータの説明
- rot_matrix 変換する回転行列
- quaternion 変換後のクォータニオン結果
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t rot_matrix_to_quaternion(const RotMatrix *rot_matrix, Quaternion *quaternion);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
// 4.59 回転行列 ---> クォータニオン
int example_rot_matrix_to_quaternion()
{
errno_t ret;
//APIオブジェクトdemoのインスタンス
JAKAZuRobot demo;
// クォータニオンを初期化
Quaternion quat;
// 回転行列を初期化する
RotMatrix rot_matrix;
rot_matrix.x.x = -0.4488774, rot_matrix.y.x = -0.499824, rot_matrix.z.x = 0.740795;
rot_matrix.x.y = -0.662098, rot_matrix.y.y = -0.370777, rot_matrix.z.y = -0.651268;
rot_matrix.x.z = 0.600190, rot_matrix.y.z = -0.782751, rot_matrix.z.z = -0.164538;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
ret = demo.rot_matrix_to_quaternion(&rot_matrix, &quat);
std::cout << ret << "rotm2quat:" << std::endl;
printf("%lf %lf %lf %lf \n", quat.s, quat.x, quat.y, quat.z);
return 0;
}
ロボットアームの力制御インターフェース
JAKAロボットアームは、エンドエフェクタに搭載された力センサーに基づく力制御インターフェースを提供しており、ユーザーはこれらのインターフェースを利用して、一定力のコンプライアンス制御などの高度な力制御機能を実現し、さらに複雑な応用シーン(例:カルテジアン空間で指定方向へのドラッグ、力制御による組立、研磨など)を達成することができます。
ただし、これらのインターフェースはエンドエフェクタ力センサに依存している点に注意してください。
本節の内容は、力制御製品の使用マニュアルを一通り読んだ上で読むことを推奨します。また、JAKA SDKの力制御機能クイックスタートガイドを併せて参照すると理解が深まります。 本文では冗長な記述を避けるため、「力制御」は「力コンプライアンス制御」を意味し、「エンドエフェクタ力センサー」、「力センサー」、「センサー」はロボットアーム末端に取り付けられた6軸または1軸の力/トルクセンサーを指します。
エンド力センサのモデルを設定する
エンド力センサのモデルを設定する
- パラメータの説明
- sensor_brand センサモデル。取り得る値の範囲は1〜6または10であり、センサハードウェア筐体に刻印されたモデル番号と一致している必要があります。ここで10はロボットアームのフランジ内部にすでに内蔵されているセンサーを指します。このタイプのセンサーはシステムによって自動的に管理され、このインターフェースを呼び出して設定する必要はありません。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_torsenosr_brand(int sensor_brand);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//エンドエフェクタ力センサーのモデルを設定
int example_set_torsensor_brand()
{
errno_t ret;
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
//エンドエフェクタ力センサーのモデルを設定
ret = demo.set_torsenosr_brand(2);
std::cout << ret << std::endl;
return 0;
}
エンド部力覚センサーの型番を取得
エンド部力覚センサーの型番を取得
- パラメータの説明
- sensor_brand センサーのモデル
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_torsenosr_brand(int* sensor_brand);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//エンドエフェクタ力センサーのモデルを取得
int example_get_torsensor_brand()
{
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
errno_t ret;
int cur_sensor;
//エンドエフェクタ力センサーのモデルを取得
ret = demo.get_torsenosr_brand(&cur_sensor);
std::cout << ret << std::endl;
std::cout << "エンドエフェクタセンサーのモデルは:" << cur_sensor << std::endl;
return 0;
}
エンドエフェクタ力センサーのオン/オフを切り替える
エンドエフェクタ力センサーのオン/オフを切り替える
- パラメータの説明
- sensor_mode 0はセンサーをオフにし、1はセンサーをオンにします
- 戻り値 ERR_SUCC 成功 その他 失敗
- 末端フランジにセンサーが内蔵されたロボットアームモデル(例:Sシリーズ)では、センサーはデフォルトでオンになっており、特別な要件がない限りこのインターフェースを呼び出す必要はありません
errno_t set_torque_sensor_mode(int sensor_mode);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//末端力センサーをオンまたはオフにする
int example_set_torque_sensor_mode()
{
errno_t ret;
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
demo.servo_move_enable(TRUE);
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
//末端力センサーをオンまたはオフにする。1はオン、0はオフ
ret = demo.set_torque_sensor_mode(1);
std::cout << ret << std::endl;
return 0;
}
センサーエンドの負荷を設定
センサーの末端負荷を設定する
注意: set_torq_sensor_tool_payloadとset_payloadの違いをよく区別してください。
payloadはロボットアームの動力学に影響します。
tool_payloadは力制御の効果(すなわち力制御中のアーム力およびトルク補償)に影響します。
エンドフランジにセンサが内蔵されたロボットアームモデル(例:Sシリーズ)では、センサエンド負荷とロボットアーム負荷は同一であり、この場合、対応する2つの設定およびクエリインターフェースは等価です。
- パラメータの説明
- payload 末端負荷、単位はkg、mm
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_torq_sensor_tool_payload(const PayLoad* payload);
センサー先端の負荷を取得
センサーの末端負荷を取得する
- パラメータの説明
- payload 末端負荷、単位はkg、mm
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_torq_sensor_tool_payload(PayLoad *payload);
コード例:
#include <iostream>
#include "JAKAZuRobot.h"
//センサーの負荷を識別し負荷識別状態を取得、センサー末端負荷の設定と取得
int example_sensor_payload()
{
JointValue joint_pos;
PayLoad pl,pl_ret;
errno_t ret;
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
demo.power_on();
demo.enable_robot();
//終了位置は実際の設定に応じて調整する必要があります。ここでは例であり、直接使用しないでください
joint_pos.jVal[0] = 0;
joint_pos.jVal[1] = 0;
joint_pos.jVal[2] = 0;
joint_pos.jVal[3] = 0;
joint_pos.jVal[4] = 0;
joint_pos.jVal[5] = 0;
//センサー負荷の識別を開始
ret = demo.start_torq_sensor_payload_identify(&joint_pos);
do
{
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
//センサー負荷の状態を確認
demo.get_torq_sensor_identify_staus(&ret);
std::cout << ret << std::endl;
} while (1 == ret);
//識別結果を取得
if(ret == 0) ret = demo.get_torq_sensor_payload_identify_result(&pl);
std::cout << ret << std::endl;
//センサーのエンド負荷を設定
ret = demo.set_torq_sensor_tool_payload(&pl);
//現在設定されているセンサーのエンド負荷を取得
ret = demo.get_torq_sensor_tool_payload(&pl_ret);
return 0;
}
センサーエンドの負荷識別状態を取得
センサーエンドの負荷識別状態を取得
- パラメータの説明
- identify_status 0は識別完了で結果が読み取り可能、1は読み取れる識別結果がまだなく、2は識別失敗を意味します。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_torq_sensor_identify_staus(int *identify_status);
センサーエンドの負荷識別を開始
センサーエンドの負荷識別を開始 注意:これは動作をトリガーするコマンドであり、ロボットアームをjointpositionで指定された位置まで動かします。識別プロセスには1~3分かかる場合があります。
- パラメータの説明
- joint_pos は負荷識別の終点です。終点位置の設定に関する注意事項については、力制御製品の使用マニュアルにある関連機能の説明を参照してください。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t start_torq_sensor_payload_identify(const JointValue *joint_pos);
センサーエンドの負荷識別結果を取得
センサーエンドの負荷識別結果を取得
- パラメータの説明
- payload エンド負荷、単位はkg、mm
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_torq_sensor_payload_identify_result(PayLoad *payload);
エンドエフェクタの力センサー通信パラメータを設定
廃止されたインターフェース
エンドエフェクタの力センサー通信パラメータを設定
- パラメータの説明
- type:0はネットワークポートまたはUSBを使用、1はTIOを使用します。
- ip_addrはネットワークポート使用時のセンサーIPアドレスです。
- portはネットワークポート使用時の力制御センサーポート番号です。
- 1に設定するかUSBを使用する場合、ip_addrとportは無効であり、例のようにデフォルトパラメータを指定すれば十分です。
- 戻り値 ERR_SUCC 成功 その他 失敗
- エンドフランジにセンサーが内蔵されているロボットモデル(Sシリーズなど)は、システム内部で自動的に指定されており、この設定を行う必要はありません。
errno_t set_torque_sensor_comm(const int type, const char *ip_addr, const int port);
エンドエフェクタの力センサー通信パラメータを取得
廃止されたインターフェース
エンドエフェクタの力センサー通信パラメータを取得
- パラメータの説明
- type:0はネットワークポートまたはUSBを使用、1はTIOを使用します。
- ip_addrはネットワークポート使用時のセンサーIPアドレスです。
- portはネットワークポート使用時の力制御センサーポート番号です。
- TIOまたはUSBを使用する場合、ip_addrとportは無効なパラメータであり、返り値に実際の意味はありません。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_torque_sensor_comm(int *type, char *ip_addr,int *port);
力コンプライアンス制御を無効にする
廃止されたインターフェース
力コンプライアンス制御をオフにする(一定力コンプライアンス制御と速度コンプライアンス制御には有効ですが、ツールドラッグには無効です)
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t disable_force_control();
エンドエフェクタの力センサーのローパスフィルタカットオフ周波数を設定
エンドエフェクタの力センサーのローパスフィルタカットオフ周波数を設定
- パラメータの説明
- torque_sensor_filter ローパスフィルタのカットオフ周波数、単位:Hz
errno_t set_torque_sensor_filter(const float torque_sensor_filter);
エンドエフェクタの力センサーのローパスフィルタカットオフ周波数を取得
エンドエフェクタの力センサーのローパスフィルタカットオフ周波数を取得
- パラメータの説明
- torque_sensor_filter ローパスフィルタのカットオフ周波数、単位:Hz
errno_t get_torque_sensor_filter(float *torque_sensor_filter);
エンド力センサのソフトリミットを設定する
エンド力センサのソフトリミットを設定する
- パラメータの説明
- torque_sensor_soft_limit 各方向で許容される最大の力またはトルク値。この値を超えると衝突保護が作動します。力制限:fx, fy, fz 単位:N;トルク制限 tx, ty, tz 単位:Nm
errno_t set_torque_sensor_soft_limit( const FTxyz torque_sensor_soft_limit);
エンド力センサのソフトリミットを取得する
エンド力センサのソフトリミットを取得する
- パラメータの説明
- torque_sensor_soft_limit 各方向で許容される最大の力またはトルク値。この値を超えると衝突保護が作動します。力制限:fx, fy, fz 単位:N;トルク制限 tx, ty, tz 単位:Nm
errno_t get_torque_sensor_soft_limit(FTxyz *torque_sensor_soft_limit);
ツールドラッグのオン/オフを切り替える
廃止されたインターフェース
ツールドラッグのオン/オフを切り替えます。センサーを有効にし、適切なアドミッタンス制御パラメータを設定する必要があります。さらに、ツールドラッグを有効にする前に、フォースセンサーのゼロ校正を少なくとも1回行うことを推奨します。
- パラメータの説明
- enable_flag 0はツールドラッグを無効、1は有効
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t enable_admittance_ctrl(const int enable_flag);
力制御タイプとゼロ校正(初期化)オプションを設定する
廃止されたインターフェース
力制御タイプとゼロ校正(初期化)オプションを設定する
- パラメータの説明
- sensor_compensation:1はセンサーのゼロ補正を即時に一度実行し、APPのリアルタイム力曲線表示およびtorq_sensor_monitor_data.actTorqueを実際の外力に切り替えます;0はゼロ補正を行わず、力制御状態でない場合にはAPPのリアルタイム力曲線表示およびtorq_sensor_monitor_data.actTorqueをセンサーの生の読み取り値に切り替えます(力制御状態では依然として実際の外力を表示します)。
- compliance_type:0はコンプライアンス制御を使用しないことを示し、1は一定力コンプライアンス制御を有効にし、2は速度コンプライアンス制御を有効にすることを示します。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t set_compliant_type(int sensor_compensation, int compliance_type);
力制御タイプと読み取り表示(初期化)状態を取得する
廃止されたインターフェース
力制御タイプとセンサー初期化状態を取得する
- パラメータの説明
- sensor_compensation センサー補償を有効にするかどうか。1はAPPのリアルタイム力曲線表示およびtorq_sensor_monitor_data.actTorqueが実際の外力であることを示し、0は力制御状態でない場合にセンサーの生の読み取り値を表示します(力制御状態では実際の外力を表示します)。
- compliance_type 0 はいかなる柔順制御方法も使用しないことを示し、1 は一定力柔順制御、2 は速度柔順制御を示します。
- 戻り値 ERR_SUCC 成功 その他 失敗
errno_t get_compliant_type(int *sensor_compensation, int *compliance_type);
力・コンプライアンス制御パラメータの設定
廃止されたインターフェース
力・コンプライアンス制御パラメータの設定
- パラメータの説明
- axis:0,x軸;1,y軸;2,z軸;3,rx;4,ry;5,rz。
- opt:0 オフ,1 オン。
- ftUser:ダンピング。これはロボット先端が外部環境に対して示す剛性に影響します。このパラメータが大きいほど、ロボット先端が示す剛性は大きくなります。単位は×8N·s/m(x/y/zに対して)、×16Nm·s/(π·rad)(rx/ry/rzに対して)
- ftReboundFK:リバウンド。これはロボットのコンプライアンス制御過程で、指令軌跡(または初期位置)との弾性係数を表します。単位は N/mm (x/y/z用)、Nm/rad (rx/ry/rz用) です。
- ftConstant:目標力を表し、単位は N (x/y/z用)、Nm (rx/ry/rz用) です。
- ftNnormalTrack:過去との互換性のためのインターフェースであり、正常動作を確保するために現在はすべて0に設定する必要があります。
- 上記各パラメータの理解については、171力制御製品取扱説明書の関連説明をさらに参照してください。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_admit_ctrl_config(int axis, int opt, double ftUser, double ftConstant, int ftNnormalTrack, double ftReboundFK);
力コンプライアンス制御パラメータを取得
廃止されたインターフェース
力コンプライアンス制御パラメータを取得
- パラメータの説明
- admit_ctrl_cfg ロボットアームの力コンプライアンス制御パラメータの保存アドレス。6つのAdmitCtrlTypeから構成される配列で、x,y,z,rx,ry,rz方向の力コンプライアンス制御パラメータに対応します。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_admit_ctrl_config(RobotAdmitCtrl *admit_ctrl_cfg);
速度コンプライアンス制御パラメータを設定する
廃止されたインターフェース
速度コンプライアンス制御パラメータを設定する
- パラメータの説明
- vel_cfgは速度コンプライアンス制御パラメータです。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_vel_compliant_ctrl(const VelCom *vel_cfg);
コンプライアンス制御力の条件を設定する
廃止されたインターフェース
コンプライアンス制御力の条件を設定する
- パラメータの説明
- ftはコンプライアンス制御トルクの制限値であり、制限値を超えると減速して停止する
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_compliance_condition(const FTxyz *ft);
センサーをゼロ設定にする
廃止されたインターフェース
センサーのゼロ点をキャリブレーションし、0.5秒間ブロックします。
errno_t zero_end_sensor();
センサーのハードウェアレベル校正
廃止されたインターフェース
センサーのハードウェアレベル校正をトリガーし、センサー数値の精度を向上させます。
- パラメータの説明
- type: 0:効果なし。1: キャリブレーションを実行。2: 現在のキャリブレーション値を照会。
- 注意:この命令は即時に有効にならず、ロボット制御キャビネットを再起動した後、最初の通電時に現在のセンサー状態でキャリブレーションを行います。キャリブレーションには5〜10秒かかる場合があります。この指令を送信した後、次回再起動・通電後に5〜10秒待ってから有効化すると、最適なキャリブレーション結果が得られます。
- 注意:この命令は、センサー値の精度を極限まで向上させる必要がある場合のみ使用してください。不適切な使用はセンサーのゼロ点の大きなずれを引き起こし、予期しない状況を招く可能性があります。頻繁または繰り返しのキャリブレーションは推奨されません。通常のセンサー値のキャリブレーションは、センサーゼロインターフェースを通じてソフトウェアでゼロ調整を行うことを推奨します。
- 注意:この命令が有効になった後は、起動後にAPP上に表示される現在のキャリブレーション結果を必ず記録し、後続の使用時に実際の加圧がこのキャリブレーション結果との合算でセンサーの測定範囲を超えないことを確認してください。
errno_t tio_sensor_calib(int type);
センサーの動作状態を取得する
センサーの動作状態を取得する
- パラメータの説明
- sensor_mode: センサーがオンまたはオフの状態。0はオフ、1はオン。
errno_t get_torque_sensor_mode(int* sensor_mode);
センサーの状態とデータを取得する
センサーの動作状態を取得する
- パラメータの説明
- type: データ取得タイプ。1:torq_sensor_monitor_data.actTorqueと同じ;2:torq_sensor_monitor_data.torqueと同じ(センサーの生データ);3:torq_sensor_monitor_data.realTorqueと同じ(負荷の重力補償とセンサーのオフセットを差し引いた実際の力)。
- TorqSensorData:センサー状態、エラーコード、および測定値を含む構造体
- 注意:typeが1の場合はバージョン1.7.1以前向けの互換性インターフェースです。バージョン1.7.2以降では、このパラメータに1または3を指定した場合の取得値は同じですが、3の使用を推奨します。
errno_t get_torque_sensor_data(int type, TorqSensorData* data);
定常力コンプライアンス制御パラメータを設定
定常力コンプライアンス制御パラメータを設定
- パラメータの説明
- axis:0,x軸;1,y軸;2,z軸;3,rx;4,ry;5,rz。
- opt:0 オフ,1 オン。
- ftUser:ダンピングであり、ロボットアームの末端が外部環境に示す剛性に影響します。このパラメータが大きいほど、ロボットアーム末端が示す剛性は高くなります。単位は×8N·s/m(x/y/zに対して)、×16Nm·s/(π·rad)(rx/ry/rzに対して)
- ftReboundFK:リバウンドであり、ロボットアームのコンプライアンス制御過程において指令軌跡(または初期位置)との弾性係数を示します。単位はx/y/zの場合N/mm、rx/ry/rzの場合Nm/radです。
- ftConstant:目標力を表し、単位は N (x/y/z用)、Nm (rx/ry/rz用) です。
- 上記の各パラメータの理解については、172APPプログラミング命令ヘルプおよび172APPユーザーマニュアルの関連説明をさらに参照してください。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_ft_ctrl_config(AdmitCtrlType admit_ctrl_cfg);
定常力コンプライアンス制御パラメータを取得
定常力コンプライアンス制御パラメータを取得
- パラメータの説明
- cfg ロボットアームの力制御コンプライアンス制御パラメータの保存アドレス。6つのAdmitCtrlTypeからなる配列で、x、y、z、rx、ry、rz方向の力コンプライアンス制御パラメータに対応します。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_ft_ctrl_config(RobotAdmitCtrl* cfg);
恒力コンプライアンス制御座標系を設定
恒力コンプライアンス制御座標系を設定
- パラメータの説明
- ftFrame 0:力制御座標系の方向軸は、現在有効なツール座標系と常に平行に維持されます。1:力制御座標系の方向軸は、現在有効なユーザー座標系と常に平行に維持されます。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_ft_ctrl_frame(FTFrameType ftFrame);
恒力コンプライアンス制御座標系を取得
定力コンプライアンス制御座標系を取得し、コントローラ内部の新しいインターフェースを呼び出す
- パラメータの説明
- ftFrame 0:力制御座標系の方向軸は、現在有効なツール座標系と常に平行に維持されます。1:力制御座標系の方向軸は、現在有効なユーザー座標系と常に平行に維持されます。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_ft_ctrl_frame(FTFrameType* ftFrame);
力制御ドラッグ感覚パラメータを設定
力制御ドラッグ感度パラメータを設定し、コントローラ内部の対応インターフェースを呼び出す
- パラメータの説明
- cfg ツールドライブの構成
- 上記の各パラメータの理解については、172APPユーザーマニュアルおよび172力制御製品ユーザーマニュアルの関連説明を参照してください。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_tool_drive_config(ToolDriveConfig cfg);
ツールドラッグパラメータを取得
ツールドラッグパラメータを取得し、コントローラ内部の新しいインターフェースを呼び出す
- パラメータの説明
- cfg ロボットアームの力制御コンプライアンス制御パラメータの保存アドレス。6つのAdmitCtrlTypeからなる配列で、x、y、z、rx、ry、rz方向の力コンプライアンス制御パラメータに対応します。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_tool_drive_config(RobotToolDriveCtrl* cfg);
ツールドラッグを有効にする
ツールドラッグのオン/オフを切り替えます。センサーを有効にし、適切なアドミッタンス制御パラメータを設定する必要があります。さらに、ツールドラッグを有効にする前に、フォースセンサーのゼロ校正を少なくとも1回行うことを推奨します。
- パラメータの説明
- enable_flag 0 はツールドラッグを無効、1 は有効
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t enable_tool_drive(const int enable_flag);
定常力コンプライアンス制御の有効/無効を設定
定常力コンプライアンス制御の有効/無効を設定
- パラメータの説明
- enable_flag 0 は無効、1 は有効。センサーを有効にし、適切なコンプライアンス制御パラメータを設定する必要があります。さらに、恒力コンプライアンス制御を有効にする前に少なくとも一度力制御センサーのゼロ点校正を行うことを推奨します。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_ft_ctrl_mode(BOOL enable);
力制御の停止条件を設定する
力制御の終了条件を設定します。APPのグラフィカルプログラミングで同名の命令と同じ意味を持ちます。詳細は172APPプログラミング命令ヘルプおよび172APPユーザーマニュアルの関連説明を参照してください。
- パラメータの説明
- condition: 6次元のForceStopCondition配列:
- axis 方向、0〜5はそれぞれx、y、z、rx、ry、rzに対応
- opt 力制御終了条件を有効にするかどうか。0 は未選択、0 以外の値は選択済みを意味します。
- lower_limit_opt 0 は下限を設定しない、0 以外の値は設定することを意味します。
- lower_limit 下限値
- upper_limit_opt 0 は下限を設定しないことを表し、0 以外の値は設定を表します
- upper_limit 上限値
- condition: 6次元のForceStopCondition配列:
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_force_stop_condition(ForceStopConditionList condition);
定力コンプライアンスの有効状態を取得
定力コンプライアンスの有効状態を取得
- パラメータの説明
- enable,0 は未起動、1 は起動、2 は速度モード(コントローラバージョン1.7.2以降では速度モードはサポートされず、2 は互換性コード内のみに存在します)
errno_t get_ft_ctrl_mode(BOOL* enable);
接近速度制限を設定
接近速度制限を設定
- パラメータの説明
- vel 線速度制限,mm/s
- angularVel 角速度制限,rad/s
- この設定項目の具体的な意味については、172APPユーザーマニュアルの関連説明を参照してください。
errno_t set_approach_speed_limit(double vel, double angularVel);
接近速度制限を取得
接近速度制限を取得
- パラメータの説明
- speed_limit 線速度制限、mm/s
- パラメータ説明 angular_speed_limit 角速度制限,rad/s
errno_t get_approach_speed_limit(double *vel, double *angularVel);
恒力制御許容値を設定
恒力制御許容値を設定
- パラメータの説明
- force 力許容値,N
- torque トルク許容値,Nm
errno_t set_ft_tolerance(double force, double torque);
恒力制御許容値を取得
恒力制御許容値を設定
- パラメータの説明
- force 力許容値,N
- torque トルク許容値,Nm
errno_t get_ft_tolerance(double *force, double *torque);
ツールドラッグの有効状態を取得
フォースコントロールツールドラッグの有効状態を取得
- パラメータの説明
- enable: 0 はオフ、1 はオン
- state:現在のドラッグ状態が動作制限警告を持つかどうかを示します。0 は警告なし、その他の値は警告を示します。2進数に変換した場合の有効ビットは16ビットで、下位から上位に向かって順に以下の警告トリガータイプを表します:1〜6番の特異点トリガー、1〜9関節のソフトリミットトリガー、速度制限トリガー
- 戻り値 ERR_SUCC ERR_SUCC 成功 それ以外は失敗
errno_t get_tool_drive_state(int *enable, int *state);
注:
state の戻り値は S シリーズロボットアームのみサポートされ、その他の機種ではこの戻り値は無意味です。 S シリーズ構成では、1〜3番の特異点はそれぞれ肘特異点、手首特異点、肩特異点を表し、4〜6番の特異点および7〜9関節のフラグビットは意味を持ちません。
ツールドラッグ座標系を取得
ツールドラッグ座標系を取得します。
- パラメータの説明
- toolDragFrame 0:ドラッグ座標系の方向軸は、現在有効なツール座標系と平行を保ちます;1:ドラッグ座標系の方向軸は、現在有効なユーザー座標系と平行を保ちます
- 戻り値 ERR_SUCC 成功 その他の失敗
errno_t get_tool_drive_frame(FTFrameType *ftFrame);
ツールドラッグ座標系を設定
ツールドラッグ座標系を設定します。
- パラメータの説明
- toolDragFrame 0:ドラッグ座標系の方向軸は、現在有効なツール座標系と平行を保ちます;1:ドラッグ座標系の方向軸は、現在有効なユーザー座標系と平行を保ちます
- 戻り値 ERR_SUCC
errno_t set_tool_drive_frame(FTFrameType ftFrame);
注:
以下の融合ドラッグおよび動作制限(特異点と関節リミット)警告範囲に関するインターフェースは、Sシリーズロボットアーム専用です。 これらの設定の具体的な意味については、APPユーザーマニュアルの関連説明を参照してください。
融合ドライブ感度を取得
融合ドラッグ感度を取得します。
- パラメータの説明
- level 感度レベル、0〜5、0はオフを表し、値が小さいほど感度が低くなります
errno_t get_fusion_drive_sensitivity_level(int *level);
融合ドライブ感度を設定
融合ドラッグ感度を設定します。
- パラメータの説明
- level 感度レベル、0〜5、0はオフを表し、値が小さいほど感度が低くなります
- この設定の具体的な意味については、APPユーザーマニュアルの関連説明を参照してください。
errno_t set_fusion_drive_sensitivity_level(int level);
動作制限(特異点および関節リミット)の警告範囲を取得
動作制限(特異点と関節リミット)警告範囲を取得します。
- パラメータの説明
- warningRange 範囲レベル、1〜5、値が小さいほど警告範囲が大きくなります
errno_t get_motion_limit_warning_range(int *warningRange);
動作制限(特異点および関節リミット)の警告範囲を設定
動作制限(特異点と関節リミット)警告範囲を設定します。
- パラメータの説明
- warningRange 範囲レベル、1〜5、値が小さいほど警告範囲が大きくなります
- この設定の具体的な意味については、APPユーザーマニュアルの関連説明を参照してください。
errno_t set_motion_limit_warning_range(int warningRange);
力制御の速度制限を取得する
力制御の速度制限を取得します。
errno_t get_compliant_speed_limit(double *vel, double *angularVel);
力制御の速度制限を設定する
力制御の速度制限を設定します。
- パラメータの説明
- speed_limit 線速度制限、mm/s
- angular_speed_limit 角速度制限、rad/s
- この設定の具体的な意味については、APPユーザーマニュアルの関連説明を参照してください。
errno_t set_compliant_speed_limit(double vel, double angularVel);
トルク参照点を取得
トルク参照中心を取得します。
- パラメータの説明
- refPoint 0は末端フランジの中心(またはセンサーの中心)を表し、1は現在有効なツール座標系の中心を表します。
errno_t get_torque_ref_point(int *refPoint);
トルク基準中心を設定する
トルク基準点を設定します。
- パラメータの説明
- refPoint 0は末端フランジの中心(またはセンサーの中心)を表し、1は現在有効なツール座標系の中心を表します。
- この設定の具体的な意味については、APPユーザーマニュアルの関連説明を参照してください。
errno_t set_torque_ref_point(int refPoint);
センサー感度を設定する
センサーの感度を設定します。
- パラメータの説明
- threshold は6次元配列で、値の範囲は0~1です。値が大きいほどセンサーの感度は低く、外力干渉への反応閾値は高くなります。
errno_t set_end_sensor_sensitivity_threshold(FTxyz threshold);
センサー感度を取得する
センサーの感度を取得します。
- パラメータの説明
- threshold は6次元配列で、ユーザーが設定した感度のパーセンテージです。
- この設定の具体的な意味については、APPユーザーマニュアルの関連説明を参照してください。
errno_t get_end_sensor_sensitivity_threshold(FTxyz *threshold);
- この設定の具体的な意味については、APPユーザーマニュアルの関連説明を参照してください。
コード例:
int main()
{
std::cout << "こんにちは、世界!";
JAKAZuRobot demo;
//コントローラーへのログイン。192.168.2.194を自分のコントローラーのIPに、passwordをアプリで設定したjaka_sdkパスワードに置き換えてください。
demo.login_in("192.168.2.194",1,"jaka_sdk","password");
std::cout << "電源オン: " << demo.power_on() << std::endl;
std::cout << "イネーブル: " << demo.enable_robot() << std::endl;
std::cout << "ツールドライブ有効化: " << demo.enable_tool_drive(1) << std::endl;
// ツールドライブフレームを設定
FTFrameType tool_drive_frame;
demo.set_tool_drive_frame(FTFrameType::FTFrame_World);
demo.get_tool_drive_frame(&tool_drive_frame);
std::cout << tool_drive_frame << std::endl;
// トルク基準点を設定
CartesianTran ref_point, ret_point;
ref_point.x = 1;
ref_point.y = 2;
ref_point.z = 2;
demo.set_ft_sensor_ref_point(&ref_point); // TCPに追従するように設定
std::this_thread::sleep_for(std::chrono::milliseconds(500));
ret = demo.get_ft_sensor_ref_point(&ret_point);
std::cout << ret_point.x << "、" << ret_point.y << "、" << ret_point.z << std::endl;
//準拠速度制限
double vel, angvel;
demo.set_compliant_speed_limit(500, 60);
demo.get_compliant_speed_limit(&vel, &angvel);
std::cout << vel << "、" << angvel << std::endl; //出力は: 500, 60 のはず
//トルクセンサー感度しきい値
FTxyz ft;
ft.fx = 0.3;
ft.fy = 0.3;
ft.fz = 0.3;
ft.tx = 0.3;
ft.ty = 0.3;
ft.tz = 0.3;
demo.set_end_sensor_sensitivity_threshold(ft);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
demo.get_end_sensor_sensitivity_threshold(&ft);
std::cout << ft.fx << "、" << ft.fy << "、" << ft.fz << "、" << ft.tx << "、" << ft.ty << "、" << ft.tz << "、" << std::endl; //出力は: 0.3, 0.3, 0.3, 0.3, 0.3, 0.3 のはず
//他のすべての方向をロックし、z方向のみ開放
ToolDriveConfig toolDriveCfg{};
RobotToolDriveCtrl robToolCfg;
for (int i = 0; i < 6; i++)
{
toolDriveCfg.axis = i;
if(i == 2){
toolDriveCfg.opt = 1;
}
else{
toolDriveCfg.opt = 0;
}
toolDriveCfg.rigidity = 0.3;
toolDriveCfg.rebound = 0;
demo.set_tool_drive_config(toolDriveCfg);
}
demo.get_tool_drive_config(&robToolCfg);
for (int i = 0; i < 6; i++)
{
std::cout << robToolCfg.config[i].axis << ", " << robToolCfg.config[i].opt << ", " << robToolCfg.config[i].rigidity << ", " << robToolCfg.config[i].rebound << std::endl;
}
//ゼロエンドセンサー
std::cout << "ゼロ: " << demo.zero_end_sensor() << std::endl;
//ツールドライブを開く
demo.enable_tool_drive(1);
int enable, state;
demo.get_tool_drive_state(&enable, &state);
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
demo.enable_tool_drive(0);
//ログアウト
demo.login_out();
std::cout << "終了" << std::endl;
return 0;
}
センサーの基本情報を取得
- パラメータの説明
- infos は
FTSensorBasicInfoStrへのポインタで、取得したデータを格納するために使用されます。 - robot_id は対象ロボットアームの ID です。指定されていない場合、デフォルト値は 0 です。
- infos は
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_ft_sensor_basic_info(FTSensorBasicInfoStr *infos, int robot_id = 0);
センサーのソフトリミットルールを取得
- パラメータの説明
- rules は
FTSensorSoftLimitRuleStr へのポインタで、取得したデータを格納するために使用されます。 - robot_id は照会対象のロボットアームの ID で、デフォルトは 0 です。
- rules は
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_ft_sensor_soft_limit_rules(FTSensorSoftLimitRuleStr *rules, int robot_id = 0);
センサーのソフトリミットルールを設定
- パラメータの説明
- rules は
FTSensorSoftLimitRuleStr へのポインタで、ルールを定義するために使用されます。 - robot_id ロボットアームのID。デフォルトは0。
- rules は
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_ft_sensor_soft_limit_rules(const FTSensorSoftLimitRuleStr *rules, int robot_id = 0);
センサーのフィルター パラメータを設定する
- パラメータの説明
- sensor_id 設定するセンサー。
- filter フィルターパラメータを指すポインタ。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_ft_sensor_filter(int sensor_id, const double *filter);
センサーのフィルター パラメータを取得する
- パラメータの説明
- sensor_id センサーID。
- filter パラメータを格納する配列を指すポインタ。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_ft_sensor_filter(int sensor_id, double *filter);
センサーモードを取得する
- パラメータの説明
- sensor_id 照会対象のセンサーID。
- mode 整数を指すポインタ。モードを格納する:1 はオン、0 はオフを示す。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_ft_sensor_mode(int sensor_id, int *mode);
力覚センサのゼロ点調整
- パラメータの説明
- sensor_id ゼロ調整を行うセンサーID。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_ft_sensor_zero(int sensor_id);
センサーのしきい値を設定する
- パラメータの説明
- sensor_id 対象センサーID。
- threshold 閾値を含む
FTSensorThresholdStr構造体を指すポインタ。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_contact_force_threshold(int sensor_id, const FTSensorThresholdStr *threshold);
センサーのしきい値を取得する
- パラメータの説明
- sensor_id 対象センサーID。
- threshold 閾
値を格納する FTSensorThresholdStr へのポインタ。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_contact_force_threshold(int sensor_id, FTSensorThresholdStr *threshold);
センサーの基準点を設定する
- パラメータの説明
- ref_point:
CartesianTranを指すポインタ。メートル単位の[ x, y, z] オフセットを含む。 - robot_id:ロボットアームのID。デフォルト値は0です。
- ref_point:
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_ft_sensor_ref_point(const CartesianTran *ref_point, int robot_id = 0);
センサーの基準点を取得する
- パラメータの説明
- ref_point:CartesianTranを指すポインタ。メートル単位の[x, y, zの]オフセットを受け取るために使用します。
- robot_id:ロボットアームのID。デフォルト値は0です。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_ft_sensor_ref_point(CartesianTran *ref_point, int robot_id = 0);
センサー データを取得する
- パラメータの説明
- sensor_id:センサーのID。
- type:取得するデータのタイプ:
- 1 は実行トルク(互換インターフェース)を示します。
- 2 は生データを示します。
- 3 は重力と偏差を除去した実際のデータを示します。
- data:FTSensorDataStrを指すポインタ。結果を受け取るために使用します。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_ft_sensor_data(int sensor_id, int type, FTSensorDataStr *data);
センサーの負荷を取得する
- パラメータの説明
- sensor_id:センサーのID。
- payload:
PayLoad構造体を指すポインタ。結果を保存するために使用します。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_ft_sensor_payload(int sensor_id, PayLoad *payload);
センサーの負荷を設定する
- パラメータの説明
- sensor_id:センサーのID。
- payload_id:割り当てるペイロード構成のID。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_ft_sensor_payload(int sensor_id, int payload_id);
現在ロボットアームに接続されているセンサーIDを取得する
- パラメータの説明
- sensor_ids:
FTLinkedSensorIDStrを指すポインタ。結果を受け取るために使用します。 - robot_id:ロボットアームのID。デフォルト値は0です。
- sensor_ids:
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_linked_ft_sensor_id(FTLinkedSensorIDStr *sensor_ids, int robot_id = 0);
センサーを追加する
- パラメータの説明
- config:
FTSensorConfigStrを指すポインタ。センサーの構成情報を含みます。 - robot_id:ロボットアームのID。デフォルト値は0です。
- config:
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t add_ft_sensor(const FTSensorConfigStr *config, int robot_id = 0);
センサーを削除
- パラメータの説明
- sensor_id 削除するセンサーID。
- robot_id ロボットアームのID。デフォルト値は0。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t remove_ft_sensor(int sensor_id, int robot_id = 0);
力制御モードでの速度制限を設定
- パラメータの説明
- limit:
VelocityLimit構造体へのポインタ。線速度および角速度の制限を指定するために使用されます。 - robot_id:ロボットアームのID。デフォルト値は0です。
- limit:
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_force_ctrl_vel_limit(const VelocityLimit *limit, int robot_id = 0);
力制御モードでの速度制限を取得
- パラメータの説明
- limit:
VelocityLimit へのポインタ。速度制限パラメータを受け取るために使用されます。 - robot_id:ロボットアームのID。デフォルト値は0です。
- limit:
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_force_ctrl_vel_limit(VelocityLimit *limit, int robot_id = 0);
接近速度制限を設定
接近速度制限とは、定常力コンプライアンス制御を有効にした後、ロボットアームの先端が物体に接触して力が発生する前までの動作速度を制限することを指します。
- パラメータの説明
- limit:
VelocityLimit構造体へのポインタ。速度制限パラメータを指定するために使用されます。 - robot_id:ロボットアームのID。デフォルト値は0です。
- limit:
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_approaching_vel_limit(const VelocityLimit *limit, int robot_id = 0);
接近速度制限を取得
- パラメータの説明
- limit:VelocityLimit へのポインタ。速度制限パラメータを受け取るために使用されます。
- robot_id:ロボットアームのID。デフォルト値は0です。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_approaching_vel_limit(VelocityLimit *limit, int robot_id = 0);
定力コンプライアンス制御モードのパラメータを設定
- パラメータの説明
- axis:0,x軸;1,y軸;2,z軸;3,rx;4,ry;5,rz。
- opt:0 オフ,1 オン。
- ftUser:ダンピングであり、ロボットアームの末端が外部環境に示す剛性に影響します。このパラメータが大きいほど、ロボットアーム末端が示す剛性は高くなります。単位は×8N·s/m(x/y/zに対して)、×16Nm·s/(π·rad)(rx/ry/rzに対して)
- ftReboundFK:リバウンドであり、ロボットアームのコンプライアンス制御過程において指令軌跡(または初期位置)との弾性係数を示します。単位はx/y/zの場合N/mm、rx/ry/rzの場合Nm/radです。
- ftConstant:目標力を表し、単位は N (x/y/z用)、Nm (rx/ry/rz用) です。
- 上記の各パラメータの理解については、172APPプログラミング命令ヘルプおよび172APPユーザーマニュアルの関連説明をさらに参照してください。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_cst_force_ctrl_config(const AdmitCtrlType *config, int robot_id = 0);
定力コンプライアンス制御モードのパラメータを取得
- パラメータの説明
- config:
AdmitCtrlType へのポインタ。コンプライアンス制御設定を受け取るために使用されます。 - robot_id:ロボットアームのID。デフォルト値は0です。
- config:
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_cst_force_ctrl_config(AdmitCtrlType *config, int robot_id = 0);
定力コンプライアンス制御の許容差を設定
- パラメータの説明
- tol:
FTxyz構造体へのポインタ。許容値を指定するために使用されます。 - robot_id:ロボットアームのID。デフォルト値は0です。
- tol:
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t set_cst_force_ctrl_tol(const FTxyz *tol, int robot_id = 0);
定力コンプライアンス制御の許容差を取得
- パラメータの説明
- tol:FTxyz へのポインタ。許容値を受け取るために使用されます。
- robot_id:ロボットアームのID。デフォルト値は0です。
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t get_cst_force_ctrl_tol(FTxyz *tol, int robot_id = 0);
FTPサービス
FTPクライアントの初期化
FTPクライアントを初期化し、制御キャビネットと接続を確立して、programやtrackをエクスポートできます
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t init_ftp_client();
FTPアップロード
ローカルから指定の種類と名前のファイルをコントローラにアップロードします
- パラメータの説明
- remote コントローラ内部のファイル名の絶対パス。フォルダーの場合は「または「/」で終わる必要があります
- local ローカルファイル名の絶対パス。フォルダーの場合は「または「/」で終わる必要があります
- opt:1 単一ファイル 2 フォルダ
- 戻り値 ERR_SUCC 成功 その他は失敗
- @note Windows C++/ Windows C# の場合、渡されるパラメータのエンコードはGBKです。LinuxはUTF-8です。
errno_t upload_file(char *local, char *remote, int opt);
FTPダウンロード
コントローラから指定の種類と名前のファイルをローカルにダウンロードします
- パラメータの説明
- remote コントローラ内部のファイル名の絶対パス。フォルダーの場合は「または「/」で終わる必要があります
- local ローカルにダウンロードするファイル名の絶対パス。フォルダーの場合は「または「/」で終わる必要があります
- opt:1 単一ファイル 2 フォルダ
- 戻り値 ERR_SUCC 成功 その他は失敗
- Windows C++/ Windows C# の場合、渡されるパラメータのエンコードはGBKです。LinuxはUTF-8です。
errno_t download_file(char *local, char *remote, int opt);
FTPディレクトリ照会
FTPディレクトリを照会します
- パラメータの説明
- remote コントローラ内部ファイル名の元の名前。“/track/”で軌跡を照会、“/program/”でスクリプトプログラムを照会します
- opt 0 ファイル名とサブディレクトリ名、1 ファイル名、2 サブディレクトリ名
- ret 照会結果の戻り値
- 戻り値 ERR_SUCC 成功 その他は失敗
- Windows C++/ Windows C# の場合、渡されるパラメータのエンコードはGBKです。LinuxはUTF-8です。
errno_t get_ftp_dir(const char *remotedir, int type, char *ret);
FTP削除
コントローラから指定の種類と名前のファイルを削除します
- パラメータの説明
- リモートコントローラ内部ファイル名
- opt:1 単一ファイル 2 フォルダ
- 戻り値 ERR_SUCC 成功 その他は失敗
- Windows C++/ Windows C# の場合、渡されるパラメータのエンコードはGBKです。LinuxはUTF-8です。
errno_t del_ftp_file(char *remote, int opt);
FTP名前変更
コントローラで指定されたタイプと名前のファイルをリネームする
- パラメータの説明
- リモートコントローラ内部ファイル名の元の名称
- des 変更後のターゲット名
- opt:1 単一ファイル 2 フォルダ
- 戻り値 ERR_SUCC 成功 その他は失敗
- Windows C++/ Windows C# の場合、渡されるパラメータのエンコードはGBKです。LinuxはUTF-8です。
errno_t rename_ftp_file(char *remote, char *des, int opt);
FTPクライアントを閉じる
コントローラとのFTP接続を切断する
- 戻り値 ERR_SUCC 成功 その他は失敗
errno_t close_ftp_client();
インターフェース呼び出し戻り値リストおよび問題のトラブルシューティング
| エラーコード | 説明 | 処理の提案 |
|---|---|---|
| 0 | 成功 | null |
| 2 | インターフェースエラーまたはコントローラーが未対応 | コントローラーとSDKのバージョン情報を確認し、アップグレードまたは他のインターフェースに切り替えてください |
| -1 | 無効なハンドラー | 呼び出しインターフェースの前にログインしているか確認してください |
| -2 | 無効なパラメータ | パラメータが正しいか確認してください |
| -3 | 接続に失敗しました | ネットワーク接続状態、またはロボットのIPが正しいか確認してください |
| -4 | 逆運動学エラー | 逆解に失敗しました。現在の座標系、または参照関節角が適切か確認してください |
| -5 | 非常停止 | 非常停止状態、保持状態 |
| -6 | 電源が入っていません | 未通電 |
| -7 | 未イネーブル | 有効化されていません |
| -8 | サーボモードではありません | サーボモードではありません。servoJPを実行する際は、先にサーボモードに入る必要があります。対応するインターフェースを呼び出しているか確認してください |
| -9 | 電源を切る前にイネーブルをオフにする必要があります | 電源を切る前に必ずイネーブルを解除してください |
| -10 | 操作できません。プログラムが実行中です | 操作できません。プログラムが実行中です。先にプログラムを終了してください |
| -11 | ファイルを開けない、またはファイルが存在しません | ファイルを開けません、またはファイルが存在しません |
| -12 | 動作異常 | 動作が異常です。特異点付近にあるか、ロボットの動作制限を超えている可能性があります |
| -14 | ftpエラー | ftp異常 |
| -15 | ソケットメッセージまたは値が大きすぎます | 制限超過異常 |
| -16 | kine_forward エラー | 順運動学の解が失敗しました |
| -17 | 空のフォルダーはサポートされていません | 空のフォルダーはサポートされていません |
| -20 | 保護停止 | 保護停止 |
| -21 | 緊急停止 | 緊急停止 |
| -22 | ソフトリミット上 | ソフトリミット内にあり、手動でロボットをドラッグできません。APPのティーチング機能を使用してソフトリミットから離してください。 |
| -30 | コマンド文字列のエンコードに失敗しました | コマンドのエンコードに失敗しました。通常はコントローラーからのメッセージ解析時のエラーです。 |
| -31 | コマンド文字列のデコードに失敗しました | コマンドのデコードに失敗しました。通常はコントローラーからのメッセージ解析時のエラーです。 |
| -32 | ポート10004の文字列の解凍に失敗しました | ポート10004のデータの解凍に失敗しました。ネットワークの不安定またはデータ量過多が原因の可能性があります。 |
| -40 | 直線移動エラー | 直線運動に失敗しました。軌道内に特異点領域がないか確認してください。 |
| -41 | 関節移動エラー | 関節運動に失敗しました。設定した関節角度を確認してください。 |
| -42 | 円弧移動エラー | 円弧運動に失敗しました。設定パラメータを確認してください。 |
| -50 | block_wait タイムアウト | ブロック待機がタイムアウトしました |
| -51 | 電源投入タイムアウト | 電源オンがタイムアウトしました |
| -52 | 電源オフのタイムアウト | 電源オフのタイムアウト |
| -53 | 有効化タイムアウト | 有効化タイムアウト |
| -54 | 無効化タイムアウト | 無効化タイムアウト |
| -55 | ユーザーフレーム設定のタイムアウト | ユーザ座標系設定のタイムアウト |
| -56 | ツール設定のタイムアウト | ツール座標系設定のタイムアウト |
| -57 | edg 初期化に失敗しました | edg機能の初期化に失敗しました |
| -58 | edgが実行中のため、servo_jまたはservo_pを使用できません | edg機能が実行中のため、servo_jまたはservo_pインターフェースを使用できません |
| -59 | 現在のedgモードでは、edg_servo_jまたはedg_servo_pの使用はサポートされていません。 | edg機能が実行中のため、edg_servo_jまたはedg_servo_pインターフェースを使用できません |
| -60 | IO設定のタイムアウト | IO設定のタイムアウト |
| -61 | 操作タイムアウト | インターフェースのタイムアウト |
| -62 | サーボキューが満杯です | サーボキューが満杯です |
| -63 | サーボが動作していません | サーボモードが開始されていません |
| -9997 | 未実装 | インターフェースが実装されていません |
| -9998 | 非推奨のインターフェース | このインターフェースは将来的に削除される予定です(現在は利用可能) |
| -9999 | 廃止されたインターフェース | このインターフェースは将来的に削除される予定です(機能は利用できません) |
問題のフィードバック
ドキュメントに不正確な記述や誤りがあった場合は、読者の皆様のご理解とご指摘をお願いいたします。読書中に問題を発見したりご意見がありましたら、support@jaka.com までメールをお送りください。できるだけ早く返信いたします。
