一份覆盖机器人完整知识点的学习笔记。从运动学到 SLAM,从传感器到通信协议,重点讲"为什么这么设计"(费曼式 📌 讲解),配代码实例和 RyBOS 项目真实案例。
图表在
/机器人学习笔记/diagrams/目录。图注名即原图文件名,看图注就能直接找到原图用 draw.io 编辑。
机器人 = 感知 + 决策 + 执行 的自主或半自主机器系统。ISO 8373 定义:一种可编程的、具备两个或更多自由度的机构,能够在其环境中自主运动以完成预定任务。
📌 打个比方:机器人像一个"有身体的人"。计算机只有大脑(算力),机器人多了"眼睛耳朵"(传感器)、"大脑"(控制器)、"手脚"(执行器)。它不仅要思考,还要在物理世界中行动并承受后果——思考错了可以重来,行动错了可能撞墙。
| 层 | 作用 | 例子 |
|---|---|---|
| 感知层 | 获取环境与自身状态信息 | 激光雷达、相机、IMU、编码器、GPS |
| 决策层 | 理解环境、规划行为 | SLAM、路径规划、避障、行为树 |
| 控制层 | 将决策转化为具体运动指令 | PID 控制、运动学逆解、力控 |
| 执行层 | 物理执行运动 | 电机、舵机、液压缸、轮子、机械臂关节 |
| 通信层 | 模块间数据传输 | ROS 话题/服务、串口帧协议、CAN 总线 |
📌 为什么分层而不是写成一坨?和 Linux 分层一样的道理——解耦。传感器换了不影响决策算法,电机升级了不影响感知逻辑。每一层有清晰的输入输出契约,团队可以并行开发。
| 类型 | 特点 | 典型应用 |
|---|---|---|
| 移动机器人 | 在环境中移动 | AGV、扫地机、无人车、无人机 |
| 机械臂 | 固定基座,多关节 | 工业装配、焊接、搬运 |
| 人形机器人 | 拟人形态 | 服务、研究(Atlas、Tesla Bot) |
| 特种机器人 | 特殊环境作业 | 水下、太空、排爆、巡检 |
| 协作机器人 | 与人共处 | 装配线辅助、康复训练 |
机器人的一切运动和感知都发生在三维空间中。要描述"机器人在哪""手臂伸到哪""障碍物在哪",必须建立统一的坐标参考系。
📌 打个比方:坐标系就是"给空间贴格子标签"。没有坐标系,你说"往前走两步"毫无意义——谁的"前"?哪个"两步"?有了坐标系,一切位置和方向都有了精确的数值描述。
| 坐标系 | 定义 | 用途 |
|---|---|---|
| 世界坐标系 (World/Map) | 全局固定参考系 | 地图、路径规划的全局目标 |
| 机器人坐标系 (Base/Body) | 机器人本体原点 | 机械臂基座、车辆中心 |
| 传感器坐标系 (Sensor) | 传感器安装位置 | 雷达扫描数据原始坐标 |
| 关节坐标系 (Joint) | 每个关节的局部系 | 机械臂运动学链 |
| 工具坐标系 (Tool/EE) | 末端执行器 | 抓取目标位姿 |
| 相机坐标系 (Camera) | 光心为原点 | 视觉测量、3D 重建 |
将旋转和平移统一为一个 4×4 矩阵:
📌 为什么用 4×4 而不是 3×3 + 3×1 分开写?因为变换的复合可以用矩阵乘法一步完成。T_total = T_1 × T_2 × T_3,从基座到末端的总变换就是各关节变换的连乘。齐次坐标的精髓:在 n 维坐标末尾加一个 1,用 (n+1)×(n+1) 矩阵统一处理旋转和平移。
| 表示法 | 参数数 | 优点 | 缺点 |
|---|---|---|---|
| 欧拉角 | 3 | 直观(roll/pitch/yaw) | 万向节锁 |
| 四元数 | 4 | 无万向锁、插值平滑 | 不直观 |
| 旋转矩阵 | 9 | 无歧义、直接运算 | 冗余(6个约束) |
📌 万向节锁:欧拉角按固定顺序旋转(如 ZYX),当中间轴旋转到 ±90° 时,第一个和第三个旋转轴重合,丢失一个自由度。四元数不依赖旋转顺序,多出一个维度正是为了避免奇异性。这就是为什么机器人姿态控制几乎都用四元数。
cpp/GeodeticConverter 处理 WGS84↔UTM↔CGCS2000,cpp/GeoTransform 做空间坐标系变换,JianYunWei/AttitudeCorrection2.0 实现了欧拉角旋转顺序转换和四元数运算。
| 正运动学 (FK) | 逆运动学 (IK) | |
|---|---|---|
| 输入 | 各关节角度 | 末端目标位姿 |
| 输出 | 末端位姿 | 各关节角度 |
| 唯一性 | 唯一解 | 可能多解、无解 |
| 计算 | 直接矩阵连乘 | 解析或数值求解 |
📌 打个比方:正运动学像"你告诉手臂每个关节弯多少度,我算出手指尖在哪"。逆运动学像"你告诉手指尖要去哪,我算出每个关节该弯多少度"——可能有多条路径都能到达目标,也可能目标太远够不着。
每个关节 4 个参数:d(沿z平移)、θ(绕z旋转)、a(沿x平移)、α(绕x旋转)。
📌 DH 参数的精髓:任何两个相邻关节的相对位姿,都可以用恰好 4 个参数描述。3D 空间中两个坐标系之间有 6 个自由度,但关节的机械约束消去了 2 个,剩下 4 个——就是 DH 四参数。
当 det(J)=0 时为奇异配置,末端某些方向无法运动(如手臂完全伸直时无法径向移动)。
| 运动学 | 动力学 | |
|---|---|---|
| 关注 | 位置/速度/加速度 | 力/质量/惯性 |
| 不关心 | 力从哪来 | 运动轨迹 |
| 方程 | 几何关系 | 牛顿-欧拉 / 拉格朗日 |
📌 打个比方:运动学告诉你"方向盘转多少度车走什么弧线",动力学告诉你"要以多大力气转方向盘才能在2秒内转到那个角度"。前者是几何,后者是物理。
| 方法 | 思路 | 适用 |
|---|---|---|
| 牛顿-欧拉 | 对每个连杆列力/力矩平衡方程 | 递归计算、数值仿真 |
| 拉格朗日 | 基于能量(动能-势能)推导 | 解析表达式、控制器设计 |
机器人最常用的控制策略:
📌 PID 为什么这么常用:它不需要知道系统的精确数学模型——只要能测量误差就能控制。大多数工业机器人关节级控制用 PID 就够了。只有需要高精度力控或高速运动时才需要更高级的控制策略(如计算力矩控制、阻抗控制)。
| 传感器 | 原理 | 精度 | 范围 | 频率 | 成本 | 适用 |
|---|---|---|---|---|---|---|
| 激光雷达 | TOF飞时测距 | ±2cm | 100m | 10-20Hz | 高 | SLAM/避障 |
| 相机(单目) | 被动光学 | 依赖算法 | 无限制 | 30-60fps | 低 | 目标识别 |
| 深度相机 | 结构光/TOF | ±1-3cm | 0.5-10m | 30-60fps | 中 | 抓取/导航 |
| IMU | MEMS加速度+陀螺 | 漂移累积 | 短时精准 | 100-1000Hz | 低 | 姿态估计 |
| GPS/RTK | 卫星三角 | GPS:米级 RTK:cm | 全球 | 1-10Hz | 中-高 | 室外定位 |
| 编码器 | 光电/磁电计数 | 高精度 | 本体关节 | 高频 | 低 | 轮式里程计 |
IMU 包含加速度计(测线性加速度)和陀螺仪(测角速度)。通过积分可得速度和位置:
📌 为什么 IMU 不能单独用于长期定位:积分会累积误差——加速度计的微小偏差经过两次积分后变成位置误差,且随时间平方增长。所以 IMU 必须与 GPS/视觉/激光等绝对位置传感器融合使用。这就是"多传感器融合"的根本原因。
qt/VideoPlayer — GPU加速视频流播放(FFmpeg低延迟解码,D3D11/VAAPI硬件加速)qt/CameraComm — 相机通信控制(串口/TCP命令帧协议)qt/ImageMetadata — 图像元数据解析(EXIF/GNSS位置信息提取)cpp/Serial — 串口通信(传感器数据读取常用接口)RieboPPK — GNSS PPK后处理(载波相位差分,厘米级定位)针孔相机模型:3D 点 → 2D 像素的投影关系:
畸变:真实镜头有径向畸变(桶形/枕形)和切向畸变,需要标定后校正。
| 特征点法 | 直接法 | |
|---|---|---|
| 提取 | 角点/描述子(ORB, SIFT) | 不提取,直接用像素灰度 |
| 匹配 | 描述子距离匹配 | 光流跟踪/灰度误差最小化 |
| 精度 | 高(亚像素) | 中(依赖光度一致性) |
| 速度 | 中 | 快 |
| 代表 | ORB-SLAM | DSO, LSD-SLAM |
AprilTag 是一种类似二维码的视觉基准标记,用于:
RyBOS 的 intserv 项目集成了 AprilTag 库用于视觉基准标记检测。
| 格式 | 说明 | RyBOS 模块 |
|---|---|---|
| LAS/LAZ | LiDAR 行业标准 | cpp/LasFile · cpp/Las3DTiles · cpp/LasSampler |
| PCD | PCL 框架原生格式 | cpp/PcdFile · cpp/Pcd3DTiles · cpp/PcdSampler |
| PLY | 通用3D格式,支持网格+点云 | cpp/PlyFile (ASCII+Binary, 流式写入) |
RyBOS 提供完整的点云 → 3D Tiles 转换链:
cpp/Osgb3DTiles)cpp/Las3DTiles · cpp/Pcd3DTiles)cpp/PointCloudClipper · cpp/LasSampler · cpp/PcdSampler| 算法 | 用途 |
|---|---|
| ICP 配准 | 两片点云对齐:找最近点对→计算变换→迭代收敛 |
| NDT 配准 | 点云转高斯分布集合,概率优化对齐,比ICP快 |
| 体素滤波 | 空间划分网格,每格取重心→降采样 |
| RANSAC 地面分割 | 随机采样一致性拟合最大平面=地面,剩余=障碍物 |
单一传感器各有局限:IMU 短期精准但长期漂移,GPS 全局定位但频率低、室内不可用,激光雷达精度高但成本高、无色彩信息。
📌 打个比方:就像人同时用眼睛(视觉)+ 内耳前庭(IMU)+ 脚底触觉(里程计)来感知运动。闭眼走路会偏(只有IMU会漂移),在黑暗中靠触觉走得慢(只有里程计会累积误差),多感官融合才能又快又准。
最经典的传感器融合算法:
| 变量 | 含义 |
|---|---|
| x | 状态向量(位置、速度、姿态等) |
| F | 状态转移矩阵(运动模型) |
| P | 状态协方差(不确定性) |
| Q | 过程噪声协方差 |
| R | 测量噪声协方差 |
| K | 卡尔曼增益(预测与测量的信任比例) |
📌 卡尔曼增益的直觉:K 决定"信预测还是信测量"。如果测量噪声 R 很小(传感器很准),K 接近 1,更信测量;如果 R 很大(传感器不准),K 接近 0,更信预测。这就是融合的核心——根据各传感器的不确定性自动分配信任权重。
| 方法 | 特点 |
|---|---|
| KF | 线性系统 |
| EKF (Extended KF) | 非线性系统,一阶泰勒展开线性化 |
| UKF (Unscented KF) | 非线性系统,Sigma点采样,不需求雅可比 |
RyBOS 项目中的 RoadInspection 使用串口读取 GPS + IMU 数据,配合 CORS 差分定位实现组合导航。RieboPPK 实现 GNSS PPK 后处理,达到厘米级定位精度。
同时解决两个问题:定位(知道自己在地图中的位置)+ 建图(构建周围环境的地图)。鸡生蛋问题:定位需要地图,建图需要定位 → 用迭代优化同时求解。
| 类型 | 代表算法 | 特点 |
|---|---|---|
| 2D 激光 | Gmapping · Cartographer · Karto | 精度高、计算量适中 |
| 3D 激光 | LOAM · LeGO-LOAM · LIO-SAM | 3D建图、户外大场景 |
| 单目视觉 | ORB-SLAM · VINS-Mono | 信息丰富、成本低、尺度不确定 |
| RGBD | RTAB-Map · ElasticFusion | 直接深度信息、室内场景 |
| 双目 | ORB-SLAM2 Stereo · VINS-Fusion | 恢复尺度、室外可用 |
📌 回环检测为什么关键:前端 VO 逐帧估计运动,误差不断累积(漂移)。如果机器人回到曾经去过的地方(回环),后端可以用"我以前在这里"的约束来修正整条轨迹。没有回环检测,SLAM 就退化成纯里程计,长时间运行后位置估计完全不可信。
intserv — 分布式AI任务调度(COLMAP三维重建 + Ceres优化 + CGAL/Metis网格处理)RoadInspection — 车载GPS/IMU串口读取 + CORS差分定位| 全局规划 | 局部规划 | |
|---|---|---|
| 目标 | 已知地图上找 A→B 最优路径 | 实时避障 + 跟踪全局路径 |
| 算法 | A* · Dijkstra · RRT · RRT* | DWA · TEB · VFH |
| 频率 | 低(地图变化时重规划) | 高(每帧/每周期) |
📌 A 为什么比 Dijkstra 快*:Dijkstra 向所有方向均匀扩展(无方向性),A* 的 h(n) 像一个"指南针"引导搜索朝目标方向偏移。只要 h(n) 不超过实际代价(可采纳性),A* 保证找到最优解且搜索量更少。
适合高维空间,但路径不平滑。RRT* 改进版可渐近最优。
在速度空间 (v, ω) 中采样 → 模拟轨迹 → 评分(目标距离 + 障碍距离 + 速度)→ 选最优执行。
| 层级 | 频率 | 任务 |
|---|---|---|
| 轨迹规划 | 1-10Hz | 生成全局参考轨迹 |
| 轨迹跟踪 | 50-100Hz | 跟踪参考轨迹(Pure Pursuit / MPC) |
| 底层控制 | 100-1000Hz | 关节级 PID / 力矩控制 |
几何跟踪方法:以前瞻距离 l_d 在参考轨迹上取目标点,控制转向使车头朝向目标点。
在每个控制周期:预测未来 N 步状态 → 优化控制序列使代价最小 → 执行第一步 → 滚动重复。
📌 MPC 为什么比 PID 强:MPC 能"看到未来"——它基于运动模型预测未来轨迹,同时考虑约束(速度上限、转角极限、障碍物)。PID 只对当前误差做反应,无法预判。代价是计算量大,需要快速求解优化问题。
ROS (Robot Operating System) 不是真正的操作系统,而是运行在 Linux 上的机器人中间件框架。提供进程间通信、软件包管理、工具链和生态。
| 概念 | 说明 |
|---|---|
| Node | 进程,执行特定功能(如激光雷达驱动节点) |
| Topic | 发布/订阅消息总线(异步通信) |
| Service | 请求/响应同步调用 |
| Action | 带反馈的长时任务(如导航到目标点) |
| Bag | 录制/回放话题数据(调试利器) |
| URDF | 机器人模型描述(关节、连杆、传感器) |
| ROS1 | ROS2 | |
|---|---|---|
| 中间件 | 自研 TCPROS | DDS (工业标准) |
| 实时性 | 不支持 | 支持 (RT) |
| 多机 | 需要 master | 去中心化发现 |
| 安全 | 无 | DDS 安全层 |
| 平台 | Linux 为主 | Linux/Windows/RTOS |
📌 为什么 ROS2 用 DDS:ROS1 的自研通信协议在实时性、安全性和跨平台方面都有短板。DDS 是工业级发布/订阅中间件,支持 QoS(服务质量)、多播、安全认证。ROS2 站在 DDS 巨人的肩膀上,直接获得了工业级通信能力。
RyBOS cpp/CommandProtocol 模块定义的帧格式:
RyBOS: cpp/CRC(CRC8/16/32)+ cpp/CommandProtocol(CRC16/XMODEM,初始值可配置)
串口/网络数据是字节流,一帧可能分多次到达。FrameParser 实现:
| 方式 | 特点 | RyBOS 模块 |
|---|---|---|
| 串口 | 点对点·简单可靠 | cpp/Serial |
| TCP | 可靠传输·有连接 | cpp/TcpSocket |
| UDP | 快速无连接·实时 | cpp/UdpSocket |
| WebSocket | Web控制界面 | cpp/WebSocket |
| CAN | 多主竞争·实时性强 | (未提取) |
| 标准 | 领域 |
|---|---|
| ISO 13849 | 机械安全控制系统 |
| ISO 10218 | 工业机器人安全要求 |
| ISO/TS 15066 | 协作机器人安全 |
机器人通信协议需要考虑:
RyBOS 的 cpp/CommandProtocol 内置 CRC-16 校验,cpp/Crypto 提供 AES 加密。
RyBOS 项目中的 AI 推理部署架构:
intserv — 分布式 AI 任务调度服务
crackservicenew — 道路裂缝 AI 检测
RyBOS 项目中的自动更新架构(来源:CameraToolBox):
| 术语 | 英文 | 说明 |
|---|---|---|
| 自由度 | DOF (Degrees of Freedom) | 独立运动维度数 |
| 正运动学 | FK (Forward Kinematics) | 关节角→末端位姿 |
| 逆运动学 | IK (Inverse Kinematics) | 末端位姿→关节角 |
| 齐次变换 | Homogeneous Transform | 4×4矩阵统一旋转+平移 |
| 四元数 | Quaternion | 4参数无万向锁的旋转表示 |
| 雅可比 | Jacobian | 关节速度→末端速度的映射矩阵 |
| 奇异配置 | Singularity | det(J)=0,丢失自由度 |
| SLAM | Simultaneous Localization and Mapping | 同步定位与建图 |
| 回环检测 | Loop Closure | 检测重访以消除漂移 |
| ICP | Iterative Closest Point | 点云配准算法 |
| RANSAC | RANdom SAmple Consensus | 随机采样一致性(模型拟合) |
| PID | Proportional-Integral-Derivative | 比例积分微分控制 |
| MPC | Model Predictive Control | 模型预测控制 |
| EKF | Extended Kalman Filter | 扩展卡尔曼滤波 |
| DDS | Data Distribution Service | ROS2 通信中间件标准 |
| TOF | Time of Flight | 飞时测距 |
| RTK | Real-Time Kinematic | 实时动态差分定位 |
| PPK | Post-Processed Kinematic | 事后差分定位 |
| VO | Visual Odometry | 视觉里程计 |
| BA | Bundle Adjustment | 光束法平差(全局优化) |
| 类别 | 模块 | 说明 |
|---|---|---|
| 坐标变换 | cpp/GeodeticConverter |
WGS84↔UTM↔CGCS2000 |
cpp/GeoTransform |
空间坐标系变换 | |
| 点云读写 | cpp/LasFile |
LAS 格式读写 |
cpp/PcdFile |
PCD 格式读写 | |
cpp/PlyFile |
PLY 格式读写(ASCII+Binary) | |
| 点云处理 | cpp/LasSampler · cpp/PcdSampler |
点云降采样 |
cpp/PointCloudClipper (+GUI) |
点云裁剪 | |
| 3D Tiles | cpp/Las3DTiles · cpp/Pcd3DTiles |
点云→3D Tiles |
cpp/Osgb3DTiles |
OSGB→3D Tiles | |
| 通信协议 | cpp/CommandProtocol |
命令帧构建/解析/CRC |
cpp/CRC |
CRC8/16/32 校验 | |
| 传输层 | cpp/Serial |
串口通信 |
cpp/TcpSocket · cpp/UdpSocket |
网络通信 | |
cpp/WebSocket |
WebSocket 通信 | |
| 视觉 | qt/VideoPlayer |
GPU加速视频流播放 |
qt/CameraComm |
相机通信控制 | |
qt/ImageMetadata |
图像EXIF/GNSS元数据 | |
| 定位 | RieboPPK |
GNSS PPK后处理 |
| AI推理 | intserv |
分布式AI任务调度 |
crackservicenew |
TensorRT道路裂缝检测 | |
| 应用 | RoadInspection |
车载巡检系统 |
RieboCapture |
无人机地面站 | |
| 地图上传下载工具 | 机器人地图文件传输 |
使用 cpp/CommandProtocol + cpp/Serial 构建机器人串口通信系统:
FrameBuilder 构建命令帧Serial 发送到机器人FrameParser 流式解析返回数据使用 RyBOS 点云模块链:
LasFile / PcdFile 读取原始点云LasSampler / PcdSampler 降采样PointCloudClipper 裁剪感兴趣区域Las3DTiles / Pcd3DTiles 转 3D Tiles参考 RoadInspection 架构:
Serial 读取 GPS NMEA 报文 + IMU 数据GeodeticConverter 转换坐标系