[ROS2实战] 从零打造SLAM机器人(一):基于ESP32与Micro-ROS的底盘运动控制与里程计实现

1. 前言:为什么SLAM需要一个好底盘?

  • SLAM的本质:SLAM 就像人闭着眼睛走路摸墙画地图。
  • 底盘的作用
    • 如果人走路晃晃悠悠(电机控制不稳),地图就会画歪。
    • 如果人不知道自己迈了几步(里程计不准),地图就会断裂。
  • 本篇目标:抛弃昂贵的工控机,用几十块钱的 ESP32 单片机,通过 Micro-ROS 接入 ROS 2 生态,实现精准的 PID闭环控制里程计(Odometry)发布,为后续接入激光雷达做准备。

2. 系统架构设计

  • 上位机:Ubuntu 22.04 (虚拟机) + ROS 2 Humble + Micro-ROS Agent。
  • 下位机:ESP32 开发板 + 直流减速电机 + 霍尔编码器。
  • 通信链路
    • 物理层:Wi-Fi (UDP协议),彻底摆脱 USB 线束缚。
    • 协议层:Micro-ROS (XRCE-DDS),让单片机成为 ROS 2 网络中的一等公民。

3. 核心技术点复盘(这是干货部分)

3.1 环境搭建与“填坑”
  • Docker Agent:使用 Docker 运行 Micro-ROS Agent,避免了复杂的环境配置。
  • PlatformIO:使用 VS Code + PlatformIO 进行嵌入式开发,利用 lib 目录管理多模块代码。
  • 网络隔离之战(重点)
    • 问题:虚拟机 NAT 模式下,外部 ESP32 无法连接内部 Agent;桥接模式又导致虚拟机崩溃。
    • 绝杀方案NAT模式 + 端口转发 (Port Forwarding)
    • 操作:将主机的 UDP 8888 映射到虚拟机的 UDP 8888,ESP32 直连 Windows 主机 IP,实现数据“穿墙”。
3.2 闭环控制:PID 算法
  • 为什么要 PID:开环控制(直接给占空比)受电量、摩擦力影响大,速度不可控。
  • 实现
    • 测量:利用 ESP32 的 PCNT 硬件单元读取编码器脉冲。
    • 计算目标速度 - 实际速度 = 误差,通过 PID 公式计算出补偿后的 PWM。
    • 效果:无论负载变化,轮子都能死死咬住目标速度(例如 20mm/s)。
3.3 机器人的“小脑”:两轮差速运动学
  • 运动学逆解 (Inverse Kinematics) —— 听指挥
    • ROS 发来 /cmd_vel ($v, \omega$) $\rightarrow$ 算出左右轮目标转速 。
  • 运动学正解 (Forward Kinematics) —— 自省
    • 读取左右轮实际速度 推算出机器人整体速度。
3.4 机器人的“自我感知”:里程计 (Odometry)
  • 原理:航位推算(Dead Reckoning)。
  • 实现
    • 利用正解算出的速度,乘以微小时间间隔 $dt$。
    • 累加计算出全局坐标和朝向。
  • 坐标系转换
    • 将欧拉角 (Yaw) 转换为 ROS 2 标准的 四元数 (Quaternion) 发布。
    • 发布 TF 变换(虽然本例暂时只发了话题,但在 SLAM 中 TF 是必须的)。

4. 关键代码片段展示

  • Kinematics::kinematic_inverse (逆解实现)
  • Kinematics::update_bot_odom (里程计积分实现)
  • microros_task 中的 UDP 连接配置。

5. 联调与可视化验证

  • 工具:Rviz2。
  • 遇到的坑与解决
    • 现象:Rviz2 收不到数据,或者不显示箭头。
    • 原因1QoS 不匹配。Micro-ROS 默认 Best Effort,Rviz2 默认 Reliable。必须修改 Rviz2 配置为 Best Effort。
    • 原因2时间同步。ESP32 必须调用 rmw_uros_sync_session 与电脑对表,否则数据会被视为“过期”丢弃。
    • 原因3坐标系。Fixed Frame 必须设置为 odom
  • 最终效果
    • 启动 teleop_twist_keyboard 控制小车。
    • Rviz2 中的红色箭头随着键盘指令同步移动和旋转,且数据平滑。

6. 总结与展望

  • 当前状态:我们要到了一个能动、能听、知道自己在哪的“瞎子”机器人。
  • 下一步计划
    • 加眼睛:接入激光雷达(Lidar)。
    • 长脑子:运行 Cartographer 或 Gmapping 算法。
    • 最终目标:看着它在房间里自动构建出户型图!

给读者的建议

  1. 供电很重要:Wi-Fi 模式耗电大,USB 供电不足会导致 Micro-ROS 频繁断连,建议使用电池供电。
  2. 善用 Git:每完成一个功能模块(PID、正解、逆解)就 commit 一次,方便回溯。
  3. 网络是最大的坑:如果是在虚拟机里开发,搞定网络设置就成功了一半。

Read more

llama.cpp docker 镜像pull国内加速地址

目前llama cpp官方提供的llama.cpp提供的docker 镜像下载命令:docker pull ghcr.io/ggml-org/llama.cpp:server-cuda-b6222 服务器下载速度非常的慢。 比较好的方法是把ghcr.io替换为国内镜像源地址ghcr.nju.edu.cn进行下载: // 官方命令: docker pull ghcr.io/ggml-org/llama.cpp:server-cuda //国内源地址命令 docker pull ghcr.nju.edu.cn/ggml-org/llama.cpp:server-cuda 速度快了几十倍,非常节约时间 推荐给大家!

【2026大模型面试圣经】(2)主流大模型架构全景 | GPT/LLaMA/DeepSeek/Qwen深度对比

2026大模型面试圣经(2):主流大模型架构全景 | GPT/LLaMA/DeepSeek/Qwen深度对比 定位:了解每个主流模型"怎么设计的、为什么这样设计",面试中不只说出名字,还能对比分析。 目标:看完本章,你能画出GPT/LLaMA/DeepSeek的架构图,说清每个设计选择背后的权衡。 模块一:GPT系列架构演进 | 从GPT-1到GPT-4 1.1 核心概念 什么是GPT? GPT(Generative Pre-trained Transformer)是OpenAI推出的系列模型,核心思想是"在大量文本上做自回归预训练,然后通过prompt引导做各种任务"。 GPT-1(2018):首次证明"预训练+微调"在NLP上的威力。12层Transformer Decoder,117M参数。用BookCorpus做CLM预训练。

Whisper 模型本地化部署:全版本下载链接与离线环境搭建教程

Whisper 模型本地化部署指南 一、模型版本与下载 Whisper 提供多种规模版本,可通过以下官方渠道获取: 1. GitHub 仓库 https://github.com/openai/whisper 包含最新代码、预训练权重和文档 * tiny.en / tiny * base.en / base * small.en / small * medium.en / medium * large-v2 (最新大模型) Hugging Face 模型库 所有版本下载路径: https://huggingface.co/openai/whisper-{version}/tree/main 替换 {version} 为具体型号: 二、离线环境搭建教程 准备工作 1.

AIGCJson 库介绍与使用指南

AIGCJson 库介绍与使用指南 目录 1. 概述 2. 核心特性 3. 快速开始 4. 详细功能 5. 使用场景 6. 与其他库对比 7. 最佳实践 8. 常见问题 9. 总结 概述 什么是 AIGCJson? AIGCJson 是一个轻量级、仅包含头文件的 C++ 库,提供了 C++ 类与 JSON 之间的无缝转换。它提供了一种简单直观的方式,用于将 C++ 对象序列化为 JSON 字符串,并将 JSON 字符串反序列化为 C++ 对象,所需代码和配置最少。 AIGCJson 通过一种非侵入式、基于宏的方法,弥合了