⚙️ 修正版:典型硬件组合与通信流程(以移动机器人为例)
1. 硬件分工:大脑 vs 四肢
角色 | 硬件 | 运行软件 | 核心任务 | 是否直接运行ROS |
---|---|---|---|---|
决策大脑 | 树莓派4B / Jetson Nano | Ubuntu + ROS | 运行SLAM、导航、视觉识别等复杂算法 | ✅ 是 |
实时四肢 | STM32F4 | FreeRTOS/裸机 | 读取电机编码器、控制电机PWM | ❌ 否 |
传感器/执行器 | 电机、激光雷达、IMU | - | 执行动作/采集数据 | - |
2. 为什么需要STM32?
树莓派无法直接控制电机(缺少PWM硬件、实时性差),而STM32的优势在于:
- 实时响应(微秒级中断控制电机)
- 直接读写编码器/PWM/ADC等硬件接口
- 低功耗、低成本
3. rosserial的作用:翻译官
问题场景
- STM32 采集到电机编码器数据(如"左轮转速100转/分")
- 树莓派ROS 需要这些数据做导航计算,但只认识ROS消息(如
/odom
)
rosserial解决方案
关键步骤
-
STM32端:
-
烧录
rosserial
固件(本质是一个串口通信协议库) -
调用API发布数据
-
-
树莓派端:
-
运行
rosserial_python
节点监听串口:BASH
rosrun rosserial_python serial_node.py _port:=/dev/ttyUSB0
-
该节点将自动:
- 把STM32发来的数据 → 转换成ROS话题
/odom
- 把ROS指令
/cmd_vel
→ 转发给STM32执行
- 把STM32发来的数据 → 转换成ROS话题
-
❓ 常见疑问解答
Q1:为什么树莓派不直接控制电机?
- 实时性不足:电机控制需微秒级响应,Linux系统调度延迟在毫秒级。
- 硬件限制:树莓派GPIO无法生成高精度PWM,且直接驱动大电流会烧毁主板。
Q2:STM32能直接运行ROS吗?
- 绝大多数不能:ROS依赖Linux系统,STM32资源不足(通常只有几百KB内存)。
- 例外:ROS 2支持MCU(如ESP32),但功能受限,仍需要主控协同。
Q3:树莓派和STM32之间用什么连接?
物理接口 | 适用场景 | 性能 |
---|---|---|
USB转串口 | 最常用(成本低) | 带宽1Mbps |
以太网 | 高速数据传输(如摄像头) | 带宽100Mbps+ |
CAN总线 | 工业环境(抗干扰) | 带宽1Mbps |
✅ 终极总结
- 树莓派 :负责"思考"(ROS算法),不碰硬件。
- STM32 :负责"动手"(控制硬件),不懂ROS。
- rosserial:是双方的"翻译官",让STM32的数据"伪装"成ROS消息,让树莓派的指令"翻译"成硬件命令。
这就解释了为什么STM32既出现在"底层控制器"中,又出现在"通信桥梁"中------它本身不运行ROS,但通过rosserial与ROS系统交互!