Guidesに戻る

ロボットプログラミング言語: Python,C++,ROS

ロボット向けに最高のプログラミング言語: プロトタイプ作成のためのパイトン,リアルタイム制御のためのC++,システム統合のためのROS. どの時に使うか.

言語比較

Language Typical レイテンシ 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 建築

ROS2 (ロボットオペレーティングシステム2) は言語ではなく コミュニケーション (DDS) と パッケージ管理を提供する ミドルウェアフレームワークです ロボットソフトウェアを構築するための標準的なアーキテクチャです

  • ノード: 独立したプロセス (センサ,コントローラー,プランナーごとに1つ) テーマ (pub/sub),サービス (リクエスト/レスポンス) とアクション (長期作業) を通じてコミュニケーションをとる.
  • T2 (センサー_msgs/JointState) は100-1000 Hzで関節位置を公開する. T3 (センサー_msgs/画像) は30-60 Hzでフレームを公開する.
  • 制御ループ階層: セルボレベル (1-10 kHz,モーターコントローラファームウェアで実行) → 共同レベル (100-1000 Hz,ros2_control) → 作業レベル (10-30 Hz,MoveIt2/政策推論)

実践的な推奨事項:認識,計画,高レベルの論理のために Python ノードを書きなさい. タイミング保証を満たす制御ループのために ** C++ ノードを書きなさい. これはすべての主要ROS2ロボットドライバーが使用するパターンです.

リアルタイム制御要件

異なるロボットコンポーネントには異なるタイミング要求があります

  • Servo制御ループ: <1 ms (1-10 kHz) エンジンコントローラファームウェアで動作する (コードに含まれていない). PID位置/速度/トーク制御を処理する.
  • ** 合同制御ループ:** 1-10 ms (100-1000 Hz). モーターにターゲット位置/速度/トークを送信する. 決定性である必要があります. リアルタイムカーネル (Linux の PREEMPT_RT パッチ) を使用する.
  • 運動計画: 計画ごとに10~100ms. MoveIt2は衝突のない軌道を生成します.リアルタイムではありませんが,反応的な再計画のために十分な速度でなければなりません.
  • ゲートグラフで実行されている神経ネットワークのポリシー (模倣学習,RL). パイソンはここで大丈夫です. GPUは重い計算処理を行う.
  • 視力処理: フレームあたり16-33ms (30-60Hz) 検出,分割,ポーズ推定 GPU加速,PyTorch/ONNXでPython

サンプルコード: 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()

この例は,ROS2対応の腕 (OpenArm 1, UR, Kinova) に関して, T5を暴露する動作します. OpenArm 1 に対して,両名は,腕付いている URDFと MoveIt2の設定で記録されています.

キーライブラリとフレームワーク

  • MoveIt2: 運動計画枠組み.衝突意識の軌道の生成,逆運動学,把握計画. PythonとC++ API. ROS2における腕操作の標準.
  • Nav2: モバイルロボット向けナビゲーションスタック. 経路計画,障害物回避,ローカライゼーション (AMCL). TurtleBot 4,Unitree Go2で使用.
  • Drake: MITのロボットライブラリで,多体ダイナミクス,最適化ベースの制御,シミュレーション.C++とパイソン結合.接触豊富な操作研究に優れた.
  • PyTorch / JAX: MLのトレーニング操作政策のフレームワーク. PyTorchはロボット研究 (RT-2,Octo,ACTによって使用) で支配されている. JAXはRL (brax,mujoco-mjx) に関する牽引力を獲得している.
  • OpenCV: コンピュータビジョン. カメラの校正,画像処理,ArUco検出. パイthonとC++で利用可能.
  • LeRobot (Hugging Face): ロボット学習のためのオープンソースのフレームワーク.データセット管理,政策訓練 (ACT,拡散政策) および展開. Pythonベースの.

どの 言語 を どの よう に 使う か

  • **新しい行動のプロトタイプを作成し,MLトレーニングパイプラインを書き,センサーデータを処理し,スクリプト実験,ウェブダッシュボードを構築するときに Python を使用します. ロボティクスコードの90%は Python でなければならない.
  • C++ を使って: ドライバを書き,ハードタイムリングの締め切り (<1ms jitter) を満たす制御ループを実装し,パフォーマンスが重要である生産システムを構築し, MoveIt2 または Nav2 に貢献する.
  • Rustを使用する: 記憶の安全性が優先される安全性重要な部品を構築する時,新しいモータードライバーを書き込む時,またはあなたのチームがRustの専門知識を持っているとき.
  • 産業ロボット (KUKA, ABB, FANUC) を本来のコントローラーにプログラミングする必要があります.可能な限り,ROS2橋を好みます.

言語比較

Language Typical レイテンシ 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 建築

ROS2 (ロボットオペレーティングシステム2) は言語ではなく コミュニケーション (DDS) と パッケージ管理を提供する ミドルウェアフレームワークです ロボットソフトウェアを構築するための標準的なアーキテクチャです

  • ノード: 独立したプロセス (センサ,コントローラー,プランナーごとに1つ) テーマ (pub/sub),サービス (リクエスト/レスポンス) とアクション (長期作業) を通じてコミュニケーションをとる.
  • T6 (センサー_msgs/JointState) は100-1000Hzで関節位置を公開する. T7 (センサー_msgs/画像) は30-60Hzでフレームを公開する.
  • 制御ループ階層: セルボレベル (1-10 kHz,モーターコントローラファームウェアで実行) → 共同レベル (100-1000 Hz,ros2_control) → 作業レベル (10-30 Hz,MoveIt2/政策推論)

実践的な推奨事項:認識,計画,高レベルの論理のために Python ノードを書きなさい. タイミング保証を満たす制御ループのために ** C++ ノードを書きなさい. これはすべての主要ROS2ロボットドライバーが使用するパターンです.

リアルタイム制御要件

異なるロボットコンポーネントには異なるタイミング要求があります

  • Servo制御ループ: <1 ms (1-10 kHz) エンジンコントローラファームウェアで動作する (コードに含まれていない). PID位置/速度/トーク制御を処理する.
  • ** 合同制御ループ:** 1-10 ms (100-1000 Hz). モーターにターゲット位置/速度/トークを送信する. 決定的である必要があります. リアルタイムカーネル (Linux の PREEMPT_RT パッチ) を使用する.
  • 運動計画: 計画ごとに10~100ms. MoveIt2は衝突のない軌道を生成します.リアルタイムではありませんが,反応的な再計画のために十分な速度でなければなりません.
  • ゲートグラフで実行されている神経ネットワークのポリシー (模倣学習,RL). パイソンはここで大丈夫です. GPUは重い計算処理を行う.
  • 視力処理: フレームあたり16-33ms (30-60Hz) 検出,分割,ポーズ推定 GPU加速,PyTorch/ONNXでPython

サンプルコード: 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()

この例は,ROS2対応の腕 (OpenArm 1, UR, Kinova) に関して, T9を暴露する動作します. OpenArm 1 に対して,両名は,腕付いている URDFと MoveIt2の設定で記録されています.

キーライブラリとフレームワーク

  • MoveIt2: 運動計画枠組み.衝突意識の軌道の生成,逆運動学,把握計画. PythonとC++ API. ROS2における腕操作の標準.
  • Nav2: モバイルロボット向けナビゲーションスタック. 経路計画,障害物回避,ローカライゼーション (AMCL). TurtleBot 4,Unitree Go2で使用.
  • Drake: MITのロボットライブラリで,多体ダイナミクス,最適化ベースの制御,シミュレーション.C++とパイソン結合.接触豊富な操作研究に優れた.
  • PyTorch / JAX: MLのトレーニング操作政策のフレームワーク. PyTorchはロボット研究 (RT-2,Octo,ACTによって使用) で支配されている. JAXはRL (brax,mujoco-mjx) に関する牽引力を獲得している.
  • OpenCV: コンピュータビジョン. カメラの校正,画像処理,ArUco検出. パイthonとC++で利用可能.
  • LeRobot (Hugging Face): ロボット学習のためのオープンソースのフレームワーク.データセット管理,政策訓練 (ACT,拡散政策) および展開. Pythonベースの.

どの 言語 を どの よう に 使う か

  • **新しい行動のプロトタイプを作成し,MLトレーニングパイプラインを書き,センサーデータを処理し,スクリプト実験,ウェブダッシュボードを構築するときに Python を使用します. ロボティクスコードの90%は Python でなければならない.
  • C++ を使って: ドライバを書き,ハードタイムリングの締め切り (<1ms jitter) を満たす制御ループを実装し,パフォーマンスが重要である生産システムを構築し, MoveIt2 または Nav2 に貢献する.
  • Rustを使用する: 記憶の安全性が優先される安全性重要な部品を構築する時,新しいモータードライバーを書き込む時,またはあなたのチームがRustの専門知識を持っているとき.
  • 産業ロボット (KUKA, ABB, FANUC) を本来のコントローラーにプログラミングする必要があります.可能な限り,ROS2橋を好みます.