机器人编程语言: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) 进行操作,这些手臂都会暴露出
关键图书馆和框架
- **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) 进行操作,这些手臂都会暴露出
关键图书馆和框架
- **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桥梁.







