English | 简体中文
ROS Noetic + ESP32 + J1900 + LiDAR 构成的两轮差速移动机器人平台。 内容覆盖电机 PID、SLAM 建图、导航、人体跟随,采用三机分布式部署。
| 功能 | 技术栈 | 状态 |
|---|---|---|
| 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
| 组件 | 型号 | 关键参数 |
|---|---|---|
| 下位机 | 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
主控板为自行设计,2026-07 定版。
左:主控板原理图,右:PCB 正面,集成电机驱动、编码器、IMU、rosserial 接口
| 层 | 组件 | 说明 |
|---|---|---|
| 仿真 | Gazebo / RViz | 15m×15m 房间 + 差速插件 + 相同导航参数 |
| 建图 | gmapping | 订阅 /scan_deskewed(支持 IMU 去畸变) |
| 定位 | AMCL | 100 |
| 规划 | 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-markerscd ~/ROS
source /opt/ros/noetic/setup.bash
catkin_make
source devel/setup.bash# 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# 状态查看 / 建图 / 多点巡航 / 人体跟随 / 停止
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 # 发送零速度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 雷达 + 摄像头
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 生态工具)遵循各自许可证。




