Skip to content
 
 

Repository files navigation

系统架构图

ROS 两轮差速自主移动机器人

English | 简体中文

ROS Noetic + ESP32 + J1900 + LiDAR 构成的两轮差速移动机器人平台。 内容覆盖电机 PID、SLAM 建图、导航、人体跟随,采用三机分布式部署。

CI License: MIT ROS Ubuntu Platform


核心功能

功能 技术栈 状态
SLAM 建图 S9 雷达(AA55 协议解析) + gmapping 实机验证
自主导航 AMCL 定位 + move_base + TEB 局部规划 实机验证
多点巡航 脚本启动 + YAML 巡航点 + 循环执行 实机验证
人体跟随 视觉测向 + 雷达测距,三态状态机融合 实机验证
EKF 融合 robot_localization(编码器里程计 + MPU6050 IMU) 已内置
仿真环境 Gazebo 空房间 + 差速插件 + 相同导航参数 可用

系统架构

三机分布:PC(计算)←WiFi→ J1900(车载采集)←USB→ ESP32(底盘控制)

ROS PC (Master)                    J1900 (车载)                     ESP32 (下位机)
┌──────────────────┐        WiFi  ┌──────────────────┐   USB   ┌──────────────────┐
│  SLAM / EKF      │◄─────────────│  s9_lidar_driver │◄────────│ 双路 PID          │
│  AMCL / move_base│   ROS Topics │  usb_cam+republish│  rosserial│ PCNT 编码器里程计  │
│  TEB / YOLOv8n   │─────────────►│  雷达+摄像头采集   │────────►│ MPU6050 IMU       │
└──────────────────┘   cmd_vel    └──────────────────┘  串口    └─────────┬────────┘
                                                                            │ PWM
                                                                       ┌──▼────────┐
                                                                       │ TB6612FNG │
                                                                       │ 左/右电机  │
                                                                       └───────────┘
数据流: LiDAR → /scan → SLAM → map → AMCL → move_base → /cmd_vel → ESP32 → PID → Motors
flowchart LR
    subgraph PC["PC · Ubuntu 20.04 · ROS Noetic (Master)"]
        SLAM[gmapping SLAM]
        EKF[robot_localization EKF]
        AMCL[AMCL 定位]
        NAV[move_base + TEB]
        VISION[YOLOv8n 视觉检测]
    end
    subgraph J1900["J1900 车载 · Ubuntu 20.04"]
        LIDAR[s9_lidar_driver.py]
        CAM[usb_cam + republish]
        SER[rosserial_python]
    end
    subgraph ESP32["ESP32 · esp32_firmware"]
        PID[双路 PID]
        ENC[PCNT 编码器里程计]
        IMU[MPU6050]
    end
    LIDAR -->|/scan| SLAM
    SLAM -->|map| AMCL
    AMCL --> NAV
    NAV -->|/cmd_vel| SER
    CAM -->|/image_raw/compressed| VISION
    VISION -->|/person_angle| NAV
    SER <-->|rosserial 115200| ESP32
    PID -->|PWM| M[TB6612FNG → 电机]
    ENC -->|/odom| EKF
    IMU -->|/imu| EKF
    EKF -->|odom→base_footprint TF| NAV
Loading

硬件

组件 型号 关键参数
下位机 ESP32-WROOM-32 PCNT 硬件编码器 + 双路 PID + IMU
车载工控机 Intel Celeron J1900 x86_64, Ubuntu 20.04, ROS Noetic
主控 PC 笔记本 ROS Master,SLAM/导航/视觉
激光雷达 S9-FSRD-V1.0 RX 115200, AA55 协议, 360° 扫描, 约 69Hz
电机 JGB37-520 ×2 12V, 减速比 1:10, 11 PPR 霍尔编码器
电机驱动 TB6612FNG 双路 H 桥,3.3V 逻辑直连 ESP32
轮子 85mm 橡胶轮 轮距 180mm(URDF、固件、仿真一致)
IMU MPU6050 I2C,用于 EKF 融合与激光去畸变
电池 3S LiPo 11.1V 5200mAh XT60 接口

引脚接线(TB6612FNG ↔ ESP32)

AIN1→GPIO25  AIN2→GPIO26  PWMA→GPIO18
BIN1→GPIO32  BIN2→GPIO33  PWMB→GPIO19
STBY→GPIO4(拉高)  VCC→3.3V  VM→电池12V

编码器: 左A→GPIO27 左B→GPIO23 右A→GPIO14 右B→GPIO13
MPU6050: SDA→GPIO21  SCL→GPIO22

原理图与 PCB

主控板为自行设计,2026-07 定版。

ESP32 主控板原理图 PCB 正面
左:主控板原理图,右:PCB 正面,集成电机驱动、编码器、IMU、rosserial 接口

PCB 反面
PCB 反面


软件栈

组件 说明
仿真 Gazebo / RViz 15m×15m 房间 + 差速插件 + 相同导航参数
建图 gmapping 订阅 /scan_deskewed(支持 IMU 去畸变)
定位 AMCL 100500 粒子(实物)/ 5003000(仿真),diff-corrected 里程计模型
规划 move_base + TEB navfn 全局 + TEB 局部,max_vel_x=0.6
融合 robot_localization EKF odom+imu → /odometry/filtered(30Hz)
通信 rosserial (115200) PC↔J1900 走 WiFi,J1900↔ESP32 走 USB
感知 YOLOv8n 人体检测,压缩图像流 (320×240)
控制 双路 PID(固件内) 速度闭环 + 堵转保护 + 看门狗

快速开始

1. 安装(完整步骤见 SETUP.md

# Ubuntu 20.04 下安装 ROS Noetic 及全部依赖
sudo apt install ros-noetic-desktop-full
sudo apt install ros-noetic-gmapping ros-noetic-move-base ros-noetic-amcl \
                 ros-noetic-map-server ros-noetic-teleop-twist-keyboard \
                 ros-noetic-robot-state-publisher ros-noetic-topic-tools \
                 ros-noetic-robot-localization ros-noetic-teb-local-planner \
                 ros-noetic-tf ros-noetic-interactive-markers

2. 编译

cd ~/ROS
source /opt/ros/noetic/setup.bash
catkin_make
source devel/setup.bash

3. 仿真(无需硬件)

# SLAM 建图(另开终端,用 teleop_twist_keyboard 遥控绕场)
bash src/robot_sim/scripts/sim_slam.sh

# 建图完成后保存地图
rosrun map_server map_saver -f ~/maps/sim_map

# 导航(需先有地图)
bash src/robot_sim/scripts/sim_navigation.sh ~/maps/sim_map.yaml

4. 实物机器人(PC + J1900 + ESP32 + 雷达)

# 状态查看 / 建图 / 多点巡航 / 人体跟随 / 停止
bash src/robot_bringup/scripts/robot_start.sh status
bash src/robot_bringup/scripts/robot_start.sh slam
bash src/robot_bringup/scripts/robot_start.sh patrol ~/maps/lab_map.yaml
bash src/robot_bringup/scripts/robot_start.sh follow
bash src/robot_bringup/scripts/robot_start.sh stop   # 发送零速度

5. 单元测试

python3 -m pip install -r requirements-dev.txt   # numpy + pytest
python3 -m pytest tests -q
# 61 例回归测试:雷达协议解析+缓冲/跨零(23) + 跟随状态机(12) + 检测帧处理(9)
#               + 激光去畸变/IMU窗均值(11) + 巡航目标解析(6)
# 无需 ROS 环境:tests/conftest.py 提供 rospy/消息替身;CI 会在 ros:noetic 容器中执行全部测试

实测记录

实物机器人
两轮差速底盘:ESP32 主控 + J1900 车载 + S9 雷达 + 摄像头

实物运行演示视频
实物运行演示视频(MP4)

RViz 雷达建图 SLAM 建图
左:RViz 雷达点云建图,右:gmapping 建图结果

导航路径
多点导航路径


项目结构

ROS/                          # catkin 工作空间根
├── AGENTS.md                 # Coding Agent 项目指南
├── SETUP.md                  # 部署手册(环境/网络/接线/上电/FAQ)
├── src/
│   ├── robot_bringup/        # 实物包(PC + J1900 部署)
│   │   ├── launch/           # bringup/slam/navigation/follow/follow_vision/ekf/odom_ekf
│   │   ├── scripts/          # robot_start.sh / j1900_start.sh + 6 个 Python 节点
│   │   ├── config/           # ekf.yaml / patrol_goals.yaml / slam.rviz
│   │   └── urdf/robot.urdf   # 实物模型(轮距 0.180m)
│   └── robot_sim/            # 仿真包(仅 PC,Gazebo)
│       ├── launch/           # simulation / sim_slam / sim_navigation
│       ├── scripts/          # sim_slam.sh / sim_navigation.sh / sim_follow.sh
│       ├── urdf/ worlds/ rviz/ config/
├── esp32_firmware/           # ESP32 固件(Arduino 编译,独立于 ROS)
│   ├── esp32_firmware.ino    # 主固件(PCNT + PID + IMU + rosserial)
│   ├── esp32_board_test/     # 板级测试固件(单项验证)
│   └── libraries/ros_lib/    # vendored rosserial 库(已修复 ESP32 兼容)
├── tests/                    # pytest 回归测试(61 例,无硬件依赖)
├── assets/                   # 实物照片 / 演示视频 / 建图截图
├── tools/                    # 调试工具(不入部署链)
└── docs/                     # 架构图 / 开发指南 / 项目文档

文档

文档 内容
SETUP.md 部署:环境安装、网络、接线、首次上电、仿真与实物操作、FAQ
docs/ARCHITECTURE.md 系统架构:三机数据流、TF 树、节点/launch 清单、安全机制
docs/PROJECT_STATUS.md 组件状态矩阵、测试覆盖、已知限制、路线图
CHANGELOG.md 变更记录(来自 git 历史)
CONTRIBUTING.md 贡献指南:环境、测试、硬件安全、PR 流程(含英文摘要)
SECURITY.md 安全策略与漏洞报告方式
docs/MAINTAINER_WORKFLOW.md 维护者工作流:AI 工具链使用规范与人工审查要求
AGENTS.md Coding Agent 项目指南
docs/developer-guide.md 开发者工具链参考(MCP / Skills / Git 速查)
docs/system_architecture.png 系统架构图(可用 tools/generate_architecture.py 重新生成)

参与贡献

先读 CONTRIBUTING.md,接受 Issue 与 PR:

  • 报告 Bug 或提功能建议 → 新建 Issue
  • 提交代码 → fork 后提 PR,CI 会运行静态检查、容器内 catkin_make、pytest
  • 已知问题与路线图 → docs/PROJECT_STATUS.md

状态标记依据:标为“实机验证”的功能均有对应提交记录和实验数据。安全漏洞按 SECURITY.md 私下报告。


硬件安全

  • 启动后小车保持静止,遥控建图默认速度上限 0.3 m/s
  • robot_start.sh stop/cmd_vel 发布零速度
  • 首次调试先架空轮子,或以低速(≤0.3 m/s)落地测试
  • ROS Master 只绑定局域网,不对外暴露

许可证

本项目基于 MIT License 开源。第三方组件(rosserial Arduino 库、YOLOv8、ROS 生态工具)遵循各自许可证。

About

ROS Noetic 两轮差速自主移动机器人:ESP32 底盘(PID/编码器/IMU) + J1900 车载(LiDAR/相机) + PC(SLAM/导航/人体跟随),三机分布式全链路开源实现

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages