写在最前面的话
为什么做该博客?该博客的特点是什么?
随着DeepSeek、ChatGPT等AI技术的崛起,促使机器人技术发展到了新的高度,诞生了宇树科技、特斯拉为代表的人形机器人,四足机器人等等,越来越多的科技巨头涌入机器人赛道,行业对于相关人才的需求也随之达到了顶峰。本博客的内容是替你阅读所有关于机器人的经典书籍,采用书籍瘦身计划,帮你提炼出核心内容,采用最通俗易懂的语言来解释原理,将书读薄。大大缩短学习时间,助你快速成为机器人时代的佼佼者。


文章目录
一、书籍介绍
《ROS2机器人开发 从入门到实践》是一本从零基础到实战落地的机器人开发指南,通过"基础理论+工具详解+项目实战"的三阶学习路径,带你掌握机器人操作系统ROS2核心架构。书中不仅包含通信机制、URDF建模等必备知识,更有SLAM导航、机械臂控制等12个工业级案例,配合Git代码库和仿真环境配置指南,帮助开发者快速实现从算法仿真到真机部署的完整闭环。无论是学生、工程师还是科研人员,都能通过本书构建系统的ROS2开发能力,抢占机器人技术前沿阵地。
二、第9章 搭建一个实体移动机器人(提炼总结)
9.1节 移动机器人系统设计(提炼总结)
- 机器人由感知、决策、控制三部分组成。感知部分时通过各种传感器来实现,比如激光雷达和编码器;决策部分软件则是由各种算法组合实现的,比如进行路径规划和运动控制的Navigation2,硬件则依托性能较强的处理器实现;控制部分通常是由驱动系统和电动机组成的
9.1.1节 机器人传感器(提炼总结)
- FishBot搭建了雷达、超声波、编码器和IMU四种传感器
- FishBot使用单线旋转式激光雷达,头部有一个激光发射头和线性CCD接收头,发射头发出的光属于红外光,肉眼不可见
- FishBot采用的时AB电磁编码器,编码器位于电动机的后部,电磁编码器是由1和2这两个霍尔传感器和圆形磁铁3组成的,该磁铁的磁性是间隔分布的,磁铁固定在电动机的转子上,当电动机转动时,带动磁铁转动,用于检测磁性的霍尔传感器就会检测到磁性的变化,从而测量出电动机在某段时间内转了多少圈,具体原理可以看我的文章提炼总结—机器人学导论(原书第四版)(第8章) 8.9节 光学编码器(提炼总结)
9.1.2节 机器人执行器(提炼总结)
- 执行器就是机器人负责动的部件,最重要的一个执行器就是电动机。FishBot采用的是一个额定电压为12v的370减速电动机,额定转速为130r/min,额定电流为0.5a,转矩为600gf.cm
- 减速电机指的是带减速器的电动机,一般的电动机转速都比较快,但输出的扭矩比较小,当配备减速器后,让转速降低,提高扭矩。上图L的部分为减速器
9.1.3节 机器人决策系统(提炼总结)
- 决策部分主要负责根据传感器数据以及任务要求来控制机器人的运动,一般采用树莓派或Jetson Nano一样的卡片式计算机
- 除了感知、决策、控制部分,一个机器人要想动起来还需要一些硬件来配合,比如电池、电源模块以及必要的支撑结构
9.2节 单片机开发基础(提炼总结)
- MCU:micro control unit,又称单片机微型计算机,简称单片机。FishBot采用的就是国产的单片机ESP32
9.2.1节 开发平台介绍与安装(提炼总结)
- 安装虚拟环境工具
sudo apt install python3-venv
- 安装PlatformIO IDE
1、打开vscode扩展商店,搜索安装,之后在右侧点开这个图标
2、安装完成后
添加platformio到环境变量
echo 'export PATH=$PATH:~/.platformio/penv/bin' >> ~/.bashrc
source ~/.bashrc
安装ESP32单片机的Arduino开发环境
pio pkg install --global --platform "platformio/espressif32@^6.4.0"
pio pkg install --global --tool "platformio/contrib-piohome"
pio pkg install --global --tool "platformio/framework-arduinoespressif32"
pio pkg install --global --tool "platformio/tool-scons"
pio pkg install --global --tool "platformio/tool-mkfatfs"
pio pkg install --global --tool "platformio/tool-mkspiffs"
pio pkg install --global --tool "platformio/tool-mklittlefs"
3、启动
点击PIO Home下的open,打开PIO Home,点击New Project,在窗口输入工程名example01_helloword,开发板选择Adafruit ESP32 Feather,开发框架选择Arduino,最后选择工程的位置,点击Finish按钮,就得到了一个Heool World的工程
9.2.2节 第一个HelloWorld工程(提炼总结)
- 一般单片机开发流程分为四步,分别为编写代码、编译工程、烧录二进制文件和运行测试
1、打开src/main.cpp,编写如下内容:
#include <Arduino.h>
// put function declarations here:
//int myFunction(int, int);
void setup() {
// put your setup code here, to run once:
//int result = myFunction(2, 3);
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.printf("Hello World!\n");
delay(1000);
}
// put function definitions here:
//int myFunction(int x, int y) {
// return x + y;
//}
Arduino提供setup和loop两个声明好的函数,其中setup函数在启动时调用一次,一般初始化设置都在该函数进行。loop函数会在setup函数后循环调用。我们使用串口Serial通信,需要先在setup函数中初始化串口,并设置波特率为115200,接着在loop函数中调用串口输出数据,并延时1000ms
2、编译工程,在VS CODE的左下角,点击编译按钮
3、编译成功后打开.pio/bulid.featheresp32文件夹,可以看到firmware.bin文件就是编译生成的二进制文件。通过串口将单片机连接到计算机
串口卸载占用及添加权限
sudo apt remove --purge brltty -y
sudo usermod -aG dialout `whoami`
点击上传按钮,就可以将代码下载到开发板中
4、使用串口查看工具Serial Monitor来查看开发板的数据
在VS CODE中搜索Serial Monitor插件并安装
安装完成后在VS CODE的终端会多出串行监视器一栏,在端口处选择/dev/ttyUSB开头的设备,波特率选为115200,点击开始监视按钮,即可看到来自串口的数据
9.2.3节 使用代码点亮LED灯(提炼总结)
1、新建工程example02_led,在src/main.cpp中编写如下内容:
#include <Arduino.h>
void setup() {
pinMode(2, OUTPUT);
}
void loop() {
digitalWrite(2, LOW);
delay(1000);
digitalWrite(2, HIGH);
delay(1000);
}
pinMode函数用于设置指定引脚的模式,OUTPUT表示输出模式,digitalWrite用于设置引脚的电平状态,HIGH表示高,LOW表示低电平。编译并下载到开发板,发现LED灯每间隔1000ms闪烁一次
9.2.4节 使用超声波测量距离(提炼总结)
- 超声波传感器有一个发射头、一个接收头,发射头负责发送超声波,超声波遇到障碍物就会反射回来,接收头就可以接收信号,根据时间差和声速来计算障碍物的距离
1、新建工程example03_ultrasound,在src/main下编写代码:
#include <Arduino.h>
#define TRIG 27
#define ECHO 21
void setup() {
Serial.begin(115200);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT);
}
void loop() {
digitalWrite(TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG, LOW);
double delta_time = pulseIn(ECHO, HIGH);
float detect_distance = delta_time * 0.034 / 2;
Serial.printf("Distance = %f cm\n ",detect_distance;
delay(500);
}
2、编译工程并下载到开发板,打开串行监视器,可以看到间隔500ms左右的时间输出数据
9.2.5节 使用开源库驱动IMU(提炼总结)
- IMU是惯性测量单元,FishBot采用的是MPU6050模块用于惯性测量,它通过I2C协议和单片机进行通信,驱动它需要使用第三方库来驱动硬件
1、新建工程example04_imu,接着编辑工程目录下的platformio.ini文件,添加依赖库MPU6050_light
lib_deps =
https://github.com/rfetick/MPU6050_light.git
就会自动复制库文件到.pio/libdeps/featheresp32,一般开源库都会为我们提供示例代码
2、打开文件.pio/libdeps/featheresp32/MPU6050_light/examples/GetAngle/GetAngle.ino,把文件内容复制到src/main.cpp中,修改波特率为115200,修改I2C引脚为18和19
#include "Wire.h"
#include <MPU6050_light.h>
MPU6050 mpu(Wire);
unsigned long timer=0;
void setup() {
Serial.begin(115200);
Wire.begin(18,19);
byte status = mpu.begin();
Setial.println(F("MPU6050 init status: "));
Serial.println(status);
while(status!=0){
Serial.println(F("MPU6050 init error"));
delay(1000);
}
Serial.println(F("Calculating offsets, do not move MPU6050"));
delay(1000);
mpu.calcOffsets();
Serial.println(F("Done!\n"));
}
void loop(){
mpu.update();
if((millis()-timer)>10){
Serial.print("X: ");
Serial.print(mpu.getAccelX());
Serial.print(" Y: ");
Serial.print(mpu.getAccelY());
Serial.print(" Z: ");
Serial.print(mpu.getAccelZ());
timer=millis();
}
}
编译工程并下载到开发板,打开串行监视器,可以看到角度信息的输出