Roboterprogrammiersprachen: Python, C++, ROS
Die besten Programmiersprachen für Robotik: Python für Prototypen, C++ für Echtzeitsteuerung, ROS für Systemintegration. Wann jedes zu verwenden.
Sprachenvergleich
| Language | Typical Latenz | Key Libraries | Best For | Limitation |
|---|---|---|---|---|
| Python | 1-10 ms (non-deterministic) | NumPy, OpenCV, PyTorch, rclpy | Rapid prototyping, ML/AI, data processing, research | GIL prevents true parallelism; not real-time safe |
| C++ | <1 ms (deterministic with RT kernel) | Eigen, rclcpp, MoveIt2, Drake | Real-time control loops, drivers, production systems | Slow iteration; complex build systems; memory management |
| Rust | <1 ms (deterministic) | ros2_rust, nalgebra | Safety-critical systems, memory-safe drivers | Small robotics ecosystem; steep learning curve |
| MATLAB / Simulink | N/A (offline / codegen) | Robotics System Toolbox, ROS Toolbox | Control system design, simulation, academic research | Expensive license ($2K+/yr); not used in production |
| Proprietary (KRL, RAPID, Karel) | <1 ms (built into controller) | Vendor-specific | Industrial robot programming on OEM controllers | No portability; vendor lock-in; limited ecosystem |
ROS2-Architektur für Robotersteuerung
ROS2 (Robot-Betriebssystem 2) ist keine Sprache - es ist ein Middleware-Framework, das Kommunikation (DDS), Paketmanagement und eine Standardarchitektur für den Bau von Robotersoftware bietet.
- Nodes: Unabhängige Prozesse (ein pro Sensor, Controller, Planer). Kommunikation über Themen (pub/sub), Dienste (Anfrage/Antwort) und Aktionen (langfristige Aufgaben).
- Themen: Asynchrone Nachrichtenübertragung.
T2 (sensor_msgs/JointState) veröffentlicht gemeinsame Positionen bei 100-1000 Hz. T3 (sensor_msgs/image) veröffentlicht Rahmen bei 30-60 Hz. - Level der Steuerungsschleife: Servo-Level (1-10 kHz, läuft in der Firmware des Motorcontrollers) → Joint-Level (100-1000 Hz, ros2_control) → Task-Level (10-30 Hz, MoveIt2/Politik-Fluß)
Die praktische Empfehlung: Schreiben Python-Knoten für Wahrnehmung, Planung und Logik auf hoher Ebene. ** Schreiben C ++-Knoten** für Steuerungsschleifen, die Zeitgarantien erfüllen müssen. Dies ist das Muster, das von allen großen ROS2-Roboter-Treiber verwendet wird.
Echtzeitkontrolle
Verschiedene Roboterkomponenten haben unterschiedliche Zeitvorgaben:
- Servo-Steuerungsschleifen: <1 ms (1-10 kHz). Laufen in der Firmware des Motorcontrollers (nicht in Ihrem Code). Handelt die PID-Positions-/Geschwindigkeits-/ Drehmomentsteuerung.
- Gemeinsame Steuerungsschleifen: 1-10 ms (100-1000 Hz). Sendet Zielpositionen/Geschwindigkeiten/Torks an Motoren. Muss deterministisch sein. Verwenden Sie
T4 mit einem Echtzeit-Kernel (PREEMPT_RT-Patch für Linux). - Bewegungsplanung: 10-100 ms pro Plan. MoveIt2 generiert kollizierungsfreie Strecken. Nicht in Echtzeit, sondern sollte schnell genug für eine reaktive Neuplanung sein.
- Politik-Abschluss: 10-50 ms pro Schritt (20-100 Hz). Neuralnetzwerk-Politiken (Nachahmungslernen, RL) laufen auf GPU. Python ist hier in Ordnung - die GPU behandelt die schwere Rechenleistung.
- Vision-Verarbeitung: 16-33 ms pro Bildschirm (30-60 Hz). Erkennung, Segmentierung, Posenbewertung. GPU-beschleunigt, Python mit PyTorch/ONNX.
Beispielcode: Basis-Arm-Steuerung mit ROS2 Python
import rclpy
from rclpy.node import Node
from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint
from builtin_interfaces.msg import Duration
class ArmController(Node):
def __init__(self):
super().__init__('arm_controller')
self.publisher = self.create_publisher(
JointTrajectory,
'/joint_trajectory_controller/joint_trajectory',
10
)
self.joint_names = [
'joint1', 'joint2', 'joint3',
'joint4', 'joint5', 'joint6'
]
def move_to_pose(self, positions, duration_sec=2.0):
"""Send arm to target joint positions."""
msg = JointTrajectory()
msg.joint_names = self.joint_names
point = JointTrajectoryPoint()
point.positions = positions # radians
point.time_from_start = Duration(sec=int(duration_sec),
nanosec=int((duration_sec % 1) * 1e9))
msg.points = [point]
self.publisher.publish(msg)
self.get_logger().info(f'Moving to: {positions}')
def main():
rclpy.init()
controller = ArmController()
# Home position
controller.move_to_pose([0.0, -1.57, 1.57, 0.0, 1.57, 0.0])
rclpy.spin(controller)
rclpy.shutdown()
if __name__ == '__main__':
main()
Dieses Beispiel funktioniert mit jedem ROS2-kompatiblen Arm (OpenArm 1, UR, Kinova), der einen
Schlüsselbibliotheken und Rahmenwerke
- MoveIt2: Bewegungsplanung Framework. Kollisionsbewusste Flugbahngenerierung, inverse Kinematik, Grappplanning. Python und C++ API. Standard für Armmanipulation in ROS2.
- Nav2: Navigationsstack für mobile Roboter. Wegplanung, Hindernisvermeidung, Lokalisierung (AMCL).
- Drake: MIT's Robotikbibliothek für Multibody-Dynamik, Optimierung-basierte Steuerung und Simulation. C++ mit Python-Bindungen. Ausgezeichnet für kontaktreiche Manipulationsforschung.
- PyTorch / JAX: ML-Frameworks für Ausbildungsmanipulationen. PyTorch dominiert in der Robotikforschung (von RT-2, Octo, ACT verwendet). JAX gewinnt an Anziehungskraft für RL (Brax, Mujoco-mjx).
- OpenCV: Computersicht. Kamerakalibrierung, Bildverarbeitung, ArUco-Detektion.
- LeRobot (Hugging Face): Open-Source-Framework für Roboter-Lernen. Datensatzmanagement, politische Ausbildung (ACT, Diffusion Policy) und Bereitstellung. Python-basiert.
Wann jede Sprache benutzt werden sollte
- Python verwenden, wenn: Prototypen für neues Verhalten, ML-Trainings-Pipelines schreiben, Sensordaten verarbeiten, Skriptversuche erstellen, Web-Dashboards erstellen. 90% Ihres Robotikcodes sollten Python sein.
- C++ verwenden, wenn: Motorfahrer schreiben, Steuerungsschleifen implementieren, die schwierige Zeitfristen (<1 ms jitter) erfüllen müssen, Produktionssysteme aufbauen, wo Leistung wichtig ist, und MoveIt2 oder Nav2 beitragen.
- Rust verwenden, wenn: Sicherheitskritische Komponenten aufbauen, bei denen die Sicherheit des Speichers von größter Bedeutung ist, neue Motorfahrer schreiben oder wenn Ihr Team über Rust-Expertise verfügt.
- Verwenden Sie proprietäre Sprachen, wenn: Sie müssen einen industriellen Roboter (KUKA, ABB, FANUC) auf seinem nativen Controller programmieren.
Sprachenvergleich
| Language | Typical Latenz | Key Libraries | Best For | Limitation |
|---|---|---|---|---|
| Python | 1-10 ms (non-deterministic) | NumPy, OpenCV, PyTorch, rclpy | Rapid prototyping, ML/AI, data processing, research | GIL prevents true parallelism; not real-time safe |
| C++ | <1 ms (deterministic with RT kernel) | Eigen, rclcpp, MoveIt2, Drake | Real-time control loops, drivers, production systems | Slow iteration; complex build systems; memory management |
| Rust | <1 ms (deterministic) | ros2_rust, nalgebra | Safety-critical systems, memory-safe drivers | Small robotics ecosystem; steep learning curve |
| MATLAB / Simulink | N/A (offline / codegen) | Robotics System Toolbox, ROS Toolbox | Control system design, simulation, academic research | Expensive license ($2K+/yr); not used in production |
| Proprietary (KRL, RAPID, Karel) | <1 ms (built into controller) | Vendor-specific | Industrial robot programming on OEM controllers | No portability; vendor lock-in; limited ecosystem |
ROS2-Architektur für Robotersteuerung
ROS2 (Robot-Betriebssystem 2) ist keine Sprache - es ist ein Middleware-Framework, das Kommunikation (DDS), Paketmanagement und eine Standardarchitektur für den Bau von Robotersoftware bietet.
- Nodes: Unabhängige Prozesse (ein pro Sensor, Controller, Planer). Kommunikation über Themen (pub/sub), Dienste (Anfrage/Antwort) und Aktionen (langfristige Aufgaben).
- Themen: Asynchrone Nachrichtenübertragung.
T6 (Sensor_msgs/JointState) veröffentlicht gemeinsame Positionen bei 100-1000 Hz. T7 (Sensor_msgs/Bild) veröffentlicht Rahmen bei 30-60 Hz. - Level der Steuerungsschleife: Servo-Level (1-10 kHz, läuft in der Firmware des Motorcontrollers) → Joint-Level (100-1000 Hz, ros2_control) → Task-Level (10-30 Hz, MoveIt2/Politik-Fluß)
Die praktische Empfehlung: Schreiben Python-Knoten für Wahrnehmung, Planung und Logik auf hoher Ebene. ** Schreiben C ++-Knoten** für Steuerungsschleifen, die Zeitgarantien erfüllen müssen. Dies ist das Muster, das von allen großen ROS2-Roboter-Treiber verwendet wird.
Echtzeitkontrolle
Verschiedene Roboterkomponenten haben unterschiedliche Zeitvorgaben:
- Servo-Steuerungsschleifen: <1 ms (1-10 kHz). Laufen in der Firmware des Motorcontrollers (nicht in Ihrem Code). Handelt die PID-Positions-/Geschwindigkeits-/ Drehmomentsteuerung.
- Gemeinsame Steuerungsschleifen: 1-10 ms (100-1000 Hz). Sendet Zielpositionen/Geschwindigkeiten/Torks an Motoren. Muss deterministisch sein. Verwenden Sie
T8 mit einem Echtzeit-Kernel (PREEMPT_RT-Patch für Linux). - Bewegungsplanung: 10-100 ms pro Plan. MoveIt2 generiert kollizierungsfreie Strecken. Nicht in Echtzeit, sondern sollte schnell genug für eine reaktive Neuplanung sein.
- Politik-Abschluss: 10-50 ms pro Schritt (20-100 Hz). Neuralnetzwerk-Politiken (Nachahmungslernen, RL) laufen auf GPU. Python ist hier in Ordnung - die GPU behandelt die schwere Rechenleistung.
- Vision-Verarbeitung: 16-33 ms pro Bildschirm (30-60 Hz). Erkennung, Segmentierung, Posenbewertung. GPU-beschleunigt, Python mit PyTorch/ONNX.
Beispielcode: Basis-Arm-Steuerung mit ROS2 Python
import rclpy
from rclpy.node import Node
from trajectory_msgs.msg import JointTrajectory, JointTrajectoryPoint
from builtin_interfaces.msg import Duration
class ArmController(Node):
def __init__(self):
super().__init__('arm_controller')
self.publisher = self.create_publisher(
JointTrajectory,
'/joint_trajectory_controller/joint_trajectory',
10
)
self.joint_names = [
'joint1', 'joint2', 'joint3',
'joint4', 'joint5', 'joint6'
]
def move_to_pose(self, positions, duration_sec=2.0):
"""Send arm to target joint positions."""
msg = JointTrajectory()
msg.joint_names = self.joint_names
point = JointTrajectoryPoint()
point.positions = positions # radians
point.time_from_start = Duration(sec=int(duration_sec),
nanosec=int((duration_sec % 1) * 1e9))
msg.points = [point]
self.publisher.publish(msg)
self.get_logger().info(f'Moving to: {positions}')
def main():
rclpy.init()
controller = ArmController()
# Home position
controller.move_to_pose([0.0, -1.57, 1.57, 0.0, 1.57, 0.0])
rclpy.spin(controller)
rclpy.shutdown()
if __name__ == '__main__':
main()
Dieses Beispiel funktioniert mit jedem ROS2-kompatiblen Arm (OpenArm 1, UR, Kinova), der einen
Schlüsselbibliotheken und Rahmenwerke
- MoveIt2: Bewegungsplanung Framework. Kollisionsbewusste Flugbahngenerierung, inverse Kinematik, Grappplanning. Python und C++ API. Standard für Armmanipulation in ROS2.
- Nav2: Navigationsstack für mobile Roboter. Wegplanung, Hindernisvermeidung, Lokalisierung (AMCL).
- Drake: MIT's Robotikbibliothek für Multibody-Dynamik, Optimierung-basierte Steuerung und Simulation. C++ mit Python-Bindungen. Ausgezeichnet für kontaktreiche Manipulationsforschung.
- PyTorch / JAX: ML-Frameworks für Ausbildungsmanipulationen. PyTorch dominiert in der Robotikforschung (von RT-2, Octo, ACT verwendet). JAX gewinnt an Anziehungskraft für RL (Brax, Mujoco-mjx).
- OpenCV: Computersicht. Kamerakalibrierung, Bildverarbeitung, ArUco-Detektion.
- LeRobot (Hugging Face): Open-Source-Framework für Roboter-Lernen. Datensatzmanagement, politische Ausbildung (ACT, Diffusion Policy) und Bereitstellung. Python-basiert.
Wann jede Sprache benutzt werden sollte
- Python verwenden, wenn: Prototypen für neues Verhalten, ML-Trainings-Pipelines schreiben, Sensordaten verarbeiten, Skriptversuche erstellen, Web-Dashboards erstellen. 90% Ihres Robotikcodes sollten Python sein.
- C++ verwenden, wenn: Motorfahrer schreiben, Steuerungsschleifen implementieren, die schwierige Zeitfristen (<1 ms jitter) erfüllen müssen, Produktionssysteme aufbauen, wo Leistung wichtig ist, und MoveIt2 oder Nav2 beitragen.
- Rust verwenden, wenn: Sicherheitskritische Komponenten aufbauen, bei denen die Sicherheit des Speichers von größter Bedeutung ist, neue Motorfahrer schreiben oder wenn Ihr Team über Rust-Expertise verfügt.
- Verwenden Sie proprietäre Sprachen, wenn: Sie müssen einen industriellen Roboter (KUKA, ABB, FANUC) auf seinem nativen Controller programmieren.







