从零搭建一台 2200 元($300)的 ROS2 科研机器人
一台完整的 ROS2 科研机器人,具备四轮麦克纳姆全向驱动、2D LiDAR SLAM、边缘 AI 推理,以及让你用 10 行代码编写第一个自主行为的 Python API。硬件总成本:不到 2200 元人民币(~$300 美元)。第一版原型无需定制 PCB——所有元件均可从淘宝或 AliExpress 现货购买。
作为参考,TurtleBot4 Lite 售价 $1,200 以上。高校自制科研平台在采购传感器、算力和底盘后通常花费 $2,000-5,000。3we 平台以极低成本实现了相当的感知和计算能力,并且通过 Python 优先的 SDK 消除了 ROS2 学习曲线。
| 组件 | 型号 | 大约价格 (RMB) |
|---|---|---|
| 计算单元 | Raspberry Pi 5 (8GB) + Hailo-8L AI Hat | 650 |
| 微控制器 | ESP32-S3 DevKitC-1 | 35 |
| LiDAR | LD06 360 度 2D LiDAR | 100 |
| IMU | BNO055 9 轴 IMU | 45 |
| 摄像头 | 160 度鱼眼 USB 摄像头 (1080p) | 80 |
| 电机 | 4x JGA25-370 直流电机带编码器 | 120 |
| 电机驱动 | 2x DRV8833 双 H 桥驱动 | 20 |
| 轮子 | 4x 65mm 麦克纳姆轮 | 160 |
| 电池 | 3S 2200mAh LiPo + BMS | 120 |
| 底盘 | 200x200mm 铝板 + 铜柱 | 80 |
| 电源 | 5V/5A 降压模块(供 Pi5) | 25 |
| 安全 | 急停按钮 + 继电器 | 30 |
| 接线 | 连接器、线缆、压接端子 | 50 |
| 紧固件 | M3/M4 螺栓、螺母、铜柱 | 30 |
| 合计 |
加上以下可选升级后,完整科研配置约 2200 元:
| 可选升级 | 型号 | 价格 (RMB) |
|---|---|---|
| 深度感知 | Intel RealSense D405(二手) | 350 |
| 更强算力 | Pi 5 (16GB) 替换 8GB | +100 |
| 充电底座 | 定制底座 PCB + 触点 | 200 |
| 含升级合计 |
为什么选这些元件
Section titled “为什么选这些元件”Raspberry Pi 5 + Hailo-8L
Section titled “Raspberry Pi 5 + Hailo-8L”Pi 5 原生运行 ROS2 Jazzy,性能是 Pi 4 的 1.5 倍。Hailo-8L AI 加速器(13 TOPS)通过 M.2 扩展板插入,可以 30+ FPS 运行 YOLO、MobileNet 和自定义 VLA 模型,且不占用 CPU。这一组合提供:
- 完整的 ROS2 技术栈(Nav2、SLAM、感知)
- 13 TOPS 神经网络推理,支持设备端 AI
- USB3 接摄像头,以太网用于远程开发
- 系统总功耗低于 8W
ESP32-S3 电机控制
Section titled “ESP32-S3 电机控制”ESP32-S3 通过 micro-ROS 处理实时电机控制,通过 USB-CDC 以 1000Hz 与 Pi 通信。它运行:
- 4 个电机的 PID 速度控制
- 编码器计数(4 通道,正交编码)
- 100Hz IMU 融合
- 安全看门狗(通信中断时停止电机)
这种架构将硬实时(电机控制)与软实时(导航、感知)分离,这对可靠的机器人运行至关重要。
LD06 LiDAR
Section titled “LD06 LiDAR”LD06 是一款 14 美元的 360 度 2D LiDAR,12m 测距范围,4500 采样/秒。通过 UART 接口连接,直接兼容 ROS2 的 ldlidar 包。在室内环境的 SLAM 和避障场景中,其表现与价格贵 10 倍的 LiDAR 相当。
麦克纳姆轮无需复杂转向机构即可实现平台全向移动(前后、横移、对角线、原地旋转)。这对以下场景至关重要:
- 紧凑的室内导航(走廊、桌下)
- 精确的对接操作
- 完整运动规划(简化 Nav2 配置)
┌─────────────────────────────────────────────────────────┐│ 你的 Python 代码 ││ from threewe import Robot ││ await robot.move_to(x=2.0, y=1.5) │├─────────────────────────────────────────────────────────┤│ threewe Python SDK ││ Robot, VLMRunner, VLARunner, Gymnasium Envs │├─────────────────────────────────────────────────────────┤│ Backend Abstraction Layer ││ GazeboBackend │ IsaacSimBackend │ RealBackend │├─────────────────────────────────────────────────────────┤│ ROS2 Jazzy ││ Nav2 │ SLAM Toolbox │ robot_perception │ micro-ROS │├──────────────────────┬──────────────────────────────────┤│ Raspberry Pi 5 │ ESP32-S3 ││ + Hailo-8L │ Motor PID + Encoders ││ Camera, LiDAR │ IMU, Safety Watchdog │└──────────────────────┴──────────────────────────────────┘关键点:你永远不需要学习 ROS2。threewe SDK 通过 Python 暴露所有功能:
import asynciofrom threewe import Robot
async def main(): async with Robot(backend="real") as robot: # 获取传感器数据 image = robot.get_camera_image() # (480, 640, 3) uint8 scan = robot.get_lidar_scan() # 360 range measurements pose = robot.get_pose() # x, y, theta in map frame
# 导航 await robot.move_to(x=2.0, y=1.5) # 使用 Nav2 路径规划 await robot.move_forward(1.0) # 前进 1 米 await robot.rotate(1.57) # 旋转 90 度
# AI 推理(在 Hailo-8L 上运行) result = await robot.execute_instruction("find the door")
asyncio.run(main())底层实现中,RealBackend 将这些调用转换为 ROS2 服务调用、动作客户端和话题订阅。但你永远不需要接触这些复杂性。
先在仿真中体验
Section titled “先在仿真中体验”你不需要购买任何硬件就可以开始开发:
pip install threewe[sim]threewe launch --backend gazebo --scene office_v2这会启动一个 Gazebo 仿真环境,其中包含 3we 机器人模型和一个办公场景。你的 Python 代码运行方式完全相同:
async with Robot(backend="gazebo") as robot: await robot.move_to(x=2.0, y=1.5) image = robot.get_camera_image()当你准备好迁移到硬件时,只需将 backend="gazebo" 改为 backend="real"。这是唯一需要的修改。
完整组装指南在 docs/assembly_guide.md。以下是关键步骤:
1. 底盘组装(30 分钟)
Section titled “1. 底盘组装(30 分钟)”切割或订购 200x200mm 铝板。用 L 型支架安装 4 个电机。安装麦克纳姆轮(注意对角线配对——方向错误会破坏全向移动)。
┌────────────────┐ │ FL ╲ ╱ FR │ FL/BR: 左旋滚子 │ ╲╱ │ FR/BL: 右旋滚子 │ ╱╲ │ │ BL ╱ ╲ BR │ 俯视图 └────────────────┘2. 电子元件堆叠(45 分钟)
Section titled “2. 电子元件堆叠(45 分钟)”使用铜柱分层安装组件:
- 底层:电池 + BMS + 降压模块
- 中层:ESP32-S3 + 电机驱动
- 顶层:Raspberry Pi 5 + Hailo-8L 扩展板 + LiDAR
3. 接线(60 分钟)
Section titled “3. 接线(60 分钟)”关键连接:
| 起始端 | 目标端 | 接口 |
|---|---|---|
| Pi 5 | ESP32-S3 | USB-C (micro-ROS) |
| ESP32-S3 | DRV8833 x2 | GPIO (PWM + DIR) |
| DRV8833 | Motors | 直连 |
| Pi 5 | LD06 LiDAR | USB-UART |
| Pi 5 | Camera | USB3 |
| ESP32-S3 | BNO055 | I2C |
| E-Stop | Safety Relay | 常闭触点 |
| Safety Relay | Motor power | 串联 |
4. 软件配置(20 分钟)
Section titled “4. 软件配置(20 分钟)”# Raspberry Pi 5 (Ubuntu 24.04 + ROS2 Jazzy 预装)git clone https://github.com/telleroutlook/3we-robot-platform.gitcd 3we-robot-platform
# 编译 ROS2 包cd ros2_ws && colcon build --symlink-installsource install/setup.bash
# 烧录 ESP32-S3 固件cd firmware/esp32idf.py set-target esp32s3idf.py build && idf.py flash
# 安装 Python SDKpip install threewe
# 启动所有节点ros2 launch robot_bringup robot.launch.py5. 首次测试(5 分钟)
Section titled “5. 首次测试(5 分钟)”import asynciofrom threewe import Robot
async def main(): async with Robot(backend="real") as robot: # 简单运动测试 await robot.move_forward(0.5) # 前进 50cm await robot.rotate(3.14) # 掉头 await robot.move_forward(0.5) # 返回
asyncio.run(main())对比:3we vs 其他方案
Section titled “对比:3we vs 其他方案”| 特性 | 3we 平台 | TurtleBot4 Lite | 自行搭建 |
|---|---|---|---|
| 成本 | ~$300 | $1,200+ | $2,000-5,000 |
| 驱动类型 | 麦克纳姆轮(全向) | 差速 | 不定 |
| 边缘 AI | Hailo-8L (13 TOPS) | 无标配 | 附加件 |
| LiDAR | LD06 (360-deg) | RPLiDAR (360-deg) | 不定 |
| 摄像头 | 鱼眼 1080p | OAK-D Lite | 不定 |
| Python API | threewe SDK | 自定义 | 自定义 |
| Sim2Real | 内置 (Gazebo/Isaac) | 需单独配置 | 手动 |
| SLAM | SLAM Toolbox | SLAM Toolbox | 手动 |
| 导航 | Nav2(预配置) | Nav2 | 手动 |
| VLM/VLA 支持 | 内置 | 无 | 手动 |
| Gymnasium 环境 | 包含 | 无 | 手动 |
| 开源硬件 | 完全开源 (CERN-OHL-P) | 专有 | 不定 |
| 可复现性 | 高(BOM、指南) | 购买预装产品 | 低 |
| 首次演示时间 | 2-3 小时 | 30 分钟(预装) | 数天到数周 |
关键差异化因素不是任何单一规格——而是集成体验。Python 研究人员可以从 pip install threewe[sim] 开始,训练 RL 智能体并部署到硬件上,无需编写 ROS2 节点、配置 Nav2 或调试 TF 树。
所有组件均可从主流中国电子零售商和 AliExpress(国际买家)购买:
淘宝(国内)
Section titled “淘宝(国内)”| 元件 | 搜索关键词 | 推荐店铺 |
|---|---|---|
| Pi 5 | ”树莓派5 8GB” | 树莓派官方店 |
| Hailo-8L | ”Hailo-8L M.2 AI Hat” | 微雪 (Waveshare) |
| ESP32-S3 | ”ESP32-S3-DevKitC-1” | 乐鑫官方店 |
| LD06 LiDAR | ”LD06 激光雷达” | 乐动机器人店 |
| BNO055 | ”BNO055 九轴” | 各类店铺 |
| JGA25-370 | ”JGA25-370 编码器电机” | 各类店铺 |
| 麦克纳姆轮 | ”65mm 麦克纳姆轮” | 各类店铺 |
| DRV8833 | ”DRV8833 电机驱动” | 各类店铺 |
AliExpress(国际)
Section titled “AliExpress(国际)”搜索英文元件名称即可。大多数发往全球,2-3 周到货。LD06 LiDAR 和麦克纳姆轮特别容易找到。
无需定制元件
Section titled “无需定制元件”第一代平台使用零定制 PCB。所有连接使用标准杜邦线、USB 线缆和螺丝端子。定制充电底座 PCB 是可选的,仅在需要自主长时间实验时才需要。
你可以用它做什么
Section titled “你可以用它做什么”1. 室内导航研究
Section titled “1. 室内导航研究”async with Robot(backend="real") as robot: # SLAM 自动运行中 occupancy_map = robot.get_map()
# 导航到任何可达点 result = await robot.move_to(x=5.0, y=3.0) print(f"Arrived: {result.success}, distance: {result.distance:.2f}m")2. 基于 VLM 的物体导航
Section titled “2. 基于 VLM 的物体导航”async with Robot(backend="real") as robot: result = await robot.execute_instruction( "go to the kitchen and find the coffee mug" )3. 仿真中的 RL 训练
Section titled “3. 仿真中的 RL 训练”import gymnasium as gymimport threewe.gym # Registers environments
env = gym.make("3we/Navigation-v1", render_mode="rgb_array")obs, info = env.reset()
for _ in range(1000): action = your_policy(obs) obs, reward, terminated, truncated, info = env.step(action)4. VLA 模型部署
Section titled “4. VLA 模型部署”from threewe.ai.vla_runner import VLARunner
vla = VLARunner.from_pretrained("lerobot/act_3we_nav")
async with Robot(backend="real") as robot: while True: obs = robot.get_observation(modalities=["image", "lidar", "velocity"]) action = vla.predict(obs, instruction="patrol the office") robot.execute_action(action)5. 基准测试
Section titled “5. 基准测试”# 运行 100 轮点目标导航threewe benchmark run --task pointnav --episodes 100 --backend gazebo
# 与基线对比threewe benchmark compare --result results.json --baseline random_walk
# 提交到社区排行榜threewe benchmark submit --result results.json6. 多机器人实验
Section titled “6. 多机器人实验”该平台支持仿真中的多机器人。每个机器人实例独立连接:
async def multi_robot(): async with Robot(backend="gazebo", config="robot_1") as r1: async with Robot(backend="gazebo", config="robot_2") as r2: # 协调两个机器人 await asyncio.gather( r1.move_to(x=2.0, y=0.0), r2.move_to(x=-2.0, y=0.0), )该平台实现了硬件级安全机制,软件无法绕过:
-
物理急停按钮:红色蘑菇头按钮通过常闭继电器切断电机电源。按下后立即断开所有电机驱动的供电,无论软件在做什么。
-
通信看门狗:ESP32-S3 固件有 200ms 看门狗。如果 200ms 内未收到速度指令,电机自动停止。这可以防护 Pi 崩溃、网络断开或进程挂起等情况。
-
速度限制:在固件和 SDK 中均硬编码。最大线速度 0.5 m/s,最大角速度 1.0 rad/s。不重新烧录固件无法覆盖。
-
安全距离:SDK 强制 15cm 缓冲区——如果 LiDAR 检测到 15cm 内有障碍物,运动指令会被拒绝并抛出
SafetyError。
模块化设计意味着你可以从最小配置开始,逐步升级:
| 阶段 | 硬件 | 能力 |
|---|---|---|
| 第 1 阶段 | Pi5 + ESP32 + 电机 + LiDAR | 导航、SLAM |
| 第 2 阶段 | + 摄像头 | 视觉感知、VLM 控制 |
| 第 3 阶段 | + Hailo-8L | 设备端 AI、实时检测 |
| 第 4 阶段 | + RealSense | 3D 建图、深度避障 |
| 第 5 阶段 | + 充电底座 | 自主长时间实验 |
每个阶段无需修改已有代码。SDK 自动检测可用硬件并进行适配。
快速开始总结
Section titled “快速开始总结”# 1. 先在仿真中体验(无需硬件)pip install threewe[sim]threewe launch --backend gazebo --scene office_v2
# 2. 编写你的第一个自主行为python -c "import asynciofrom threewe import Robot
async def main(): async with Robot(backend='gazebo') as robot: await robot.move_to(x=2.0, y=1.5) print('Arrived!')
asyncio.run(main())"
# 3. 准备好后,搭建硬件(见 docs/assembly_guide.md)# 4. 将 backend="gazebo" 改为 backend="real"# 5. 在真实机器人上运行相同代码