8. Zapytanie o stan robota

8.1. Pobranie bieżącej pozycji stawów (stopnie)

1/**
2* @brief  Pobiera bieżącą pozycję stawów (stopnie)
3* @param  [in] flag 0-blokujący, 1-nieblokujący
4* @param  [out] jPos Sześć pozycji stawów, jednostka deg
5* @return  Kod błędu
6*/
7int GetActualJointPosDegree(byte flag, ref JointPos jPos);

8.2. Pobranie bieżącej pozycji stawów (radiany)

1/**
2* @brief  Pobiera bieżącą pozycję stawów (radiany)
3* @param  [in] flag 0-blokujący, 1-nieblokujący
4* @param  [out] jPos Sześć pozycji stawów, jednostka rad
5* @return  Kod błędu
6*/
7int GetActualJointPosRadian(byte flag, ref JointPos jPos);

8.3. Pobranie 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 Sześć prędkości stawów
5* @return Kod błędu
6*/
7int GetActualJointSpeedsDegree(byte flag, ref double[] speed);

8.4. Pobranie 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 Sześć przyspieszeń stawów
5* @return Kod błędu
6*/
7int GetActualJointAccDegree(byte flag, ref double[] acc);

8.5. Pobranie prędkości instrukcji TCP - prędkość złożona

1/**
2* @brief Pobiera prędkość instrukcji TCP - prędkość złożona
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ść orientacji
6* @return Kod błędu
7*/
8int GetTargetTCPCompositeSpeed(byte flag, ref double tcp_speed, ref double ori_speed);

8.6. Pobranie prędkości sprzężenia zwrotnego TCP - prędkość złożona

1/**
2* @brief Pobiera prędkość sprzężenia zwrotnego TCP - prędkość złożona
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ść orientacji
6* @return Kod błędu
7*/
8int GetActualTCPCompositeSpeed(byte flag, ref double tcp_speed, ref double ori_speed);

8.7. Pobranie prędkości instrukcji TCP - prędkości składowe

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

8.8. Pobranie prędkości sprzężenia zwrotnego TCP - prędkości składowe

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

8.9. Pobranie bieżącej pozycji i orientacji narzędzia

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

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

1/**
2* @brief  Pobiera bieżący numer 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*/
7int GetActualTCPNum(byte flag, ref int id);

8.11. Pobranie bieżącego numeru układu współrzędnych przedmiotu

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

8.12. Pobranie bieżącej pozycji i orientacji kołnierza końcowego

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

8.13. Pobranie bieżącego momentu obrotowego stawów

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

8.14. Pobranie czasu systemowego

1/**
2* @brief  Pobiera czas systemowy
3* @param  [out] t_ms Jednostka ms, można konwertować na czas UTC, w stanie awarii robota GetClock zwraca 0 i kod błędu
4* @return  Kod błędu
5*/
6public int GetSystemClock(ref double t_ms)

8.15. 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*/
5public int SetRobottime()

8.16. Przykład Kodu Synchronizacji Czasu Systemowego z Robotem

 1public void testSetAndGetRobotTime()
 2{
 3    double t_ms = 0.0;
 4
 5    int ret = robot.GetSystemClock(ref t_ms);
 6    if (ret == 0)
 7    {
 8        Console.WriteLine($"system clock : {t_ms}");
 9        // Konwersja znacznika czasu w milisekundach na DateTime (czas UTC)
10        DateTime utcTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(t_ms);
11        Console.WriteLine($"BEFORE UTC Time   : {utcTime:yyyy-MM-dd HH:mm:ss}");
12    }
13    else
14    {
15        Console.WriteLine($"GetSystemClock failed,ret:{ret}");
16    }
17
18    robot.SetRobottime();
19
20    // Pobranie czasu robota po ustawieniu
21    double t_ms_after = 0;
22    ret = robot.GetSystemClock(ref t_ms_after);
23    if (ret == 0)
24    {
25        Console.WriteLine($"system clock : {t_ms}");
26        DateTime robotTimeAfter = DateTimeOffset.FromUnixTimeMilliseconds((long)t_ms_after).UtcDateTime;
27
28        // Pobranie czasu PC przed ustawieniem (jako wartość oczekiwana)
29        DateTime pcTimeBefore = DateTime.Now;
30
31        // Obcięcie zarówno czasu oczekiwanego (czas PC), jak i czasu robota do minut
32        DateTime pcMinute = new DateTime(pcTimeBefore.Year, pcTimeBefore.Month, pcTimeBefore.Day,
33                                            pcTimeBefore.Hour, pcTimeBefore.Minute, 0, DateTimeKind.Utc);
34        DateTime robotMinute = new DateTime(robotTimeAfter.Year, robotTimeAfter.Month, robotTimeAfter.Day,
35                                            robotTimeAfter.Hour, robotTimeAfter.Minute, 0, DateTimeKind.Utc);
36
37        // Porównanie spójności
38        bool isConsistent = (pcMinute == robotMinute);
39        if (isConsistent)
40        {
41            Console.WriteLine($"Consistent     | PC time: {pcMinute:yyyy-MM-dd HH:mm}  | Robot time: {robotMinute:yyyy-MM-dd HH:mm}");
42        }
43        else
44        {
45            Console.WriteLine($"[Inconsistent | PC time: {pcMinute:yyyy-MM-dd HH:mm}  | Robot time: {robotMinute:yyyy-MM-dd HH:mm}");
46        }
47    }
48    else
49    {
50        Console.WriteLine($"GetSystemClock failed,ret:{ret}");
51    }
52}

8.17. Sprawdzenie, 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*/
6int GetRobotMotionDone(ref byte state);

8.18. Sprawdzenie 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*/
6int GetMotionQueueLength(ref int len);

8.19. Pobranie 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*/
6int GetRobotEmergencyStopState(ref byte state);

8.20. Pobranie 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*/
5int GetSDKComState(ref int state);

8.21. Pobranie 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*/
6int GetSafetyStopState(ref byte si0_state, ref byte si1_state);

8.22. Pobranie temperatury napędu stawu robota (°C)

1/**
2* @brief Pobiera temperaturę napędu stawu robota (°C)
3* @return Kod błędu
4*/
5int GetJointDriverTemperature(double[] temperature);

8.23. Pobranie momentu obrotowego napędu stawu robota (Nm)

1/**
2* @brief Pobiera moment obrotowy napędu stawu robota (Nm)
3* @return Kod błędu
4*/
5int GetJointDriverTorque(double torque[]);

8.24. Pobranie najnowszej ramki danych stanu robota w czasie rzeczywistym (zmiana mechanizmu wewnętrznego)

1/**
2* @brief Pobiera najnowszą ramkę danych stanu robota w czasie rzeczywistym (wewnętrzny wątek ciągle aktualizuje, ten interfejs bezpośrednio zwraca dane z bufora)
3* @param [out] pkg Parametr referencyjny do odbioru danych stanu robota (struktura ROBOT_STATE_PKG)
4* @return Sukces zwraca 0; błąd zwraca ujemny kod błędu (np. błąd komunikacji sieciowej)
5*/
6public int GetRobotRealTimeState(ref ROBOT_STATE_PKG pkg)

8.25. Przykład kodu zapytania o stan robota

 1private void button29_Click(object sender, EventArgs e)
 2{
 3    ROBOT_STATE_PKG pkg = new ROBOT_STATE_PKG();
 4    double yangle = 0, zangle = 0;
 5    robot.GetRobotInstallAngle(ref yangle, ref zangle);
 6    Console.WriteLine($"yangle:{yangle},zangle:{zangle}");
 7
 8    JointPos j_deg = new JointPos(0,0,0,0,0,0);
 9    robot.GetActualJointPosDegree(0, ref j_deg);
10    Console.WriteLine($"joint pos deg:{j_deg.jPos[0]},{j_deg.jPos[1]},{j_deg.jPos[2]},{j_deg.jPos[3]},{j_deg.jPos[4]},{j_deg.jPos[5]}");
11
12    double[] jointSpeed = new double[6];
13    robot.GetActualJointSpeedsDegree(0, ref jointSpeed);
14    Console.WriteLine($"joint speeds deg:{jointSpeed[0]},{jointSpeed[1]},{jointSpeed[2]},{jointSpeed[3]},{jointSpeed[4]},{jointSpeed[5]}");
15
16    double[] jointAcc = new double[6];
17    robot.GetActualJointAccDegree(0, ref jointAcc);
18    Console.WriteLine($"joint acc deg:{jointAcc[0]},{jointAcc[1]},{jointAcc[2]},{jointAcc[3]},{jointAcc[4]},{jointAcc[5]}");
19
20    double tcp_speed = 0, ori_speed = 0;
21    robot.GetTargetTCPCompositeSpeed(0, ref tcp_speed, ref ori_speed);
22    Console.WriteLine($"GetTargetTCPCompositeSpeed tcp {tcp_speed}; ori {ori_speed}");
23
24    robot.GetActualTCPCompositeSpeed(0, ref tcp_speed, ref ori_speed);
25    Console.WriteLine($"GetActualTCPCompositeSpeed tcp {tcp_speed}; ori {ori_speed}");
26
27    double[] targetSpeed = new double[6];
28    robot.GetTargetTCPSpeed(0,ref targetSpeed);
29    Console.WriteLine($"GetTargetTCPSpeed {targetSpeed[0]},{targetSpeed[1]},{targetSpeed[2]},{targetSpeed[3]},{targetSpeed[4]},{targetSpeed[5]}");
30
31    double[] actualSpeed = new double[6];
32    robot.GetActualTCPSpeed(0, ref actualSpeed);
33    Console.WriteLine($"GetTargetTCPSpeed {actualSpeed[0]},{actualSpeed[1]},{actualSpeed[2]},{actualSpeed[3]},{actualSpeed[4]},{actualSpeed[5]}");
34
35    DescPose tcp = new DescPose(0, 0, 0, 0, 0, 0);
36    robot.GetActualTCPPose(0, ref tcp);
37    Console.WriteLine($"tcp pose:{tcp.tran.x},{tcp.tran.y},{tcp.tran.z},{tcp.rpy.rx},{tcp.rpy.ry},{tcp.rpy.rz}");
38
39    DescPose flange = new DescPose(0, 0, 0, 0, 0, 0);
40    robot.GetActualToolFlangePose(0, ref flange);
41    Console.WriteLine($"flange pose:{flange.tran.x},{flange.tran.y},{flange.tran.z},{flange.rpy.rx},{flange.rpy.ry},{flange.rpy.rz}");
42
43    int id = 0;
44    robot.GetActualTCPNum(0, ref id);
45    Console.WriteLine($"tcp num:{id}");
46
47    robot.GetActualWObjNum(0, ref id);
48    Console.WriteLine($"wobj num:{id}");
49
50    double[] jtorque = new double[6];
51    robot.GetJointTorques(0, jtorque);
52    Console.WriteLine($"torques:{jtorque[0]},{jtorque[1]},{jtorque[2]},{jtorque[3]},{jtorque[4]},{jtorque[5]}");
53
54    double t_ms = 0;
55    robot.GetSystemClock(ref t_ms);
56    Console.WriteLine($"system clock:{t_ms}");
57
58    int config = 0;
59    robot.GetRobotCurJointsConfig(ref config);
60    Console.WriteLine($"joint config:{config}");
61
62    byte motionDone = 0;
63    robot.GetRobotMotionDone(ref motionDone);
64    Console.WriteLine($"GetRobotMotionDone :{motionDone}");
65
66    int len = 0;
67    robot.GetMotionQueueLength(ref len);
68    Console.WriteLine($"GetMotionQueueLength :{len}");
69
70    byte emergState = 0;
71    robot.GetRobotEmergencyStopState(ref emergState);
72    Console.WriteLine($"GetRobotEmergencyStopState :{emergState}");
73
74    int comstate = 0;
75    robot.GetSDKComState(ref comstate);
76    Console.WriteLine($"GetSDKComState :{comstate}");
77
78    byte si0_state = 0, si1_state = 0;
79    robot.GetSafetyStopState(ref si0_state, ref si1_state);
80    Console.WriteLine($"GetSafetyStopState :{si0_state} {si1_state}");
81
82    double[] temp = new double[6];
83    robot.GetJointDriverTemperature(temp);
84    Console.WriteLine($"Temperature:{temp[0]},{temp[1]},{temp[2]},{temp[3]},{temp[4]},{temp[5]}");
85
86    double[] torque = new double[6];
87    robot.GetJointDriverTorque(torque);
88    Console.WriteLine($"torque:{torque[0]},{torque[1]},{torque[2]},{torque[3]},{torque[4]},{torque[5]}");
89
90    robot.GetRobotRealTimeState(ref pkg);
91}

8.26. Rozwiązanie odwrotnej kinematyki

1/**
2* @brief  Rozwiązanie odwrotnej kinematyki
3* @param  [in] type 0-pozycja bezwzględna (układ podstawowy), 1-pozycja przyrostowa (układ podstawowy), 2-pozycja przyrostowa (układ narzędzia)
4* @param  [in] desc_pos Pozycja i orientacja kartezjańska
5* @param  [in] config Konfiguracja przestrzeni stawów, [-1]-obliczenie z odniesieniem do bieżącej pozycji stawów, [0~7]-rozwiązanie zgodnie z określoną konfiguracją przestrzeni stawów
6* @param  [out] joint_pos Pozycja stawów
7* @return  Kod błędu
8*/
9int GetInverseKin(int type, DescPose desc_pos, int config, ref JointPos joint_pos);

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

1/**
2* @brief  Rozwiązanie odwrotnej kinematyki, sprawdzenie, czy istnieje rozwiązanie w odniesieniu do określonej pozycji stawów
3* @param  [in] type 0-pozycja bezwzględna (układ podstawowy), 1-pozycja przyrostowa (układ podstawowy), 2-pozycja przyrostowa (układ narzędzia)
4* @param  [in] desc_pos Pozycja 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*/
9int GetInverseKinRef(int posMode, DescPose desc_pos, JointPos joint_pos_ref, ref JointPos joint_pos);

8.28. Rozwiązanie odwrotnej kinematyki z uwzględnieniem pozycji osi rozszerzonej w przestrzeni kartezjańskiej

 1/**
 2* @brief Rozwiązanie odwrotnej kinematyki z uwzględnieniem pozycji osi rozszerzonej w przestrzeni kartezjańskiej
 3* @param [in] type 0-pozycja bezwzględna (układ podstawowy), 1-pozycja przyrostowa (układ podstawowy), 2-pozycja przyrostowa (układ narzędzia)
 4* @param [in] desc_pos Pozycja i orientacja kartezjańska
 5* @param [in] exaxis Pozycja osi rozszerzonej
 6* @param [in] tool Numer narzędzia
 7* @param [in] workPiece Numer przedmiotu
 8* @param [out] joint_pos Pozycja stawów
 9* @param [in] config -1: automatyczne rozwiązanie, 0-7 odpowiada ośmiu zestawom rozwiązań
10* @return Kod błędu
11*/
12public int GetInverseKinExaxis(int type, DescPose desc_pos, ExaxisPos exaxis, int tool, int workPiece, ref JointPos joint_pos, int config = -1);

8.29. Przykład kodu rozwiązania odwrotnej kinematyki z uwzględnieniem pozycji osi rozszerzonej

 1public void TestInverseKinExaxis()
 2{
 3    ROBOT_STATE_PKG pkg = new ROBOT_STATE_PKG();
 4    robot.GetRobotRealTimeState(ref pkg);
 5    int toolnum = pkg.tool;
 6    int workPcsNum = pkg.user;
 7
 8    DescPose desc = new DescPose(-547.469, -47.361, 184.149, 169.843, 4.579, 82.557);
 9    ExaxisPos exaxis = new ExaxisPos(0.0, 0.0, 0.0, 0.0);
10    JointPos jointPos = new JointPos(0.0, 0.0, 0.0, 0.0, 0.0, 0.0);
11
12    robot.GetInverseKinExaxis(0, desc, exaxis, toolnum, workPcsNum, ref jointPos, 0);
13    Console.WriteLine($"GetInverseKinExaxis joint is {jointPos.jPos[0]}, {jointPos.jPos[1]}, {jointPos.jPos[2]}, {jointPos.jPos[3]}, {jointPos.jPos[4]}, {jointPos.jPos[5]}");
14}

8.30. Sprawdzenie, czy istnieje rozwiązanie odwrotnej kinematyki

1/**
2* @brief Rozwiązanie odwrotnej kinematyki, sprawdzenie, czy istnieje rozwiązanie dla określonej referencyjnej pozycji stawów
3* @param [in] posMode 0-pozycja bezwzględna, 1-pozycja względna - układ podstawowy, 2-pozycja względna - układ narzędzia
4* @param [in] desc_pos Pozycja i orientacja kartezjańska
5* @param [in] joint_pos_ref Referencyjna pozycja stawów
6* @param [out] hasResult 0-brak rozwiązania, 1-jest rozwiązanie
7* @return Kod błędu
8*/
9int GetInverseKinHasSolution(int posMode, DescPose desc_pos, JointPos joint_pos_ref, ref bool hasResult);

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

 1/**
 2* @brief  Pobierz 8 zestawów rozwiązań odwrotnych
 3* @param [in] tcp_pose 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] jPos Wyjście 8 zestawów kątów przegubów
 8* @return Kod błędu
 9*/
10public int TCFToAllJoint( DescPose tcp_pose, int tool, int workpiece, ExaxisPos exPos , ref JointPos[] jPos)

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

 1public int TestTCFToAllJoint()
 2{
 3    // Get current TCP pose
 4    DescPose curTcp = new DescPose(0, 0, 0, 0, 0, 0);
 5    int rtn = robot.GetActualTCPPose(1, ref curTcp);
 6    if (rtn != 0)
 7    {
 8        return rtn;
 9    }
10    Console.WriteLine($"Aktualna pozycja TCP: x={curTcp.tran.x:F3}, y={curTcp.tran.y:F3}, z={curTcp.tran.z:F3}, " +
11                        $"a={curTcp.rpy.rx:F3}, b={curTcp.rpy.ry:F3}, c={curTcp.rpy.rz:F3}");
12
13    // Extension axis position, all zeros here
14    ExaxisPos exPos = new ExaxisPos(0, 0, 0, 0);
15
16    // 8 sets of inverse kinematics results
17    JointPos[] allJoints = new JointPos[8];
18    for (int i = 0; i < 8; i++)
19    {
20        allJoints[i] = new JointPos(0, 0, 0, 0, 0, 0);
21    }
22
23    // Call TCFToAllJoint to get 8 sets of inverse solutions, tool=0, workpiece=0
24    rtn = robot.TCFToAllJoint(curTcp, 0, 0, exPos, ref allJoints);
25    if (rtn != 0)
26    {
27        return rtn;
28    }
29
30    // Verify each solution with forward kinematics
31    for (int i = 0; i < 8; i++)
32    {
33        JointPos joint = allJoints[i];
34
35        Console.WriteLine($"JOINT{i + 1}: " +
36                            $"j1={joint.jPos[0]:F3}, j2={joint.jPos[1]:F3}, j3={joint.jPos[2]:F3}, " +
37                            $"j4={joint.jPos[3]:F3}, j5={joint.jPos[4]:F3}, j6={joint.jPos[5]:F3}");
38
39        // Cartesian pose corresponding to the i-th inverse solution
40        DescPose pos = new DescPose(0, 0, 0, 0, 0, 0);
41        rtn = robot.GetForwardKin(joint, ref pos);
42        if (rtn != 0)
43        {
44            // Failure of one set does not affect the others
45            continue;
46        }
47
48        Console.WriteLine($"POS{i + 1}: " +
49                            $"x={pos.tran.x:F3}, y={pos.tran.y:F3}, z={pos.tran.z:F3}, " +
50                            $"a={pos.rpy.rx:F3}, b={pos.rpy.ry:F3}, c={pos.rpy.rz:F3}");
51    }
52
53    return 0;
54}

8.33. Rozwiązanie prostej kinematyki

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

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

 1private void button30_Click(object sender, EventArgs e)
 2{
 3    JointPos j1 = new JointPos(-11.904f, -99.669f, 117.473f, -108.616f, -91.726f, 74.256f);
 4    DescPose desc_pos1 = new DescPose(-419.524f, -13.000f, 351.569f, -178.118f, 0.314f, 3.833f);
 5
 6    JointPos inverseRtn = new JointPos(0, 0, 0, 0, 0, 0);
 7
 8    robot.GetInverseKin(0, desc_pos1, -1, ref inverseRtn);
 9    Console.WriteLine($"dcs1 GetInverseKin rtn is {inverseRtn.jPos[0]} {inverseRtn.jPos[1]} {inverseRtn.jPos[2]} {inverseRtn.jPos[3]} {inverseRtn.jPos[4]} {inverseRtn.jPos[5]}");
10    robot.GetInverseKinRef(0,  desc_pos1, j1, ref inverseRtn);
11    Console.WriteLine($"dcs1 GetInverseKinRef rtn is {inverseRtn.jPos[0]} {inverseRtn.jPos[1]} {inverseRtn.jPos[2]} {inverseRtn.jPos[3]} {inverseRtn.jPos[4]} {inverseRtn.jPos[5]}");
12
13    bool hasResut = false;
14    robot.GetInverseKinHasSolution(0,  desc_pos1,  j1, ref hasResut);
15    Console.WriteLine($"dcs1 GetInverseKinRef result {hasResut}");
16
17    DescPose forwordResult = new DescPose(0, 0, 0, 0, 0, 0);
18    robot.GetForwardKin(j1, ref forwordResult);
19    Console.WriteLine($"jpos1 forwordResult rtn is {forwordResult.tran.x} {forwordResult.tran.y} {forwordResult.tran.z} {forwordResult.rpy.rx} {forwordResult.rpy.ry} {forwordResult.rpy.rz}");
20}

8.35. Sprawdzenie danych punktu zarządzania nauczaniem robota

1/**
2* @brief Sprawdza dane punktu zarządzania nauczaniem robota
3* @param [in] name    Nazwa punktu
4* @param [out] data   Dane punktu double[20]{x,y,z,rx,ry,rz,j1,j2,j3,j4,j5,j6,tool, wobj,speed,acc,e1,e2,e3,e4}
5* @return Kod błędu
6*/
7int GetRobotTeachingPoint(string name, ref double[] data);

8.36. Pobranie wartości kompensacji parametrów DH robota

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*/
6int GetDHCompensation(ref double[] dhCompensation);

8.37. Pobranie kodu SN skrzynki sterowniczej

1/**
2* @brief Pobiera kod SN skrzynki sterowniczej
3* @param [out] SNCode Kod SN skrzynki sterowniczej
4* @return Kod błędu
5*/
6int GetRobotSN(ref string SNCode);

8.38. Przykład kodu sprawdzania danych punktu zarządzania nauczaniem robota

 1private void button31_Click(object sender, EventArgs e)
 2{
 3    string name = "A0";
 4    double[] data = new double[20];
 5    int rtn = robot.GetRobotTeachingPoint(name, ref data);
 6    Console.WriteLine(" {0} name is: {1} \n", rtn, name);
 7    for (int i = 0; i < 20; i++)
 8    {
 9        Console.WriteLine("data is: {0} \n", data[i]);
10    }
11
12    int que_len = 0;
13    rtn = robot.GetMotionQueueLength(ref que_len);
14    Console.WriteLine("GetMotionQueueLength rtn is: {0}, queue length is: {1} \n", rtn, que_len);
15
16    double[] dh = { 0, 0, 0, 0, 0, 0 };
17    int retval = 0;
18    retval = robot.GetDHCompensation(ref dh);
19    Console.WriteLine($"retval is  {retval}");
20    Console.WriteLine($"dh is {dh[0]}, {dh[1]}, {dh[2]}, {dh[3]}, {dh[4]}, {dh[5]}");
21    string SN = "";
22    robot.GetRobotSN(ref SN);
23    Console.WriteLine($"robot SN is  {SN}");
24}

8.39. 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*/
11int GetToolCoordWithID(int id, ref DescPose coord, ref int type, ref int install, ref int toolID, ref int loadNo)

8.40. 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*/
8public int GetWObjCoordWithID(int id, ref DescPose coord, ref int refFrame)

8.41. 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*/
8public int GetExToolCoordWithID(int id, ref DescPose coord, ref DescPose tcoord)

8.42. 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*/
9public int GetExAxisCoordWithID(int id, ref DescPose coord, ref int axisCoordNum, ref int calibFlag)

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

Dodane w wersji C#SDK-V1.1.8: Web-3.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 */
6public int GetCurToolCoord(ref DescPose coord)

8.44. Pobranie bieżącego układu współrzędnych przedmiotu

Dodane w wersji C#SDK-V1.1.8: Web-3.8.6

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

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

Dodane w wersji C#SDK-V1.1.8: Web-3.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 */
6public int GetCurExToolCoord(ref DescPose coord)

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

Dodane w wersji C#SDK-V1.1.8: Web-3.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 */
6public int GetCurExAxisCoord(ref DescPose coord)

8.47. Przykład Kodu Pobierania Współrzędnych według ID

Zmienione w wersji C#SDK-V3.9.8.

  1public int TestCoord()
  2{
  3    int rtn;
  4    int id = 1;
  5
  6    // GetToolCoordWithID
  7    DescPose toolCoord = new DescPose(0, 0, 0, 0, 0, 0);
  8    int type = 0, install = 0, toolID = 0, loadNo = 0;
  9    rtn = robot.GetToolCoordWithID(id, ref toolCoord, ref type, ref install, ref toolID, ref loadNo);
 10    Console.WriteLine("GetToolCoordWithID {0}, {1:F3} {2:F3} {3:F3} {4:F3} {5:F3} {6:F3}, type={7}, install={8}, toolID={9}, loadNo={10}",
 11        id, toolCoord.tran.x, toolCoord.tran.y, toolCoord.tran.z,
 12        toolCoord.rpy.rx, toolCoord.rpy.ry, toolCoord.rpy.rz, type, install, toolID, loadNo);
 13
 14    // GetWObjCoordWithID
 15    DescPose wobjCoord = new DescPose(0, 0, 0, 0, 0, 0);
 16    int refFrame = 0;
 17    rtn = robot.GetWObjCoordWithID(id, ref wobjCoord, ref refFrame);
 18    Console.WriteLine("GetWObjCoordWithID {0}, {1:F3} {2:F3} {3:F3} {4:F3} {5:F3} {6:F3}, refFrame={7}",
 19        id, wobjCoord.tran.x, wobjCoord.tran.y, wobjCoord.tran.z,
 20        wobjCoord.rpy.rx, wobjCoord.rpy.ry, wobjCoord.rpy.rz, refFrame);
 21
 22    // GetExToolCoordWithID
 23    DescPose extoolCoord = new DescPose(0, 0, 0, 0, 0, 0);
 24    DescPose exworkpieceCoord = new DescPose(0, 0, 0, 0, 0, 0);
 25    rtn = robot.GetExToolCoordWithID(21, ref extoolCoord, ref exworkpieceCoord);
 26    Console.WriteLine("GetExToolCoordWithID 21, {0:F3} {1:F3} {2:F3} {3:F3} {4:F3} {5:F3}",
 27        extoolCoord.tran.x, extoolCoord.tran.y, extoolCoord.tran.z,
 28        extoolCoord.rpy.rx, extoolCoord.rpy.ry, extoolCoord.rpy.rz);
 29    Console.WriteLine("  tcoord: {0:F3} {1:F3} {2:F3} {3:F3} {4:F3} {5:F3}",
 30        exworkpieceCoord.tran.x, exworkpieceCoord.tran.y, exworkpieceCoord.tran.z,
 31        exworkpieceCoord.rpy.rx, exworkpieceCoord.rpy.ry, exworkpieceCoord.rpy.rz);
 32
 33    // GetExAxisCoordWithID
 34    DescPose exAxisCoord = new DescPose(0, 0, 0, 0, 0, 0);
 35    int axisCoordNum = 0, calibFlag = 0;
 36    rtn = robot.GetExAxisCoordWithID(id, ref exAxisCoord, ref axisCoordNum, ref calibFlag);
 37    Console.WriteLine("GetExAxisCoordWithID {0}, {1:F3} {2:F3} {3:F3} {4:F3} {5:F3} {6:F3}, axisCoordNum={7}, calibFlag={8}",
 38        id, exAxisCoord.tran.x, exAxisCoord.tran.y, exAxisCoord.tran.z,
 39        exAxisCoord.rpy.rx, exAxisCoord.rpy.ry, exAxisCoord.rpy.rz, axisCoordNum, calibFlag);
 40
 41    // GetTargetPayloadWithID
 42    double weight = 0.0;
 43    DescTran cog = new DescTran(0, 0, 0);
 44    rtn = robot.GetTargetPayloadWithID(id, ref weight, ref cog);
 45    Console.WriteLine("GetTargetPayloadWithID {0}, {1:F3} {2:F3} {3:F3} {4:F3}",
 46        id, weight, cog.x, cog.y, cog.z);
 47
 48    // GetCurToolCoord
 49    rtn = robot.GetCurToolCoord(ref toolCoord);
 50    Console.WriteLine("GetCurToolCoord {0:F3} {1:F3} {2:F3} {3:F3} {4:F3} {5:F3}",
 51        toolCoord.tran.x, toolCoord.tran.y, toolCoord.tran.z,
 52        toolCoord.rpy.rx, toolCoord.rpy.ry, toolCoord.rpy.rz);
 53
 54    // GetCurWObjCoord
 55    rtn = robot.GetCurWObjCoord(ref wobjCoord);
 56    Console.WriteLine("GetCurWObjCoord {0:F3} {1:F3} {2:F3} {3:F3} {4:F3} {5:F3}",
 57        wobjCoord.tran.x, wobjCoord.tran.y, wobjCoord.tran.z,
 58        wobjCoord.rpy.rx, wobjCoord.rpy.ry, wobjCoord.rpy.rz);
 59
 60    // GetCurExToolCoord
 61    rtn = robot.GetCurExToolCoord(ref extoolCoord);
 62    Console.WriteLine("GetCurExToolCoord {0:F3} {1:F3} {2:F3} {3:F3} {4:F3} {5:F3}",
 63        extoolCoord.tran.x, extoolCoord.tran.y, extoolCoord.tran.z,
 64        extoolCoord.rpy.rx, extoolCoord.rpy.ry, extoolCoord.rpy.rz);
 65
 66    // GetCurExAxisCoord
 67    rtn = robot.GetCurExAxisCoord(ref exAxisCoord);
 68    Console.WriteLine("GetCurExAxisCoord {0:F3} {1:F3} {2:F3} {3:F3} {4:F3} {5:F3}",
 69        exAxisCoord.tran.x, exAxisCoord.tran.y, exAxisCoord.tran.z,
 70        exAxisCoord.rpy.rx, exAxisCoord.rpy.ry, exAxisCoord.rpy.rz);
 71
 72    // GetTargetPayload / GetTargetPayloadCog
 73    double weightT = 0.0;
 74    DescTran cogT = new DescTran(0, 0, 0);
 75    robot.GetTargetPayload(0, ref weightT);
 76    robot.GetTargetPayloadCog(0, ref cogT);
 77    Console.WriteLine("GetTargetPayload {0:F3} {1:F3} {2:F3} {3:F3}",
 78        weightT, cogT.x, cogT.y, cogT.z);
 79
 80    // SetToolCoord
 81    DescPose coordSet = new DescPose(0, 1, 2, 3, 4, 5);
 82    rtn = robot.SetToolCoord(1, coordSet, 0, 0, 1, 0);
 83    Console.WriteLine("SetToolCoord(1) rtn={0}", rtn);
 84
 85    // SetWObjCoord
 86    rtn = robot.SetWObjCoord(1, coordSet, 0);
 87    Console.WriteLine("SetWObjCoord(1) rtn={0}", rtn);
 88
 89    // SetLoadWeight + SetLoadCoord
 90    rtn = robot.SetLoadWeight(1, 1.3f);
 91    Console.WriteLine("SetLoadWeight(1,1.3) rtn={0}", rtn);
 92
 93    DescTran loadCog = new DescTran(10, 20, 30);
 94    rtn = robot.SetLoadCoord(1, loadCog);
 95    Console.WriteLine("SetLoadCoord(1,10,20,30) rtn={0}", rtn);
 96
 97    // SetExToolCoord
 98    DescPose etcp = new DescPose(0, 0, 100, 0, 0, 0);
 99    DescPose etool = new DescPose(0, 0, 50, 0, 0, 0);
100    rtn = robot.SetExToolCoord(21, etcp, etool);
101    Console.WriteLine("SetExToolCoord(21) rtn={0}", rtn);
102    // SetExToolList
103    rtn = robot.SetExToolList(21, etcp, etool);
104    Console.WriteLine("SetExToolList(21) rtn={0}", rtn);
105
106    // ExtAxisActiveECoordSys
107    rtn = robot.ExtAxisActiveECoordSys(1, 1, coordSet, 1);
108    Console.WriteLine("ExtAxisActiveECoordSys(1,1,..,1) rtn={0}", rtn);
109
110    return 0;
111}