返回Guides

机器人编程语言:Python,C++,ROS

机器人最好的编程语言:Python用于原型,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架构

罗伯特操作系统2不是一个语言,而是一个提供通信 (DDS),包管理和构建机器人软件的标准架构的中间件框架.

  • **节点:**独立的过程 (每个传感器,控制器,规划器均有一种).通过主题 (公众/子),服务 (请求/响应) 和行动 (长期任务) 进行沟通.
  • **主题:**异步传递信息. T2 (传感器_msgs/JointState) 在100-1000Hz上发布联合位置. T3 (传感器_msgs/图像) 在30-60Hz上发布框架.
  • 控制循环层次: 伺服级 (1-10 kHz,运行在电动控制器固件) → 联合级 (100-1000 Hz,ros2_control) → 任务级 (10-30 Hz,MoveIt2/政策推断)

实际建议: 写Python节点用于感知,规划和高层次逻辑. 写C++节点用于必须满足时间保证的控制循环.这是所有主要ROS2机器人驱动程序使用的模式.

实时控制要求

不同机器人组件的时间要求不同:

  • ** 伺服控制循环:** <1 ms (1-10 kHz). 运行在电机控制器固件 (不在你的代码中). 处理PID位置/速度/扭矩控制.
  • ** 联合控制循环:** 1-10 ms (100-1000 Hz). 发送目标位置/速度/扭矩到电机.必须是确定性的. 使用实时内核 (Linux 预先_RT补丁).
  • **运动规划:**每计划10-100ms. MoveIt2生成无碰撞的轨迹. 并非实时,但应该足够快速进行反应重组规划.
  • 基于GPU的学习,Python在这里很好--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]T10),联合名称都会在手臂提供的 URDF 和 MoveIt2 配置中记录.

关键图书馆和框架

  • **MoveIt2:**运动规划框架.碰撞意识轨迹生成,逆动力学,抓住规划.Python和C++API.ROS2中的手臂操纵标准.
  • **Nav2:**移动机器人导航堆.路径规划,避免障碍,定位 (AMCL).
  • 机器人库为多体动态,基于优化控制和模拟.C++与Python绑定.非常适合接触丰富的操纵研究.
  • PyTorch / JAX: ML框架用于训练操纵政策. PyTorch 在机器人研究中占主导地位 (RT-2,Octo,ACT使用). JAX正在获得RL (brax,mujoco-mjx) 的吸引力.
  • **OpenCV:**计算机视觉.摄像头校准,图像处理,ArUco检测.可用Python和C++.
  • **LeRobot (Hugging Face):**机器人学习的开源框架.数据集管理,政策培训 (ACT,传播政策) 和部署.基于Python.

每种语言的使用时间

  • ** 使用Python当:** 创建新行为原型,编写ML训练管道,处理传感器数据,编写脚本实验,构建网页仪表板. 90% 的机器人代码应该是Python.
  • **在:**编写机动驱动器,实现必须达到硬时限 (<1ms jitter) 的控制环节时使用C++;在性能重要的地方构建生产系统,为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架构

罗伯特操作系统2不是一个语言,而是一个提供通信 (DDS),包管理和构建机器人软件的标准架构的中间件框架.

  • **节点:**独立的过程 (每个传感器,控制器,规划器均有一种).通过主题 (公众/子),服务 (请求/响应) 和行动 (长期任务) 进行沟通.
  • **主题:**异步传递信息. T6 (传感器_msgs/JointState) 在100-1000Hz上发布联合位置. T7 (传感器_msgs/图像) 在30-60Hz上发布框架.
  • 控制循环层次: 伺服级 (1-10 kHz,运行在电动控制器固件) → 联合级 (100-1000 Hz,ros2_control) → 任务级 (10-30 Hz,MoveIt2/政策推断)

实际建议: 写Python节点用于感知,规划和高层次逻辑. 写C++节点用于必须满足时间保证的控制循环.这是所有主要ROS2机器人驱动程序使用的模式.

实时控制要求

不同机器人组件的时间要求不同:

  • ** 伺服控制循环:** <1 ms (1-10 kHz). 运行在电机控制器固件 (不在你的代码中). 处理PID位置/速度/扭矩控制.
  • ** 联合控制循环:** 1-10 ms (100-1000 Hz). 发送目标位置/速度/扭矩到电机.必须是确定性的. 使用实时内核 (Linux 预先_RT补丁).
  • **运动规划:**每计划10-100ms. MoveIt2生成无碰撞的轨迹. 并非实时,但应该足够快速进行反应重组规划.
  • 基于GPU的学习,Python在这里很好--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]T11),联合名称都会在手臂提供的 URDF 和 MoveIt2 配置中记录.

关键图书馆和框架

  • **MoveIt2:**运动规划框架.碰撞意识轨迹生成,逆动力学,抓住规划.Python和C++API.ROS2中的手臂操纵标准.
  • **Nav2:**移动机器人导航堆.路径规划,避免障碍,定位 (AMCL).
  • 机器人库为多体动态,基于优化控制和模拟.C++与Python绑定.非常适合接触丰富的操纵研究.
  • PyTorch / JAX: ML框架用于训练操纵政策. PyTorch 在机器人研究中占主导地位 (RT-2,Octo,ACT使用). JAX正在获得RL (brax,mujoco-mjx) 的吸引力.
  • **OpenCV:**计算机视觉.摄像头校准,图像处理,ArUco检测.可用Python和C++.
  • **LeRobot (Hugging Face):**机器人学习的开源框架.数据集管理,政策培训 (ACT,传播政策) 和部署.基于Python.

每种语言的使用时间

  • ** 使用Python当:** 创建新行为原型,编写ML训练管道,处理传感器数据,编写脚本实验,构建网页仪表板. 90% 的机器人代码应该是Python.
  • **在:**编写机动驱动器,实现必须达到硬时限 (<1ms jitter) 的控制环节时使用C++;在性能重要的地方构建生产系统,为MoveIt2或Nav2做出贡献.
  • 使用Rust当: 建立安全关键组件时,内存安全性是最重要的,编写新的电动驾驶员,或者当你的团队拥有Rust专业知识时.
  • **在使用专有语言时:**你必须在本地控制器上编程工业机器人 (KUKA,ABB,FANUC).如果可能的话,避免 - 宁愿使用ROS2桥梁.