8. Zapytanie o stan robota

8.1. Pobieranie bieżącej pozycji stawów (kąt)

1/**
2* @brief  Pobiera bieżącą pozycję stawów (kąt)
3* @param  [in] flag 0-blokujący, 1-nieblokujący
4* @param  [out] jPos Pozycje sześciu stawów, jednostka deg
5* @return  Kod błędu
6*/
7errno_t  GetActualJointPosDegree(uint8_t flag, JointPos *jPos);

8.2. Pobieranie prędkości sprzężenia zwrotnego stawów

1/**
2 * @brief  Pobiera prędkość sprzężenia zwrotnego stawów - deg/s
3 * @param  [in] flag 0-blokujący, 1-nieblokujący
4 * @param  [out] speed Prędkości sześciu stawów
5 * @return  Kod błędu
6 */
7errno_t  GetActualJointSpeedsDegree(uint8_t flag, float speed[6]);

8.3. Pobieranie przyspieszenia sprzężenia zwrotnego stawów

1/**
2 * @brief  Pobiera przyspieszenie sprzężenia zwrotnego stawów - deg/s^2
3 * @param  [in] flag 0-blokujący, 1-nieblokujący
4 * @param  [out] acc Przyspieszenia sześciu stawów
5 * @return  Kod błędu
6 */
7errno_t  GetActualJointAccDegree(uint8_t flag, float acc[6]);

8.4. Pobieranie prędkości wypadkowej zadanej TCP

1/**
2 * @brief  Pobiera prędkość wypadkową zadaną TCP
3 * @param  [in] flag 0-blokujący, 1-nieblokujący
4 * @param  [out] tcp_speed Prędkość liniowa
5 * @param  [out] ori_speed Prędkość kątowa
6 * @return  Kod błędu
7 */
8errno_t  GetTargetTCPCompositeSpeed(uint8_t flag, float *tcp_speed, float *ori_speed);

8.5. Pobieranie prędkości wypadkowej sprzężenia zwrotnego TCP

1/**
2 * @brief  Pobiera prędkość wypadkową sprzężenia zwrotnego TCP
3 * @param  [in] flag 0-blokujący, 1-nieblokujący
4 * @param  [out] tcp_speed Prędkość liniowa
5 * @param  [out] ori_speed Prędkość kątowa
6 * @return  Kod błędu
7 */
8errno_t  GetActualTCPCompositeSpeed(uint8_t flag, float *tcp_speed, float *ori_speed);

8.6. Pobieranie prędkości zadanej TCP

1/**
2 * @brief  Pobiera prędkość zadaną TCP
3 * @param  [in] flag 0-blokujący, 1-nieblokujący
4 * @param  [out] speed Prędkość [x, y, z, rx, ry, rz]
5 * @return  Kod błędu
6 */
7errno_t  GetTargetTCPSpeed(uint8_t flag, float speed[6]);

8.7. Pobieranie prędkości sprzężenia zwrotnego TCP

1/**
2 * @brief  Pobiera prędkość sprzężenia zwrotnego TCP
3 * @param  [in] flag 0-blokujący, 1-nieblokujący
4 * @param  [out] speed Prędkość [x, y, z, rx, ry, rz]
5 * @return  Kod błędu
6 */
7errno_t  GetActualTCPSpeed(uint8_t flag, float speed[6]);

8.8. Pobieranie bieżącej pozy i orientacji narzędzia

1/**
2* @brief  Pobiera bieżącą pozy i orientację narzędzia
3* @param  [in] flag  0-blokujący, 1-nieblokujący
4* @param  [out] desc_pos  Pozy i orientacja narzędzia
5* @return  Kod błędu
6*/
7errno_t  GetActualTCPPose(uint8_t flag, DescPose *desc_pos);

8.9. Pobieranie numeru bieżącego układu współrzędnych narzędzia

1/**
2* @brief  Pobiera numer bieżącego układu współrzędnych narzędzia
3* @param  [in] flag  0-blokujący, 1-nieblokujący
4* @param  [out] id  Numer układu współrzędnych narzędzia
5* @return  Kod błędu
6*/
7errno_t  GetActualTCPNum(uint8_t flag, int *id);

8.10. Pobieranie numeru bieżącego układu współrzędnych obiektu

1/**
2* @brief  Pobiera numer bieżącego układu współrzędnych obiektu
3* @param  [in] flag  0-blokujący, 1-nieblokujący
4* @param  [out] id  Numer układu współrzędnych obiektu
5* @return  Kod błędu
6*/
7errno_t  GetActualWObjNum(uint8_t flag, int *id);

8.11. Pobieranie bieżącej pozy i orientacji kołnierza końcowego

1/**
2* @brief  Pobiera bieżącą pozy i orientację kołnierza końcowego
3* @param  [in] flag  0-blokujący, 1-nieblokujący
4* @param  [out] desc_pos  Pozy i orientacja kołnierza
5* @return  Kod błędu
6*/
7errno_t  GetActualToolFlangePose(uint8_t flag, DescPose *desc_pos);

8.12. Pobieranie bieżącego momentu stawów

1/**
2* @brief Pobiera bieżący moment stawów
3* @param  [in] flag 0-blokujący, 1-nieblokujący
4* @param  [out] torques Momenty stawów
5* @return  Kod błędu
6*/
7errno_t  GetJointTorques(uint8_t flag, float torques[6]);

8.13. Pobieranie czasu systemowego

1/**
2* @brief  Pobiera czas systemowy
3* @param  [out] t_ms Jednostka ms
4* @return  Kod błędu
5*/
6errno_t  GetSystemClock(float *t_ms);

8.14. Synchronizacja Czasu Systemowego z Robotem

1/**
2* @brief Pobiera bieżący czas systemowy komputera hosta i wysyła go do robota w celu synchronizacji czasu systemowego (ze względu na ograniczenia systemu QNX, dokładność synchronizacji jest na poziomie minut)
3* @return Kod błędu
4*/
5errno_t SetRobotTime();

8.15. Przykład Kodu Ustawiania i Odczytu Czasu Systemowego Robota

 1void TestSetAndGetRobotTime()
 2{
 3ROBOT_STATE_PKG pkg = {};
 4FRRobot robot;
 5robot.LoggerInit();
 6robot.SetLoggerLevel(1);
 7robot.SetReConnectParam(true, 30000, 500);
 8int rtn = robot.RPC("192.168.58.2");
 9if (rtn != 0) {
10    return;
11}
12float t_ms = 0.0f;
13int ret = robot.GetSystemClock(&t_ms);
14if (ret == 0) {
15    constexpr int64_t OFFSET_8H_MS = 8LL * 3600LL * 1000LL;
16    int64_t rawMs = static_cast<int64_t>(t_ms);
17    int64_t fixedMs = rawMs - OFFSET_8H_MS;
18    std::time_t sec = static_cast<std::time_t>(fixedMs / 1000LL);
19    std::tm utcTm {};
20    #if defined (_WIN32) || defined (_WIN64)
21        localtime_s(&utcTm, &sec);
22    #else
23        localtime_r(&sec, &utcTm);
24    #endif
25        char utcBuf[64] = { 0 };
26        strftime(utcBuf, sizeof(utcBuf), "%Y-%m-%d %H:%M:%S", &utcTm);
27        printf("system clock : %.0f\n", t_ms);
28        printf("BEFORE UTC Time : %s\n", utcBuf);
29    }
30    else {
31        printf("GetSystemClock failed, ret:%d\n", ret);
32    }
33
34    robot.SetRobotTime();
35    robot.Sleep(1000);
36    float t_ms_after = 0.0f;
37    ret = robot.GetSystemClock(&t_ms_after);
38    if (ret == 0) {
39        printf("system clock : %.0f\n", t_ms_after);
40
41        constexpr int64_t OFFSET_8H_MS = 8LL * 3600LL * 1000LL;
42        int64_t robotMs = static_cast<int64_t>(t_ms_after);
43        int64_t robotMsFixed = robotMs - OFFSET_8H_MS;
44
45        auto nowSys = std::chrono::system_clock::now();
46        int64_t pcMs = std::chrono::duration_cast<std::chrono::milliseconds>(nowSys.time_since_epoch()).count();
47        constexpr int64_t MS_PER_MINUTE = 60LL * 1000LL;
48        bool isConsistent = ((robotMsFixed / MS_PER_MINUTE) == (pcMs / MS_PER_MINUTE));
49
50        std::time_t robotSec = robotMsFixed / 1000LL;
51        std::tm robotTm {};
52    #if defined (_WIN32) || defined (_WIN64)
53        localtime_s(&robotTm, &robotSec);
54    #else
55        localtime_r(&robotSec, &robotTm);
56    #endif
57
58        std::time_t pcSec = pcMs / 1000LL;
59        std::tm pcTm {};
60    #if defined (_WIN32) || defined (_WIN64)
61        localtime_s(&pcTm, &pcSec);
62    #else
63        localtime_r(&pcSec, &pcTm);
64    #endif
65
66    char pcBuf[64] = { 0 };
67    char robotBuf[64] = { 0 };
68    strftime(pcBuf, sizeof(pcBuf), "%Y-%m-%d %H:%M", &pcTm);
69    strftime(robotBuf, sizeof(robotBuf), "%Y-%m-%d %H:%M", &robotTm);
70    if (isConsistent) {
71    printf("Consistent | PC time: %s | Robot time: %s\n", pcBuf, robotBuf);
72    }
73    else {
74    printf("[Inconsistent] | PC time: %s | Robot time: %s\n", pcBuf, robotBuf);
75    }
76}
77else {
78    printf("GetSystemClock failed, ret:%d\n", ret);
79}
80robot.Sleep(1000);
81robot.CloseRPC();
82robot.Sleep(1000);
83}

8.16. Sprawdzanie, czy ruch robota został zakończony

1/**
2* @brief  Sprawdza, czy ruch robota został zakończony
3* @param  [out]  state  0-niezakończony, 1-zakończony
4* @return  Kod błędu
5*/
6errno_t  GetRobotMotionDone(uint8_t *state);

8.17. Sprawdzanie długości bufora kolejki ruchu robota

1/**
2 * @brief  Sprawdza długość bufora kolejki ruchu robota
3 * @param  [out]  len  Długość bufora
4 * @return  Kod błędu
5 */
6errno_t  GetMotionQueueLength(int *len);

8.18. Pobieranie stanu awaryjnego zatrzymania robota

1/**
2* @brief Pobiera stan awaryjnego zatrzymania robota
3* @param [out] state Stan awaryjnego zatrzymania, 0-brak, 1-awaryjne zatrzymanie
4* @return Kod błędu
5*/
6errno_t GetRobotEmergencyStopState(uint8_t *state);

8.19. Pobieranie stanu komunikacji SDK z robotem

1/**
2* @brief Pobiera stan komunikacji SDK z robotem
3* @param [out] state Stan komunikacji, 0-komunikacja normalna, 1-komunikacja nieprawidłowa
4*/
5errno_t GetSDKComState(int *state);

8.20. Pobieranie sygnału bezpiecznego zatrzymania

1/**
2* @brief Pobiera sygnał bezpiecznego zatrzymania
3* @param [out] si0_state Sygnał bezpiecznego zatrzymania SI0, 0-nieaktywny, 1-aktywny
4* @param [out] si1_state Sygnał bezpiecznego zatrzymania SI1, 0-nieaktywny, 1-aktywny
5*/
6errno_t GetSafetyStopState(uint8_t *si0_state, uint8_t *si1_state);

8.21. Pobieranie temperatury sterownika stawów robota (℃)

Dodane w wersji C++SDK-v2.1.5.0.

1/**
2* @brief Pobiera temperaturę sterownika stawów robota (℃)
3* @return Kod błędu
4*/
5errno_t GetJointDriverTemperature(double temperature[]);

8.22. Pobieranie momentu sterownika stawów robota (Nm)

Dodane w wersji C++SDK-v2.1.5.0.

1/**
2* @brief Pobiera moment sterownika stawów robota (Nm)
3* @return Kod błędu
4*/
5errno_t GetJointDriverTorque(double torque[]);

8.23. Pobieranie struktury stanu robota w czasie rzeczywistym

Dodane w wersji C++SDK-v2.1.3.0.

1/**
2* @brief Pobiera strukturę stanu robota w czasie rzeczywistym
3* @param [out] pkg Struktura stanu robota w czasie rzeczywistym
4* @return Kod błędu
5*/
6errno_t GetRobotRealTimeState(ROBOT_STATE_PKG *pkg);

8.24. Przykład kodu zapytania o stan robota

 1int TestGetStatus(void)
 2{
 3  ROBOT_STATE_PKG pkg = {};
 4  FRRobot robot;
 5  robot.LoggerInit();
 6  robot.SetLoggerLevel(1);
 7  int rtn = robot.RPC("192.168.58.2");
 8  if (rtn != 0)
 9  {
10    return -1;
11  }
12  robot.SetReConnectParam(true, 30000, 500);
13  float yangle, zangle;
14  robot.GetRobotInstallAngle(&yangle, &zangle);
15  printf("yangle:%f,zangle:%f\n", yangle, zangle);
16  JointPos j_deg = {};
17  robot.GetActualJointPosDegree(0, &j_deg);
18  printf("joint pos deg:%f,%f,%f,%f,%f,%f\n", j_deg.jPos[0], j_deg.jPos[1], j_deg.jPos[2], j_deg.jPos[3], j_deg.jPos[4], j_deg.jPos[5]);
19  float jointSpeed[6] = { 0.0 };
20  robot.GetActualJointSpeedsDegree(0, jointSpeed);
21  printf("joint speeds deg:%f,%f,%f,%f,%f,%f\n", jointSpeed[0], jointSpeed[1], jointSpeed[2], jointSpeed[3], jointSpeed[4], jointSpeed[5]);
22  float jointAcc[6] = { 0.0 };
23  robot.GetActualJointAccDegree(0, jointAcc);
24  printf("joint acc deg:%f,%f,%f,%f,%f,%f\n", jointAcc[0], jointAcc[1], jointAcc[2], jointAcc[3], jointAcc[4], jointAcc[5]);
25  float tcp_speed = 0.0;
26  float ori_speed = 0.0;
27  robot.GetTargetTCPCompositeSpeed(0, &tcp_speed, &ori_speed);
28  printf("GetTargetTCPCompositeSpeed tcp %f; ori %f\n", tcp_speed, ori_speed);
29  robot.GetActualTCPCompositeSpeed(0, &tcp_speed, &ori_speed);
30  printf("GetActualTCPCompositeSpeed tcp %f; ori %f\n", tcp_speed, ori_speed);
31  float targetSpeed[6] = { 0.0 };
32  robot.GetTargetTCPSpeed(0, targetSpeed);
33  printf("GetTargetTCPSpeed %f,%f,%f,%f,%f,%f\n", targetSpeed[0], targetSpeed[1], targetSpeed[2], targetSpeed[3], targetSpeed[4], targetSpeed[5]);
34  float actualSpeed[6] = { 0.0 };
35  robot.GetActualTCPSpeed(0, actualSpeed);
36  printf("GetTargetTCPSpeed %f,%f,%f,%f,%f,%f\n", actualSpeed[0], actualSpeed[1], actualSpeed[2], actualSpeed[3], actualSpeed[4], actualSpeed[5]);
37  DescPose tcp = {};
38  robot.GetActualTCPPose(0, &tcp);
39  printf("tcp pose:%f,%f,%f,%f,%f,%f\n", tcp.tran.x, tcp.tran.y, tcp.tran.z, tcp.rpy.rx, tcp.rpy.ry, tcp.rpy.rz);
40  DescPose flange = {};
41  robot.GetActualToolFlangePose(0, &flange);
42  printf("flange pose:%f,%f,%f,%f,%f,%f\n", flange.tran.x, flange.tran.y, flange.tran.z, flange.rpy.rx, flange.rpy.ry, flange.rpy.rz);
43  int id = 0;
44  robot.GetActualTCPNum(0, &id);
45  printf("tcp num:%d\n", id);
46  robot.GetActualWObjNum(0, &id);
47  printf("wobj num:%d\n", id);
48  float jtorque[6] = { 0.0 };
49  robot.GetJointTorques(0, jtorque);
50  printf("torques:%f,%f,%f,%f,%f,%f\n", jtorque[0], jtorque[1], jtorque[2], jtorque[3], jtorque[4], jtorque[5]);
51  float t_ms = 0.0;
52  robot.GetSystemClock(&t_ms);
53  printf("system clock:%f\n", t_ms);
54  int config = 0;
55  robot.GetRobotCurJointsConfig(&config);
56  printf("joint config:%d\n", config);
57  uint8_t motionDone = 0;
58  robot.GetRobotMotionDone(&motionDone);
59  printf("GetRobotMotionDone :%d\n", motionDone);
60  int len = 0;
61  robot.GetMotionQueueLength(&len);
62  printf("GetMotionQueueLength :%d\n", len);
63  uint8_t emergState = 0;
64  robot.GetRobotEmergencyStopState(&emergState);
65  printf("GetRobotEmergencyStopState :%d\n", emergState);
66  int comstate = 0;
67  robot.GetSDKComState(&comstate);
68  printf("GetSDKComState :%d\n", comstate);
69  uint8_t si0_state, si1_state;
70  robot.GetSafetyStopState(&si0_state, &si1_state);
71  printf("GetSafetyStopState :%d %d\n", si0_state, si1_state);
72  double temp[6] = { 0.0 };
73  robot.GetJointDriverTemperature(temp);
74  printf("Temperature:%f,%f,%f,%f,%f,%f\n", temp[0], temp[1], temp[2], temp[3], temp[4], temp[5]);
75  double torque[6] = { 0.0 };
76  robot.GetJointDriverTorque(torque);
77  printf("torque:%f,%f,%f,%f,%f,%f\n", torque[0], torque[1], torque[2], torque[3], torque[4], torque[5]);
78  robot.GetRobotRealTimeState(&pkg);
79  robot.CloseRPC();
80  return 0;
81}

8.25. Rozwiązanie odwrotnej kinematyki

1/**
2* @brief  Rozwiązanie odwrotnej kinematyki
3* @param  [in] type 0-pozycja absolutna (układ bazowy), 1-pozycja przyrostowa (układ bazowy), 2-pozycja przyrostowa (układ narzędzia)
4* @param  [in] desc_pos Pozy i orientacja kartezjańska
5* @param  [in] config Konfiguracja przestrzeni stawów, [-1]-obliczenia w oparciu o bieżącą pozycję stawów, [0~7]-obliczenia zgodnie z określoną konfiguracją przestrzeni stawów
6* @param  [out] joint_pos Pozycja stawów
7* @return  Kod błędu
8*/
9errno_t  GetInverseKin(int type, DescPose *desc_pos, int config, JointPos *joint_pos);

8.26. Rozwiązanie odwrotnej kinematyki (z pozycją odniesienia)

1/**
2* @brief  Rozwiązanie odwrotnej kinematyki, z uwzględnieniem zadanej pozycji stawów
3* @param  [in] type 0-pozycja absolutna (układ bazowy), 1-pozycja przyrostowa (układ bazowy), 2-pozycja przyrostowa (układ narzędzia)
4* @param  [in] desc_pos Pozy i orientacja kartezjańska
5* @param  [in] joint_pos_ref Referencyjna pozycja stawów
6* @param  [out] joint_pos Pozycja stawów
7* @return  Kod błędu
8*/
9errno_t  GetInverseKinRef(int type, DescPose *desc_pos, JointPos *joint_pos_ref, JointPos *joint_pos);

8.27. Rozwiązanie odwrotnej kinematyki z pozycją osi rozszerzonej w przestrzeni kartezjańskiej

 1/**
 2* @brief Rozwiązanie odwrotnej kinematyki z pozycją osi rozszerzonej w przestrzeni kartezjańskiej
 3* @param [in] type 0-pozycja absolutna (układ bazowy), 1-pozycja przyrostowa (układ bazowy), 2-pozycja przyrostowa (układ narzędzia)
 4* @param [in] desc_pos Pozy i orientacja kartezjańska
 5* @param [in] exaxis Pozycja osi rozszerzonej
 6* @param [in] tool Numer narzędzia
 7* @param [in] workPiece Numer obiektu
 8* @param [out] joint_pos Pozycja stawów
 9* @param [in] config Konfiguracja przestrzeni stawów, [-1] - rozwiązanie w oparciu o bieżącą pozycję stawów jako odniesienie, [0~7] - rozwiązanie zgodnie z określoną konfiguracją przestrzeni stawów
10* @return Kod błędu
11*/
12errno_t GetInverseKinExaxis(int type, DescPose desc_pos, ExaxisPos exaxis, int tool, int workPiece, JointPos& joint_pos, int config = -1);

8.28. Przykład kodu rozwiązania odwrotnej kinematyki z pozycją osi rozszerzonej

 1int TestInverseKinExaxis()
 2{
 3    ROBOT_STATE_PKG pkg = {};
 4    FRRobot robot;
 5    robot.LoggerInit();
 6    robot.SetLoggerLevel(1);
 7    int rtn = robot.RPC("192.168.58.2");
 8    if (rtn != 0)
 9    {
10        return 0;
11    }
12    robot.SetReConnectParam(true, 30000, 500);
13    DescPose desc(99.957, -0.002, 29.994, -176.569, -6.757, -167.462);
14    ExaxisPos exaxis(100.0, 0.0, 0.0, 0.0);
15    JointPos jointPos = {};
16    DescPose offsetPos = {};
17    robot.GetRobotRealTimeState(&pkg);
18    int toolnum = pkg.tool;
19    int workPcsNum = pkg.user;
20    robot.GetInverseKinExaxis(0, desc, exaxis, toolnum, workPcsNum, jointPos);
21    printf("GetInverseKinExaxis joint is %f, %f, %f, %f, %f, %f\n", jointPos.jPos[0], jointPos.jPos[1], jointPos.jPos[2], jointPos.jPos[3], jointPos.jPos[4], jointPos.jPos[5]);
22    robot.ExtAxisMove(exaxis, 100, -1);
23    robot.MoveJ(&jointPos, &desc, toolnum, workPcsNum, 100.0, 100.0, 100.0, &exaxis, -1, 0, &offsetPos);
24    robot.CloseRPC();
25    robot.Sleep(9999999);
26    return 0;
27}

8.29. Sprawdzanie, czy odwrotna kinematyka ma rozwiązanie

1/**
2* @brief  Sprawdza, czy odwrotna kinematyka ma rozwiązanie, z uwzględnieniem zadanej pozycji stawów
3* @param  [in] type 0-pozycja absolutna (układ bazowy), 1-pozycja przyrostowa (układ bazowy), 2-pozycja przyrostowa (układ narzędzia)
4* @param  [in] desc_pos Pozy i orientacja kartezjańska
5* @param  [in] joint_pos_ref Referencyjna pozycja stawów
6* @param  [out] result 0-brak rozwiązania, 1-jest rozwiązanie
7* @return  Kod błędu
8*/
9errno_t  GetInverseKinHasSolution(int type, DescPose *desc_pos, JointPos *joint_pos_ref, uint8_t *result);

8.30. Pobieranie 8 zestawów rozwiązań odwrotnych dla robota

 1/**
 2* @brief Pobierz 8 zestawów rozwiązań odwrotnych dla robota
 3* @param [in] tcfPose Pozycja kartezjańska
 4* @param [in] tool Układ współrzędnych narzędzia
 5* @param [in] workpiece Układ współrzędnych przedmiotu obrabianego
 6* @param [in] exPos Pozycja osi rozszerzonej
 7* @param [out] jointPos Wyjście 8 zestawów kątów przegubów
 8* @return Kod błędu
 9*/
10errno_t TCFToAllJoint(DescPose tcfPose, int tool, int workpiece, ExaxisPos exPos, std::vector<JointPos>& jointPos);

8.31. Przykład kodu pobierania 8 zestawów rozwiązań odwrotnych dla robota

 1int TestTCFToAllJoint()
 2{
 3    ROBOT_STATE_PKG pkg = {};
 4    FRRobot robot;
 5    robot.LoggerInit();
 6    robot.SetLoggerLevel(1);
 7    robot.SetReConnectParam(true, 30000, 500);
 8    int rtn = robot.RPC("192.168.58.2");
 9    if (rtn != 0)
10    {
11        return -1;
12    }
13    DescPose curTcp(0, 0, 0, 0, 0, 0);
14    rtn = robot.GetActualTCPPose(1, &curTcp);
15    if (rtn != 0)
16    {
17        return rtn;
18    }
19    std::cout << std::fixed << std::setprecision(3);
20    std::cout << "cur TCF: x=" << curTcp.tran.x << ", y=" << curTcp.tran.y << ", z=" << curTcp.tran.z << ", "
21        << "a=" << curTcp.rpy.rx << ", b=" << curTcp.rpy.ry << ", c=" << curTcp.rpy.rz << std::endl;
22    ExaxisPos exPos(0, 0, 0, 0);
23    std::vector<JointPos> allJoints(8, JointPos(0, 0, 0, 0, 0, 0));
24    rtn = robot.TCFToAllJoint(curTcp, 0, 0, exPos, allJoints);
25    if (rtn != 0)
26    {
27        return rtn;
28    }
29    for (int i = 0; i < 8; i++)
30    {
31        JointPos joint = allJoints[i];
32        std::cout << "JOINT" << (i + 1) << ": "
33            << "j1=" << joint.jPos[0] << ", j2=" << joint.jPos[1] << ", j3=" << joint.jPos[2] << ", "
34            << "j4=" << joint.jPos[3] << ", j5=" << joint.jPos[4] << ", j6=" << joint.jPos[5] << std::endl;
35        DescPose pos(0, 0, 0, 0, 0, 0);
36        rtn = robot.GetForwardKin(&joint, &pos);
37        if (rtn != 0)
38        {
39            continue;
40        }
41        std::cout << "POS" << (i + 1) << ": "
42            << "x=" << pos.tran.x << ", y=" << pos.tran.y << ", z=" << pos.tran.z << ", "
43            << "a=" << pos.rpy.rx << ", b=" << pos.rpy.ry << ", c=" << pos.rpy.rz << std::endl;
44    }
45    return 0;
46}

8.32. Rozwiązanie prostej kinematyki

1/**
2* @brief  Rozwiązanie prostej kinematyki
3* @param  [in] joint_pos Pozycja stawów
4* @param  [out] desc_pos Pozy i orientacja kartezjańska
5* @return  Kod błędu
6*/
7errno_t  GetForwardKin(JointPos *joint_pos, DescPose *desc_pos);

8.33. Przykład kodu obliczeń prostej i odwrotnej kinematyki robota

 1int TestInverseKin(void)
 2{
 3  ROBOT_STATE_PKG pkg = {};
 4  FRRobot robot;
 5  robot.LoggerInit();
 6  robot.SetLoggerLevel(1);
 7  int rtn = robot.RPC("192.168.58.2");
 8  if (rtn != 0)
 9  {
10    return -1;
11  }
12  robot.SetReConnectParam(true, 30000, 500);
13  JointPos j1(-11.904, -99.669, 117.473, -108.616, -91.726, 74.256);
14  DescPose desc_pos1(-419.524, -13.000, 351.569, -178.118, 0.314, 3.833);
15  JointPos inverseRtn = {};
16  robot.GetInverseKin(0, &desc_pos1, -1, &inverseRtn);
17  printf("dcs1 GetInverseKin rtn is %f %f %f %f %f %f \n", inverseRtn.jPos[0], inverseRtn.jPos[1], inverseRtn.jPos[2], inverseRtn.jPos[3], inverseRtn.jPos[4], inverseRtn.jPos[5]);
18  robot.GetInverseKinRef(0, &desc_pos1, &j1, &inverseRtn);
19  printf("dcs1 GetInverseKinRef rtn is %f %f %f %f %f %f \n", inverseRtn.jPos[0], inverseRtn.jPos[1], inverseRtn.jPos[2], inverseRtn.jPos[3], inverseRtn.jPos[4], inverseRtn.jPos[5]);
20  uint8_t hasResut = 0;
21  robot.GetInverseKinHasSolution(0, &desc_pos1, &j1, &hasResut);
22  printf("dcs1 GetInverseKinRef result %d\n", hasResut);
23  DescPose forwordResult = {};
24  robot.GetForwardKin(&j1, &forwordResult);
25  printf("jpos1 forwordResult rtn is %f %f %f %f %f %f \n", forwordResult.tran.x, forwordResult.tran.y, forwordResult.tran.z, forwordResult.rpy.rx, forwordResult.rpy.ry, forwordResult.rpy.rz);
26  robot.CloseRPC();
27  return 0;
28}

8.34. Zapytanie o dane punktu nauczania w zarządzaniu nauczaniem robota

1/**
2 * @brief  Zapytanie o dane punktu nauczania w zarządzaniu nauczaniem robota
3 * @param  [in]  name  Nazwa punktu
4 * @param  [out]  data   Dane punktu
5 * @return  Kod błędu
6 */
7errno_t  GetRobotTeachingPoint(char name[64], float data[20]);

8.35. Pobieranie wartości kompensacji parametrów DH robota

Dodane w wersji C++SDK-v2.1.1.0.

1/**
2* @brief Pobiera wartości kompensacji parametrów DH robota
3* @param [out] dhCompensation Wartości kompensacji parametrów DH robota (mm) [cmpstD1, cmpstA2, cmpstA3, cmpstD4, cmpstD5, cmpstD6]
4* @return Kod błędu
5*/
6errno_t GetDHCompensation(double dhCompensation[6]);

8.36. Pobieranie numeru seryjnego szafy sterowniczej

Dodane w wersji C++SDK-v2.2.1-3.8.1.

1/**
2* @brief Pobiera numer seryjny szafy sterowniczej
3* @param [out] SNCode Numer seryjny szafy sterowniczej
4* @return Kod błędu
5*/
6errno_t GetRobotSN(std::string& SNCode);

8.37. Przykład kodu zapytania o dane punktu nauczania w zarządzaniu nauczaniem robota

 1int TestGetTeachPoint(void)
 2{
 3  ROBOT_STATE_PKG pkg = {};
 4  FRRobot robot;
 5  robot.LoggerInit();
 6  robot.SetLoggerLevel(1);
 7  int rtn = robot.RPC("192.168.58.2");
 8  if (rtn != 0)
 9  {
10    return -1;
11  }
12  robot.SetReConnectParam(true, 30000, 500);
13  char name[64] = "P1";
14  float data[20] = { 0 };
15  rtn = robot.GetRobotTeachingPoint(name, data);
16  printf(" %d name is: %s \n", rtn, name);
17  for (int i = 0; i < 20; i++)
18  {
19    printf("data is: %f \n", data[i]);
20  }
21  int que_len = 0;
22  rtn = robot.GetMotionQueueLength(&que_len);
23  printf("GetMotionQueueLength rtn is: %d, queue length is: %d \n", rtn, que_len);
24  double dh[6] = { 0 };
25  int retval = 0;
26  retval = robot.GetDHCompensation(dh);
27  cout << "retval is: " << retval << endl;
28  cout << "dh is: " << dh[0] << " " << dh[1] << " " << dh[2] << " " << dh[3] << " " << dh[4] << " " << dh[5] << endl;
29  string SN = "";
30  robot.GetRobotSN(SN);
31  cout << "robot SN is " << SN << endl;
32  robot.CloseRPC();
33  return 0;
34}

8.38. Pobieranie Układu Współrzędnych Narzędzia według ID

Zmienione w wersji C++SDK-v3.9.8.

 1/**
 2* @brief Pobiera układ współrzędnych narzędzia według ID
 3* @param [in] id Numer układu współrzędnych narzędzia
 4* @param [out] coord Wartości układu współrzędnych
 5* @param [out] type Typ narzędzia: 0-narzędzie; 1-czujnik
 6* @param [out] install Pozycja instalacji: 0-koniec robota; 1-na zewnątrz robota
 7* @param [out] toolID ID narzędzia
 8* @param [out] loadNo Numer obciążenia
 9* @return Kod błędu
10*/
11errno_t GetToolCoordWithID(int id, DescPose& coord, int& type, int& install, int& toolID, int& loadNo);

8.39. Pobieranie Układu Współrzędnych Przedmiotu według ID

Zmienione w wersji C++SDK-v3.9.8.

1/**
2* @brief Pobiera układ współrzędnych przedmiotu według ID
3* @param [in] id Numer układu współrzędnych przedmiotu
4* @param [out] coord Wartości układu współrzędnych
5* @param [out] refFrame Referencyjny układ współrzędnych
6* @return Kod błędu
7*/
8errno_t GetWObjCoordWithID(int id, DescPose& coord, int& refFrame);

8.40. Pobieranie Zewnętrznego Układu Współrzędnych Narzędzia według ID

Zmienione w wersji C++SDK-v3.9.8.

1/**
2* @brief Pobiera zewnętrzny układ współrzędnych narzędzia według ID
3* @param [in] id Numer zewnętrznego układu współrzędnych narzędzia, 20-39 odpowiadają zewnętrznym układom współrzędnych narzędzi 0-19
4* @param [out] coord Pozycja TCP stałego narzędzia zewnętrznego na robocie
5* @param [out] tcoord Pozycja układu współrzędnych przedmiotu zamontowanego na końcówce robota
6* @return Kod błędu
7*/
8errno_t GetExToolCoordWithID(int id, DescPose& coord, DescPose& tcoord);

8.41. Pobieranie Układu Współrzędnych Osi Rozszerzonej według ID

Zmienione w wersji C++SDK-v3.9.8.

1/**
2* @brief Pobiera układ współrzędnych osi rozszerzonej według ID
3* @param [in] id Numer zewnętrznego układu współrzędnych narzędzia
4* @param [out] coord Wartości układu współrzędnych
5* @param [out] axisCoordNum Numer osi rozszerzonej; bit0-bit3 odpowiadają osiom rozszerzonym 1-4; np. wartość axisCoordNum 3 odpowiada osiom rozszerzonym [1, 2]
6* @param [out] calibFlag Flaga kalibracji; 0-niekalibrowany; 1-kalibrowany
7* @return Kod błędu
8*/
9errno_t GetExAxisCoordWithID(int id, DescPose& coord, int& axisCoordNum, int& calibFlag);

8.42. Pobieranie masy i środka ciężkości obciążenia według numeru

Dodane w wersji C++SDK-v3.8.6.

1/**
2* @brief Pobiera masę i środek ciężkości obciążenia według numeru
3* @param [in] id Numer obciążenia
4* @param [out] weight Masa obciążenia
5* @param [out] cog Środek ciężkości obciążenia
6* @return Kod błędu
7*/
8errno_t GetTargetPayloadWithID(int id, double& weight, DescTran& cog);

8.43. Pobieranie bieżącego układu współrzędnych narzędzia

Dodane w wersji C++SDK-v3.8.6.

1/**
2* @brief Pobiera bieżący układ współrzędnych narzędzia
3* @param [out] coord Wartości układu współrzędnych
4* @return Kod błędu
5*/
6errno_t GetCurToolCoord(DescPose& coord);

8.44. Pobieranie bieżącego układu współrzędnych obiektu

Dodane w wersji C++SDK-v3.8.6.

1/**
2* @brief Pobiera bieżący układ współrzędnych obiektu
3* @param [out] coord Wartości układu współrzędnych
4* @return Kod błędu
5*/
6errno_t GetCurWObjCoord(DescPose& coord);

8.45. Pobieranie bieżącego zewnętrznego układu współrzędnych narzędzia

Dodane w wersji C++SDK-v3.8.6.

1/**
2* @brief Pobiera bieżący zewnętrzny układ współrzędnych narzędzia
3* @param [out] coord Wartości układu współrzędnych
4* @return Kod błędu
5*/
6errno_t GetCurExToolCoord(DescPose& coord);

8.46. Pobieranie bieżącego układu współrzędnych osi rozszerzonej

Dodane w wersji C++SDK-v3.8.6.

1/**
2* @brief Pobiera bieżący układ współrzędnych osi rozszerzonej
3* @param [out] coord Wartości układu współrzędnych
4* @return Kod błędu
5*/
6errno_t GetCurExAxisCoord(DescPose& coord);

8.47. Przykład kodu pobierania układów współrzędnych i obciążenia robota

Dodane w wersji C++SDK-v3.8.6.

 1int TestCoord()
 2{
 3    ROBOT_STATE_PKG pkg = {};
 4    FRRobot robot;
 5    robot.LoggerInit();
 6    robot.SetLoggerLevel(1);
 7    int rtn = robot.RPC("192.168.58.2");
 8    if (rtn != 0)
 9    {
10        return 0;
11    }
12    robot.SetReConnectParam(true, 30000, 500);
13    robot.Sleep(2000);
14    int id = 1;
15    DescPose toolCoord = {};
16    DescPose extoolCoord = {};
17    DescPose exworkpieceCoord = {};
18    DescPose wobjCoord = {};
19    DescPose exAxisCoord = {};
20    int type = 0, install = 0, toolID = 0, loadNo = 0;
21    robot.GetToolCoordWithID(id, toolCoord, type, install, toolID, loadNo);
22    printf("GetToolCoordWithID %d, %f %f %f %f %f %f,  type = %d, install = %d, toolID = %d, loadNo = %d\n", id,
23        toolCoord.tran.x, toolCoord.tran.y, toolCoord.tran.z,
24        toolCoord.rpy.rx, toolCoord.rpy.ry, toolCoord.rpy.rz, type, install, toolID, loadNo);
25    int refFrame = 0;
26    robot.GetWObjCoordWithID(id, wobjCoord, refFrame);
27    printf("GetWObjCoordWithID %d, %f %f %f %f %f %f, refFrame = %d\n", id,
28        wobjCoord.tran.x, wobjCoord.tran.y, wobjCoord.tran.z,
29        wobjCoord.rpy.rx, wobjCoord.rpy.ry, wobjCoord.rpy.rz, refFrame);
30    robot.GetExToolCoordWithID(21, extoolCoord, exworkpieceCoord);
31    printf("GetExToolCoordWithID %d, %f %f %f %f %f %f\n", id,
32        extoolCoord.tran.x, extoolCoord.tran.y, extoolCoord.tran.z,
33        extoolCoord.rpy.rx, extoolCoord.rpy.ry, extoolCoord.rpy.rz,
34        exworkpieceCoord.tran.x, exworkpieceCoord.tran.y, exworkpieceCoord.tran.z,
35        exworkpieceCoord.rpy.rx, exworkpieceCoord.rpy.ry, exworkpieceCoord.rpy.rz);
36    int axisCoordNum = 0, calibFlag = 0;
37    robot.GetExAxisCoordWithID(id, exAxisCoord, axisCoordNum, calibFlag);
38    printf("GetExAxisCoordWithID %d, %f %f %f %f %f %f, axisCoordNum = %d, calibFlag = %d\n", id,
39        exAxisCoord.tran.x, exAxisCoord.tran.y, exAxisCoord.tran.z,
40        exAxisCoord.rpy.rx, exAxisCoord.rpy.ry, exAxisCoord.rpy.rz, axisCoordNum, calibFlag);
41    double weight = 0.0;
42    DescTran cog = {};
43    robot.GetTargetPayloadWithID(id, weight, cog);
44    printf("GetTargetPayloadWithID %d, %f %f %f %f\n", id, weight,
45        cog.x, cog.y, cog.z);
46    robot.GetCurToolCoord(toolCoord);
47    printf("GetCurToolCoord %f %f %f %f %f %f\n",
48        toolCoord.tran.x, toolCoord.tran.y, toolCoord.tran.z,
49        toolCoord.rpy.rx, toolCoord.rpy.ry, toolCoord.rpy.rz);
50    robot.GetCurWObjCoord(wobjCoord);
51    printf("GetCurWObjCoord %f %f %f %f %f %f\n",
52        wobjCoord.tran.x, wobjCoord.tran.y, wobjCoord.tran.z,
53        wobjCoord.rpy.rx, wobjCoord.rpy.ry, wobjCoord.rpy.rz);
54    robot.GetCurExToolCoord(extoolCoord);
55    printf("GetExToolCoordWithID %f %f %f %f %f %f\n",
56        extoolCoord.tran.x, extoolCoord.tran.y, extoolCoord.tran.z,
57        extoolCoord.rpy.rx, extoolCoord.rpy.ry, extoolCoord.rpy.rz);
58    robot.GetCurExAxisCoord(exAxisCoord);
59    printf("GetCurExAxisCoord %f %f %f %f %f %f\n",
60        exAxisCoord.tran.x, exAxisCoord.tran.y, exAxisCoord.tran.z,
61        exAxisCoord.rpy.rx, exAxisCoord.rpy.ry, exAxisCoord.rpy.rz);
62    float weightT = 0.0;
63    DescTran cogT = {};
64    robot.GetTargetPayload(0, &weightT);
65    robot.GetTargetPayloadCog(0, &cogT);
66    printf("GetTargetPayload %f %f %f %f\n", weightT,
67        cogT.x, cogT.y, cogT.z);
68    DescPose coordSet(0, 1, 2, 3, 4, 5);
69    robot.SetToolCoord(1, &coordSet, 0, 0, 1, 0);
70    robot.SetWObjCoord(1, &coordSet, 0);
71    robot.SetLoadWeight(1, 1.3);
72    //DescTran cog = {};
73    cog.x = 10;
74    cog.y = 20;
75    cog.z = 30;
76    robot.SetLoadCoord(1, &cog);
77    DescPose etcp(0, 0, 100, 0, 0, 0);
78    DescPose etool(0, 0, 50, 0, 0, 0);
79    rtn = robot.SetExToolCoord(21, &etcp, &etool);
80    printf("SetExToolCoord rtn is %d\n", rtn);
81    robot.ExtAxisActiveECoordSys(1, 1, coordSet, 1);
82    robot.CloseRPC();
83    return 0;
84}