Zurück zu Guides

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 T5 ausstellt. Für den [OpenArm 1]T10) werden die gemeinsamen Namen in der mit dem Arm bereitgestellten URDF- und MoveIt2-Konfiguration dokumentiert.

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 T9 ausstellt. Für den [OpenArm 1]T11) werden die gemeinsamen Namen in der URDF- und MoveIt2-Konfiguration dokumentiert, die mit dem Arm bereitgestellt wird.

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.