9. Odtwarzanie trajektorii robota
9.1. Ustawienie parametrów rejestracji trajektorii TPD
1/**
2* @brief Ustawia parametry rejestracji trajektorii TPD
3* @param [in] type Typ rejestrowanych danych, 1-pozycja stawów
4* @param [in] name Nazwa pliku trajektorii
5* @param [in] period_ms Okres próbkowania danych, stała wartość 2 ms lub 4 ms lub 8 ms
6* @param [in] di_choose Wybór DI, bit0~bit7 odpowiadają DI0~DI7 skrzynki sterowniczej, bit8~bit9 odpowiadają końcowym DI0~DI1, 0-nie wybieraj, 1-wybierz
7* @param [in] do_choose Wybór DO, bit0~bit7 odpowiadają DO0~DO7 skrzynki sterowniczej, bit8~bit9 odpowiadają końcowym DO0~DO1, 0-nie wybieraj, 1-wybierz
8* @return Kod błędu
9*/
10int SetTPDParam(int type, string name, int period_ms, UInt16 di_choose, UInt16 do_choose);
9.2. Rozpoczęcie rejestracji trajektorii TPD
1/**
2* @brief Rozpoczyna rejestrację trajektorii TPD
3* @param [in] type Typ rejestrowanych danych, 1-pozycja stawów
4* @param [in] name Nazwa pliku trajektorii
5* @param [in] period_ms Okres próbkowania danych, stała wartość 2 ms lub 4 ms lub 8 ms
6* @param [in] di_choose Wybór DI, bit0~bit7 odpowiadają DI0~DI7 skrzynki sterowniczej, bit8~bit9 odpowiadają końcowym DI0~DI1, 0-nie wybieraj, 1-wybierz
7* @param [in] do_choose Wybór DO, bit0~bit7 odpowiadają DO0~DO7 skrzynki sterowniczej, bit8~bit9 odpowiadają końcowym DO0~DO1, 0-nie wybieraj, 1-wybierz
8* @return Kod błędu
9*/
10int SetTPDStart(int type, string name, int period_ms, UInt16 di_choose, UInt16 do_choose);
9.3. Zatrzymanie rejestracji trajektorii TPD
1/**
2* @brief Zatrzymuje rejestrację trajektorii TPD
3* @return Kod błędu
4*/
5int SetWebTPDStop();
9.4. Usunięcie rejestracji trajektorii TPD
1/**
2* @brief Usuwa rejestrację trajektorii TPD
3* @param [in] name Nazwa pliku trajektorii
4* @return Kod błędu
5*/
6int SetTPDDelete(string name);
9.5. Wstępne ładowanie trajektorii TPD
1/**
2* @brief Wstępne ładowanie trajektorii
3* @param [in] name Nazwa pliku trajektorii
4* @return Kod błędu
5*/
6int LoadTPD(string name);
9.6. Pobranie początkowej pozycji i orientacji trajektorii TPD
1/**
2* @brief Pobiera początkową pozycję i orientację trajektorii
3* @param [in] name Nazwa pliku trajektorii
4* @param [out] desc_pose Początkowa pozycja i orientacja trajektorii
5* @return Kod błędu
6*/
7int GetTPDStartPose(string name, ref DescPose desc_pose);
9.7. Odtworzenie trajektorii TPD
1/**
2* @brief Odtwarza trajektorię
3* @param [in] name Nazwa pliku trajektorii
4* @param [in] blend 0-niewygładzone, 1-wygładzone
5* @param [in] ovl Procent skalowania prędkości, zakres [0~100]
6* @return Kod błędu
7*/
8int MoveTPD(string name, byte blend, float ovl);
9.8. Przykład kodu rejestracji trajektorii TPD robota
1private void btnTPDMove_Click(object sender, EventArgs e)
2{
3 int type = 1;
4 string name = "tpd2025";
5 int period_ms = 4;
6 ushort di_choose = 0;
7 ushort do_choose = 0;
8
9 robot.SetTPDParam(type, name, period_ms, di_choose, do_choose);
10
11 robot.Mode(1);
12 Thread.Sleep(1000);
13 robot.DragTeachSwitch(1);
14 robot.SetTPDStart(type, name, period_ms, di_choose, do_choose);
15 Thread.Sleep(10000);
16 robot.SetWebTPDStop();
17 robot.DragTeachSwitch(0);
18
19 float ovl = 100.0f;
20 byte blend = 0;
21
22 DescPose start_pose = new DescPose();
23
24 int rtn = robot.LoadTPD(name);
25 Console.WriteLine("LoadTPD rtn is: {0}\n", rtn);
26
27 robot.GetTPDStartPose(name, ref start_pose);
28 Console.WriteLine("start pose, xyz is: {0} {1} {2}. rpy is: {3} {4} {5} \n",
29 start_pose.tran.x, start_pose.tran.y, start_pose.tran.z,
30 start_pose.rpy.rx, start_pose.rpy.ry, start_pose.rpy.rz);
31 robot.MoveCart(start_pose, 0, 0, 100, 100, ovl, -1, -1);
32 Thread.Sleep(1000);
33
34 rtn = robot.MoveTPD(name, blend, ovl);
35 Console.WriteLine("MoveTPD rtn is: {0}\n", rtn);
36 Thread.Sleep(5000);
37
38 robot.SetTPDDelete(name);
39}
9.9. Wstępne przetwarzanie zewnętrznego pliku trajektorii
1/**
2* @brief Wstępne przetwarzanie zewnętrznego pliku trajektorii
3* @param [in] name Nazwa pliku trajektorii
4* @param [in] ovl Procent skalowania prędkości, zakres [0~100]
5* @param [in] opt 1-punkt sterujący, domyślnie 1
6* @return Kod błędu
7*/
8int LoadTrajectoryJ(string name, float ovl, int opt);
9.10. Odtworzenie trajektorii z zewnętrznego pliku trajektorii
1/**
2* @brief Odtwarza trajektorię z zewnętrznego pliku trajektorii
3* @return Kod błędu
4*/
5int MoveTrajectoryJ();
9.11. Pobranie początkowej pozycji trajektorii z pliku trajektorii
1/**
2* @brief Pobiera początkową pozycję trajektorii z pliku trajektorii
3* @param [in] name Nazwa pliku trajektorii
4* @param [out] desc_pose Początkowa pozycja i orientacja trajektorii
5* @return Kod błędu
6*/
7int GetTrajectoryStartPose(string name, ref DescPose desc_pose);
9.12. Pobranie numeru punktu trajektorii z pliku trajektorii
1/**
2* @brief Pobiera numer punktu trajektorii
3* @param [out] pnum Numer punktu trajektorii
4* @return Kod błędu
5*/
6int GetTrajectoryPointNum(ref int pnum);
9.13. Ustawienie prędkości podczas odtwarzania trajektorii
1/**
2* @brief Ustawia prędkość podczas odtwarzania trajektorii
3* @param [in] ovl Procent prędkości
4* @param [in] mode 0-tryb zmniejszania prędkości 1-bezpośrednie przełączanie
5* @return Kod błędu
6*/
7public int SetTrajectoryJSpeed(double ovl, int mode = 0)
9.14. Przykład kodu ustawiania prędkości podczas odtwarzania trajektorii
1public int RunTrajectoryJ(string localFilePath = "D://zUP/trajHelix_aima_1.txt", string remoteFilePath = "/fruser/traj/trajHelix_aima_1.txt",
2int initialSpeedPercent = 50, int trajSpeedMode = 1)
3{
4 int rtn;
5
6 // 1. Przesłanie pliku trajektorii J
7 rtn = robot.TrajectoryJUpLoad(localFilePath);
8 if (rtn != 0)
9 {
10 Console.WriteLine($"Upload TrajectoryJ failed: {rtn}");
11 return rtn;
12 }
13 Console.WriteLine($"Upload TrajectoryJ success: {localFilePath}");
14
15 // 2. Załadowanie pliku trajektorii
16 rtn = robot.LoadTrajectoryJ(remoteFilePath, 100, 1);
17 if (rtn != 0)
18 {
19 Console.WriteLine($"LoadTrajectoryJ failed: {rtn}");
20 return rtn;
21 }
22 Console.WriteLine($"LoadTrajectoryJ success: {remoteFilePath}");
23
24 // 3. Pobranie początkowej pozycji trajektorii
25 DescPose trajStartPose = new DescPose(0, 0, 0, 0, 0, 0);
26 rtn = robot.GetTrajectoryStartPose(remoteFilePath, ref trajStartPose);
27 if (rtn != 0)
28 {
29 Console.WriteLine($"GetTrajectoryStartPose failed: {rtn}");
30 return rtn;
31 }
32 Console.WriteLine($"Trajectory start pose: ({trajStartPose.tran.x}, {trajStartPose.tran.y}, {trajStartPose.tran.z}, " +
33 $"{trajStartPose.rpy.rx}, {trajStartPose.rpy.ry}, {trajStartPose.rpy.rz})");
34
35 // 4. Przejście do punktu początkowego trajektorii (używając PTP w przestrzeni kartezjańskiej)
36 robot.SetSpeed(initialSpeedPercent);
37 rtn = robot.MoveCart(trajStartPose, 0, 0, 100, 100, 100, -1, -1);
38 if (rtn != 0)
39 {
40 Console.WriteLine($"MoveCart to start pose failed: {rtn}");
41 return rtn;
42 }
43
44 // 5. Pobranie liczby punktów trajektorii (opcjonalne, tylko do wyświetlenia)
45 int trajPointNum = 0;
46 rtn = robot.GetTrajectoryPointNum(ref trajPointNum);
47 if (rtn != 0)
48 {
49 Console.WriteLine($"GetTrajectoryPointNum failed: {rtn}");
50 // Nie zwracaj, kontynuuj wykonywanie
51 }
52 else
53 {
54 Console.WriteLine($"Trajectory points count: {trajPointNum}");
55 }
56
57 // 6. Rozpoczęcie wykonywania ruchu trajektorii (nieblokujące)
58 rtn = robot.MoveTrajectoryJ();
59 if (rtn != 0)
60 {
61 Console.WriteLine($"MoveTrajectoryJ failed: {rtn}");
62 return rtn;
63 }
64 Console.WriteLine("MoveTrajectoryJ started.");
65
66 // 7. Dynamiczna zmiana prędkości podczas ruchu (naprzemiennie 10% i 80%)
67 // Użyj GetRobotMotionDone do sprawdzenia, czy ruch został zakończony
68 byte motionDone = 0;
69 robot.GetRobotMotionDone(ref motionDone);
70
71 while (motionDone == 0)
72 {
73 // Ustaw prędkość na 10%
74 rtn = robot.SetTrajectoryJSpeed(10.0, trajSpeedMode);
75 Console.WriteLine($"SetTrajectoryJSpeed to 10% returned: {rtn}");
76 robot.Sleep(1000);
77
78 // Ponownie sprawdź stan ruchu
79 robot.GetRobotMotionDone(ref motionDone);
80 if (motionDone != 0) break;
81
82 // Ustaw prędkość na 80%
83 rtn = robot.SetTrajectoryJSpeed(80.0, trajSpeedMode);
84 Console.WriteLine($"SetTrajectoryJSpeed to 80% returned: {rtn}");
85 robot.Sleep(1000);
86
87 // Ponownie sprawdź stan ruchu
88 robot.GetRobotMotionDone(ref motionDone);
89 }
90
91 Console.WriteLine("Trajectory J motion completed.");
92 return 0;
93}
9.15. Ustawienie siły i momentu podczas odtwarzania trajektorii
1/**
2* @brief Ustawia siłę i moment podczas odtwarzania trajektorii
3* @param [in] ft Siły w trzech kierunkach i momenty obrotowe, jednostka N i Nm
4* @return Kod błędu
5*/
6int SetTrajectoryJForceTorque(ForceTorque ft);
9.16. Ustawienie siły wzdłuż osi X podczas odtwarzania trajektorii
1/**
2* @brief Ustawia siłę wzdłuż osi X podczas odtwarzania trajektorii
3* @param [in] fx Siła wzdłuż osi X, jednostka N
4* @return Kod błędu
5*/
6int SetTrajectoryJForceFx(double fx);
9.17. Ustawienie siły wzdłuż osi Y podczas odtwarzania trajektorii
1/**
2* @brief Ustawia siłę wzdłuż osi Y podczas odtwarzania trajektorii
3* @param [in] fy Siła wzdłuż osi Y, jednostka N
4* @return Kod błędu
5*/
6int SetTrajectoryJForceFy(double fy);
9.18. Ustawienie siły wzdłuż osi Z podczas odtwarzania trajektorii
1/**
2* @brief Ustawia siłę wzdłuż osi Z podczas odtwarzania trajektorii
3* @param [in] fz Siła wzdłuż osi Z, jednostka N
4* @return Kod błędu
5*/
6int SetTrajectoryJForceFz(double fz);
9.19. Ustawienie momentu obrotowego wokół osi X podczas odtwarzania trajektorii
1/**
2* @brief Ustawia moment obrotowy wokół osi X podczas odtwarzania trajektorii
3* @param [in] tx Moment obrotowy wokół osi X, jednostka Nm
4* @return Kod błędu
5*/
6int SetTrajectoryJTorqueTx(double tx);
9.20. Ustawienie momentu obrotowego wokół osi Y podczas odtwarzania trajektorii
1/**
2* @brief Ustawia moment obrotowy wokół osi Y podczas odtwarzania trajektorii
3* @param [in] ty Moment obrotowy wokół osi Y, jednostka Nm
4* @return Kod błędu
5*/
6int SetTrajectoryJTorqueTy(double ty);
9.21. Ustawienie momentu obrotowego wokół osi Z podczas odtwarzania trajektorii
1/**
2* @brief Ustawia moment obrotowy wokół osi Z podczas odtwarzania trajektorii
3* @param [in] tz Moment obrotowy wokół osi Z, jednostka Nm
4* @return Kod błędu
5*/
6int SetTrajectoryJTorqueTz(double tz);
9.22. Przesłanie pliku trajektorii J
1/**
2* @brief Przesyła plik trajektorii J
3* @param [in] filePath Pełna ścieżka przesyłanego pliku trajektorii C://test/testJ.txt
4* @return Kod błędu
5*/
6int TrajectoryJUpLoad(string filePath);
9.23. Usunięcie pliku trajektorii J
1/**
2* @brief Usuwa plik trajektorii J
3* @param [in] fileName Nazwa pliku testJ.txt
4* @return Kod błędu
5*/
6int TrajectoryJDelete(string fileName);
9.24. Przykład kodu odtwarzania pliku trajektorii J robota
1private void button33_Click(object sender, EventArgs e)
2{
3 int rtn = robot.TrajectoryJUpLoad("D://zUP/spray_traj1.txt");
4 Console.WriteLine("Upload TrajectoryJ A {0}\n", rtn);
5
6 string traj_file_name = "/fruser/traj/spray_traj1.txt";
7 rtn = robot.LoadTrajectoryJ(traj_file_name, 100, 1);
8 Console.WriteLine("LoadTrajectoryJ {0}, rtn is: {1}\n", traj_file_name, rtn);
9
10 DescPose traj_start_pose = new DescPose();
11 rtn = robot.GetTrajectoryStartPose(traj_file_name, ref traj_start_pose);
12 Console.WriteLine("GetTrajectoryStartPose is: {0}\n", rtn);
13 Console.WriteLine("desc_pos:{0},{1},{2},{3},{4},{5}\n",
14 traj_start_pose.tran.x, traj_start_pose.tran.y, traj_start_pose.tran.z,
15 traj_start_pose.rpy.rx, traj_start_pose.rpy.ry, traj_start_pose.rpy.rz);
16
17 Thread.Sleep(1000);
18
19 robot.SetSpeed(50);
20 robot.MoveCart(traj_start_pose, 0, 0, 100, 100, 100, -1, -1);
21
22 int traj_num = 0;
23 rtn = robot.GetTrajectoryPointNum(ref traj_num);
24 Console.WriteLine("GetTrajectoryStartPose rtn is: {0}, traj num is: {1}\n", rtn, traj_num);
25
26 rtn = robot.SetTrajectoryJSpeed(50.0f);
27 Console.WriteLine("SetTrajectoryJSpeed is: {0}\n", rtn);
28
29 ForceTorque traj_force = new ForceTorque();
30 traj_force.fx = 10;
31 rtn = robot.SetTrajectoryJForceTorque(traj_force);
32 Console.WriteLine("SetTrajectoryJForceTorque rtn is: {0}\n", rtn);
33
34 rtn = robot.SetTrajectoryJForceFx(10.0f);
35 Console.WriteLine("SetTrajectoryJForceFx rtn is: {0}\n", rtn);
36
37 rtn = robot.SetTrajectoryJForceFy(0.0f);
38 Console.WriteLine("SetTrajectoryJForceFy rtn is: {0}\n", rtn);
39
40 rtn = robot.SetTrajectoryJForceFz(0.0f);
41 Console.WriteLine("SetTrajectoryJForceFz rtn is: {0}\n", rtn);
42
43 rtn = robot.SetTrajectoryJTorqueTx(10.0f);
44 Console.WriteLine("SetTrajectoryJTorqueTx rtn is: {0}\n", rtn);
45
46 rtn = robot.SetTrajectoryJTorqueTy(10.0f);
47 Console.WriteLine("SetTrajectoryJTorqueTy rtn is: {0}\n", rtn);
48
49 rtn = robot.SetTrajectoryJTorqueTz(10.0f);
50 Console.WriteLine("SetTrajectoryJTorqueTz rtn is: {0}\n", rtn);
51
52 rtn = robot.MoveTrajectoryJ();
53 Console.WriteLine("MoveTrajectoryJ rtn is: {0}\n", rtn);
54}
9.25. Wstępne przetwarzanie trajektorii (wyprzedzenie trajektorii)
1/**
2* @brief Wstępne przetwarzanie trajektorii (wyprzedzenie trajektorii)
3* @param [in] name Nazwa pliku trajektorii
4* @param [in] mode Tryb próbkowania, 0-brak próbkowania; 1-próbkowanie w równych odstępach danych; 2-próbkowanie z ograniczeniem błędu
5* @param [in] errorLim Ograniczenie błędu, stosowane przy aproksymacji liniowej
6* @param [in] type Sposób wygładzania, 0-wygładzanie Beziera
7* @param [in] precision Dokładność wygładzania, stosowana przy wygładzaniu Beziera
8* @param [in] vamx Ustawiona maksymalna prędkość, mm/s
9* @param [in] amax Ustawione maksymalne przyspieszenie, mm/s²
10* @param [in] jmax Ustawione maksymalne gwałtowność, mm/s³
11* @return Kod błędu
12*/
13int LoadTrajectoryLA(string name, int mode, double errorLim, int type, double precision, double vamx, double amax, double jmax);
9.26. Odtworzenie trajektorii (wyprzedzenie trajektorii)
1/**
2* @brief Odtwarza trajektorię (wyprzedzenie trajektorii)
3* @return Kod błędu
4*/
5int MoveTrajectoryLA();
9.27. Przykład kodu odtwarzania trajektorii (wyprzedzenie trajektorii)
1private void button8_Click(object sender, EventArgs e)
2{
3 int rtn = 0;
4
5 string nameA = "/fruser/traj/A.txt";
6 string nameB = "/fruser/traj/B.txt";
7
8 rtn = robot.LoadTrajectoryLA(nameB, 0, 0, 0, 1, 100.0, 100.0, 1000.0); // Aproksymacja liniowa
9 Console.WriteLine($"LoadTrajectoryLA rtn is {rtn}");
10
11 DescPose startPos = new DescPose(0, 0, 0, 0, 0, 0);
12 robot.GetTrajectoryStartPose(nameA, ref startPos);
13
14 //
15 robot.MoveCart(startPos, 1, 0, (float)100.0, (float)100.0, (float)100.0, -1, -1);
16
17 rtn = robot.MoveTrajectoryLA();
18 Console.WriteLine($"MoveTrajectoryLA rtn is {rtn}");
19}
9.28. Przejście do punktu początkowego rejestracji trajektorii TPD
1/**
2* @brief Przejście do punktu początkowego rejestracji trajektorii TPD
3* @param [in] name Nazwa pliku trajektorii
4* @param [in] moveType Typ ruchu; 0-PTP; 1-LIN
5* @param [in] ovl Procent skalowania prędkości, zakres [0~100]
6* @return Kod błędu
7*/
8public int MoveToTPDStart(string name, int moveType, double ovl)
9.29. Przykład kodu SDK przejścia do punktu początkowego rejestracji trajektorii TPD
1void testTPDmove()
2{
3 string name = "tpd2025";
4 int type = 1;
5 int period_ms = 4;
6 int rtn = 0;
7 UInt16 di_choose = 0;
8 UInt16 do_choose = 0;
9
10 robot.SetTPDParam(type, name, period_ms, di_choose, do_choose);
11
12 robot.Mode(1);
13 Thread.Sleep(3000);
14 robot.DragTeachSwitch(1);
15 robot.SetTPDStart(type, name, period_ms, di_choose, do_choose);
16 Thread.Sleep(3000);
17 robot.SetWebTPDStop();
18 robot.DragTeachSwitch(0);
19
20 Thread.Sleep(1000);
21 float ovl = 100.0f;
22 byte blend = 0;
23 DescPose start_pose = new DescPose();
24 rtn = robot.LoadTPD(name);
25 Console.WriteLine($"LoadTPD rtn is:{rtn}\n");
26
27 robot.GetTPDStartPose(name, ref start_pose);
28 Console.WriteLine($"start pose, xyz is: %f %f %f. rpy is: {start_pose.tran.x},{start_pose.tran.y}, {start_pose.tran.z}, {start_pose.rpy.rx}, {start_pose.rpy.ry}, {start_pose.rpy.rz}");
29
30 rtn = robot.MoveToTPDStart(name, 0, 100.0);
31
32 rtn = robot.MoveTPD(name, blend, ovl);
33 Thread.Sleep(5000*5);
34
35 robot.SetTPDDelete(name);
36}