1. 课程导论与基础概念:任务规划与轨迹规划的定义、区别与联系
1.1 为什么要把「规划」拆成两件事?
大家好,我是这门课的主讲。先聊个我早年踩过的坑。
刚入行那会儿,我接手过一个移动抓取项目。机器人需要从A点取零件,放到B点的托盘上。我当时想得很简单:写个路径,让机械臂动起来不就完了?结果一跑,机械臂倒是动了——但它先绕过了桌子,又差点撞到墙上的电箱,最后在目标点上方悬停了五秒钟,因为不知道该先放下夹爪还是先旋转手腕。
你看,问题出在哪?
我其实只给了它一条「轨迹」,却没告诉它「任务」是什么。它不知道要先移动到安全高度,再调整姿态,最后执行放置。说白了,我混淆了任务规划和轨迹规划这两个层次。
从那天起,我养成了一个习惯:先拆任务,再算轨迹。这也是这门课的核心思路。
一句话总结:任务规划决定「做什么、按什么顺序做」;轨迹规划决定「具体怎么动、动多快、走哪条路」。
1.2 任务规划 vs 轨迹规划:一张表说清楚
很多同学问我:「这两个东西到底有啥区别?不都是规划吗?」
嗯,我习惯用一个例子来解释:你让一个机器人帮你倒杯水。
- 任务规划:先走到饮水机 → 拿起杯子 → 按下出水键 → 等水满 → 把杯子端回来。这是逻辑顺序。
- 轨迹规划:从当前位置到饮水机,手臂以多快的速度伸出,手指以多大的力捏住杯子,手腕转多少度才能让杯口对准出水口。这是运动细节。
下面这张表是我在项目里经常拿来给团队对齐认知的,你直接拿去用:
| 对比维度 | 任务规划 | 轨迹规划 |
|---|---|---|
| 核心问题 | 做什么?下一步是什么? | 怎么动?动多快? |
| 输入 | 目标状态、环境约束、资源列表 | 起始位姿、目标位姿、运动学模型 |
| 输出 | 动作序列(如:抓取→移动→放置) | 时间-位置-速度-加速度曲线 |
| 典型算法 | 状态机、行为树、PDDL、HTN | 多项式插值、S形曲线、RRT、A* |
| 时间尺度 | 秒级到分钟级 | 毫秒级到秒级 |
| 我常犯的错误 | 把任务写死,不考虑异常 | 轨迹算得完美,但任务顺序错了 |
我的小技巧:在项目初期,我会先用一张白纸画出任务流程图,确定好所有「如果…就…」的分支,再开始写轨迹代码。这样能避免后期大量返工。
1.3 它们是怎么「整合」到一起的?
你可能会问:「既然分开了,那怎么让它们配合工作?」
好问题。我见过不少团队,任务规划用一套系统,轨迹规划用另一套,中间靠一个简陋的接口传数据。结果呢?任务规划说「去抓杯子」,轨迹规划发现杯子位置变了,但任务层不知道,直接报错。
真正的整合,需要做到三点:
- 信息闭环:轨迹执行的结果要反馈给任务层,比如「抓取失败,因为目标偏移了2厘米」。
- 状态同步:任务规划要知道机器人当前在哪个关节角度、末端在哪,才能决定下一步。
- 异常处理:轨迹规划遇到障碍物时,不能只停在原地,要告诉任务层「这条路走不通,换个方案」。
说白了,任务规划是大脑,轨迹规划是手脚。大脑做决策,手脚执行,但手脚如果被烫到了,得喊一声让大脑换个策略。
1.4 课程整体框架:我们怎么学?
这门课一共30章,我把它分成了四个阶段。下面这张图是我自己画的,你可以先存下来当路线图:
四个阶段的设计思路是这样的:
- 阶段一(第1-5章):打地基。把概念、坐标系、运动学这些基本功练扎实。我见过太多人一上来就调RRT,结果连正逆解都写不对——嗯,别做那种人。
- 阶段二(第6-13章):深入任务规划。从状态机讲到行为树,再到PDDL和HTN。你会学会怎么让机器人「思考」下一步。
- 阶段三(第14-23章):死磕轨迹规划。关节空间、笛卡尔空间、避障、平滑优化……这些都是我实际项目中反复调优过的内容。
- 阶段四(第24-30章):整合实战。把前三个阶段的东西拼起来,做一个完整的抓取-移动-装配系统。这也是最有意思的部分。
1.5 学习目标:学完你能做什么?
我不喜欢讲虚的。学完这门课,你应该能:
- 独立设计一个任务规划器:用状态机或行为树描述一个完整的作业流程,包括异常处理。
- 编写平滑的轨迹规划算法:从简单的点到点运动,到带避障的连续轨迹。
- 打通任务层和轨迹层:让两者通过标准接口通信,实现「任务下发→轨迹执行→结果反馈」的闭环。
- 调试真实机器人系统:遇到规划失败时,能快速定位是任务逻辑问题还是轨迹参数问题。
⚠️ 一个重要的提醒:这门课不是纯理论课。每章都有代码示例和练习。我建议你边学边写,哪怕只是把示例代码跑通、改几个参数看看效果,也比只看不练强十倍。我曾经带过一个实习生,他把所有示例都自己重写了一遍,两周后就能独立调通一个简单的抓取任务了。
1.6 我的一点经验之谈
最后,分享一个我个人的工作习惯。
每次开始一个新项目,我不会急着写代码。我会先拿一张纸,画出任务流程图和轨迹规划的关键约束。然后问自己三个问题:
- 这个任务有哪些步骤?哪些步骤可以并行?
- 每个步骤对轨迹有什么特殊要求?(比如:末端必须保持水平、速度不能超过0.5m/s)
- 如果某一步失败了,系统该怎么反应?
把这三个问题想清楚,代码写起来就顺了。你想想看,是不是这个道理?