9.7 KiB
Pytanie 22: Języki programowania robotów
Pytanie
"Omówić specjalizowane języki programowania robotów. Uwypuklić ich klasyfikację."
Przedmiot: ERPM (Elementy Robotyki i Projektowania Mechatronicznego)
📚 Odpowiedź główna
1. Klasyfikacja języków programowania robotów
┌─────────────────────────────────────────────────────────────────┐
│ JĘZYKI PROGRAMOWANIA ROBOTÓW │
├─────────────────────────────────────────────────────────────────┤
│ POZIOM ABSTRAKCJI: │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ TASK-LEVEL (Zadaniowy) │ │
│ │ "Podnieś obiekt A i połóż na B" │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ ROBOT-LEVEL (Obiektowy) │ │
│ │ move_to(position), grasp(), release() │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ MOTION-LEVEL (Ruchowy) │ │
│ │ Trajektorie, interpolacja, kinematyka │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ SERVO-LEVEL (Napędowy) │ │
│ │ Sterowanie silnikami, PID, momenty │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
2. Klasyfikacja wg metody programowania
| Metoda | Opis | Przykłady |
|---|---|---|
| Online (Teach-in) | Programowanie przez demonstrację | Pendant, prowadzenie ręczne |
| Offline | Programowanie bez robota | Symulacja, CAD/CAM |
| Tekstowe | Kod źródłowy | RAPID, KRL, Karel |
| Graficzne | Bloki, flowcharty | Blockly, ROBOGUIDE |
3. Języki producentów robotów przemysłowych
RAPID (ABB)
MODULE MainModule
PROC main()
MoveJ pHome, v1000, z50, tool1;
MoveL pPick, v500, fine, tool1;
GripClose;
MoveL pPlace, v500, fine, tool1;
GripOpen;
ENDPROC
ENDMODULE
! MoveJ = ruch w przestrzeni złączy (Joint)
! MoveL = ruch liniowy (Linear)
! v500 = prędkość 500 mm/s
! fine/z50 = dokładność (fine = dokładnie)
KRL - KUKA Robot Language
DEF Pick_and_Place()
PTP HOME
LIN pPick
GripperClose()
LIN pPlace
GripperOpen()
PTP HOME
END
; PTP = Point-to-Point (ruch złączowy)
; LIN = ruch liniowy
; CIRC = ruch kołowy
Karel (FANUC)
PROGRAM pick_place
BEGIN
MOVE TO home_pos
MOVE TO pick_pos
CLOSE HAND 1
MOVE TO place_pos
OPEN HAND 1
END pick_place
PDL2 (Comau)
PROGRAM main
BEGIN
MOVE TO home_jnt
MOVE LINEAR TO pick_point
$DOUT[1] := ON -- gripper
MOVE LINEAR TO place_point
$DOUT[1] := OFF
END main
4. Porównanie języków producentów
| Cecha | RAPID (ABB) | KRL (KUKA) | Karel (FANUC) |
|---|---|---|---|
| Paradygmat | Proceduralny | Proceduralny | Proceduralny |
| Typy ruchów | MoveJ, MoveL, MoveC | PTP, LIN, CIRC | MOVE TO |
| Zmienne | VAR, PERS, CONST | DECL | VAR |
| I/O | SetDO, WaitDI | $OUT[], $IN[] | DOUT[], DIN[] |
| Wielozadaniowość | Tak (TASK) | Tak (SUBMIT) | Tak (TASK) |
5. Języki uniwersalne i frameworki
ROS (Robot Operating System)
# Python + rospy
import rospy
from geometry_msgs.msg import Twist
rospy.init_node('robot_controller')
pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)
twist = Twist()
twist.linear.x = 0.5
twist.angular.z = 0.1
pub.publish(twist)
MoveIt (ROS)
# Planowanie ruchu manipulatora
import moveit_commander
move_group = moveit_commander.MoveGroupCommander("arm")
move_group.set_pose_target(target_pose)
plan = move_group.go(wait=True)
Orocos / RTT
// Real-Time Toolkit - C++
class MyComponent : public RTT::TaskContext {
void updateHook() {
// Pętla sterowania (deterministyczna)
}
};
6. Języki graficzne
| Narzędzie | Producent | Opis |
|---|---|---|
| RobotStudio | ABB | RAPID + symulacja 3D |
| KUKA.Sim | KUKA | KRL + symulacja |
| ROBOGUIDE | FANUC | Karel + symulacja |
| Blockly | Programowanie wizualne (edukacja) | |
| Scratch for Robots | MIT | Edukacja, LEGO, mBot |
7. Klasyfikacja wg poziomu abstrakcji
┌─────────────────────────────────────────────────────────────────┐
│ Task-Level: │
│ "Złóż produkt X z części A, B, C" │
│ → Planowanie automatyczne, AI │
│ Przykłady: STRIPS, PDDL, Behavior Trees │
├─────────────────────────────────────────────────────────────────┤
│ Robot-Level: │
│ move_to(), pick(), place(), wait() │
│ → RAPID, KRL, Karel, Python+ROS │
├─────────────────────────────────────────────────────────────────┤
│ Motion-Level: │
│ Trajektorie, splajny, kinematyka odwrotna │
│ → MoveIt, OMPL, IKFast │
├─────────────────────────────────────────────────────────────────┤
│ Servo-Level: │
│ PID, sterowanie momentem, prądem │
│ → C/C++, FPGA, PLC (Ladder, ST) │
└─────────────────────────────────────────────────────────────────┘
🧠 Mnemoniki
"RAPID = Robot Application Programming in Data":
Język ABB - MoveJ, MoveL, MoveC
"KRL = KUKA Robot Language":
PTP, LIN, CIRC
"ROS = Robot Operating System":
Middleware - topics, services, actions
"Od zadania do serwa: T-R-M-S":
Task → Robot → Motion → Servo
❓ Pytania dodatkowe
Q1: "Czym różni się ruch PTP od LIN?"
Odpowiedź: PTP (Point-to-Point) = ruch w przestrzeni złączy, najszybszy ale trajektoria TCP nieprzewidywalna. LIN (Linear) = ruch liniowy TCP, wolniejszy ale precyzyjna ścieżka. LIN wymaga rozwiązania kinematyki odwrotnej w każdym punkcie.
Q2: "Dlaczego każdy producent ma własny język?"
Odpowiedź: Historyczne (lata 80-90), integracja ze sterownikiem, optymalizacja dla konkretnego sprzętu, vendor lock-in. ROS próbuje to ujednolicić, ale nie dla real-time.
Q3: "Co to jest Teach Pendant?"
Odpowiedź: Przenośny panel do programowania online. Przyciski ruchu (jog), zapis punktów, edycja programu. Tryb manualny (bezpieczny) vs automatyczny.
🎯 Kluczowe punkty
- Klasyfikacja: Online/Offline, Task/Robot/Motion/Servo level
- Producenci: RAPID (ABB), KRL (KUKA), Karel (FANUC)
- Uniwersalne: ROS + Python/C++, MoveIt
- Graficzne: RobotStudio, ROBOGUIDE, Blockly
📖 Źródła
- Siciliano, Khatib - "Springer Handbook of Robotics"
- ABB RAPID Reference Manual
- KUKA KRL Documentation
- ROS Wiki - ros.org