🛩️ 第 7 课 · 无人机编程飞行
模块:航空 | 课时:45 分钟 | 类型:实操
📖 讲义
模块:航空 | 课时:45 分钟 | 类型:实操(编程飞行) 教学法:EDP(设计任务 → 编程 → 试飞 → 调试 → 迭代)+ 5E 之 Explore/Explain
学习目标
完成本课后,你能够:
- 说明无人机编程飞行的基本原理,区分"遥控飞行"与"编程飞行"的本质差异。
- 解释 SDK 与编程接口的作用,列举 Tello EDU 常用指令(起飞、移动、旋转、翻滚、降落)的格式与参数含义。
- 运用坐标飞行思想,把一条期望航线(如矩形)分解为一组有序的航点指令。
- 使用循环、条件、函数等控制结构,编写并优化一段飞行任务代码(DroneBlocks 或 Python)。
- 执行一次完整的 EDP 循环:设计 → 编程 → 试飞 → 调试 → 迭代,让无人机安全完成"起飞 → 矩形航线 → 翻滚 → 降落"任务,并尝试穿越障碍门。
核心知识
一、
从遥控到编程:无人机为什么要"自己飞"
第 6 课你已经亲手遥控无人机完成了起飞、悬停、平移、降落。但真正的"任务飞行"——比如巡检一条管道、按固定航线测绘一块农田、穿越一连串障碍门——靠人手遥控既慢又不准。这时候我们需要让无人机按预设程序自动飞行,这就是编程飞行(Programmed Flight)。
| 维度 | 遥控飞行(第 6 课) | 编程飞行(本课) |
|---|---|---|
| 指令来源 | 飞手实时推摇杆 | 预先写好的代码 / 积木程序 |
| 精度 | 依赖飞手手感,误差大 | 依赖传感器 + 指令参数,可达厘米级 |
| 可重复性 | 每次飞都不一样 | 同一段程序每次飞几乎一致 |
| 典型场景 | 航拍、自由飞行 | 航线测绘、编队表演、穿越竞赛、自主巡检 |
💡 思考:为什么穿越竞赛和编队表演几乎都用编程飞行而不是遥控?(答案:竞赛要求毫秒级时序和精确到厘米的位置,人手反应速度(约 200 ms)跟不上;编队还要多机协同,靠人遥控多台几乎不可能——这些场景必须靠程序保证一致性与同步性。)
二、SDK 与编程接口:人与无人机的"对话协议"
要让无人机听懂你的指令,你需要一套标准化的"语言",这套语言就是 SDK(Software Development Kit,软件开发工具包)。不同厂商的无人机有不同的 SDK:大疆有 Mobile SDK / PSDK,而我们课堂上用的 Tello EDU 提供了一套简洁的文本指令协议。
1. Tello EDU 指令一览(核心)
Tello EDU 通过 Wi-Fi 与电脑/平板连接,接受一串文本指令。最常用的指令如下:
| 指令 | 含义 | 参数范围 | 示例 |
|---|---|---|---|
takeoff | 自动起飞至约 1 m 高度悬停 | 无 | takeoff |
land | 自动降落 | 无 | land |
up <x> / down <x> | 上升 / 下降 x 厘米 | 20–500 | up 50 |
forward <x> / back <x> | 前进 / 后退 x 厘米 | 20–500 | forward 100 |
left <x> / right <x> | 左移 / 右移 x 厘米 | 20–500 | left 80 |
cw <x> / ccw <x> | 顺时针 / 逆时针旋转 x 度 | 1–360 | cw 90 |
flip <d> | 翻滚(f/b/l/r) | 方向 | flip f |
speed <x> | 设置速度(cm/s) | 10–100 | speed 50 |
emergency | 紧急停机(电机立即停) | 无 | emergency |
⚠️ 关键约束:每条移动指令的参数必须在合法范围内,否则无人机不执行且不报错(只会返回错误码)。这是初学者最常见的"踩坑"——
forward 10不会动,因为最小值是 20。
2. 两种编程方式:积木 vs 代码
| 方式 | 工具 | 适合 | 特点 |
|---|---|---|---|
| 积木编程 | DroneBlocks(平板/电脑) | 零基础、快速上手 | 拖拽积木,直观,自动生成指令 |
| 代码编程 | Python + djitellopy 库 | 有编程基础、需要复杂逻辑 | 支持循环/条件/函数/传感器读取 |
DroneBlocks 示意(矩形航线的一个边):
[起飞] → [前进 80 cm] → [顺时针转 90°] → [前进 80 cm] → ...Python 示例(同样动作):
from djitellopy import Tello
tello = Tello()
tello.connect()
tello.takeoff()
tello.forward(80) # 前进 80 cm
tello.rotate_clockwise(90) # 顺时针转 90°
tello.forward(80)
tello.land()🎤 关键理解:积木和代码本质相同——都是把 Tello 指令按顺序发给无人机。积木是"包装过的代码",帮你避免拼写错误和参数错误;代码则给你更强的表达力(循环、条件、读取传感器)。本课两种都可用,建议先积木上手,再过渡代码。
三、坐标飞行:给无人机一套"空间语言"
编程飞行的核心思想是坐标飞行(Coordinate Flight):把无人机在三维空间中的运动,描述为相对于自身的位移与转角。
1. 机身坐标系
Tello EDU 使用机体坐标系——即以无人机自身为原点,前后左右上下都相对无人机当前朝向:
| 方向 | 含义 | 正方向 |
|---|---|---|
| X 轴(前后) | Pitch 方向 | 前为正 |
| Y 轴(左右) | Roll 方向 | 右为正(但指令是 left/right 分开) |
| Z 轴(上下) | Throttle 方向 | 上为正 |
| 偏航角(Yaw) | 机身朝向 | 顺时针为正 |
💡 重要区别:Tello 的
forward / back / left / right都是相对当前朝向的,不是相对地面固定方向。所以走矩形航线时,每次转弯后"前进"的方向都会变——这正是我们用cw 90来"换方向"的原因。
2. 航点(Waypoint)思想
一条复杂航线可以看作一系列航点的连线。编程飞行就是让无人机依次经过这些航点。例如矩形航线有 4 个角点,无人机要:
起飞点 → 角1 → 角2 → 角3 → 角4 → 起飞点 → 降落把"走完矩形"分解成"前进 + 转弯"的小步组合,就是任务分解。
四、任务分解:把复杂航线拆成小步
任务分解(Task Decomposition) 是编程飞行的核心方法,也是工程思维的基础。以本课主任务"起飞 → 矩形航线 → 翻滚 → 降落"为例:
任务:完成一个边长 80 cm 的矩形航线 + 一次前翻 + 降落
│
├─ 步骤 0:起飞(takeoff)
├─ 步骤 1:前进 80 cm(forward 80)
├─ 步骤 2:顺时针转 90°(cw 90)
├─ 步骤 3:前进 80 cm(forward 80)
├─ 步骤 4:顺时针转 90°(cw 90)
├─ 步骤 5:前进 80 cm(forward 80)
├─ 步骤 6:顺时针转 90°(cw 90)
├─ 步骤 7:前进 80 cm(forward 80)
├─ 步骤 8:顺时针转 90°(cw 90) ← 回到原朝向
├─ 步骤 9:前翻(flip f)
└─ 步骤 10:降落(land)注意到步骤 1–2、3–4、5–6、7–8 是重复的"前进 + 转弯"模式——这正是循环结构大显身手的地方:
tello.takeoff()
for i in range(4): # 重复 4 次
tello.forward(80) # 前进 80 cm
tello.rotate_clockwise(90) # 转 90°
tello.flip_forward() # 前翻
tello.land()同样的逻辑在 DroneBlocks 中用一块"重复 4 次"积木包裹即可。识别重复模式 → 用循环替代复制粘贴,是从"写代码"到"写好代码"的关键一步。
🎤 教师提示:矩形航线看似简单,但试飞时你会发现无人机走不回原点——会偏移几厘米到几十厘米。为什么?因为每次
forward和cw都有误差,4 次累积后偏差放大。这就引出下一节的调试与迭代。
五、条件控制与任务规划
真实的竞赛任务(如无人机编程技能挑战赛)远不止走矩形,还包含条件判断:根据传感器读数决定下一步动作。
1. 条件指令示例
# 读电池电量,低于 20% 立即降落
battery = tello.get_battery()
if battery < 20:
tello.land()
else:
tello.takeoff()
# ... 执行任务2. 任务规划的基本流程
面对一个复杂任务(如穿越 3 道障碍门),任务规划的标准步骤是:
- 场地测量:用卷尺量出障碍门位置、间距、高度,记录坐标。
- 航线设计:在纸上画出预期航线,标注每个航点。
- 指令分解:把航线翻译成一串 takeoff/move/rotate/land 指令。
- 编程实现:用积木或代码写出程序。
- 试飞观察:低空、低速试飞,记录偏差。
- 调试迭代:根据偏差调整参数(距离/角度/速度),重复 5–6 步直至达标。
这就是 EDP(工程设计过程) 在编程飞行中的具体落地。
六、EDP 循环:编程飞行的方法论
本课的每一次飞行任务,都遵循 EDP 五步循环:
| EDP 步骤 | 在编程飞行中的具体动作 |
|---|---|
| Design(设计) | 画航线图、量场地、定航点 |
| Code(编程) | 写积木 / Python 代码 |
| Fly(试飞) | 低速试飞,观察实际轨迹 |
| Debug(调试) | 找出偏差原因(参数?时序?电量?) |
| Iterate(迭代) | 修改参数/逻辑,再次试飞 |
🏆 赛事对接:全国青少年航天创新大赛的**"无人机编程技能挑战赛",要求选手在规定时间内编程完成一系列场地任务(穿越障碍门、精准降落、物资投放等)。评分看任务完成度 + 用时 + 精度**。你今天练的矩形航线 + 翻滚是基础,穿越障碍门是进阶——直接对应赛场任务。
本课小结
- 编程飞行 vs 遥控飞行:前者按预设程序自动飞,精度高、可重复,是竞赛和行业应用的主流。
- SDK 是对话协议:Tello EDU 用文本指令(takeoff/forward/cw/flip/land 等),通过 Wi-Fi 下发。
- 坐标飞行:用机体坐标系描述位移与转角;复杂航线 = 一串航点的连线。
- 任务分解:把复杂航线拆成"前进 + 转弯"等小步,识别重复模式用循环。
- 条件控制:结合传感器读数(电量、高度)做判断,提升任务鲁棒性。
- EDP 循环:设计 → 编程 → 试飞 → 调试 → 迭代,每次飞行都走一遍。
延伸阅读
- 🌐 Tello EDU 官方 SDK 文档(指令全集):https://terra-1-g.djicdn.com/2d4dcec68891f46dab57ad4e6c8f0e3f/v1.3/Tello SDK Documentation.pdf
- 🌐 DroneBlocks 官网(积木编程,免费注册):https://learn.droneblocks.io/
- 🌐 djitellopy Python 库(GitHub):https://github.com/damiafuentes/DJITelloPy
- 🎬 "Tello EDU 编队飞行"演示(B 站可搜)——感受多机协同编程飞行
- 📖 《多旋翼无人机入门》(全权 著)第 8 章——航迹规划基础
- 🏆 全国青少年航天创新大赛官网(无人机编程赛规程):http://nysic.declare.htgjjl.com
🔬 实践活动
第 7 课实践环节(约 30 分钟) 教学法:EDP(设计任务 → 编程 → 试飞 → 调试 → 迭代)
活动目标
- 使用 DroneBlocks 或 Python,让 Tello EDU 完成起飞 → 矩形航线 → 前翻 → 降落的完整编程飞行任务。
- 经历一次完整的 EDP 循环:设计航线 → 编程 → 试飞 → 观察偏差 → 调试迭代。
- 进阶挑战:编程让无人机穿越一道障碍门(对接无人机编程技能挑战赛场地任务)。
- 体会任务分解与循环结构在编程飞行中的价值。
器材清单
| 器材 | 数量 | 说明 |
|---|---|---|
| Tello EDU 教育无人机 | 每组 1 台 | 电量 ≥ 50%(满电约飞 13 分钟) |
| Tello 电池(备用) | 每组 1–2 块 | 课堂轮换 |
| 平板 / 电脑(含 Wi-Fi) | 每组 1 台 | 装好 DroneBlocks 或 Python + djitellopy |
| 充电排插 + Tello 充电管家 | 全班 1–2 套 | 集中充电 |
| 障碍门道具 | 每组 1 道 | 宽 50 cm × 高 60 cm 框架(纸箱/魔术贴杆/PVC 框自制) |
| 卷尺 | 每组 1 把 | 量航线边长、门距 |
| 飞行场地标记胶带 | 全班 1 卷 | 地面贴矩形角点、起飞点 |
| 《EDP 试飞记录表》 | 每组 1 份 | 见下方 |
| 护目镜(选配) | 每人 1 副 | 推荐佩戴 |
💡 场地要求:每组至少 2 m × 2 m 开阔平整区域,无人员穿越,远离窗帘、吊扇、灯饰。建议在体育馆 / 空教室 / 走廊划区。室内飞行无需 GPS,Tello 用底部光流 + 气压计定位。
活动一:连接与首飞测试(5 分钟)
步骤 1:连接 Tello EDU
- 长按 Tello 侧面电源键开机,前灯闪烁红色表示就绪。
- 在平板/电脑的 Wi-Fi 列表中找到
TELLO-XXXXXX网络,点击连接(首次无密码)。 - 打开 DroneBlocks 或运行 Python
tello.connect(),确认图传画面正常显示。
⚠️ 常见坑:Tello 的 Wi-Fi 会抢占平板的网络连接——连上 Tello 后,平板一般无法上网。所以代码和素材要课前下载好,不能临时在线取。
步骤 2:电池与状态自检
在 DroneBlocks 用"获取电池"积木,或 Python tello.get_battery(),读取电量并记录。
| 检查项 | 标准 | 我的读数 |
|---|---|---|
| 电池电量 | ≥ 50% | ____% |
| 图传画面 | 清晰流畅 | □ 正常 □ 卡顿 |
| 前灯状态 | 绿色常亮 = 连接成功 | □ 绿 □ 红 |
步骤 3:首飞——起飞 + 悬停 + 降落
编写最简单的三行程序并执行(全程手放在"紧急停"按钮附近):
takeoff → (等待 3 秒,观察悬停是否稳定)→ land✅ 首飞成功标准:平稳离地、悬停不漂移 > 1 m、轻柔降落。若悬停时明显漂移或撞墙,立即 land,重新水平放置开机做水平校准。
活动二:矩形航线 + 翻滚(核心任务,15 分钟)
步骤 1:设计(Design,2 分钟)
在地面用胶带贴出一个边长 80 cm 的正方形,标记起飞点(角 1)。画出预期航点:
起飞点(角1) → 角2 → 角3 → 角4 → 角1 → 翻滚 → 降落在纸上把这条航线翻译成指令序列(参考讲义第四节任务分解)。
步骤 2:编程(Code,4 分钟)
DroneBlocks 方案:搭积木——takeoff → [重复 4 次:forward 80 + cw 90] → flip f → land。
Python 方案:
from djitellopy import Tello
import time
tello = Tello()
tello.connect()
print("电池:", tello.get_battery())
tello.takeoff()
time.sleep(2)
for i in range(4):
tello.forward(80)
tello.rotate_clockwise(90)
tello.flip_forward()
tello.land()💡 关键技巧:每两条指令之间 Tello 会自动短暂悬停,无需手动加 delay;但起降前后加 1–2 秒延迟有助于观察。
步骤 3:试飞(Fly,3 分钟)
低速试飞(先设 speed 30 或 DroneBlocks 设低速档)。全组站到飞行区外,由 1 人操作。全程拍摄(手机录像),便于回看偏差。
步骤 4:调试 + 迭代(Debug & Iterate,6 分钟)
观察无人机最终落点与起飞点的偏差,按下表诊断:
| 现象 | 可能原因 | 调试方法 |
|---|---|---|
| 走完矩形偏前/偏后几厘米 | forward 距离有系统误差 | 微调距离(如 80 → 85 或 75) |
| 转角偏大/偏小,矩形歪斜 | cw 90 转向有误差 | 改成 cw 88 或 cw 92 试 |
| 越走越飘,最后撞墙 | 光流定位受地面纹理影响 | 在地面贴黑白格胶带增加纹理 |
| 突然大幅偏移或急停 | 阵风 / 电量骤降 / 障碍物干扰 | 检查电量、关闭门窗、清场 |
| 翻滚失败或"卡住" | 电量不足 / 高度太低 | 充电后再试,翻滚前确保高度 > 1 m |
填写《EDP 试飞记录表》(见下),至少迭代 2 轮。
EDP 试飞记录表
| 轮次 | 电池 % | 速度档 | 关键参数调整 | 终点偏移(cm) | 转角误差 | 翻滚是否成功 | 问题与下一步 |
|---|---|---|---|---|---|---|---|
| 第 1 轮 | 低 | 初始参数 80/90 | |||||
| 第 2 轮 | |||||||
| 第 3 轮(选) |
✅ 达标标准:终点偏移 ≤ 20 cm,矩形闭合(回到起飞点附近),翻滚完成,平稳降落。
活动三:穿越障碍门(进阶挑战,8 分钟)💡
本环节对接无人机编程技能挑战赛的核心场地任务——穿越障碍门。完成基础矩形航线的组方可挑战。
场地布置
在矩形航线一侧,距起飞点约 1.5 m 处放置障碍门(宽 50 cm × 高 60 cm),门后 50 cm 处设降落点。
任务
编程让无人机:起飞 → 升至 80 cm 高 → 前进穿过障碍门 → 门后降落。
参考代码(Python)
tello.takeoff()
tello.up(30) # 起飞后再升 30 cm,确保高于门下沿
tello.forward(150) # 穿过障碍门(150 cm)
tello.land()挑战升级(如时间允许)
- 三连穿门:依次穿越 3 道不同横向位置的障碍门(考验航点规划 + 转角精度)。
- 精准降落:在降落点贴一张 A4 纸作为靶心,要求机腹中心落在纸上。
- 条件控制:在起飞前读取电量,<30% 时打印警告并跳过翻滚(保护电池)。
🏆 赛事对接:无人机编程技能挑战赛的典型任务正是"穿越若干障碍门 + 精准降落"。今天能稳定穿过 1 道门,赛事中就能挑战 3–5 道。把今天的参数和经验记下来,期末若报名该赛道可直接复用。
数据记录与反思
组别飞行成绩汇总
| 组员(主操) | 矩形闭合偏差(cm) | 翻滚成功 | 穿门成功 | 用时(秒) | 迭代轮数 |
|---|---|---|---|---|---|
| □是 □否 | □是 □否(未挑战) | ||||
| □是 □否 | □是 □否(未挑战) |
反思问题(全组讨论,写在下方)
- 你的矩形航线为什么走不回原点?误差来自哪几条指令?(提示:每条
forward和cw的系统误差会累积放大) - 把 4 次"前进 + 转弯"用循环写,相比复制粘贴 4 遍,有什么好处?(提示:改一个参数即可调全部、不易写错、代码量少)
- 如果要穿越不同高度的障碍门,你需要在程序里加什么控制结构?(提示:读取高度 / 条件判断 / 高度参数变量化)
讨论问题(如时间允许)
- 编程飞行比遥控飞行精确,但为什么仍有偏差?是哪些传感器或物理因素限制了精度?(提示:光流受地面纹理影响、气压计受气流影响、桨叶磨损、电池电压下降影响电机出力)
- 如果让你设计一架森林巡护无人机,你会用编程飞行还是遥控飞行?为什么?(提示:固定巡护航线用编程,突发情况用遥控,实际是二者结合)
- 把今天的"矩形 + 穿门"任务再扩展,你想加什么任务?(如:物资投放、识别地面色块、避障)
⚠️ 安全提示
飞行前:
- 确认场地无闲杂人员,划定飞行区,旁观者站到 2 m 范围外。
- 关闭门窗、电扇、空调出风口,避免气流干扰。
- 电池电量 ≥ 50%,电池鼓包立即停用(参考第 6 课锂电池安全)。
- 长发、围巾、衣带收束,避免卷入旋翼。
飞行中:
- 全程有人盯机,手放在"紧急停/land"按钮附近。
- 无人机若失控飞向人员或障碍物,立即按 emergency(电机停,无人机会掉落)。
- 翻滚动作需要 高度 > 1 m 且电量充足,否则可能失败或撞地。
- 每次只飞一台(同一场地多台会互相干扰 Wi-Fi 和光流)。
飞行后:
- 等电机完全停转再去拿无人机,桨叶可能仍在惯性转动。
- 电池飞行后发热属正常,但若烫手应静置 5 分钟再充电。
- 桨叶有缺口/裂纹立即更换,否则振动剧烈影响定位精度。
PBL 关联:如果你的期末作品涉及无人机方案,本课的编程飞行经验是原型验证的关键能力——你可以在作品视频中展示一段编程飞行演示,极大提升"可行性"说服力。
✏️ 学生任务单
姓名:__________ 班级:__________ 团队:__________
课堂任务(当堂完成)
任务 1:Tello 指令速记(5 分钟)
填空(参考讲义指令表):
- 让无人机自动起飞的指令是 ________;自动降落的指令是 ________。
- 让无人机前进 100 厘米的指令是 ________;顺时针转 90° 的指令是 ________。
- Tello 移动指令(forward / back / left / right / up / down)的参数范围是 ________ 到 ________ 厘米。如果输入
forward 10,无人机 ________(会/不会)执行。 - 让无人机做前翻的指令是 ________;紧急停机的指令是 ________。
- 编程飞行中,我们说"前进、左移"是相对 ________(机身当前朝向 / 地面固定方向)而言的。
任务 2:任务分解(5 分钟)
把"起飞 → 边长 80 cm 的矩形航线 → 降落"分解为指令序列,写在横线上(提示:矩形 = 4 次"前进 + 转弯"):
1. ________
2. ________ ← 角1到角2
3. ________
4. ________ ← 角2到角3
5. ________
6. ________ ← 角3到角4
7. ________
8. ________ ← 角4回角1
9. ________任务 3:用循环改写(3 分钟)
上面 2、3 步(前进 + 转弯)重复了 4 次。请用 Python 或积木的"重复"结构改写:
Python:
tello.takeoff()
for i in ________:
tello.________(80)
tello.________(90)
tello.land()DroneBlocks:用一块"重复 ____ 次"积木包裹 ________ 积木和 ________ 积木。
💡 思考:用循环的好处是?(写出 1 条)____________________________________________
任务 4:EDP 试飞记录(配合实践活动)
填写本组的飞行数据:
| 轮次 | 电池 % | 速度档 | 参数调整 | 终点偏移(cm) | 翻滚成功 | 穿门成功 |
|---|---|---|---|---|---|---|
| 第 1 轮 | 初始 80/90 | □是 □否 | □是 □否 □未挑战 | |||
| 第 2 轮 | □是 □否 | □是 □否 □未挑战 |
我们调试中发现的最大问题是:____________________________________________
我们的解决办法是:____________________________________________
任务 5:条件控制小练习(3 分钟)
阅读下面 Python 代码,回答问题:
battery = tello.get_battery()
if battery < 30:
tello.land()
print("电量不足,已降落")
else:
tello.takeoff()
tello.forward(100)
tello.land()- 这段代码的作用是:____________________________________________
- 为什么要加这个判断?如果不加,可能发生什么?____________________________________________
- 如果想让"电量 < 50% 时跳过翻滚动作",应该怎么写?写出
if那一行:____________________________________________
课后任务
必做
整理本课程序:把今天写的矩形航线代码(或积木截图)保存,第 8 课前提交到课程平台。文件命名:
第7课_矩形航线_组号.pdf。写一段 150 字"调试心得":记录你在试飞中遇到的最大偏差和解决办法。这条经验会进入你的 PBL 研究日志。
我的调试心得:
查 Tello SDK 文档(见讲义延伸阅读链接),找出 2 条课堂上没讲过的指令(如
curve、go、mon、mdirection等),写下指令名和用途:- 指令 1:________ 用途:____________________________________________
- 指令 2:________ 用途:____________________________________________
完成第 6 课布置的查新任务(若尚未完成):提交完整《PBL 选题确认书》+ ≥5 条查新摘要。这是本课的硬性前置——选题未确认的组不能进入后续作品制作阶段。
查新完成情况:□ 已提交 □ 本周内提交 □ 遇到困难(请说明:________)
选做 💡
- 曲线飞行:查 SDK 文档中的
curve指令,尝试让无人机走一段弧线(而不是直角转弯),比较与forward + cw的轨迹差异。 - 编队尝试:如有 2 台以上 Tello EDU,查 Tello Swarm(编队)资料,尝试让 2 台同时起飞做镜像动作。
- 赛事观摩:在 B 站搜索"无人机编程技能挑战赛",看一段比赛视频,记录其中 1 个你觉得最难的场地任务:________________。
- PBL 关联:如果你的期末作品涉及无人机,思考"一段编程飞行演示"如何放进你的作品视频,下节课和队友讨论。
自评(✔ / ✘)
| 本课目标 | 达成 |
|---|---|
| 能区分遥控飞行与编程飞行 | |
| 能列举至少 5 个 Tello 指令及参数范围 | |
| 能把矩形航线分解为一串有序指令 | |
| 能用循环结构简化重复指令 | |
| 能读懂简单的条件判断代码(if/else) | |
| 完成矩形航线 + 翻滚的编程飞行试飞 | |
| 经历至少 2 轮 EDP 调试迭代 | |
| (进阶)成功穿越 1 道障碍门 |
🏆 PBL 进度自查
- [ ] 第 6 课《选题确认书》+ ≥5 条查新已提交
- [ ] 本课编程飞行程序已保存(可作为作品原型/演示素材)
- [ ] 调试心得已记入 PBL 研究日志
- [ ] 若作品涉及无人机:已规划"编程飞行演示"环节
提示:如果你的期末作品有无人机相关内容,今天写的代码和试飞视频就是**作品包第 4 件(展示视频)和第 2 件(实物/原型)**的直接素材。边学边存档,期末不慌。
👨🏫 教师参考
课时概览
本课是航空模块的实操高潮,也是学生第一次让无人机按自己写的程序自动飞行。从"遥控飞行"跨越到"编程飞行",学生将真正体验"代码控制物理世界"的成就感,并直接对接无人机编程技能挑战赛的场地任务。
成败关键在于:让每个小组在 30 分钟内至少完成一次成功的编程飞行,并经历至少 1 轮调试迭代。即使矩形走不回原点也没关系——理解"为什么走不回"才是本课的核心收获,这恰恰是 EDP 的精髓。
时间分配表(45 分钟)
| 时间 | 环节 | 内容 | 形式 |
|---|---|---|---|
| 0–3 min | 🎤 导入 | 抛问:"遥控飞行走 10 遍矩形会一样吗?怎么让它每次都一样?" | 讲授 |
| 3–10 min | 🎤 编程飞行原理 | 遥控 vs 编程对比 + SDK/指令表 + 两种编程方式 | 讲授 |
| 10–15 min | 🎤 坐标飞行 + 任务分解 | 机体坐标系 + 矩形航线分解 + 循环结构 | 讲授 + 板书 |
| 15–20 min | ✅ 连接与首飞 | Wi-Fi 连接 Tello + 电池自检 + takeoff/hover/land 首飞 | 小组实操 |
| 20–35 min | ✅ 矩形航线 + 翻滚 | 编程 → 试飞 → 调试迭代(≥2 轮 EDP) | 小组实操 |
| 35–43 min | 💡 穿越障碍门挑战 | 进阶组穿门,基础组继续迭代矩形 | 小组实操 |
| 43–45 min | 总结 + 课后任务 | 收拾器材,布置整理代码 + 调试心得 | 讲授 |
⏱ 时间紧的应对:讲授部分严格控制在 12 分钟内(只讲指令表 + 任务分解,传感器原理第 6 课已铺垫)。把时间让给实操——这是"做中学"的课,讲再多不如飞一次。若器材不足(每组不到 1 台 Tello),采用分组轮换制:2 组共享 1 台,A 组飞时 B 组在平板上编程/模拟。
教学设计(5E + EDP 对应)
| 阶段 | 本课对应 |
|---|---|
| Engage(激发) | 开场抛问"怎么让矩形航线每次都一样" |
| Explore(探索) | 学生连接 Tello、首飞、自行编程试飞 |
| Explain(解释) | 教师讲授 SDK、坐标飞行、任务分解、循环 |
| Elaborate(拓展) | 穿越障碍门进阶挑战 + 课后曲线飞行 |
| Evaluate(评价) | EDP 试飞记录表 + 自评表 + 代码提交 |
| EDP 循环 ⭐ | 设计航线 → 编程 → 试飞 → 调试 → 迭代(本课主线) |
重难点与突破策略
重难点 1:从"手动"思维转向"程序"思维
- 学生困难:习惯了遥控"边看边调",难以理解"代码一次性写完后无人机自己飞完,中途无法干预"。常见表现是代码写得很随意(参数乱填、顺序乱排),试飞时手忙脚乱。
- 突破:
- 强调任务分解先行——先在纸上把航线画出来、列出每一步指令,再打开编程软件。讲义第四节的标准分解模板让学生照着填。
- 第一轮试飞低速 + 简单任务(只 takeoff→hover→land),让学生先建立"代码能控制飞机"的信心,再加复杂航线。
- 反复强调"程序是你意志的延伸——你写错一个参数,飞机就飞错一个动作"。
重难点 2:矩形航线走不回原点(系统误差累积)
- 学生困难:理论上 4 次
forward 80 + cw 90应该回到原点,实际偏差几厘米到几十厘米。学生容易沮丧或怀疑代码有错。 - 突破:
- 这是本课最重要的教学时刻——告诉学生"走不回原点才是真实世界"。理论上精确,实际上每条指令都有系统误差(桨叶、气流、地面纹理、电池电压),误差会累积放大。
- 引导学生量化偏差(用尺子量终点偏移),然后针对性调参(如 forward 80 → 82,cw 90 → 88)。这就是 EDP 的"调试 → 迭代"。
- 借机引申:专业无人机用 RTK-GPS / 视觉锚点来消除累积误差,这正是航天器轨道修正(第 9 课)的同款思想——"测量→修正→再测量"。
重难点 3:Tello Wi-Fi 占用导致平板断网
- 学生困难:连上 Tello Wi-Fi 后平板无法上网,学生临时想查文档/下载素材失败。
- 突破:课前强调所有代码、SDK 文档、DroneBlocks 离线版必须提前装好。教师准备 1 台可上网的备用机(用手机热点)供临时查资料。
重难点 4:循环结构(for / 重复积木)的理解
- 学生困难:零基础学生不熟悉循环,倾向复制粘贴 4 遍。
- 突破:
- 用 DroneBlocks 的"重复 N 次"积木演示,可视化的循环边界比 Python 的
for更直观。 - 提问引导:"如果矩形边长要改成 100 cm,复制粘贴的要改几处?循环的要改几处?"——学生立刻体会到循环的维护优势。
- 对零基础组不强求用循环,复制粘贴能飞起来即可,循环作为"优化"在迭代阶段引入。
- 用 DroneBlocks 的"重复 N 次"积木演示,可视化的循环边界比 Python 的
编程飞行评价量规(教师巡回用)
| 维度 | 3 分(优) | 2 分(良) | 1 分(待改进) |
|---|---|---|---|
| 任务分解 | 指令序列完整、顺序正确、参数在合法范围 | 序列基本正确,1–2 处参数需调 | 序列有逻辑错误(顺序乱/缺关键步) |
| 代码质量 | 用循环/函数简化,结构清晰 | 顺序结构完整,未用循环 | 指令零散、难以维护 |
| 试飞执行 | 矩形闭合、翻滚成功、平稳降落 | 完成大部分动作,有 1 处偏差 | 多次失败或撞机 |
| EDP 迭代 | ≥2 轮调试,每轮有明确调整依据 | 2 轮调试,调整较随意 | 仅 1 轮或未迭代 |
| 安全规范 | 全程遵守安全规程 | 1 次小违规(如未清场) | 多次违规或危险操作 |
总分 ≥ 10 分优秀,7–9 分合格,< 7 分需补做。安全规范为"一票否决"项——违规组无论其他维度多好都判不合格。
常见问题(FAQ)
Q1:学生代码/积木拼对了,但无人机不动或乱飞?
按 5 步排查:① 电量 < 10% 时 Tello 拒绝执行动作指令(只起飞/降落);② 参数超范围(如
forward 10,最小 20);③ Wi-Fi 不稳——图传卡顿说明信号差,靠近或减少干扰;④ 桨叶装反/缺口的桨——剧烈抖动;⑤ 未水平校准——把 Tello 放水平面,长按电源键 3 秒重置(前灯黄闪后绿闪)。
Q2:学生想用 Python,但 djitellopy 装不上 / 报错?
最常见是 Python 环境问题。三个方案:① 用 DroneBlocks 桌面版(免装 Python)替代;② 用学校预装的 Python 环境,教师课前在每台机器装好
pip install djitellopy;③ 用 Thonny / Mu 等自带 Python 的轻量 IDE。不建议课堂现场排 Python 环境坑——会吃掉大量时间。
Q3:Tello 飞着飞着突然"急停"或飘走?
三个可能:① 底部光流受地面纹理影响——纯色光滑地面(如打蜡地板)定位会失效,地面贴黑白格胶带或报纸增加纹理;② 阵风(开窗/空调/风扇)——关闭所有气流源;③ 电量骤降保护——Tello 电量过低会自动降落,这是安全机制不是故障。
Q4:有组很快完成矩形,其他组还在首飞,怎么办?
差异化任务:快的组立即进入"进阶挑战"(穿越障碍门 → 三连穿门 → 精准落靶 → 条件控制)。把挑战任务分层卡片化(见素材清单),让快组自主取卡推进。慢的组目标降为"完成起飞→前进→降落"基础三步即可。
Q5:翻滚(flip)总是失败或飞机侧翻?
翻滚需要 高度 > 1 m + 电量 > 30% + 速度适中。常见失败原因:起飞后立即翻(高度不够)、电量低、或场地太小翻完撞墙。解决:takeoff 后加
up 50升到 1.5 m,确认电量充足再翻;场地至少 2 m 见方。翻滚是本课"亮点动作",但非必需——翻不成的组不强求,矩形闭合才是核心。
Q6:多组同时飞行互相干扰?
Tello 各组 Wi-Fi 名不同(
TELLO-XXXXXX),理论上互不干扰,但同一场地多台同时飞会互相影响光流定位(地面纹理被其他无人机的阴影/气流干扰),且 Wi-Fi 频段拥挤。建议分组轮飞:同一时刻全场最多 1–2 台在飞,其他组在编程/观察。
参考答案(学生任务单)
任务 1
takeoff;landforward 100;cw 90- 20 到 500;不会(低于最小值 20)
flip f(或flip forward);emergency- 机身当前朝向
任务 2
1. takeoff
2. forward 80
3. cw 90
4. forward 80
5. cw 90
6. forward 80
7. cw 90
8. forward 80
9. cw 90(回到原朝向,可选 land)注:第 9 步之后通常再加
land。学生若把 land 写进序列也正确。
任务 3
for i in range(4):
tello.forward(80)
tello.rotate_clockwise(90)- DroneBlocks:用"重复 4 次"积木包裹 forward 积木和 cw(顺时针旋转) 积木。
- 循环好处(任答 1 条):改一个参数即可调全部 / 不易写错 / 代码量少 / 易维护。
任务 5
- 起飞前读电池电量,<30% 则直接降落(不飞),否则起飞前进 100 cm 后降落。
- 防止电量过低时强行飞行导致空中断电坠机或无法完成动作。
- 示例:
if battery < 50: 跳过 flip 指令或if tello.get_battery() < 50: pass # 不执行翻滚。
⚠️ 任务 4 为开放性记录,无标准答案,按学生实际数据评阅。
差异化教学建议
- 零编程基础学生/组:用 DroneBlocks 积木,不要碰 Python;任务分解先在纸上画图,再照图搭积木;目标降为"起飞→前进→降落"三步走通即可,矩形闭合为加分。
- 有编程基础学生/组:用 Python,要求加循环 + 条件判断(电量保护);挑战
curve弧线指令、编队、传感器读取(高度/温度/气压)。 - 动手能力强但代码弱的组:让其在场地布置、参数标定、试飞录像上发挥,分工中承担"飞手/记录员"角色,代码由同伴主导——这是团队协作的体现。
- PBL 作品涉及无人机的组:本课的代码和试飞视频是作品原型的直接素材,提醒他们高清录像存档,期末作品视频可直接用。
赛事对接说明 🏆
本课是无人机编程技能挑战赛的直接训练课:
- 赛道认知:无人机编程技能挑战赛要求选手在规定时间内编程完成一系列场地任务(穿越障碍门、精准降落、物资投放、识别色块等),按任务完成度 + 用时 + 精度评分。本课的矩形航线、翻滚、穿门正是赛场任务的"最小子集"。
- 能力对接:今天的 EDP 循环(设计→编程→试飞→调试→迭代)就是赛场上的标准工作流。赛事中选手只有几分钟调试时间,谁平时练得多、对参数敏感,谁就稳。
- 报名引导:对编程飞行感兴趣且手感不错的组,引导其考虑双线报名——既参加航天创意赛(作品包),也参加无人机编程赛(现场任务)。两条赛道能力互补,不冲突。
- PBL 协同:本课的代码、参数、试飞视频,对做无人机方向作品的小组是作品包第 2 件(原型)和第 4 件(视频)的核心素材。提醒学生边学边存档。
🏆 赛事节奏提醒:本课约在学期第 7 周,距省赛提交约 4–6 周。编程飞行的熟练度靠积累,鼓励学生课后用模拟器/DroneBlocks 离线模式继续练(见素材清单)。
课前准备清单
- [ ] Tello EDU 无人机 逐台测试:开机、连 Wi-Fi、图传正常、电量充满(每台飞 1 次确认无故障)
- [ ] 备用电池充满(每组至少 1 块备用),充电管家接好排插
- [ ] 平板/电脑预装 DroneBlocks(桌面版/离线)或 Python + djitellopy,逐台测试连接 Tello
- [ ] 所有代码、SDK 文档离线可用(Tello Wi-Fi 会上不了网)
- [ ] 障碍门道具组装到位(PVC 框/魔术贴杆/纸箱自制,宽 50 × 高 60 cm)
- [ ] 场地划区:每组 2×2 m,地面贴黑白格胶带增加光流纹理,标记起飞点
- [ ] 关闭门窗、风扇、空调出风口
- [ ] 《EDP 试飞记录表》《学生任务单》打印件,每组 1 份
- [ ] 进阶挑战任务卡(分层卡片,见素材清单)打印若干套,供快组取用
- [ ] 紧急停机演示预演:教师课前演示 1 次 emergency 按钮的位置和效果,确保能"一秒停机"
- [ ] 检查第 6 课《选题确认书》回收情况——未确认选题的组本课要重点督促
附:分层挑战任务卡(供快组取用)
打印成卡片,按由易到难排列,快组完成矩形航线后依次取卡挑战。
🟢 卡 1(基础+):精准降落 在降落点贴一张 A4 纸靶心,要求机腹中心落在纸上。记录连续 3 次落点距靶心距离。
🟡 卡 2(进阶):穿越障碍门 编程让无人机起飞→升 30 cm→前进 150 cm 穿过障碍门→门后降落。记录是否成功、是否碰门框。
🟠 卡 3(进阶+):三连穿门 布置 3 道横向错位的障碍门,编程依次穿越。考验航点规划 + 转角精度。
🔴 卡 4(高阶):条件控制 在起飞前读电量,<30% 跳过翻滚;读高度并打印,确保翻滚前高度 > 1 m。加 try-except 异常保护。
⚫ 卡 5(高阶+):弧线飞行 查 SDK 的 curve 指令,让无人机走一段弧线代替直角转弯,比较轨迹差异。如有多台 Tello,尝试 Swarm 编队(2 台镜像动作)。
教师提示:卡 4、卡 5 涉及较深的编程概念,仅给真正学有余力且有时间的组;绝大多数组完成到卡 2/卡 3 即为优秀。
📋 素材清单
课前准备(教师)
核心器材
| 器材 | 数量 | 说明 | 参考价格 / 来源 |
|---|---|---|---|
| Tello EDU 教育无人机 | 每组 1 台 | 编程飞行主力机(支持 SDK、积木、Python、编队) | 约 ¥700–900 / 台(大疆官方 / 京东) |
| Tello 电池(备用) | 每组 1–2 块 | 单块续航约 13 分钟,课堂需轮换 | 约 ¥80 / 块 |
| Tello 充电管家 | 全班 1–2 套 | 集中给多块电池充电 | 约 ¥150 / 套 |
| 全桨保护罩 | 每台 1 套 | 强烈建议——室内飞行防止桨叶伤人/刮墙 | 约 ¥40 / 套,部分 EDU 套装自带 |
| 备用桨叶(正反各 2) | 全班若干 | 易损耗,桨缺口立即换 | 约 ¥30 / 套 |
| 平板 / 电脑(含 Wi-Fi) | 每组 1 台 | 装 DroneBlocks 或 Python | 学校现有设备 |
| 障碍门道具 | 每组 1 道 | 宽 50 × 高 60 cm,PVC 框 / 魔术贴杆 / 纸箱自制 | 自制,材料 < ¥30 |
| 卷尺(5 m) | 每组 1 把 | 量航线边长、门距 | 约 ¥10 |
| 地面标记胶带(含黑白格) | 全班 1–2 卷 | 贴矩形角点 + 增加光流纹理 | 美纹纸胶带,约 ¥15 |
| 护目镜(选配) | 每人 1 副 | 推荐佩戴 | 约 ¥10 / 副 |
💡 预算有限方案:若器材不足,采用 2 组共享 1 台 Tello,A 组飞时 B 组在平板上离线编程/模拟(DroneBlocks 有模拟模式)。或全班共用 2–3 台,分组轮换,每组实际飞行 8–10 分钟。
软件
| 软件 | 用途 | 费用 | 获取 | 推荐度 |
|---|---|---|---|---|
| DroneBlocks(桌面版/平板版) | 积木编程 Tello,零基础友好 | 🆓 免费 | https://learn.droneblocks.io/ | ⭐⭐⭐⭐⭐ 首选 |
| djitellopy(Python 库) | Python 控制 Tello,支持传感器读取 | 🆓 免费 | pip install djitellopy https://github.com/damiafuentes/DJITelloPy | ⭐⭐⭐⭐ 有基础用 |
| Tello SDK 文档(PDF) | 指令全集参考 | 🆓 免费 | https://terra-1-g.djicdn.com/2d4dcec68891f46dab57ad4e6c8f0e3f/v1.3/Tello SDK Documentation.pdf | ⭐⭐⭐⭐⭐ 必备 |
| Python 3.x + IDE(Thonny/Mu/VSCode) | Python 运行环境 | 🆓 免费 | https://thonny.org / https://codewith.mu | ⭐⭐⭐⭐ |
| DroneBlocks 模拟器(离线/网页) | 无真机时模拟飞行 | 🆓 免费 | DroneBlocks 内置 | ⭐⭐⭐⭐ 无机备选 |
⚠️ 课前务必在每台设备上预装并测试:① DroneBlocks 能连上 Tello 并收到图传;② Python + djitellopy 能
connect()成功。课堂现场排环境坑会吃掉大量时间。
文档(打印)
| 文档 | 份数 | 说明 |
|---|---|---|
| 学生任务单 | 每人 1 | |
| 《EDP 试飞记录表》 | 每组 1 | 见实践活动 |
| 进阶挑战任务卡(分层,🟢🟡🟠🔴⚫) | 若干套 | 见教师参考附录,供快组取用 |
| Tello 指令速查卡(A4 单页) | 每组 1 | 摘自讲义指令表,方便试飞时查阅 |
| 安全规程海报 | 场地 1 张 | 贴在飞行区醒目处 |
视频资源
| 素材 | 用途 | 来源 |
|---|---|---|
| Tello EDU 编程飞行演示(2 分钟) | 课堂导入,展示编程飞行效果 | 大疆官网 / B 站搜"Tello EDU 编程" |
| Tello EDU 编队飞行(Swarm) | 展示进阶可能,激发兴趣 | B 站搜"Tello 编队" |
| 无人机编程技能挑战赛实录(3–5 分钟) | 赛事对接认知 | 大赛官网 / B 站搜"无人机编程赛" |
| Tello 翻滚(flip)演示(30 秒) | 展示亮点动作 | YouTube/B 站 |
| 四旋翼差速控制动画(第 6 课备用回顾) | 回顾原理 | B 站搜"四旋翼 差速控制" |
💡 推荐课堂开场用 Tello 编队飞行视频(视觉冲击强),课中"进阶挑战"环节穿插无人机编程赛实录做赛事对接。
场地布置要点
| 要点 | 说明 |
|---|---|
| 场地大小 | 每组 ≥ 2 m × 2 m 开阔平整区域,组间间隔 ≥ 1.5 m |
| 地面 | 避免纯色光滑地面(打蜡地板/瓷砖)——光流定位失效。地面贴黑白格胶带或铺报纸增加纹理 |
| 高度 | 室内净高 ≥ 2.5 m,无吊扇 / 吊灯 / 易碰物 |
| 气流 | 关闭门窗、电扇、空调出风口;避免穿堂风 |
| 划区 | 用胶带贴出每组飞行区边界 + 起飞点 + 矩形角点 |
| 障碍门 | 放在矩形区一侧,门距起飞点约 1.5 m,门后 50 cm 设降落点 |
| 旁观区 | 划定 2 m 外的旁观线,非操作人员站线外 |
⚠️ 不要在普通教室飞——课桌椅密集、空间小、人多,极易撞机伤人。首选体育馆 / 空教室 / 宽走廊。
赛事对接资源 🏆
| 资源 | 用途 | 链接 |
|---|---|---|
| 全国青少年航天创新大赛官网 | 规则 / 报名 | http://nysic.declare.htgjjl.com |
| "无人机编程技能挑战赛"规程 | 赛道规则 | 大赛官网"赛事规程"栏(每年更新,课前核对当年版本) |
| Tello EDU 官方教学资源 | 课程设计参考 | https://www.dji.com/cn/tello-edu |
| DroneBlocks 课程 | 免费编程飞行课程 | https://learn.droneblocks.io/ |
| 大疆教育"机器人编程"社区 | 教案 / 案例 | 大疆教育官网 |
延伸阅读 / 推荐书目
| 资源 | 类型 | 说明 |
|---|---|---|
| Tello SDK 文档(PDF) | 📖 文档 | 指令全集,必读 |
| 《多旋翼无人机入门》(全权 著) | 📖 书籍 | 第 8 章航迹规划,进阶理论 |
| DroneBlocks 官方教程 | 🌐 网课 | 从积木到 Python 的系统课程 |
| djitellopy GitHub README + 示例 | 🌐 代码 | Python 控制实例 |
| B 站"无人机编程"系列 | 🎬 视频 | 大量民间教程 |
| 《Python 编程:从入门到实践》 | 📖 书籍 | 给零基础学生的 Python 补充 |
注意事项
- ⚠️ 课前逐台测试 Tello:开机、连 Wi-Fi、图传、起飞降落各 1 次,淘汰故障机。故障桨/鼓包电池立即停用。
- ⚠️ 电池管理:每块电池满电续航约 13 分钟,1 节课每组可能飞 3–5 次,至少需 2 块电池轮换。充电需有人值守,不可过充。
- ⚠️ Wi-Fi 占用提醒:连上 Tello 后平板/电脑无法上网,所有代码、文档、SDK 手册必须课前离线备好。建议教师备 1 台手机热点机供临时查资料。
- ⚠️ 桨叶保护罩:室内飞行强烈建议装保护罩,可避免 90% 以上的桨叶伤人/刮墙事故。EDU 版部分自带,否则需另购。
- ⚠️ emergency 按钮演示:开课前教师必须当众演示紧急停机按钮位置与效果(电机会立即停,无人机会掉落),并要求每组全程有人手放该按钮附近。
- ⚠️ 同场多机干扰:Tello 各自 Wi-Fi 独立,但同场多台同时飞会互相干扰光流定位(阴影/气流)+ Wi-Fi 频段拥挤。建议分组轮飞,同时刻全场最多 1–2 台在飞。
- ⚠️ 法规复核:虽为室内教育飞行,仍提醒学生(第 6 课已讲):真机户外飞行须实名登记、避让禁飞区。本课用 Tello EDU(< 0.25 kg,属微型)室内飞行无需登记,但养成合规意识。
- ⚠️ 核对第 6 课选题进度:本课是编程实操,但 PBL 项目的选题确认书(第 6 课布置)应已回收。未确认选题的组本课要重点督促,避免项目滞后。