第1章:课程导论与预备知识

各位同学好,我是这门课的主讲。在机器人行业摸爬滚打了十几年,从最早的轮式机器人做到现在的协作机械臂,踩过的坑确实不少。今天咱们开始第一讲,先把地基打牢。

这一章我不会讲太深的技术细节,而是帮大家理清三个问题:机械臂运动学到底在算什么?避障问题究竟难在哪?以及我们这30章课程的整体路线图是什么样的?

说白了,如果你连正逆解都写不利索,后面谈避障就是空中楼阁。我见过太多同学一上来就调RRT*的参数,结果机械臂直接怼到桌面上——嗯,连碰撞检测的包围盒都没设对。

本章核心目标:

  • 回顾机械臂运动学基础(正解、逆解、雅可比)
  • 明确避障问题的数学定义与工程边界
  • 建立课程知识体系与学习路径

1.1 机械臂运动学基础回顾

先问大家一个问题:你给机械臂发一个末端位姿,它怎么知道每个关节该转多少度? 这就是运动学要解决的事。

1.1.1 正运动学:从关节空间到任务空间

正运动学很简单。给定一组关节角度 q = [q1, q2, ..., qn],通过DH参数法算出末端执行器的位姿 T。公式长这样:

T = T1(q1) * T2(q2) * ... * Tn(qn)

每个 Ti 是一个4x4齐次变换矩阵。我刚开始做项目时,觉得这步就是纯数学推导,没什么好说的。直到有一次在产线上,六轴机器人末端突然抖动——查了半天,发现是DH参数表里一个连杆偏距写错了0.5毫米。

我的习惯: 每次建完DH模型,先用正解算几个已知位姿验证一下。比如让所有关节归零,看末端是不是在预期位置。这一步花不了5分钟,但能省后面几小时的调试时间。

1.1.2 逆运动学:从任务空间回到关节空间

逆解就麻烦多了。给定末端位姿 T_desired,求关节角 q。对于六轴机械臂,解析解存在但计算复杂;对于七轴冗余臂,解空间是无穷多的。

我常用的逆解方法对比:

方法 适用场景 优点 缺点
解析法(Pieper准则) 六轴,后三轴交于一点 速度快,精度高 对构型有限制
数值法(雅可比迭代) 任意构型 通用性强 可能陷入局部解
优化法(二次规划) 冗余臂、多约束 可加入关节限位等约束 计算量大

这里有个坑:数值法逆解一定要做奇异性检测。我曾经在调试一个SCARA机器人时,没检查雅可比矩阵的条件数,结果在奇异位形附近迭代直接发散,末端执行器差点撞到夹具。

避坑指南: 写逆解代码时,务必加入以下检查:

  • 雅可比矩阵是否满秩(行列式不为零)
  • 迭代次数是否超限(建议最大100次)
  • 关节角度是否在限位范围内

1.1.3 雅可比矩阵:速度与力的桥梁

雅可比矩阵 J(q) 把关节速度映射到末端速度:

v_end = J(q) * q_dot

反过来,通过转置雅可比,可以把末端力映射到关节力矩。这在避障中非常有用——当你检测到机械臂靠近障碍物时,可以在任务空间施加一个虚拟斥力,然后通过 J^T 映射成关节力矩。

我个人习惯在代码里把雅可比矩阵的每一列单独拿出来看。为什么?因为每一列对应一个关节对末端速度的贡献。如果某一列的模长特别小,说明这个关节在当前位置几乎不贡献运动——这就是奇异的征兆。

1.2 避障问题定义

好,运动学基础过完了。现在进入正题:避障问题到底在解决什么?

用一句话概括:在存在障碍物的环境中,找到一条从起点到终点的无碰撞路径,同时满足机械臂的运动学约束(关节限位、速度限制、力矩限制等)。

1.2.1 问题的数学形式化

避障问题可以写成这样一个优化问题:

minimize    f(q)   (路径长度、时间、能耗等)
subject to  q_min ≤ q ≤ q_max   (关节限位)
            q_dot_min ≤ q_dot ≤ q_dot_max   (速度限位)
            dist(robot(q), obstacle) > d_safe   (无碰撞)
            q(0) = q_start, q(T) = q_goal   (边界条件)

这里面最难处理的是第三个约束——无碰撞约束。为什么难?因为 dist(robot(q), obstacle) 这个函数是非凸的、非线性的,而且计算起来很费时间。

你想想看,机械臂有6个关节,每个关节的运动范围是360度,整个构型空间是6维的。要在这么高维的空间里找一个无碰撞路径,暴力搜索是不可能的。

1.2.2 碰撞检测的核心逻辑

实际工程中,我们不会直接算机械臂和障碍物的精确距离。太慢了。常用的做法是:

  1. 包围盒简化:把机械臂的每个连杆用球体、胶囊体或AABB包围盒代替
  2. 分层检测:先做粗略的包围盒相交测试,如果相交再做精细的三角面片检测
  3. 距离场预计算:对于静态障碍物,提前算好距离场,运行时直接查表

我记得第一次做避障项目时,用了精确的三角面片碰撞检测,结果一帧要算200毫秒。后来换成胶囊体包围盒,一帧只要2毫秒——精度损失不到5%,但速度提升了100倍。

工程经验: 碰撞检测的精度和速度永远是一对矛盾。我的建议是:在路径规划阶段用粗检测(包围盒),在路径执行阶段用精检测(三角面片)。这样既保证了规划速度,又保证了执行安全。

1.2.3 避障算法的分类

市面上主流的避障算法可以分为以下几类:

类别 代表算法 特点 适用场景
基于采样的方法 RRT、PRM、RRT* 概率完备,适合高维空间 静态环境、离线规划
基于搜索的方法 A*、Dijkstra 最优性保证,但需要离散化 低维空间、栅格地图
基于优化的方法 CHOMP、TrajOpt 路径平滑,可加入多种约束 动态环境、在线重规划
基于学习的方法 RL、IL 泛化能力强,但训练成本高 复杂动态环境

这门课会重点讲前三种。为什么?因为在实际工业项目中,采样法和优化法是最成熟、最可靠的。学习法虽然前景好,但目前在产线上还不太敢用——万一模型泛化失败,机械臂可就撞上去了。

1.3 课程项目总览与学习路径

好了,理论铺垫完了。接下来给大家看看我们这30章课程的整体架构。

课程知识体系与学习路径 第一阶段:基础夯实 第1-5章:运动学、碰撞检测、ROS基础 第二阶段:核心算法 第6-18章:RRT、CHOMP、A*、优化 第三阶段:实战调参 第19-30章:仿真、真机、调参、部署 运动学建模 碰撞检测引擎 ROS通信框架 可视化与调试工具 RRT / RRT* / Informed RRT* CHOMP / TrajOpt A* / Hybrid A* QP优化 实战调参:仿真验证 → 真机部署 → 性能调优 输出:可部署的避障系统 + 调参方法论 每章配套代码仓库 + ROS仿真环境 + 真机实验指导

这张图基本概括了我们30章的内容流向。从最底层的运动学建模,到中间的算法实现,再到顶层的实战调参,每一步都环环相扣。

1.3.1 课程特色

这门课和市面上其他课程有什么不同?我总结了几点:

  • 代码驱动:每章都有可运行的Python/C++代码,不是只讲理论
  • 真机验证:最后10章全部围绕真实机械臂的部署和调参
  • 避坑指南:每个算法我都会讲我踩过的坑,以及怎么避免
  • 调参方法论:不是给一组固定参数,而是教你怎么根据场景调参数

学习建议:

  • 每章代码一定要自己跑一遍,不要只看不练
  • 遇到问题先看日志,日志是最诚实的调试伙伴
  • 调参时一次只改一个参数,记录每次改动的效果

1.3.2 你需要准备什么

在正式开始之前,确保你的环境满足以下要求:

工具/库 版本要求 用途
Ubuntu 20.04 或 22.04 开发环境
ROS Noetic 或 Humble 机器人通信框架
Python 3.8+ 算法原型开发
C++ C++17 性能关键模块
MoveIt 最新稳定版 运动规划框架
OMPL 1.5+ 采样规划库

如果你用的是Windows或macOS,建议装个虚拟机或者用Docker。我个人更推荐Docker——环境隔离干净,不会把宿主机搞乱。

快速开始: 课程配套的Docker镜像已经包含了所有依赖。你只需要拉取镜像、启动容器,就能直接跑代码。具体操作在课程仓库的README里有详细说明。

本章小结

这一章我们做了三件事:

  • 回顾了机械臂运动学的核心概念(正解、逆解、雅可比)
  • 明确了避障问题的数学定义和工程挑战
  • 梳理了课程的整体架构和学习路径

从下一章开始,我们会进入实战环节——用Python搭建第一个碰撞检测模块。到时候我会带着大家一步步写代码,把今天讲的理论落地。

嗯,今天就到这里。有问题随时在课程讨论区提,我看到就会回。